diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index 81cf6ce75..bf2f08e33 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -178,17 +178,24 @@ function testConfig(apiConfig, callback) { if ('externalDisk' in apiConfig && typeof apiConfig.externalDisk !== 'boolean') return callback(new BoxError(BoxError.BAD_FIELD, 'externalDisk must be boolean', { field: 'externalDisk' })); - fs.stat(apiConfig.backupFolder, function (error, result) { - if (error) return callback(new BoxError(BoxError.BAD_FIELD, 'Directory does not exist or cannot be accessed: ' + error.message), { field: 'backupFolder' }); - if (!result.isDirectory()) return callback(new BoxError(BoxError.BAD_FIELD, 'Backup location is not a directory', { field: 'backupFolder' })); + const stat = safe.fs.statSync(apiConfig.backupFolder); + if (!stat) return callback(new BoxError(BoxError.BAD_FIELD, 'Directory does not exist or cannot be accessed: ' + safe.error.message), { field: 'backupFolder' }); + if (!stat.isDirectory()) return callback(new BoxError(BoxError.BAD_FIELD, 'Backup location is not a directory', { field: 'backupFolder' })); - mkdirp(path.join(apiConfig.backupFolder, 'snapshot'), function (error) { - if (error && error.code === 'EACCES') return callback(new BoxError(BoxError.BAD_FIELD, `Access denied. Run "chown yellowtent:yellowtent ${apiConfig.backupFolder}" on the server`, { field: 'backupFolder' })); - if (error) return callback(new BoxError(BoxError.BAD_FIELD, error.message, { field: 'backupFolder' })); + if (!safe.fs.mkdirSync(path.join(apiConfig.backupFolder, 'snapshot')) && safe.error.code !== 'EEXIST') { + if (safe.error && safe.error.code === 'EACCES') return callback(new BoxError(BoxError.BAD_FIELD, `Access denied. Run "chown yellowtent:yellowtent ${apiConfig.backupFolder}" on the server`, { field: 'backupFolder' })); + return callback(new BoxError(BoxError.BAD_FIELD, safe.error.message, { field: 'backupFolder' })); + } - callback(null); - }); - }); + if (!safe.fs.writeFileSync(path.join(apiConfig.backupFolder, 'cloudron-testfile'), 'testcontent')) { + return callback(new BoxError(BoxError.BAD_FIELD, `Unable to create test file as 'yellowtent' user in ${apiConfig.backupFolder}: ${safe.error.message}. Check dir/mount permissions`, { field: 'backupFolder' })); + } + + if (!safe.fs.unlinkSync(path.join(apiConfig.backupFolder, 'cloudron-testfile'))) { + return callback(new BoxError(BoxError.BAD_FIELD, `Unable to remove test file as 'yellowtent' user in ${apiConfig.backupFolder}: ${safe.error.message}. Check dir/mount permissions`, { field: 'backupFolder' })); + } + + callback(null); } function removePrivateFields(apiConfig) {