Shared folder password change

pull/1/head
yflory 5 years ago
parent 66f2ece08e
commit 302030e1ee

@ -116,7 +116,7 @@
}*/ }*/
} }
.dialog, .alert { .dialog {
& > div { & > div {
background-color: @alertify-dialog-bg; background-color: @alertify-dialog-bg;
&.half { &.half {
@ -205,6 +205,16 @@
} }
} }
::placeholder { /* Chrome, Firefox, Opera, Safari 10.1+ */
color: darken(@alertify-input-fg, 15%);
opacity: 1; /* Firefox */
}
:-ms-input-placeholder { /* Internet Explorer 10-11 */
color: darken(@alertify-input-fg, 15%);
}
::-ms-input-placeholder { /* Microsoft Edge */
color: darken(@alertify-input-fg, 15%);
}
input:not(.form-control), textarea { input:not(.form-control), textarea {
background-color: @alertify-input-bg; background-color: @alertify-input-bg;
color: @alertify-input-fg; color: @alertify-input-fg;

@ -548,6 +548,7 @@ define([
var sframeChan = common.getSframeChannel(); var sframeChan = common.getSframeChannel();
var changePwTitle = Messages.properties_changePassword; var changePwTitle = Messages.properties_changePassword;
var changePwConfirm = Messages.properties_confirmChange; var changePwConfirm = Messages.properties_confirmChange;
var isSharedFolder = parsed.type === 'drive';
if (!hasPassword) { if (!hasPassword) {
changePwTitle = Messages.properties_addPassword; changePwTitle = Messages.properties_addPassword;
changePwConfirm = Messages.properties_confirmNew; changePwConfirm = Messages.properties_confirmNew;
@ -577,6 +578,7 @@ define([
password: newPass password: newPass
}, function (err, data) { }, function (err, data) {
if (err || data.error) { if (err || data.error) {
console.error(err || data.error);
return void UI.alert(Messages.properties_passwordError); return void UI.alert(Messages.properties_passwordError);
} }
UI.findOKButton().click(); UI.findOKButton().click();
@ -589,7 +591,9 @@ define([
}, {force: true}); }, {force: true});
} }
return void UI.alert(Messages.properties_passwordSuccess, function () { return void UI.alert(Messages.properties_passwordSuccess, function () {
if (!isSharedFolder) {
common.gotoURL(hasPassword && newPass ? undefined : (data.href || data.roHref)); common.gotoURL(hasPassword && newPass ? undefined : (data.href || data.roHref));
}
}, {force: true}); }, {force: true});
}); });
}); });

