Skill

Electron এ ফাইল সিস্টেম অ্যাক্সেস (File System Access)

ইলেকট্রন  (Electron) - Web Development

336

Electron অ্যাপ্লিকেশনগুলো Node.js এর শক্তিশালী ফাইল সিস্টেম মডিউল ব্যবহার করে সিস্টেমের ফাইল সিস্টেমে অ্যাক্সেস পেতে সক্ষম। এটি Main Process থেকে ফাইল পরিচালনার জন্য ব্যবহৃত হয়, কারণ Renderer Process-এ সরাসরি ফাইল সিস্টেমে অ্যাক্সেস করা নিরাপত্তাজনিত কারণে সীমিত থাকে।

ফাইল সিস্টেম অ্যাক্সেসের জন্য ব্যবহৃত মডিউল

  • fs (File System): ফাইল এবং ডিরেক্টরি পড়া, লেখা, মুছে ফেলা, আপডেট করা ইত্যাদি কাজের জন্য ব্যবহৃত হয়।
  • path: ফাইল বা ডিরেক্টরির পথ (path) তৈরি এবং পরিচালনা করতে ব্যবহৃত হয়।

১. Node.js File System (fs) মডিউল

Node.js এর fs মডিউল Electron অ্যাপ্লিকেশনকে ফাইল সিস্টেমে প্রবেশ করতে এবং বিভিন্ন ফাইল অপারেশন (যেমন ফাইল পড়া, লেখা, মুছে ফেলা) করতে সহায়তা করে।

ফাইল পড়া (Reading Files)

const fs = require('fs');

// ফাইল পড়া
fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('Error reading file:', err);
    return;
  }
  console.log('File content:', data);
});

ফাইল লেখা (Writing to Files)

const fs = require('fs');

// ফাইল লেখা
fs.writeFile('output.txt', 'Hello, Electron!', (err) => {
  if (err) {
    console.error('Error writing file:', err);
    return;
  }
  console.log('File written successfully');
});

ফাইল মুছে ফেলা (Deleting Files)

const fs = require('fs');

// ফাইল মুছে ফেলা
fs.unlink('output.txt', (err) => {
  if (err) {
    console.error('Error deleting file:', err);
    return;
  }
  console.log('File deleted successfully');
});

২. পাথ (Path) মডিউল ব্যবহার

ফাইল সিস্টেমে সঠিক পাথ তৈরি করতে path মডিউল ব্যবহার করা হয়। এটি ফাইল বা ডিরেক্টরির পূর্ণ পাথ তৈরি করতে সহায়ক।

const path = require('path');

// পাথ তৈরি করা
const filePath = path.join(__dirname, 'example.txt');
console.log('File path:', filePath);

৩. Main Process থেকে Renderer Process এ ফাইল সিস্টেম অ্যাক্সেস

Renderer Process (যেখানে UI রেন্ডার হয়) সরাসরি ফাইল সিস্টেমে অ্যাক্সেস পায় না, কারণ এটি নিরাপত্তা ঝুঁকি সৃষ্টি করতে পারে। তবে, Main Process এর মাধ্যমে ফাইল সিস্টেমে অ্যাক্সেস করানো যায় এবং Renderer Process এর সাথে IPC (Inter-Process Communication) ব্যবহার করে যোগাযোগ করা হয়।

উদাহরণ: Main Process থেকে Renderer Process এ ফাইল সিস্টেম অ্যাক্সেস

Main Process (main.js):
const { app, BrowserWindow, ipcMain } = require('electron');
const fs = require('fs');
const path = require('path');

let mainWindow;

app.on('ready', () => {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
    },
  });

  mainWindow.loadFile('index.html');

  // Renderer Process থেকে ফাইল পড়ার অনুরোধ গ্রহণ
  ipcMain.on('read-file', (event, filePath) => {
    fs.readFile(filePath, 'utf8', (err, data) => {
      if (err) {
        event.reply('file-read-error', err.message);
      } else {
        event.reply('file-read-success', data);
      }
    });
  });
});
Renderer Process (index.html):
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>File System Access Example</title>
</head>
<body>
  <h1>Read File from File System</h1>
  <button id="readFileBtn">Read File</button>
  <div id="fileContent"></div>
  <script>
    const { ipcRenderer } = require('electron');

    document.getElementById('readFileBtn').addEventListener('click', () => {
      // File path (এটি আপনার সিস্টেমের পাথ হতে পারে)
      const filePath = 'example.txt';
      
      // Main Process এ ফাইল পড়ার অনুরোধ পাঠানো
      ipcRenderer.send('read-file', filePath);
    });

    // Main Process থেকে ফাইল পড়ার ফলাফল গ্রহণ
    ipcRenderer.on('file-read-success', (event, data) => {
      document.getElementById('fileContent').innerText = data;
    });

    ipcRenderer.on('file-read-error', (event, errMessage) => {
      document.getElementById('fileContent').innerText = 'Error: ' + errMessage;
    });
  </script>
