Skip to content

Commit f8e195f

Browse files
committed
Merge branch 'pr/2175' into v.0.47.0 (#2177) (#2172)
2 parents 5c5631c + 22675b4 commit f8e195f

38 files changed

+160
-104
lines changed

app/back-end/app.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const Plugins = require('./plugins.js');
2424
const DBUtils = require('./helpers/db.utils.js');
2525
const Site = require('./site.js');
2626
const Utils = require('./helpers/utils.js');
27+
const FileHelper = require('./helpers/file.js');
2728
// List of the Event classes
2829
const EventClasses = require('./events/_modules.js');
2930
// Migration classes
@@ -52,7 +53,7 @@ class App {
5253
this.initPath = path.join(this.appDir, 'config', 'window-config.json');
5354
this.appConfigPath = path.join(this.appDir, 'config', 'app-config.json');
5455
this.tinymceOverridedConfigPath = path.join(this.appDir, 'config', 'tinymce.override.json');
55-
this.versionData = JSON.parse(fs.readFileSync(__dirname + '/builddata.json', 'utf8'));
56+
this.versionData = JSON.parse(FileHelper.readFileSync(__dirname + '/builddata.json', 'utf8'));
5657
this.versionData.os = os.platform() === 'darwin' ? 'mac' : os.platform() === 'linux' ? 'linux' : 'win';
5758
this.windowBounds = null;
5859
this.appConfig = null;
@@ -166,8 +167,8 @@ class App {
166167

167168
// Check if both config.json files exists
168169
if (fs.existsSync(appThemeConfig) && fs.existsSync(userThemeConfig)) {
169-
let appThemeData = JSON.parse(fs.readFileSync(appThemeConfig, 'utf8'));
170-
let userThemeData = JSON.parse(fs.readFileSync(userThemeConfig, 'utf8'));
170+
let appThemeData = JSON.parse(FileHelper.readFileSync(appThemeConfig, 'utf8'));
171+
let userThemeData = JSON.parse(FileHelper.readFileSync(userThemeConfig, 'utf8'));
171172

172173
// If app theme is newer version than the existing one
173174
if(compare(appThemeData.version, userThemeData.version) === 1) {
@@ -232,7 +233,7 @@ class App {
232233
let themeDir = path.join(siteDir, 'input', 'themes', themes.currentTheme(true));
233234
let themeOverridesDir = path.join(siteDir, 'input', 'themes', themes.currentTheme(true) + '-override');
234235
let themeConfig = Themes.loadThemeConfig(themeConfigPath, themeDir);
235-
let menuStructure = fs.readFileSync(menuConfigPath, 'utf8');
236+
let menuStructure = FileHelper.readFileSync(menuConfigPath, 'utf8');
236237
let parsedMenuStructure = {};
237238

238239
try {
@@ -284,7 +285,7 @@ class App {
284285

285286
// Load the config
286287
let defaultSiteConfig = JSON.parse(JSON.stringify(defaultAstCurrentSiteConfig));
287-
let siteConfig = fs.readFileSync(configFilePath);
288+
let siteConfig = FileHelper.readFileSync(configFilePath);
288289
siteConfig = JSON.parse(siteConfig);
289290

290291
if (siteConfig.name !== siteName) {
@@ -438,7 +439,7 @@ class App {
438439
loadConfig () {
439440
// Try to get window bounds
440441
try {
441-
this.windowBounds = JSON.parse(fs.readFileSync(this.initPath, 'utf8'));
442+
this.windowBounds = JSON.parse(FileHelper.readFileSync(this.initPath, 'utf8'));
442443
} catch (e) {
443444
console.log('The window-config.json file will be created');
444445
}
@@ -491,7 +492,7 @@ class App {
491492

492493
// Try to get application config
493494
try {
494-
this.appConfig = JSON.parse(fs.readFileSync(this.appConfigPath, 'utf8'));
495+
this.appConfig = JSON.parse(FileHelper.readFileSync(this.appConfigPath, 'utf8'));
495496
this.appConfig = Utils.mergeObjects(JSON.parse(JSON.stringify(defaultAstAppConfig)), this.appConfig);
496497
} catch (e) {
497498
if (this.hasPermissionsErrors(e)) {
@@ -519,7 +520,7 @@ class App {
519520
loadAdditionalConfig () {
520521
// Try to get TinyMCE overrided config
521522
try {
522-
this.tinymceOverridedConfig = JSON.parse(fs.readFileSync(this.tinymceOverridedConfigPath, 'utf8'));
523+
this.tinymceOverridedConfig = JSON.parse(FileHelper.readFileSync(this.tinymceOverridedConfigPath, 'utf8'));
523524
} catch (e) {}
524525

525526
if (this.appConfig.sitesLocation) {

app/back-end/author.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ const slug = require('./helpers/slug');
88
const ImageHelper = require('./helpers/image.helper.js');
99
const Themes = require('./themes.js');
1010
const Utils = require('./helpers/utils.js');
11+
const FileHelper = require('./helpers/file.js');
1112

1213
/**
1314
* Author Model - used for operations connected with author management
@@ -368,7 +369,7 @@ class Author extends Model {
368369
let themeConfigPath = path.join(this.application.sitesDir, this.site, 'input', 'config', 'theme.config.json');
369370

370371
if (fs.existsSync(themeConfigPath)) {
371-
let themeConfigString = fs.readFileSync(themeConfigPath, 'utf8');
372+
let themeConfigString = FileHelper.readFileSync(themeConfigPath, 'utf8');
372373
themesHelper.checkAndCleanImages(themeConfigString);
373374
}
374375
}

app/back-end/events/app.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require('fs-extra');
22
const path = require('path');
3+
const FileHelper = require('../helpers/file.js');
34
const ipcMain = require('electron').ipcMain;
45
const Themes = require('../themes.js');
56
const Languages = require('../languages.js');
@@ -97,7 +98,7 @@ class AppEvents {
9798
* Save app color theme config
9899
*/
99100
ipcMain.on('app-save-color-theme', function (event, theme) {
100-
let appConfig = fs.readFileSync(appInstance.appConfigPath, 'utf8');
101+
let appConfig = FileHelper.readFileSync(appInstance.appConfigPath, 'utf8');
101102

102103
try {
103104
appConfig = JSON.parse(appConfig);
@@ -440,7 +441,7 @@ class AppEvents {
440441
}
441442

442443
let filePath = path.join(appInstance.app.getPath('logs'), filename);
443-
let fileContent = fs.readFileSync(filePath, 'utf8');
444+
let fileContent = FileHelper.readFileSync(filePath, 'utf8');
444445

445446
event.sender.send('app-log-file-loaded', {
446447
fileContent: fileContent
@@ -458,7 +459,7 @@ class AppEvents {
458459
return;
459460
}
460461

461-
let appConfig = fs.readFileSync(appInstance.appConfigPath, 'utf8');
462+
let appConfig = FileHelper.readFileSync(appInstance.appConfigPath, 'utf8');
462463

463464
try {
464465
appConfig = JSON.parse(appConfig);

app/back-end/events/credits.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const fs = require('fs-extra');
22
const path = require('path');
33
const ipcMain = require('electron').ipcMain;
4+
const FileHelper = require('../helpers/file.js');
45

56
/*
67
* Events for the IPC communication regarding credits
@@ -18,7 +19,7 @@ class CreditsEvents {
1819
}
1920

2021
if(fs.existsSync(filePath)) {
21-
licenseText = fs.readFileSync(filePath, 'utf-8');
22+
licenseText = FileHelper.readFileSync(filePath, 'utf-8');
2223
}
2324

2425
event.sender.send('app-license-loaded', licenseText);

app/back-end/events/page.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require('fs');
22
const path = require('path');
3+
const FileHelper = require('../helpers/file.js');
34
const ipcMain = require('electron').ipcMain;
45
const Page = require('../page.js');
56

@@ -85,7 +86,7 @@ class PageEvents {
8586
let pagesFile = path.join(this.app.sitesDir, siteName, 'input', 'config', 'pages.config.json');
8687

8788
if (fs.existsSync(pagesFile)) {
88-
let pagesHierarchy = JSON.parse(fs.readFileSync(pagesFile, { encoding: 'utf8' }));
89+
let pagesHierarchy = JSON.parse(FileHelper.readFileSync(pagesFile, { encoding: 'utf8' }));
8990
pagesHierarchy = this.removeDuplicatedDataFromHierarchy(pagesHierarchy);
9091
event.sender.send('app-pages-hierarchy-loaded', pagesHierarchy);
9192
} else {
@@ -104,7 +105,7 @@ class PageEvents {
104105
// Update pages hierarchy during post conversion
105106
ipcMain.on('app-pages-hierarchy-update', (event, postIDs) => {
106107
let pagesFile = path.join(this.app.sitesDir, pagesData.siteName, 'input', 'config', 'pages.config.json');
107-
let pagesHierarchy = JSON.parse(fs.readFileSync(pagesFile, { encoding: 'utf8' }));
108+
let pagesHierarchy = JSON.parse(FileHelper.readFileSync(pagesFile, { encoding: 'utf8' }));
108109

109110
for (let i = 0; i < postIDs.length; i++) {
110111
pagesHierarchy.push({

app/back-end/events/plugins-api.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const ipcMain = require('electron').ipcMain;
22
const fs = require('fs');
33
const path = require('path');
4+
const FileHelper = require('../helpers/file.js');
45

56
/*
67
* Events for the IPC communication regarding plugins
@@ -19,7 +20,7 @@ class PluginsApiEvents {
1920
return false;
2021
}
2122

22-
let fileContent = fs.readFileSync(filePath);
23+
let fileContent = FileHelper.readFileSync(filePath);
2324
fileContent = fileContent.toString();
2425
return fileContent;
2526
});
@@ -34,7 +35,7 @@ class PluginsApiEvents {
3435
return false;
3536
}
3637

37-
let fileContent = fs.readFileSync(filePath);
38+
let fileContent = FileHelper.readFileSync(filePath);
3839
fileContent = fileContent.toString();
3940
return fileContent;
4041
});
@@ -50,7 +51,7 @@ class PluginsApiEvents {
5051
return false;
5152
}
5253

53-
let fileContent = fs.readFileSync(filePath);
54+
let fileContent = FileHelper.readFileSync(filePath);
5455
fileContent = fileContent.toString();
5556
return fileContent;
5657
});

app/back-end/events/site.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
const fs = require('fs-extra');
22
const os = require('os');
33
const path = require('path');
4+
const FileHelper = require('../helpers/file.js');
45
const slug = require('./../helpers/slug');
56
const passwordSafeStorage = require('keytar');
67
const ipcMain = require('electron').ipcMain;
@@ -130,7 +131,7 @@ class SiteEvents {
130131
}
131132

132133
let configFile = path.join(appInstance.sitesDir, siteName, 'input', 'config', 'site.config.json');
133-
let oldConfig = fs.readFileSync(configFile, 'utf8');
134+
let oldConfig = FileHelper.readFileSync(configFile, 'utf8');
134135
let themesPath = path.join(appInstance.sitesDir, siteName, 'input', 'themes');
135136
let newThemeConfig = {};
136137
oldConfig = JSON.parse(oldConfig);
@@ -340,7 +341,7 @@ class SiteEvents {
340341
let themeConfigPath = path.join(appInstance.sitesDir, siteName, 'input', 'config', 'theme.config.json');
341342

342343
if (fs.existsSync(themeConfigPath)) {
343-
let themeConfigString = fs.readFileSync(themeConfigPath, 'utf8');
344+
let themeConfigString = FileHelper.readFileSync(themeConfigPath, 'utf8');
344345
themesHelper.checkAndCleanImages(themeConfigString);
345346
}
346347

@@ -604,7 +605,7 @@ class SiteEvents {
604605
}
605606

606607
let configPath = path.join(appInstance.sitesDir, siteName, 'input', 'config', 'site.config.json');
607-
let config = fs.readFileSync(configPath, 'utf8');
608+
let config = FileHelper.readFileSync(configPath, 'utf8');
608609

609610
try {
610611
config = JSON.parse(config);

app/back-end/events/sync.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const fs = require('fs-extra');
22
const path = require('path');
3+
const FileHelper = require('../helpers/file.js');
34
const ipcMain = require('electron').ipcMain;
45

56
/*
@@ -23,7 +24,7 @@ class SyncEvents {
2324

2425
saveSyncStatus(status, siteName) {
2526
let configFile = path.join(this.app.sitesDir, siteName, 'input', 'config', 'site.config.json');
26-
let configContent = fs.readFileSync(configFile, 'utf8');
27+
let configContent = FileHelper.readFileSync(configFile, 'utf8');
2728
configContent = JSON.parse(configContent);
2829
configContent.synced = status;
2930

app/back-end/helpers/file.js

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
const fs = require('fs');
2+
3+
/**
4+
* FileHelper wraps fs.readFileSync to avoid leaking file descriptors.
5+
*/
6+
class FileHelper {
7+
/**
8+
* Reads a file synchronously, ensuring the file descriptor is closed.
9+
* @param {string|Buffer|URL|integer} path - filename or file descriptor
10+
* @param {Object|string} [options] - options or encoding
11+
* @returns {string|Buffer}
12+
*/
13+
static readFileSync(path, options) {
14+
let fd;
15+
try {
16+
fd = fs.openSync(path, 'r');
17+
return fs.readFileSync(fd, options);
18+
} finally {
19+
if (fd !== undefined) {
20+
try { fs.closeSync(fd); } catch (e) { /* ignore */ }
21+
}
22+
}
23+
}
24+
}
25+
26+
module.exports = FileHelper;

app/back-end/helpers/updates.helper.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const fs = require('fs');
2+
const FileHelper = require('./file.js');
23
const https = require('https');
34

45
class UpdatesHelper {
@@ -44,7 +45,7 @@ class UpdatesHelper {
4445

4546
readExistingData () {
4647
if (fs.existsSync(this.filePath)) {
47-
let body = fs.readFileSync(this.filePath, 'utf8');
48+
let body = FileHelper.readFileSync(this.filePath, 'utf8');
4849
this.handleResponse(body);
4950
} else {
5051
this.sendError();

0 commit comments

Comments
 (0)