Skip to content

Commit

Permalink
[FIX] Webdav crash (#14918)
Browse files Browse the repository at this point in the history
  • Loading branch information
MarcosSpessatto authored and sampaiodiego committed Aug 20, 2019
1 parent 82ae503 commit 91cc7cb
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 49 deletions.
29 changes: 11 additions & 18 deletions app/file-upload/ufs/Webdav/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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] !== '/') {
Expand All @@ -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');
}
});

Expand Down Expand Up @@ -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);
};

/**
Expand Down
4 changes: 2 additions & 2 deletions app/webdav/client/addWebdavAccount.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ 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));
}
if (!response.success) {
return toastr.error(t(response.message));
}
toastr.success(t(response.message));
instance.loading.set(false);
modal.close();
});
},
});
Expand Down
61 changes: 61 additions & 0 deletions app/webdav/server/lib/webdavClientAdapter.js
Original file line number Diff line number Diff line change
@@ -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);
}
}
14 changes: 6 additions & 8 deletions app/webdav/server/methods/addWebdavAccount.js
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -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 = {
Expand All @@ -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' };
}
},
});
10 changes: 4 additions & 6 deletions app/webdav/server/methods/getFileFromWebdav.js
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -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);
Expand Down
10 changes: 4 additions & 6 deletions app/webdav/server/methods/getWebdavFileList.js
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -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);
Expand Down
16 changes: 7 additions & 9 deletions app/webdav/server/methods/uploadFileToWebdav.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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();

Expand All @@ -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' });
Expand Down

0 comments on commit 91cc7cb

Please sign in to comment.