</body>
</html>

৪. সেটআপ ও নিরাপত্তা

Node.js এর fs মডিউল নিরাপত্তার দিক থেকে কিছু সতর্কতা দাবি করে। Renderer Process এ সরাসরি ফাইল সিস্টেমে অ্যাক্সেস সীমিত থাকে, এবং nodeIntegration সেটিংসটি Main Process-এ সক্রিয় রাখতে হয়। তবে, নিরাপত্তার জন্য এটি পছন্দনীয় নয়, এবং sandbox অথবা contextIsolation এর মতো নিরাপত্তা ব্যবস্থা প্রয়োগ করা উচিত।


সারাংশ

  • fs মডিউল Electron অ্যাপ্লিকেশনের Main Process থেকে ফাইল সিস্টেমে সম্পূর্ণ অ্যাক্সেস প্রদান করে।
  • path মডিউল ফাইল বা ডিরেক্টরির সঠিক পাথ তৈরি করতে ব্যবহৃত হয়।
  • Main Process থেকে Renderer Process এ ফাইল সিস্টেম অ্যাক্সেস করার জন্য IPC ব্যবহৃত হয়।
  • নিরাপত্তার কারণে Renderer Process-এ সরাসরি ফাইল সিস্টেমে অ্যাক্সেস না দেওয়াই সর্বোত্তম।
Content added By

Node.js এর fs (File System) মডিউল ব্যবহার করে Electron অ্যাপ্লিকেশনে ফাইল সিস্টেমের সাথে ইন্টারঅ্যাক্ট করা যায়। আপনি ফাইল পড়া, লেখার মতো কার্যক্রম করতে পারবেন। Electron অ্যাপ্লিকেশনগুলো Main Process-এ Node.js এর fs মডিউল ব্যবহার করে ফাইল পরিচালনা করে, এবং Renderer Process-এ এটি ব্যবহারের জন্য কিছু কনফিগারেশন প্রয়োজন।

এখানে, Electron অ্যাপ্লিকেশন তৈরি করার মাধ্যমে fs মডিউল ব্যবহার করে ফাইল পড়া এবং লেখা দেখানো হয়েছে।


১. Main Process থেকে fs মডিউল ব্যবহার করে ফাইল পড়া এবং লেখা

fs মডিউলটি Node.js এর অংশ এবং এটি ফাইল সিস্টেমে কাজ করার জন্য ব্যবহৃত হয়। Main Process-এ এই মডিউল ব্যবহার করা হয়।

উদাহরণ: Main Process - main.js

const { app, BrowserWindow, ipcMain } = require('electron');
const fs = require('fs');  // fs মডিউল ইম্পোর্ট করা

let mainWindow;

app.on('ready', () => {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true  // Renderer Process-এ Node.js ইন্টিগ্রেশন সক্রিয় করা
    }
  });

  mainWindow.loadFile('index.html');
  
  // ফাইল লেখা
  ipcMain.on('write-file', (event, data) => {
    fs.writeFile('output.txt', data, (err) => {
      if (err) {
        console.log('ফাইল লেখা সম্ভব হয়নি:', err);
        event.reply('write-file-reply', 'ফাইল লেখার সময় সমস্যা হয়েছে');
      } else {
        console.log('ফাইল সফলভাবে লেখা হয়েছে');
        event.reply('write-file-reply', 'ফাইল সফলভাবে লেখা হয়েছে');
      }
    });
  });

  // ফাইল পড়া
  ipcMain.on('read-file', (event) => {
    fs.readFile('output.txt', 'utf8', (err, data) => {
      if (err) {
        console.log('ফাইল পড়া সম্ভব হয়নি:', err);
        event.reply('read-file-reply', 'ফাইল পড়ার সময় সমস্যা হয়েছে');
      } else {
        console.log('ফাইলের ডেটা:', data);
        event.reply('read-file-reply', data);
      }
    });
  });
});
  • fs.writeFile(): এটি একটি ফাইল তৈরি করে এবং তাতে ডেটা লিখে।
  • fs.readFile(): এটি একটি ফাইল থেকে ডেটা পড়ে এবং সেই ডেটা utf8 এনকোডিং ফর্ম্যাটে রিটার্ন করে।

২. Renderer Process থেকে ফাইল পড়া এবং লেখা

Renderer Process থেকে Main Process এ মেসেজ পাঠানোর জন্য IPC (Inter-Process Communication) ব্যবহার করা হয়। ipcRenderer ব্যবহার করে Renderer Process থেকে ফাইল পড়া বা লেখা এর জন্য কমান্ড পাঠানো হয়।