@ -867,13 +867,15 @@ define([
} }
var newHref = '/' + parsed.type + '/#' + newHash; var newHref = '/' + parsed.type + '/#' + newHash;
var isSharedFolder = parsed.type === 'drive';
var optsGet = {}; var optsGet = {};
var optsPut = { var optsPut = {
password: newPassword, password: newPassword,
metadata: {} metadata: {},
initialState: isSharedFolder ? '{}' : undefined
}; };
Nthen(function (waitFor) { Nthen(function (waitFor) {
if (parsed.hashData && parsed.hashData.password) { if (parsed.hashData && parsed.hashData.password) {
common.getPadAttribute('password', waitFor(function (err, password) { common.getPadAttribute('password', waitFor(function (err, password) {
@ -933,7 +935,9 @@ define([
} }
var expire = oldMetadata.expire; var expire = oldMetadata.expire;
if (expire) {
optsPut.metadata.expire = (expire - (+new Date())) / 1000; // Lifetime in seconds optsPut.metadata.expire = (expire - (+new Date())) / 1000; // Lifetime in seconds
}
}).nThen(function (waitFor) { }).nThen(function (waitFor) {
Crypt.get(parsed.hash, waitFor(function (err, val) { Crypt.get(parsed.hash, waitFor(function (err, val) {
if (err) { if (err) {
@ -948,23 +952,22 @@ define([
}), optsPut); }), optsPut);
}), optsGet); }), optsGet);
}).nThen(function (waitFor) { }).nThen(function (waitFor) {
if (isSharedFolder) {
postMessage("UPDATE_SHARED_FOLDER_PASSWORD", {
href: href,
oldChannel: oldChannel,
password: newPassword
}, waitFor(function (obj) {
console.error(obj);
}));
return;
}
pad.leavePad({ pad.leavePad({
channel: oldChannel channel: oldChannel
}, waitFor()); }, waitFor());
pad.onDisconnectEvent.fire(true); pad.onDisconnectEvent.fire(true);
}).nThen(function (waitFor) { }).nThen(function (waitFor) {
common.removeOwnedChannel({ // Set the new password to our pad data
channel: oldChannel,
teamId: teamId
}, waitFor(function (obj) {
if (obj && obj.error) {
waitFor.abort();
return void cb(obj);
}
}));
common.unpinPads([oldChannel], waitFor(), teamId);
common.pinPads([newSecret.channel], waitFor(), teamId);
}).nThen(function (waitFor) {
common.setPadAttribute('password', newPassword, waitFor(function (err) { common.setPadAttribute('password', newPassword, waitFor(function (err) {
if (err) { warning = true; } if (err) { warning = true; }
}), href); }), href);
@ -981,6 +984,21 @@ define([
common.setPadAttribute('href', newHref, waitFor(function (err) { common.setPadAttribute('href', newHref, waitFor(function (err) {
if (err) { warning = true; } if (err) { warning = true; }
}), href); }), href);
}).nThen(function (waitFor) {
// delete the old pad
common.removeOwnedChannel({
channel: oldChannel,
teamId: teamId
}, waitFor(function (obj) {
if (obj && obj.error) {
waitFor.abort();
return void cb(obj);
}
}));
if (!isSharedFolder) {
common.unpinPads([oldChannel], waitFor(), teamId);
common.pinPads([newSecret.channel], waitFor(), teamId);
}
}).nThen(function () { }).nThen(function () {
cb({ cb({
warning: warning, warning: warning,

@ -3745,7 +3745,7 @@ define([
if (manager.isSharedFolder(el)) { if (manager.isSharedFolder(el)) {
delete data.roHref; delete data.roHref;
//data.noPassword = true; //data.noPassword = true;
data.noEditPassword = true; //data.noEditPassword = true;
data.noExpiration = true; data.noExpiration = true;
// this is here to allow users to check the channel id of a shared folder // this is here to allow users to check the channel id of a shared folder
// we should remove it at some point // we should remove it at some point
@ -4403,6 +4403,7 @@ define([
refresh(); refresh();
UI.removeLoadingScreen(); UI.removeLoadingScreen();
/*
if (!APP.team) { if (!APP.team) {
sframeChan.query('Q_DRIVE_GETDELETED', null, function (err, data) { sframeChan.query('Q_DRIVE_GETDELETED', null, function (err, data) {
var ids = manager.findChannels(data); var ids = manager.findChannels(data);
@ -4417,6 +4418,83 @@ define([
UI.log(Messages._getKey('fm_deletedPads', [titles.join(', ')])); UI.log(Messages._getKey('fm_deletedPads', [titles.join(', ')]));
}); });
} }
*/
var deprecated = files.sharedFoldersTemp;
var nt = nThen;
var passwordModal = function (fId, data, cb) {
var content = [];
var folderName = '<b>'+ (data.lastTitlei || Messages.fm_newFolder) +'</b>';
content.push(UI.setHTML(h('p'), Messages._getKey('drive_sfPassword', [folderName])));
if (data.lastTitle) {
content.push(h('p', [
Messages.fm_folderName,
' ',
h('input', data.lastTitle)
]));
}
var newPassword = UI.passwordInput({
id: 'cp-app-prop-change-password',
placeholder: Messages.settings_changePasswordNew,
style: 'flex: 1;'
});
var passwordOk = h('button', Messages.properties_changePasswordButton);
var changePass = h('span.cp-password-container', [
newPassword,
passwordOk
]);
content.push(changePass);
var div = h('div', content);
var locked = false;
$(passwordOk).click(function () {
if (locked) { return; }
var pw = $(newPassword).find('.cp-password-input').val();
locked = true;
$(div).find('.alert').remove();
$(passwordOk).html('').append(h('span.fa.fa-spinner.fa-spin', {style: 'margin-left: 0'}));
manager.restoreSharedFolder(fId, pw, function (err, obj) {
if (obj && obj.error) {
var wrong = h('div.alert.alert-danger', Messages.drive_sfPasswordError);
$(div).prepend(wrong);
$(passwordOk).text(Messages.properties_changePasswordButton);
locked = false;
return;
}
UI.findCancelButton($(div).closest('.alertify')).click();
cb();
});
});
var buttons = [{
className: 'primary',
name: Messages.forgetButton,
onClick: function () {
manager.delete([['sharedFoldersTemp', fId]], function () {
});
},
keys: []
}, {
className: 'cancel',
name: Messages.later,
onClick: function () {},
keys: [27]
}];
return UI.dialog.customModal(div, {
buttons: buttons,
onClose: cb
});
};
if (typeof (deprecated) === "object") {
Object.keys(deprecated).forEach(function (fId) {
nt = nt(function (waitFor) {
var data = deprecated[fId];
UI.openCustomModal(passwordModal(fId, data, waitFor()));
}).nThen;
});
nt(function () {
refresh();
});
}
return { return {
refresh: refresh, refresh: refresh,

@ -454,7 +454,7 @@ define([
Store.isNewChannel = function (clientId, data, cb) { Store.isNewChannel = function (clientId, data, cb) {
if (!store.anon_rpc) { return void cb({error: 'ANON_RPC_NOT_READY'}); } if (!store.anon_rpc) { return void cb({error: 'ANON_RPC_NOT_READY'}); }
var channelId = Hash.hrefToHexChannelId(data.href, data.password); var channelId = data.channel || Hash.hrefToHexChannelId(data.href, data.password);
store.anon_rpc.send("IS_NEW_CHANNEL", channelId, function (e, response) { store.anon_rpc.send("IS_NEW_CHANNEL", channelId, function (e, response) {
if (e) { return void cb({error: e}); } if (e) { return void cb({error: e}); }
if (response && response.length && typeof(response[0]) === 'boolean') { if (response && response.length && typeof(response[0]) === 'boolean') {
@ -1778,21 +1778,24 @@ define([
} }
}; };
}; };
Store.loadSharedFolder = function (teamId, id, data, cb) { Store.loadSharedFolder = function (teamId, id, data, cb, isNew) {
var s = getStore(teamId); var s = getStore(teamId);
if (!s) { return void cb({ error: 'ENOTFOUND' }); } if (!s) { return void cb({ error: 'ENOTFOUND' }); }
var rt = SF.load({ SF.load({
isNew: isNew,
network: store.network, network: store.network,
store: s store: s,
isNewChannel: Store.isNewChannel
}, id, data, cb); }, id, data, cb);
return rt;
}; };
var loadSharedFolder = function (id, data, cb) { var loadSharedFolder = function (id, data, cb, isNew) {
Store.loadSharedFolder(null, id, data, cb); Store.loadSharedFolder(null, id, data, cb, isNew);
}; };
Store.loadSharedFolderAnon = function (clientId, data, cb) { Store.loadSharedFolderAnon = function (clientId, data, cb) {
Store.loadSharedFolder(null, data.id, data.data, function () { Store.loadSharedFolder(null, data.id, data.data, function (rt) {
cb(); cb({
error: rt ? undefined : 'EDELETED'
});
}); });
}; };
Store.addSharedFolder = function (clientId, data, cb) { Store.addSharedFolder = function (clientId, data, cb) {
@ -1805,6 +1808,9 @@ define([
cb(id); cb(id);
}); });
}; };
Store.updateSharedFolderPassword = function (clientId, data, cb) {
SF.updatePassword(Store, data, store.network, cb);
};
// Drive // Drive
Store.userObjectCommand = function (clientId, cmdData, cb) { Store.userObjectCommand = function (clientId, cmdData, cb) {
@ -1889,6 +1895,27 @@ define([
}); });
}; };
registerProxyEvents = function (proxy, fId) { registerProxyEvents = function (proxy, fId) {
if (!fId) {
// Listen for shared folder password change
proxy.on('change', ['drive', UserObject.SHARED_FOLDERS], function (o, n, p) {
if (p.length > 3 && p[3] === 'password') {
var id = p[2];
var data = proxy.drive[UserObject.SHARED_FOLDERS][id];
var href = store.manager.user.userObject.getHref ?
store.manager.user.userObject.getHref(data) : data.href;
var parsed = Hash.parsePadUrl(href);
var secret = Hash.getSecrets(parsed.type, parsed.hash, o);
SF.updatePassword({
oldChannel: secret.channel,
password: n,
href: href
}, store.network, function () {
console.log('Shared folder password changed');
});
return false;
}
});
}
proxy.on('change', [], function (o, n, p) { proxy.on('change', [], function (o, n, p) {
if (fId) { if (fId) {
// Pin the new pads // Pin the new pads
@ -2039,7 +2066,8 @@ define([
pin: pin, pin: pin,
unpin: unpin, unpin: unpin,
loadSharedFolder: loadSharedFolder, loadSharedFolder: loadSharedFolder,
settings: proxy.settings settings: proxy.settings,
Store: Store
}, { }, {
outer: true, outer: true,
removeOwnedChannel: function (channel, cb) { Store.removeOwnedChannel('', channel, cb); }, removeOwnedChannel: function (channel, cb) { Store.removeOwnedChannel('', channel, cb); },

@ -22,12 +22,25 @@ define([
SF.load = function (config, id, data, cb) { SF.load = function (config, id, data, cb) {
var network = config.network; var network = config.network;
var store = config.store; var store = config.store;
var teamId = store.id || -1; var isNew = config.isNew;
var isNewChannel = config.isNewChannel;
var teamId = store.id;
var handler = store.handleSharedFolder; var handler = store.handleSharedFolder;
var parsed = Hash.parsePadUrl(data.href); var parsed = Hash.parsePadUrl(data.href);
var secret = Hash.getSecrets('drive', parsed.hash, data.password); var secret = Hash.getSecrets('drive', parsed.hash, data.password);
// If we try to load en existing shared folder (isNew === false) but this folder
// doesn't exist in the database, abort and cb
nThen(function (waitFor) {
isNewChannel(null, { channel: secret.channel }, waitFor(function (obj) {
if (obj.isNew && !isNew) {
store.manager.deprecateProxy(id, secret.channel);
waitFor.abort();
return void cb(null);
}
}));
}).nThen(function () {
var sf = allSharedFolders[secret.channel]; var sf = allSharedFolders[secret.channel];
if (sf && sf.ready && sf.rt) { if (sf && sf.ready && sf.rt) {
// The shared folder is already loaded, return its data // The shared folder is already loaded, return its data
@ -36,7 +49,7 @@ define([
store.manager.addProxy(id, sf.rt.proxy, leave); store.manager.addProxy(id, sf.rt.proxy, leave);
cb(sf.rt, sf.metadata); cb(sf.rt, sf.metadata);
}); });
sf.team.push(teamId); sf.teams.push(store);
if (handler) { handler(id, sf.rt); } if (handler) { handler(id, sf.rt); }
return sf.rt; return sf.rt;
} }
@ -47,7 +60,7 @@ define([
store: store, store: store,
id: id id: id
}); });
sf.team.push(teamId); sf.teams.push(store);
if (handler) { handler(id, sf.rt); } if (handler) { handler(id, sf.rt); }
return sf.rt; return sf.rt;
} }
@ -58,7 +71,7 @@ define([
store: store, store: store,
id: id id: id
}], }],
team: [store.id || -1] teams: [store]
}; };
var owners = data.owners; var owners = data.owners;
@ -87,13 +100,26 @@ define([
obj.store.manager.addProxy(obj.id, rt.proxy, leave); obj.store.manager.addProxy(obj.id, rt.proxy, leave);
obj.cb(rt, info.metadata); obj.cb(rt, info.metadata);
}); });
sf.leave = info.leave;
sf.metadata = info.metadata; sf.metadata = info.metadata;
sf.ready = true; sf.ready = true;
delete sf.queue; delete sf.queue;
}); });
rt.proxy.on('error', function (info) {
if (info && info.error) {
if (info.error === "EDELETED" ) {
try {
// Deprecate the shared folder from each team
sf.teams.forEach(function (store) {
store.manager.deprecateProxy(id, secret.channel);
});
} catch (e) {}
delete allSharedFolders[secret.channel];
}
}
});
if (handler) { handler(id, rt); } if (handler) { handler(id, rt); }
return rt; });
}; };
SF.leave = function (channel, teamId) { SF.leave = function (channel, teamId) {
@ -101,8 +127,14 @@ define([
if (!sf) { return; } if (!sf) { return; }
var clients = sf.teams; var clients = sf.teams;
if (!Array.isArray(clients)) { return; } if (!Array.isArray(clients)) { return; }
var idx = clients.indexOf(teamId); var idx;
if (idx === -1) { return; } clients.some(function (store, i) {
if (store.id === teamId) {
idx = i;
return true;
}
});
if (typeof (idx) === "undefined") { return; }
// Remove the selected team // Remove the selected team
clients.splice(idx, 1); clients.splice(idx, 1);
@ -113,6 +145,38 @@ define([
} }
}; };
SF.updatePassword = function (Store, data, network, cb) {
var oldChannel = data.oldChannel;
var href = data.href;
var password = data.password;
var parsed = Hash.parsePadUrl(href);
var secret = Hash.getSecrets(parsed.type, parsed.hash, password);
var sf = allSharedFolders[oldChannel];
if (!sf) { return void cb({ error: 'ENOTFOUND' }); }
if (sf.rt && sf.rt.stop) {
sf.rt.stop();
}
var nt = nThen;
sf.teams.forEach(function (s) {
nt = nt(function (waitFor) {
var sfId = s.manager.user.userObject.getSFIdFromHref(href);
var shared = Util.find(s.proxy, ['drive', UserObject.SHARED_FOLDERS]) || {};
if (!sfId || !shared[sfId]) { return; }
var sf = JSON.parse(JSON.stringify(shared[sfId]));
sf.password = password;
SF.load({
network: network,
store: s,
isNewChannel: Store.isNewChannel
}, sfId, sf, waitFor());
if (!s.rpc) { return; }
s.rpc.unpin([oldChannel], waitFor());
s.rpc.pin([secret.channel], waitFor());
}).nThen;
});
nt(cb);
};
/* loadSharedFolders /* loadSharedFolders
load all shared folder stored in a given drive load all shared folder stored in a given drive
- store: user or team main store - store: user or team main store
@ -121,35 +185,13 @@ define([
*/ */
SF.loadSharedFolders = function (Store, network, store, userObject, waitFor) { SF.loadSharedFolders = function (Store, network, store, userObject, waitFor) {
var shared = Util.find(store.proxy, ['drive', UserObject.SHARED_FOLDERS]) || {}; var shared = Util.find(store.proxy, ['drive', UserObject.SHARED_FOLDERS]) || {};
// Check if any of our shared folder is expired or deleted by its owner.
// If we don't check now, Listmap will create an empty proxy if it no longer exists on
// the server.
nThen(function (waitFor) { nThen(function (waitFor) {
var checkExpired = Object.keys(shared).map(function (fId) {
return shared[fId].channel;
});
Store.getDeletedPads(null, {list: checkExpired}, waitFor(function (chans) {
if (chans && chans.error) { return void console.error(chans.error); }
if (!Array.isArray(chans) || !chans.length) { return; }
var toDelete = [];
Object.keys(shared).forEach(function (fId) {
if (chans.indexOf(shared[fId].channel) !== -1
&& toDelete.indexOf(fId) === -1) {
toDelete.push(fId);
}
});
toDelete.forEach(function (fId) {
var paths = userObject.findFile(Number(fId));
userObject.delete(paths, waitFor(), true);
delete shared[fId];
});
}));
}).nThen(function (waitFor) {
Object.keys(shared).forEach(function (id) { Object.keys(shared).forEach(function (id) {
var sf = shared[id]; var sf = shared[id];
SF.load({ SF.load({
network: network, network: network,
store: store store: store,
isNewChannel: Store.isNewChannel
}, id, sf, waitFor()); }, id, sf, waitFor());
}); });
}).nThen(waitFor()); }).nThen(waitFor());

@ -56,6 +56,7 @@ define([
ADD_SHARED_FOLDER: Store.addSharedFolder, ADD_SHARED_FOLDER: Store.addSharedFolder,
LOAD_SHARED_FOLDER: Store.loadSharedFolderAnon, LOAD_SHARED_FOLDER: Store.loadSharedFolderAnon,
RESTORE_SHARED_FOLDER: Store.restoreSharedFolder, RESTORE_SHARED_FOLDER: Store.restoreSharedFolder,
UPDATE_SHARED_FOLDER_PASSWORD: Store.updateSharedFolderPassword,
// Messaging // Messaging
ANSWER_FRIEND_REQUEST: Store.answerFriendRequest, ANSWER_FRIEND_REQUEST: Store.answerFriendRequest,
SEND_FRIEND_REQUEST: Store.sendFriendRequest, SEND_FRIEND_REQUEST: Store.sendFriendRequest,

@ -31,6 +31,27 @@ define([
var registerChangeEvents = function (ctx, team, proxy, fId) { var registerChangeEvents = function (ctx, team, proxy, fId) {
if (!team) { return; } if (!team) { return; }
if (!fId) {
// Listen for shared folder password change
proxy.on('change', ['drive', UserObject.SHARED_FOLDERS], function (o, n, p) {
if (p.length > 3 && p[3] === 'password') {
var id = p[2];
var data = proxy.drive[UserObject.SHARED_FOLDERS][id];
var href = team.manager.user.userObject.getHref ?
team.manager.user.userObject.getHref(data) : data.href;
var parsed = Hash.parsePadUrl(href);
var secret = Hash.getSecrets(parsed.type, parsed.hash, o);
SF.updatePassword(ctx.Store, {
oldChannel: secret.channel,
password: n,
href: href
}, ctx.store.network, function () {
console.log('Shared folder password changed');
});
return false;
}
});
}
proxy.on('change', [], function (o, n, p) { proxy.on('change', [], function (o, n, p) {
if (fId) { if (fId) {
// Pin the new pads // Pin the new pads
@ -208,13 +229,13 @@ define([
}; };
})); }));
}).nThen(function () { }).nThen(function () {
var loadSharedFolder = function (id, data, cb) { var loadSharedFolder = function (id, data, cb, isNew) {
SF.load({ SF.load({
isNew: isNew,
network: ctx.store.network, network: ctx.store.network,
store: team store: team,
}, id, data, function (id, rt) { isNewChannel: ctx.Store.isNewChannel
cb(id, rt); }, id, data, cb);
});
}; };
var manager = team.manager = ProxyManager.create(proxy.drive, { var manager = team.manager = ProxyManager.create(proxy.drive, {
onSync: function (cb) { ctx.Store.onSync(id, cb); }, onSync: function (cb) { ctx.Store.onSync(id, cb); },
@ -224,7 +245,8 @@ define([
loadSharedFolder: loadSharedFolder, loadSharedFolder: loadSharedFolder,
settings: { settings: {
drive: Util.find(ctx.store, ['proxy', 'settings', 'drive']) drive: Util.find(ctx.store, ['proxy', 'settings', 'drive'])
} },
Store: ctx.Store
}, { }, {
outer: true, outer: true,
removeOwnedChannel: function (channel, cb) { removeOwnedChannel: function (channel, cb) {

@ -28,6 +28,7 @@ define([
var TRASH = exp.TRASH; var TRASH = exp.TRASH;
var TEMPLATE = exp.TEMPLATE; var TEMPLATE = exp.TEMPLATE;
var SHARED_FOLDERS = exp.SHARED_FOLDERS; var SHARED_FOLDERS = exp.SHARED_FOLDERS;
var SHARED_FOLDERS_TEMP = exp.SHARED_FOLDERS_TEMP;
var debug = exp.debug; var debug = exp.debug;
@ -74,6 +75,15 @@ define([
cb(null, id); cb(null, id);
}; };
exp.deprecateSharedFolder = function (id) {
var data = files[SHARED_FOLDERS][id];
if (!data) { return; }
files[SHARED_FOLDERS_TEMP][id] = JSON.parse(JSON.stringify(data));
var paths = exp.findFile(Number(id));
exp.delete(paths, null, true);
delete files[SHARED_FOLDERS][id];
};
// FILES DATA // FILES DATA
var spliceFileData = function (id) { var spliceFileData = function (id) {
delete files[FILES_DATA][id]; delete files[FILES_DATA][id];
@ -724,6 +734,10 @@ define([
var fixSharedFolders = function () { var fixSharedFolders = function () {
if (sharedFolder) { return; } if (sharedFolder) { return; }
if (typeof(files[SHARED_FOLDERS]) !== "object") { debug("SHARED_FOLDER was not an object"); files[SHARED_FOLDERS] = {}; } if (typeof(files[SHARED_FOLDERS]) !== "object") { debug("SHARED_FOLDER was not an object"); files[SHARED_FOLDERS] = {}; }
if (typeof(files[SHARED_FOLDERS_TEMP]) !== "object") {
debug("SHARED_FOLDER_TEMP was not an object");
files[SHARED_FOLDERS_TEMP] = {};
}
var sf = files[SHARED_FOLDERS]; var sf = files[SHARED_FOLDERS];
var rootFiles = exp.getFiles([ROOT]); var rootFiles = exp.getFiles([ROOT]);
var root = exp.find([ROOT]); var root = exp.find([ROOT]);
@ -749,6 +763,7 @@ define([
} }
}; };
var fixDrive = function () { var fixDrive = function () {
Object.keys(files).forEach(function (key) { Object.keys(files).forEach(function (key) {
if (key.slice(0,1) === '/') { delete files[key]; } if (key.slice(0,1) === '/') { delete files[key]; }

@ -23,6 +23,12 @@ define([
// Only in outer // Only in outer
userObject.fixFiles(); userObject.fixFiles();
} }
if (proxy.metadata && proxy.metadata.title) {
var sf = Env.user.proxy[UserObject.SHARED_FOLDERS][id];
if (sf) {
sf.lastTitle = proxy.metadata.title;
}
}
Env.folders[id] = { Env.folders[id] = {
proxy: proxy, proxy: proxy,
userObject: userObject, userObject: userObject,
@ -39,6 +45,12 @@ define([
delete Env.folders[id]; delete Env.folders[id];
}; };
// Password may have changed
var deprecateProxy = function (Env, id, channel) {
Env.unpinPads([channel], function () {});
Env.user.userObject.deprecateSharedFolder(id);
};
/* /*
Tools Tools
*/ */
@ -447,6 +459,11 @@ define([
// 2b. load the proxy // 2b. load the proxy
Env.loadSharedFolder(id, folderData, waitFor(function (rt, metadata) { Env.loadSharedFolder(id, folderData, waitFor(function (rt, metadata) {
if (!rt) {
waitFor.abort();
return void cb({ error: 'EDELETED' });
}
if (!rt.proxy.metadata) { // Creating a new shared folder if (!rt.proxy.metadata) { // Creating a new shared folder
rt.proxy.metadata = { title: data.name || Messages.fm_newFolder }; rt.proxy.metadata = { title: data.name || Messages.fm_newFolder };
} }
@ -456,7 +473,7 @@ define([
if (metadata.owners) { fData.owners = metadata.owners; } if (metadata.owners) { fData.owners = metadata.owners; }
if (metadata.expire) { fData.expire = +metadata.expire; } if (metadata.expire) { fData.expire = +metadata.expire; }
} }
})); }), !Boolean(data.folderData));
}).nThen(function () { }).nThen(function () {
Env.onSync(function () { Env.onSync(function () {
cb(id); cb(id);
@ -464,6 +481,42 @@ define([
}); });
}; };
var _restoreSharedFolder = function (Env, _data, cb) {
var fId = _data.id;
var newPassword = _data.password;
var temp = Util.find(Env, ['user', 'proxy', UserObject.SHARED_FOLDERS_TEMP]);
var data = temp && temp[fId];
if (!data) { return void cb({ error: 'EINVAL' }); }
if (!Env.Store) { return void cb({ error: 'ESTORE' }); }
var href = Env.user.userObject.getHref ? Env.user.userObject.getHref(data) : data.href;
var isNew = false;
nThen(function (waitFor) {
Env.Store.isNewChannel(null, {
href: href,
password: newPassword
}, waitFor(function (obj) {
if (!obj || obj.error) {
isNew = false;
return;
}
isNew = obj.isNew;
}));
}).nThen(function () {
if (isNew) {
return void cb({ error: 'ENOTFOUND' });
}
data.password = newPassword;
_addSharedFolder(Env, {
path: ['root'],
folderData: data,
}, function () {
delete temp[fId];
Env.onSync(cb);
});
});
};
// convert a folder to a Shared Folder // convert a folder to a Shared Folder
var _convertFolderToSharedFolder = function (Env, data, cb) { var _convertFolderToSharedFolder = function (Env, data, cb) {
return void cb({ return void cb({
@ -570,6 +623,13 @@ define([
return void cb({error: 'E_NOTFOUND'}); return void cb({error: 'E_NOTFOUND'});
} }
// Deleted or password changed for a shared folder
if (data.paths.length === 1 && data.paths[0][0] === UserObject.SHARED_FOLDERS_TEMP) {
var temp = Util.find(Env, ['user', 'proxy', UserObject.SHARED_FOLDERS_TEMP]);
delete temp[data.paths[0][1]];
return void Env.onSync(cb);
}
var toUnpin = []; var toUnpin = [];
var ownedRemoved; var ownedRemoved;
nThen(function (waitFor)  { nThen(function (waitFor)  {
@ -666,6 +726,7 @@ define([
var el = Env.user.userObject.find(resolved.path); var el = Env.user.userObject.find(resolved.path);
if (Env.user.userObject.isSharedFolder(el) && Env.folders[el]) { if (Env.user.userObject.isSharedFolder(el) && Env.folders[el]) {
Env.folders[el].proxy.metadata.title = data.newName; Env.folders[el].proxy.metadata.title = data.newName;
Env.user.proxy[UserObject.SHARED_FOLDERS][el].lastTitle = data.value;
return void cb(); return void cb();
} }
} }
@ -699,6 +760,8 @@ define([
_addFolder(Env, data, cb); break; _addFolder(Env, data, cb); break;
case 'addSharedFolder': case 'addSharedFolder':
_addSharedFolder(Env, data, cb); break; _addSharedFolder(Env, data, cb); break;
case 'restoreSharedFolder':
_restoreSharedFolder(Env, data, cb); break;
case 'convertFolderToSharedFolder': case 'convertFolderToSharedFolder':
_convertFolderToSharedFolder(Env, data, cb); break; _convertFolderToSharedFolder(Env, data, cb); break;
case 'delete': case 'delete':
@ -925,6 +988,7 @@ define([
pinPads: data.pin, pinPads: data.pin,
unpinPads: data.unpin, unpinPads: data.unpin,
onSync: data.onSync, onSync: data.onSync,
Store: data.Store,
loadSharedFolder: data.loadSharedFolder, loadSharedFolder: data.loadSharedFolder,
cfg: uoConfig, cfg: uoConfig,
edPublic: data.edPublic, edPublic: data.edPublic,
@ -947,6 +1011,7 @@ define([
// Manager // Manager
addProxy: callWithEnv(addProxy), addProxy: callWithEnv(addProxy),
removeProxy: callWithEnv(removeProxy), removeProxy: callWithEnv(removeProxy),
deprecateProxy: callWithEnv(deprecateProxy),
addSharedFolder: callWithEnv(_addSharedFolder), addSharedFolder: callWithEnv(_addSharedFolder),
// Drive // Drive
command: callWithEnv(onCommand), command: callWithEnv(onCommand),
@ -1016,6 +1081,15 @@ define([
} }
}, cb); }, cb);
}; };
var restoreSharedFolderInner = function (Env, fId, password, cb) {
return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", {
cmd: "restoreSharedFolder",
data: {
id: fId,
password: password
}
}, cb);
};
var convertFolderToSharedFolderInner = function (Env, path, owned, password, cb) { var convertFolderToSharedFolderInner = function (Env, path, owned, password, cb) {
return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", { return void Env.sframeChan.query("Q_DRIVE_USEROBJECT", {
cmd: "convertFolderToSharedFolder", cmd: "convertFolderToSharedFolder",
@ -1228,6 +1302,7 @@ define([
emptyTrash: callWithEnv(emptyTrashInner), emptyTrash: callWithEnv(emptyTrashInner),
addFolder: callWithEnv(addFolderInner), addFolder: callWithEnv(addFolderInner),
addSharedFolder: callWithEnv(addSharedFolderInner), addSharedFolder: callWithEnv(addSharedFolderInner),
restoreSharedFolder: callWithEnv(restoreSharedFolderInner),
convertFolderToSharedFolder: callWithEnv(convertFolderToSharedFolderInner), convertFolderToSharedFolder: callWithEnv(convertFolderToSharedFolderInner),
delete: callWithEnv(deleteInner), delete: callWithEnv(deleteInner),
restore: callWithEnv(restoreInner), restore: callWithEnv(restoreInner),

@ -118,7 +118,7 @@ define([
msgEv.fire(msg); msgEv.fire(msg);
}); });
SFrameChannel.create(msgEv, postMsg, waitFor(function (sfc) { SFrameChannel.create(msgEv, postMsg, waitFor(function (sfc) {
sframeChan = sfc; Utils.sframeChan = sframeChan = sfc;
})); }));
}); });
window.addEventListener('message', whenReady); window.addEventListener('message', whenReady);

@ -14,6 +14,7 @@ define([
var TRASH = module.TRASH = "trash"; var TRASH = module.TRASH = "trash";
var TEMPLATE = module.TEMPLATE = "template"; var TEMPLATE = module.TEMPLATE = "template";
var SHARED_FOLDERS = module.SHARED_FOLDERS = "sharedFolders"; var SHARED_FOLDERS = module.SHARED_FOLDERS = "sharedFolders";
var SHARED_FOLDERS_TEMP = module.SHARED_FOLDERS_TEMP = "sharedFoldersTemp"; // Maybe deleted or new password
// Create untitled documents when no name is given // Create untitled documents when no name is given
var getLocaleDate = function () { var getLocaleDate = function () {
@ -45,6 +46,7 @@ define([
exp.TRASH = TRASH; exp.TRASH = TRASH;
exp.TEMPLATE = TEMPLATE; exp.TEMPLATE = TEMPLATE;
exp.SHARED_FOLDERS = SHARED_FOLDERS; exp.SHARED_FOLDERS = SHARED_FOLDERS;
exp.SHARED_FOLDERS_TEMP = SHARED_FOLDERS_TEMP;
var sharedFolder = exp.sharedFolder = config.sharedFolder; var sharedFolder = exp.sharedFolder = config.sharedFolder;
exp.id = config.id; exp.id = config.id;
@ -379,11 +381,17 @@ define([
return Util.deduplicateString(ret); return Util.deduplicateString(ret);
}; };
var getIdFromHref = exp.getIdFromHref = function (href) { var getIdFromHref = exp.getIdFromHref = function (_href) {
var result; var result;
var noPassword = function (str) {
if (!str) { return; }
var value = str.replace(/\/p\/?/, '/');
return Hash.getRelativeHref(value);
};
var href = noPassword(_href);
getFiles([FILES_DATA]).some(function (id) { getFiles([FILES_DATA]).some(function (id) {
if (files[FILES_DATA][id].href === href || if (noPassword(files[FILES_DATA][id].href) === href ||
files[FILES_DATA][id].roHref === href) { noPassword(files[FILES_DATA][id].roHref) === href) {
result = id; result = id;
return true; return true;
} }
@ -391,11 +399,17 @@ define([
return result; return result;
}; };
exp.getSFIdFromHref = function (href) { exp.getSFIdFromHref = function (_href) {
var result; var result;
var noPassword = function (str) {
if (!str) { return; }
var value = str.replace(/\/p\/?/, '/');
return Hash.getRelativeHref(value);
};
var href = noPassword(_href);
getFiles([SHARED_FOLDERS]).some(function (id) { getFiles([SHARED_FOLDERS]).some(function (id) {
if (files[SHARED_FOLDERS][id].href === href || if (noPassword(files[SHARED_FOLDERS][id].href) === href ||
files[SHARED_FOLDERS][id].roHref === href) { noPassword(files[SHARED_FOLDERS][id].roHref) === href) {
result = id; result = id;
return true; return true;
} }

@ -44,6 +44,14 @@ define([
sframeChan.query('Q_DRIVE_GETOBJECT', { sframeChan.query('Q_DRIVE_GETOBJECT', {
sharedFolder: fId sharedFolder: fId
}, waitFor(function (err, newObj) { }, waitFor(function (err, newObj) {
if (!APP.loggedIn && APP.newSharedFolder) {
if (!newObj || !Object.keys(newObj).length) {
// Empty anon drive: deleted
var msg = Messages.deletedError + '<br>' + Messages.errorRedirectToHome;
setTimeout(function () { UI.errorLoadingScreen(msg, false, function () {}); });
APP.newSharedFolder = null;
}
}
folders[fId] = folders[fId] || {}; folders[fId] = folders[fId] || {};
copyObjectValue(folders[fId], newObj); copyObjectValue(folders[fId], newObj);
if (manager && oldIds.indexOf(fId) === -1) { if (manager && oldIds.indexOf(fId) === -1) {

Loading…
Cancel
Save