diff --git a/app/file-upload/ufs/Webdav/server.js b/app/file-upload/ufs/Webdav/server.js index ccfcf25deeca..3cd8838b2442 100644 --- a/app/file-upload/ufs/Webdav/server.js +++ b/app/file-upload/ufs/Webdav/server.js @@ -3,7 +3,8 @@ import stream from 'stream'; import { check } from 'meteor/check'; import { UploadFS } from 'meteor/jalik:ufs'; import { Random } from 'meteor/random'; -import { createClient } from 'webdav'; + +import { WebdavClientAdapter } from '../../../webdav/server/lib/webdavClientAdapter'; /** * WebDAV store * @param options @@ -12,14 +13,8 @@ import { createClient } from 'webdav'; export class WebdavStore extends UploadFS.Store { constructor(options) { super(options); - - const client = createClient( - options.connection.credentials.server, - { - username: options.connection.credentials.username, - password: options.connection.credentials.password, - } - ); + const { server, username, password } = options.connection.credentials; + const client = new WebdavClientAdapter(server, username, password); options.getPath = function(file) { if (options.uploadFolderPath[options.uploadFolderPath.length - 1] !== '/') { @@ -28,9 +23,11 @@ export class WebdavStore extends UploadFS.Store { return options.uploadFolderPath + file._id; }; - client.stat(options.uploadFolderPath).catch(function(err) { - if (err.status === '404') { + client.stat(options.uploadFolderPath).catch((err) => { + if (err.message.toLowerCase() === 'not found') { client.createDirectory(options.uploadFolderPath); + } else if (err.message.toLowerCase() === 'unauthorized') { + console.warn('File upload is unauthorized to connect on Webdav, please verify your credentials'); } }); @@ -73,13 +70,9 @@ export class WebdavStore extends UploadFS.Store { */ this.delete = function(fileId, callback) { const file = this.getCollection().findOne({ _id: fileId }); - client.deleteFile(this.getPath(file), (err, data) => { - if (err) { - console.error(err); - } - - callback && callback(err, data); - }); + client.deleteFile(this.getPath(file)).then((data) => { + callback && callback(null, data); + }).catch(console.error); }; /** diff --git a/app/webdav/client/addWebdavAccount.js b/app/webdav/client/addWebdavAccount.js index 8cdb66a30475..6faf24a97f3e 100644 --- a/app/webdav/client/addWebdavAccount.js +++ b/app/webdav/client/addWebdavAccount.js @@ -25,6 +25,8 @@ Template.addWebdavAccount.events({ return instance.loading.set(false); } Meteor.call('addWebdavAccount', formData, function(error, response) { + modal.close(); + instance.loading.set(false); if (error) { return toastr.error(t(error.error)); } @@ -32,8 +34,6 @@ Template.addWebdavAccount.events({ return toastr.error(t(response.message)); } toastr.success(t(response.message)); - instance.loading.set(false); - modal.close(); }); }, }); diff --git a/app/webdav/server/lib/webdavClientAdapter.js b/app/webdav/server/lib/webdavClientAdapter.js new file mode 100644 index 000000000000..3e646fcf3205 --- /dev/null +++ b/app/webdav/server/lib/webdavClientAdapter.js @@ -0,0 +1,61 @@ +import { createClient } from 'webdav'; + +export class WebdavClientAdapter { + constructor(serverConfig, username, password) { + this._client = createClient( + serverConfig, + { + username, + password, + } + ); + } + + async stat(path) { + try { + return await this._client.stat(path); + } catch (error) { + throw new Error(error.response && error.response.statusText ? error.response.statusText : 'Error checking if directory exists on webdav'); + } + } + + async createDirectory(path) { + try { + return await this._client.createDirectory(path); + } catch (error) { + throw new Error(error.response && error.response.statusText ? error.response.statusText : 'Error creating directory on webdav'); + } + } + + async deleteFile(path) { + try { + return await this._client.deleteFile(path); + } catch (error) { + throw new Error(error.response && error.response.statusText ? error.response.statusText : 'Error deleting file on webdav'); + } + } + + async getFileContents(filename) { + try { + return await this._client.getFileContents(filename); + } catch (error) { + throw new Error(error.response && error.response.statusText ? error.response.statusText : 'Error getting file contents webdav'); + } + } + + async getDirectoryContents(path) { + try { + return await this._client.getDirectoryContents(path); + } catch (error) { + throw new Error(error.response && error.response.statusText ? error.response.statusText : 'Error getting directory contents webdav'); + } + } + + createReadStream(path, options) { + return this._client.createReadStream(path, options); + } + + createWriteStream(path) { + return this._client.createWriteStream(path); + } +} diff --git a/app/webdav/server/methods/addWebdavAccount.js b/app/webdav/server/methods/addWebdavAccount.js index 2834eb52de28..f50c31ee400d 100644 --- a/app/webdav/server/methods/addWebdavAccount.js +++ b/app/webdav/server/methods/addWebdavAccount.js @@ -1,9 +1,9 @@ import { Meteor } from 'meteor/meteor'; import { Match, check } from 'meteor/check'; -import { createClient } from 'webdav'; import { settings } from '../../../settings'; import { WebdavAccounts } from '../../../models'; +import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; Meteor.methods({ async addWebdavAccount(formData) { @@ -23,18 +23,16 @@ Meteor.methods({ pass: String, })); - const client = createClient( + const client = new WebdavClientAdapter( formData.serverURL, - { - username: formData.username, - password: formData.pass, - } + formData.username, + formData.pass, ); try { await client.stat('/'); } catch (error) { - return { success: false, message: 'could-not-access-webdav', error }; + return { success: false, message: 'could-not-access-webdav' }; } const accountData = { @@ -48,7 +46,7 @@ Meteor.methods({ WebdavAccounts.insert(accountData); return { success: true, message: 'webdav-account-saved' }; } catch (error) { - return { success: false, message: error.code === 11000 ? 'duplicated-account' : 'unknown-write-error', error }; + return { success: false, message: error.code === 11000 ? 'duplicated-account' : 'unknown-write-error' }; } }, }); diff --git a/app/webdav/server/methods/getFileFromWebdav.js b/app/webdav/server/methods/getFileFromWebdav.js index 9d3b3a980fdb..52ebc0462bbc 100644 --- a/app/webdav/server/methods/getFileFromWebdav.js +++ b/app/webdav/server/methods/getFileFromWebdav.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; -import { createClient } from 'webdav'; import { settings } from '../../../settings'; import { WebdavAccounts } from '../../../models'; +import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; Meteor.methods({ async getFileFromWebdav(accountId, file) { @@ -17,12 +17,10 @@ Meteor.methods({ if (!account) { throw new Meteor.Error('error-invalid-account', 'Invalid WebDAV Account', { method: 'getFileFromWebdav' }); } - const client = createClient( + const client = new WebdavClientAdapter( account.server_url, - { - username: account.username, - password: account.password, - } + account.username, + account.password, ); try { const fileContent = await client.getFileContents(file.filename); diff --git a/app/webdav/server/methods/getWebdavFileList.js b/app/webdav/server/methods/getWebdavFileList.js index e082fe21e781..d686f7fe1616 100644 --- a/app/webdav/server/methods/getWebdavFileList.js +++ b/app/webdav/server/methods/getWebdavFileList.js @@ -1,8 +1,8 @@ import { Meteor } from 'meteor/meteor'; -import { createClient } from 'webdav'; import { settings } from '../../../settings'; import { WebdavAccounts } from '../../../models'; +import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; Meteor.methods({ async getWebdavFileList(accountId, path) { @@ -19,12 +19,10 @@ Meteor.methods({ throw new Meteor.Error('error-invalid-account', 'Invalid WebDAV Account', { method: 'getWebdavFileList' }); } - const client = createClient( + const client = new WebdavClientAdapter( account.server_url, - { - username: account.username, - password: account.password, - } + account.username, + account.password, ); try { const data = await client.getDirectoryContents(path); diff --git a/app/webdav/server/methods/uploadFileToWebdav.js b/app/webdav/server/methods/uploadFileToWebdav.js index 7460d87050a1..3dfc8e002cae 100644 --- a/app/webdav/server/methods/uploadFileToWebdav.js +++ b/app/webdav/server/methods/uploadFileToWebdav.js @@ -2,10 +2,10 @@ import stream from 'stream'; import { Meteor } from 'meteor/meteor'; import Future from 'fibers/future'; -import { createClient } from 'webdav'; import { settings } from '../../../settings'; import { WebdavAccounts } from '../../../models'; +import { WebdavClientAdapter } from '../lib/webdavClientAdapter'; Meteor.methods({ async uploadFileToWebdav(accountId, fileData, name) { @@ -21,12 +21,10 @@ Meteor.methods({ if (!account) { throw new Meteor.Error('error-invalid-account', 'Invalid WebDAV Account', { method: 'uploadFileToWebdav' }); } - const client = createClient( + const client = new WebdavClientAdapter( account.server_url, - { - username: account.username, - password: account.password, - } + account.username, + account.password, ); const future = new Future(); @@ -50,17 +48,17 @@ Meteor.methods({ await client.stat(uploadFolder).then(function() { bufferStream.pipe(writeStream); }).catch(function(err) { - if (err.status === 404) { + if (err.message.toLowerCase() === 'not found') { client.createDirectory(uploadFolder).then(function() { bufferStream.pipe(writeStream); }).catch(function() { - if (err.status === 404) { + if (err.message.toLowerCase() === 'not found') { future.return({ success: false, message: 'webdav-server-not-found' }); } else { future.return({ success: false, message: 'FileUpload_Error' }); } }); - } else if (err.status === 401) { + } else if (err.message.toLowerCase() === 'unauthorized') { future.return({ success: false, message: 'error-invalid-account' }); } else { future.return({ success: false, message: 'FileUpload_Error' });