উদাহরণ: Renderer Process - index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Renderer Process</title>
</head>
<body>
  <h1>ফাইল পড়া এবং লেখা</h1>
  
  <!-- ফাইল লেখা -->
  <textarea id="writeData" placeholder="ডেটা লিখুন এখানে"></textarea><br>
  <button id="writeFileBtn">ফাইল লিখুন</button>
  
  <!-- ফাইল পড়া -->
  <button id="readFileBtn">ফাইল পড়ুন</button>
  <p id="fileContent"></p>

  <script>
    const { ipcRenderer } = require('electron');
    
    // ফাইল লেখা
    document.getElementById('writeFileBtn').addEventListener('click', () => {
      const data = document.getElementById('writeData').value;
      ipcRenderer.send('write-file', data);  // Main Process এ মেসেজ পাঠানো
    });

    // ফাইল পড়া
    document.getElementById('readFileBtn').addEventListener('click', () => {
      ipcRenderer.send('read-file');  // Main Process এ ফাইল পড়ার জন্য মেসেজ পাঠানো
    });

    // Main Process থেকে উত্তর গ্রহণ
    ipcRenderer.on('write-file-reply', (event, message) => {
      alert(message);  // ফাইল লেখার উত্তর
    });

    ipcRenderer.on('read-file-reply', (event, data) => {
      document.getElementById('fileContent').textContent = data;  // ফাইলের কনটেন্ট দেখানো
    });
  </script>
</body>
</html>
  • ipcRenderer.send(): Renderer Process থেকে Main Process-এ মেসেজ পাঠায়, যেমন ফাইল লেখা বা পড়ার অনুরোধ।
  • ipcRenderer.on(): Main Process থেকে আসা সাড়া গ্রহণ করে, যেমন ফাইল লেখা বা পড়ার ফলাফল।

৩. ফাইল পড়া এবং লেখা সম্পর্কিত কিছু গুরুত্বপুর্ণ বিষয়

  • fs.writeFile(): যদি ফাইলটি না থাকে, এটি একটি নতুন ফাইল তৈরি করে। তবে ফাইলটি আগে থেকেই বিদ্যমান থাকলে এটি সেই ফাইলটি নতুন করে রিপ্লেস করে দিবে।
  • fs.readFile(): এটি নির্দিষ্ট ফাইল থেকে ডেটা পড়ে এবং অ্যাসিঙ্ক্রোনাস (asynchronous) পদ্ধতিতে কাজ করে, অর্থাৎ ফাইল পড়া শেষ না হওয়া পর্যন্ত অন্যান্য কোডের কার্যক্রম চলতে থাকে।
  • ফাইল পাথ (File Path): যদি আপনি কোনও নির্দিষ্ট ডিরেক্টরিতে ফাইল তৈরি বা পড়তে চান, তাহলে ফাইলের পূর্ণ পাথ (path) ব্যবহার করতে হবে, যেমন fs.readFile('path/to/file.txt', 'utf8', callback);

সারাংশ

  • fs মডিউল Node.js এর একটি শক্তিশালী মডিউল, যা ফাইল সিস্টেমের সাথে কাজ করার জন্য ব্যবহৃত হয়।
  • Electron অ্যাপ্লিকেশনে Main Process-এ fs মডিউল ব্যবহার করে ফাইল পড়া এবং লেখা করা যায়।
  • Renderer Process থেকে Main Process এ মেসেজ পাঠিয়ে ফাইল সিস্টেমের কাজ করা হয় IPC (Inter-Process Communication) ব্যবহার করে।
Content added By

Electron-এ ফাইল ডায়লগ (File Dialog) ব্যবহার করে আপনি ব্যবহারকারীদের ফাইল সিলেক্ট করতে এবং সেই ফাইলটি পড়তে বা সংরক্ষণ করতে সহায়তা করতে পারেন। Electron এর dialog মডিউল দিয়ে ফাইল ওপেন এবং সেভ ডায়লগ তৈরি করা যায়।

এই টিউটোরিয়ালে Open এবং Save ডায়লগ কিভাবে তৈরি করবেন তা দেখানো হলো।


১. Main Process - ফাইল ডায়লগ ব্যবহার

dialog মডিউলটি Main Process-এ কাজ করে, এবং এটি ব্যবহারকারীর কাছে ফাইল ডায়লগের উইন্ডো তৈরি করতে সাহায্য করে।

উদাহরণ: main.js (ফাইল ওপেন এবং সেভ ডায়লগ)

const { app, BrowserWindow, ipcMain, dialog } = require('electron');
const fs = require('fs');

let mainWindow;

