diff --git a/src/storage/filesystem.js b/src/storage/filesystem.js index e9b9ef18a..4735c6262 100644 --- a/src/storage/filesystem.js +++ b/src/storage/filesystem.js @@ -91,6 +91,23 @@ function checkPreconditions(apiConfig, dataLayout, callback) { }); } +function hasChownSupportSync(apiConfig) { + switch (apiConfig.provider) { + case PROVIDER_NFS: + case PROVIDER_EXT4: + case PROVIDER_FILESYSTEM: + return true; + case PROVIDER_SSHFS: + // sshfs can be mounted as root or normal user. when mounted as root, we have to chown since we remove backups as the yellowtent user + // when mounted as non-root user, files are created as yellowtent user but they are still owned by the non-root user (thus del also works) + return apiConfig.mountOptions.username === 'root'; + case PROVIDER_CIFS: + return true; + case PROVIDER_MOUNTPOINT: + return apiConfig.chown; + } +} + function upload(apiConfig, backupFilePath, sourceStream, callback) { assert.strictEqual(typeof apiConfig, 'object'); assert.strictEqual(typeof backupFilePath, 'string'); @@ -117,7 +134,7 @@ function upload(apiConfig, backupFilePath, sourceStream, callback) { fileStream.on('finish', function () { const backupUid = parseInt(process.env.SUDO_UID, 10) || process.getuid(); // in test, upload() may or may not be called via sudo script - if ((apiConfig.provider !== PROVIDER_MOUNTPOINT && apiConfig.provider !== PROVIDER_CIFS && apiConfig.provider !== PROVIDER_SSHFS) || apiConfig.chown) { + if (hasChownSupportSync(apiConfig)) { if (!safe.fs.chownSync(backupFilePath, backupUid, backupUid)) return callback(new BoxError(BoxError.EXTERNAL_ERROR, 'Unable to chown:' + safe.error.message)); if (!safe.fs.chownSync(path.dirname(backupFilePath), backupUid, backupUid)) return callback(new BoxError(BoxError.EXTERNAL_ERROR, 'Unable to chown:' + safe.error.message)); }