app.on('ready', () => {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
    },
  });

  mainWindow.loadFile('index.html');

  // Open File Dialog
  ipcMain.handle('dialog:openFile', async () => {
    const result = await dialog.showOpenDialog(mainWindow, {
      properties: ['openFile'],  // Only open files
      filters: [
        { name: 'Text Files', extensions: ['txt'] },
        { name: 'All Files', extensions: ['*'] }
      ]
    });
    return result.filePaths;  // Return the selected file paths
  });

  // Save File Dialog
  ipcMain.handle('dialog:saveFile', async () => {
    const result = await dialog.showSaveDialog(mainWindow, {
      filters: [
        { name: 'Text Files', extensions: ['txt'] },
        { name: 'All Files', extensions: ['*'] }
      ]
    });
    return result.filePath;  // Return the selected file path
  });
});
  • dialog.showOpenDialog(): ফাইল ওপেন করার জন্য একটি ডায়লগ উইন্ডো দেখায়।
  • dialog.showSaveDialog(): ফাইল সেভ করার জন্য একটি ডায়লগ উইন্ডো দেখায়।
  • properties: ['openFile']: শুধুমাত্র ফাইল সিলেক্ট করা যাবে।
  • filters: ফাইল টাইপ সিলেকশন ফিল্টার হিসেবে কাজ করে।

২. Renderer Process - ফাইল ডায়লগ ব্যবহার

Renderer Process থেকে Main Process-এ মেসেজ পাঠানোর জন্য IPC ব্যবহার করা হয়। ফাইল ডায়লগ খুলতে এবং ব্যবহারকারীর সিলেক্ট করা ফাইল পেতে ipcRenderer ব্যবহার করা হয়।

উদাহরণ: index.html (Renderer Process)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>File Dialog Example</title>
</head>
<body>
  <h1>ফাইল ওপেন এবং সেভ ডায়লগ উদাহরণ</h1>
  
  <button id="openFileBtn">ফাইল ওপেন করুন</button>
  <button id="saveFileBtn">ফাইল সেভ করুন</button>
  
  <p id="fileInfo"></p>

  <script>
    const { ipcRenderer } = require('electron');

    // ফাইল ওপেন করার জন্য
    document.getElementById('openFileBtn').addEventListener('click', async () => {
      const result = await ipcRenderer.invoke('dialog:openFile');
      if (result.length > 0) {
        document.getElementById('fileInfo').textContent = `সিলেক্ট করা ফাইল: ${result[0]}`;
      }
    });

    // ফাইল সেভ করার জন্য
    document.getElementById('saveFileBtn').addEventListener('click', async () => {
      const result = await ipcRenderer.invoke('dialog:saveFile');
      if (result) {
        document.getElementById('fileInfo').textContent = `ফাইল সেভ হবে: ${result}`;
      }
    });
  </script>
</body>
</html>
  • ipcRenderer.invoke(): Renderer Process থেকে Main Process-এ মেসেজ পাঠানোর জন্য ব্যবহৃত হয় এবং ডায়লগ থেকে সিলেক্ট করা ফাইলের পাথ ফেরত পাওয়া যায়।

৩. ফাইল ওপেন ডায়লগ

এখানে, আমরা Open File ডায়লগ তৈরি করেছি যেখানে ব্যবহারকারী ফাইল সিলেক্ট করতে পারবেন এবং সেই ফাইলের পাথ Renderer Process-এ পাঠানো হবে।

ফাইল ওপেন ডায়লগের বৈশিষ্ট্যসমূহ:

  • properties: ['openFile']: শুধুমাত্র ফাইল সিলেকশন করা যাবে।
  • filters: ফাইলের ধরন অনুযায়ী ফিল্টার করা যাবে, যেমন শুধুমাত্র .txt ফাইল সিলেক্ট করা যাবে।

৪. ফাইল সেভ ডায়লগ

এখানে, আমরা Save File ডায়লগ তৈরি করেছি যেখানে ব্যবহারকারী একটি ফাইল সেভ করার জন্য ডিরেক্টরি এবং ফাইলের নাম সিলেক্ট করতে পারবেন।

ফাইল সেভ ডায়লগের বৈশিষ্ট্যসমূহ:

  • filters: ফাইলের ধরন নির্বাচন করতে সাহায্য করে, যেমন .txt ফাইল।
  • defaultPath: সেভ করার জন্য ডিফল্ট পাথ নির্ধারণ করা যায় (যদি প্রয়োজন হয়)।

৫. ফাইল সিলেক্ট করা এবং সেভ করা

ফাইল ওপেন এবং সেভ ডায়লগ ব্যবহারের মাধ্যমে আপনি fs মডিউল দিয়ে ফাইলের ডেটা পড়তে বা লিখতে পারবেন। আপনি Renderer Process থেকে নির্বাচিত ফাইলের পাথ পেয়ে, Main Process এর মাধ্যমে সেই ফাইলের ডেটা পড়তে বা লেখতে পারেন।

ফাইল সেভ করার উদাহরণ

const { ipcMain } = require('electron');
const fs = require('fs');

ipcMain.handle('dialog:saveFile', async () => {
  const result = await dialog.showSaveDialog(mainWindow, {
    filters: [
      { name: 'Text Files', extensions: ['txt'] }
    ]
  });
  if (result.filePath) {
    fs.writeFileSync(result.filePath, 'এটি একটি সেভ করা টেক্সট ফাইল।');
  }
  return result.filePath;
});

সারাংশ

  • dialog.showOpenDialog(): ফাইল ওপেন করার জন্য ব্যবহৃত হয়।
  • dialog.showSaveDialog(): ফাইল সেভ করার জন্য ব্যবহৃত হয়।
  • ipcMain.handle(): Main Process-এ ফাইল ডায়লগ হ্যান্ডেল করতে ব্যবহৃত হয়।
  • ipcRenderer.invoke(): Renderer Process থেকে Main Process-এ মেসেজ পাঠানোর জন্য ব্যবহৃত হয়।

এইভাবে, Electron অ্যাপ্লিকেশনে ফাইল ওপেন এবং ফাইল সেভ ডায়লগ তৈরি করে ব্যবহারকারীদের ফাইল সিলেক্ট বা সংরক্ষণ করতে সহায়তা করা যায়।

Content added By

Electron অ্যাপ্লিকেশনে ফাইল সিস্টেমে অ্যাক্সেস অত্যন্ত গুরুত্বপূর্ণ এবং এটি নিরাপত্তা ঝুঁকি তৈরি করতে পারে যদি ঠিকভাবে কনফিগার না করা হয়। ফাইল সিস্টেমের সঙ্গে ইন্টারঅ্যাক্ট করার সময় সঠিক নিরাপত্তা নিয়মাবলী অনুসরণ করা অত্যন্ত জরুরি। কারণ Node.js এর fs (ফাইল সিস্টেম) মডিউল ব্যবহার করে অ্যাপ্লিকেশন ফাইল পড়তে এবং লিখতে সক্ষম হয়, যা ইউজারের তথ্য বা সিস্টেমে প্রবেশ করতে পারে।

নিচে কিছু নিরাপত্তা নিয়মাবলী দেওয়া হলো, যা Electron অ্যাপ্লিকেশনের ফাইল সিস্টেমে অ্যাক্সেসের সময় মানা উচিত:


১. Node.js ইন্টিগ্রেশন সীমিত করা

nodeIntegration একটি গুরুত্বপূর্ণ নিরাপত্তা সেটিং, যা Renderer Process-এ Node.js এর API ব্যবহার করার অনুমতি দেয়। এই সেটিংটি true থাকলে Renderer Process এ Node.js এর fs মডিউল এবং অন্যান্য সিস্টেম API ব্যবহার করা যাবে, যা বড় ধরনের নিরাপত্তা ঝুঁকি সৃষ্টি করতে পারে।

নিরাপদ পদ্ধতি:

  • nodeIntegration কে false রাখা উচিত, যাতে Renderer Process শুধুমাত্র ওয়েব API গুলি ব্যবহার করতে পারে।

উদাহরণ:

let mainWindow = new BrowserWindow({
  width: 800,
  height: 600,
  webPreferences: {
    nodeIntegration: false,  // Renderer Process-এ Node.js API নিষ্ক্রিয় করা
    contextIsolation: true,  // নিরাপত্তার জন্য contextIsolation সক্রিয় করা
  }
});
  • contextIsolation: true সক্রিয় রাখলে, Renderer Process এবং Main Process এর মধ্যে পৃথক কনটেক্সট বজায় থাকে, যা নিরাপত্তা বাড়ায়।

২. IPC (Inter-Process Communication) ব্যবহার করুন

ipcMain এবং ipcRenderer ব্যবহার করে আপনি Main Process এবং Renderer Process এর মধ্যে নিরাপদ যোগাযোগ করতে পারেন। আপনি শুধুমাত্র Main Process এ ফাইল সিস্টেমের কাজ পরিচালনা করতে পারেন এবং Renderer Process এ সরাসরি ফাইল সিস্টেমে অ্যাক্সেস সীমিত রাখতে পারেন।

নিরাপদ পদ্ধতি:

  • Renderer Process থেকে Main Process এ শুধুমাত্র নিরাপদ মেসেজ পাঠান, এবং ফাইল সিস্টেমের কাজ সেখানে পরিচালনা করুন।

উদাহরণ:

// Main Process (main.js)
const { ipcMain } = require('electron');
const fs = require('fs');

ipcMain.on('read-file', (event, path) => {
  // শুধুমাত্র নির্দিষ্ট পাথ থেকে ফাইল পড়ুন
  fs.readFile(path, 'utf8', (err, data) => {
    if (err) {
      event.reply('file-error', 'ফাইল পড়তে সমস্যা হয়েছে');
    } else {
      event.reply('file-data', data);
    }
  });
});

// Renderer Process (index.html)
const { ipcRenderer } = require('electron');

// Renderer Process থেকে ফাইল পড়ার অনুরোধ
ipcRenderer.send('read-file', 'path/to/safe-file.txt');

// Main Process থেকে সাড়া গ্রহণ
ipcRenderer.on('file-data', (event, data) => {
  console.log(data);
});

এভাবে Renderer Process থেকে Main Process এ মেসেজ পাঠিয়ে ফাইল সিস্টেমে অ্যাক্সেস করা যায়, যা নিরাপদ।


৩. তিনটি স্তরের নিরাপত্তা কনফিগারেশন

Electron অ্যাপ্লিকেশনে নিরাপত্তার জন্য তিনটি স্তরের কনফিগারেশন গুরুত্বপূর্ন:

  1. nodeIntegration: false: Renderer Process এ Node.js API নিষ্ক্রিয় করা।
  2. contextIsolation: true: Renderer এবং Main Process এর মধ্যে কনটেক্সট পৃথক করা।
  3. sandbox: true: অ্যাপের স্যান্ডবক্স মোড চালু করা (যা ব্যবহৃত প্লাগইন বা কোডকে সিস্টেমের বাইরের অ্যাক্সেস সীমিত করে)।

উদাহরণ:

let mainWindow = new BrowserWindow({
  width: 800,
  height: 600,
  webPreferences: {
    nodeIntegration: false,     // Renderer Process-এ Node.js নিষ্ক্রিয় করা
    contextIsolation: true,     // নিরাপত্তার জন্য context isolation সক্রিয় করা
    sandbox: true               // অ্যাপ স্যান্ডবক্স মোডে চালানো
  }
});

এই কনফিগারেশনগুলো অ্যাপের নিরাপত্তা বাড়ানোর জন্য অত্যন্ত গুরুত্বপূর্ণ, কারণ সেগুলি Renderer Process-এ কোড ইঞ্জেকশন এবং ফাইল সিস্টেম অ্যাক্সেসকে সীমিত করে।


৪. ফাইল সিস্টেম অ্যাক্সেস সীমিত করা

প্রত্যেকটি অ্যাপ্লিকেশনের জন্য ফাইল সিস্টেম অ্যাক্সেস অত্যন্ত সীমিত হওয়া উচিত। শুধুমাত্র সুনির্দিষ্ট ফোল্ডার বা ফাইল থেকে অ্যাক্সেস পাওয়া উচিত এবং অন্য কোনো ডিরেক্টরি বা ফাইলের ওপর অ্যাক্সেস রাখা উচিত নয়।

নিরাপদ পদ্ধতি:

  • শুধুমাত্র নির্দিষ্ট ফোল্ডার বা ফাইলের সাথে কাজ করুন। উদাহরণস্বরূপ, আপনি যদি একটি ডেটাবেস ফাইল পরিচালনা করতে চান তবে তার অবস্থান নির্ধারণ করুন এবং অন্যান্য ফাইল থেকে অ্যাক্সেস সীমিত করুন।

উদাহরণ:

ipcMain.on('safe-read-file', (event) => {
  const safePath = 'path/to/safe/folder/file.txt';
  fs.readFile(safePath, 'utf8', (err, data) => {
    if (err) {
      event.reply('file-error', 'ফাইল পড়তে সমস্যা হয়েছে');
    } else {
      event.reply('file-data', data);
    }
  });
});

এইভাবে আপনি অ্যাপ্লিকেশনটির ফাইল সিস্টেমে অ্যাক্সেস নিরাপদ করতে পারেন।


৫. File Path Validation

File Path যাচাই করা গুরুত্বপূর্ণ। কোন ফাইলের পাথ অ্যাক্সেস করা হচ্ছে তা যাচাই করা উচিত। আপনি এটি path.normalize() এবং path.isAbsolute() ফাংশন ব্যবহার করে নিশ্চিত করতে পারেন।

উদাহরণ:

const path = require('path');

ipcMain.on('safe-file-path', (event, filePath) => {
  const normalizedPath = path.normalize(filePath);
  if (path.isAbsolute(normalizedPath)) {
    fs.readFile(normalizedPath, 'utf8', (err, data) => {
      if (err) {
        event.reply('file-error', 'ফাইল পড়তে সমস্যা হয়েছে');
      } else {
        event.reply('file-data', data);
      }
    });
  } else {
    event.reply('file-error', 'অনুমোদিত পাথ নয়');
  }
});

এভাবে আপনি ফাইলের পাথ যাচাই করে নিরাপত্তা নিশ্চিত করতে পারেন।


সারাংশ

  • nodeIntegration: false এবং contextIsolation: true ব্যবহার করে Renderer Process-এ Node.js অ্যাক্সেস সীমিত করতে হবে।
  • IPC ব্যবহার করে Main Process থেকে ফাইল সিস্টেম অ্যাক্সেসের কাজ করা উচিত, যাতে নিরাপত্তা বজায় থাকে।
  • শুধুমাত্র নির্দিষ্ট ফোল্ডার এবং ফাইল থেকে অ্যাক্সেস নিশ্চিত করতে হবে এবং ফাইল পাথ যাচাই করার প্রক্রিয়া ব্যবহার করা উচিত।
  • স্যান্ডবক্স মোড এবং নিরাপত্তা কনফিগারেশনগুলো নিশ্চিত করুন, যাতে অ্যাপ্লিকেশনের সুরক্ষা বৃদ্ধি পায়।
Content added By

ইলেকট্রন (Electron) অ্যাপ্লিকেশনগুলির মধ্যে ফাইল স্টোরেজ এবং রিড/রাইট পারমিশন ব্যবস্থাপনাকে সঠিকভাবে পরিচালনা করা অত্যন্ত গুরুত্বপূর্ণ। এটি বিশেষভাবে নিরাপত্তা এবং ব্যবহারকারীর অভিজ্ঞতা নিশ্চিত করার জন্য প্রয়োজনীয়। ব্যবহারকারীর ফাইল সিস্টেমের সাথে নিরাপদভাবে কাজ করতে হলে, ফাইল পড়া এবং লেখা কার্যক্রমকে উপযুক্ত অনুমতি এবং কনফিগারেশনের সাথে পরিচালনা করতে হবে।

এই লেখায়, ইলেকট্রন অ্যাপ্লিকেশনে ফাইল স্টোরেজ এবং রিড/রাইট পারমিশন এর বিষয়গুলো কীভাবে কার্যকরভাবে ব্যবহৃত হয়, তা বিস্তারিতভাবে আলোচনা করা হয়েছে।


১. Electron এর ফাইল সিস্টেম অ্যাক্সেস

ইলেকট্রন অ্যাপ্লিকেশন Node.js এর fs (File System) মডিউল ব্যবহার করে ব্যবহারকারীর ফাইল সিস্টেমে ডিরেক্টরি এবং ফাইল পড়া, লেখা এবং মুছে ফেলার কাজ করতে পারে। তবে, এটি একটি গুরুত্বপূর্ণ নিরাপত্তা বিষয়, কারণ অ্যাপটি যদি ব্যবহারকারীর ব্যক্তিগত ফাইলের অ্যাক্সেস পায়, তবে এর অপব্যবহার হতে পারে।

Main Processfs মডিউল ব্যবহার করে ফাইল অ্যাক্সেস করতে হয়। Renderer Process থেকে ফাইল স্টোরেজের কাজ করার জন্য, IPC (Inter-Process Communication) ব্যবহার করা হয়।


২. ফাইল রিড/রাইট পারমিশন

Electron অ্যাপ্লিকেশন চালানোর সময়, ফাইল রিড/রাইট পারমিশন বেশ কিছু কারণে গুরুত্বপূর্ণ:

  • নিরাপত্তা: অ্যাপ্লিকেশন শুধুমাত্র অনুমোদিত ফাইলগুলোর উপর কাজ করবে, যাতে ব্যবহারকারীর ডেটা নিরাপদ থাকে।
  • ব্যবহারকারীর অনুমতি: ফাইল সিস্টেমের সাথে কাজ করার সময় অ্যাপ্লিকেশন ব্যবহারকারীর কাছে অনুমতি চাইতে পারে।

ইলেকট্রন সাধারণত ডেস্কটপ অ্যাপ্লিকেশনগুলোতে ফাইল সিস্টেম থেকে ডেটা পড়ে এবং লেখে। যেহেতু ইলেকট্রন একটি ডেস্কটপ অ্যাপ্লিকেশন, তাই এটি সাধারণত ডেস্কটপের ডিফল্ট ফাইল সিস্টেম (যেমন Documents, Downloads, AppData ইত্যাদি) অ্যাক্সেস করে।

তবে কিছু নিরাপত্তা নিয়মাবলী রয়েছে, যেমন:

  • nodeIntegration: false থাকলে, Renderer Process-এ Node.js API ব্যবহার করা যাবে না।
  • contextIsolation: true থাকলে, Renderer Process থেকে Node.js এর সরাসরি অ্যাক্সেস সীমিত থাকবে।

৩. ফাইলের পারমিশন চেক করা

Electron অ্যাপ্লিকেশন থেকে ফাইল রিড/রাইট পারমিশন চেক করতে fs.access() মেথড ব্যবহার করা যেতে পারে। এটি ফাইল বা ডিরেক্টরির পারমিশন চেক করার জন্য ব্যবহৃত হয়।

উদাহরণ: ফাইলের পারমিশন চেক করা

Main Process (main.js):

const { app, BrowserWindow, ipcMain } = require('electron');
const fs = require('fs');
const path = require('path');

let mainWindow;

app.on('ready', () => {
  mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      nodeIntegration: true,
    },
  });

  mainWindow.loadFile('index.html');

  // পারমিশন চেক করা
  ipcMain.on('check-file-permission', (event, filePath) => {
    fs.access(filePath, fs.constants.R_OK | fs.constants.W_OK, (err) => {
      if (err) {
        console.log(`ফাইলটি অ্যাক্সেস করা যাবে না: ${filePath}`);
        event.reply('permission-reply', 'ফাইল রিড/রাইট পারমিশন নেই');
      } else {
        console.log(`ফাইলটি অ্যাক্সেস করা যাবে: ${filePath}`);
        event.reply('permission-reply', 'ফাইল রিড/রাইট পারমিশন আছে');
      }
    });
  });
});

এখানে fs.access() মেথডটি ফাইলের রিড এবং রাইট পারমিশন চেক করে। fs.constants.R_OK রিড পারমিশন এবং fs.constants.W_OK রাইট পারমিশন চেক করে।


৪. ডিরেক্টরি ও ফাইল তৈরি/লেখা

যদি আপনার অ্যাপ্লিকেশন ব্যবহারকারীকে একটি ফাইল তৈরি বা মুছে ফেলতে দেয়, তাহলে fs.writeFile() এবং fs.unlink() মডিউল ব্যবহার করা যেতে পারে। তবে, Renderer Process থেকে ফাইল স্টোরেজের কাজ করার জন্য আপনাকে Main Process-এর মাধ্যমে অনুমতি নিতে হবে।

উদাহরণ: ফাইল লেখা

Main Process (main.js):

ipcMain.on('write-file', (event, filePath, data) => {
  fs.writeFile(filePath, data, (err) => {
    if (err) {
      console.log('ফাইল লেখা সম্ভব হয়নি:', err);
      event.reply('write-file-reply', 'ফাইল লেখার সময় সমস্যা হয়েছে');
    } else {
      console.log('ফাইল সফলভাবে লেখা হয়েছে');
      event.reply('write-file-reply', 'ফাইল সফলভাবে লেখা হয়েছে');
    }
  });
});

উদাহরণ: Renderer Process থেকে ফাইল লেখা

Renderer Process (index.html):

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Renderer Process</title>
</head>
<body>
  <h1>ফাইল লেখা</h1>
  <button id="writeFileBtn">ফাইল লেখো</button>
  <script>
    const { ipcRenderer } = require('electron');

    document.getElementById('writeFileBtn').addEventListener('click', () => {
      const filePath = 'output.txt';  // যেখানে ফাইল লেখা হবে
      const data = 'এটি একটি নতুন লেখার তথ্য';
      ipcRenderer.send('write-file', filePath, data);  // Main Process এ মেসেজ পাঠানো
    });

    ipcRenderer.on('write-file-reply', (event, message) => {
      alert(message);  // Main Process থেকে সাড়া
    });
  </script>
</body>
</html>

৫. ফাইল ডিলিট করা

ফাইল মুছে ফেলার জন্য fs.unlink() মেথড ব্যবহার করা হয়।

উদাহরণ: ফাইল মুছে ফেলা

Main Process (main.js):

ipcMain.on('delete-file', (event, filePath) => {
  fs.unlink(filePath, (err) => {
    if (err) {
      console.log('ফাইল মুছে ফেলা সম্ভব হয়নি:', err);
      event.reply('delete-file-reply', 'ফাইল মুছে ফেলার সময় সমস্যা হয়েছে');
    } else {
      console.log('ফাইল সফলভাবে মুছে ফেলা হয়েছে');
      event.reply('delete-file-reply', 'ফাইল সফলভাবে মুছে ফেলা হয়েছে');
    }
  });
});

সারাংশ

  • ফাইল স্টোরেজ এবং রিড/রাইট পারমিশন ব্যবস্থাপনা Electron অ্যাপ্লিকেশনগুলিতে নিরাপত্তার জন্য অত্যন্ত গুরুত্বপূর্ণ।
  • Main Process-এ fs মডিউল ব্যবহার করে ফাইল পড়া, লেখা, এবং মুছে ফেলা কাজগুলি করা হয়।
  • Renderer Process থেকে Main Process-এ IPC ব্যবহার করে ফাইল সম্পর্কিত কার্যক্রম পরিচালনা করা হয়।
  • fs.access() মেথড ব্যবহার করে ফাইলের রিড/রাইট পারমিশন চেক করা হয়।

এভাবে আপনি Electron অ্যাপ্লিকেশনগুলোতে ব্যবহারকারীর ফাইল সিস্টেমের সাথে নিরাপদভাবে ইন্টারঅ্যাক্ট করতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...