Restore full hash when safe hash is deleted from the drive

This commit is contained in:
yflory 2020-01-29 18:38:13 +01:00
parent 9961bffd48
commit 464eaee49a
5 changed files with 55 additions and 3 deletions

View File

@ -845,6 +845,7 @@ define([
pad.onConnectEvent = Util.mkEvent(); pad.onConnectEvent = Util.mkEvent();
pad.onErrorEvent = Util.mkEvent(); pad.onErrorEvent = Util.mkEvent();
pad.onMetadataEvent = Util.mkEvent(); pad.onMetadataEvent = Util.mkEvent();
pad.onChannelDeleted = Util.mkEvent();
pad.requestAccess = function (data, cb) { pad.requestAccess = function (data, cb) {
postMessage("REQUEST_PAD_ACCESS", data, cb); postMessage("REQUEST_PAD_ACCESS", data, cb);
@ -1753,6 +1754,7 @@ define([
PAD_CONNECT: common.padRpc.onConnectEvent.fire, PAD_CONNECT: common.padRpc.onConnectEvent.fire,
PAD_ERROR: common.padRpc.onErrorEvent.fire, PAD_ERROR: common.padRpc.onErrorEvent.fire,
PAD_METADATA: common.padRpc.onMetadataEvent.fire, PAD_METADATA: common.padRpc.onMetadataEvent.fire,
CHANNEL_DELETED: common.padRpc.onChannelDeleted.fire,
// Drive // Drive
DRIVE_LOG: common.drive.onLog.fire, DRIVE_LOG: common.drive.onLog.fire,
DRIVE_CHANGE: common.drive.onChange.fire, DRIVE_CHANGE: common.drive.onChange.fire,
@ -1896,7 +1898,7 @@ define([
anonHash: LocalStore.getFSHash(), anonHash: LocalStore.getFSHash(),
localToken: tryParsing(localStorage.getItem(Constants.tokenKey)), // TODO move this to LocalStore ? localToken: tryParsing(localStorage.getItem(Constants.tokenKey)), // TODO move this to LocalStore ?
language: common.getLanguage(), language: common.getLanguage(),
driveEvents: rdyCfg.driveEvents // Boolean driveEvents: true //rdyCfg.driveEvents // Boolean
}; };
// if a pad is created from a file // if a pad is created from a file
if (sessionStorage[Constants.newPadFileData]) { if (sessionStorage[Constants.newPadFileData]) {

View File

@ -1232,6 +1232,23 @@ define([
cb(res || viewRes || {}); cb(res || viewRes || {});
}; };
// Hidden hash: if a pad is deleted, we may have to switch back to full hash
// in some tabs
Store.checkDeletedPad = function (channel) {
if (!channel) { return; }
// Check if the pad is still stored in one of our drives
Store.getPadDataFromChannel(null, {
channel: channel,
isFile: true // we don't care if it's view or edit
}, function (res) {
// If it is stored, abort
if (Object.keys(res).length) { return; }
// Otherwise, tell all the tabs that this channel was deleted and give them the hrefs
broadcast([], "CHANNEL_DELETED", channel);
});
};
// Messaging (manage friends from the userlist) // Messaging (manage friends from the userlist)
Store.answerFriendRequest = function (clientId, obj, cb) { Store.answerFriendRequest = function (clientId, obj, cb) {
var value = obj.value; var value = obj.value;
@ -2127,6 +2144,12 @@ define([
} }
} }
} }
if (o && !n && Array.isArray(p) && (p[0] === UserObject.FILES_DATA ||
(p[0] === 'drive' && p[1] === UserObject.FILES_DATA))) {
setTimeout(function () {
Store.checkDeletedPad(o && o.channel);
});
}
sendDriveEvent('DRIVE_CHANGE', { sendDriveEvent('DRIVE_CHANGE', {
id: fId, id: fId,
old: o, old: o,

View File

@ -93,6 +93,12 @@ define([
} }
} }
} }
if (o && !n && Array.isArray(p) && (p[0] === UserObject.FILES_DATA ||
(p[0] === 'drive' && p[1] === UserObject.FILES_DATA))) {
setTimeout(function () {
ctx.Store.checkDeletedPad(o && o.channel);
});
}
team.sendEvent('DRIVE_CHANGE', { team.sendEvent('DRIVE_CHANGE', {
id: fId, id: fId,
old: o, old: o,

View File

@ -771,6 +771,9 @@ define([
toUnpin.forEach(function (chan) { toUnpin.forEach(function (chan) {
if (toKeep.indexOf(chan) === -1) { if (toKeep.indexOf(chan) === -1) {
unpinList.push(chan); unpinList.push(chan);
// Check if need need to restore a full hash (hidden hash deleted from drive)
Env.Store.checkDeletedPad(chan);
} }
}); });
@ -783,7 +786,16 @@ define([
}; };
// Empty the trash (main drive only) // Empty the trash (main drive only)
var _emptyTrash = function (Env, data, cb) { var _emptyTrash = function (Env, data, cb) {
Env.user.userObject.emptyTrash(cb); Env.user.userObject.emptyTrash(function (err, toClean) {
cb();
// Check if need need to restore a full hash (hidden hash deleted from drive)
if (!Array.isArray(toClean)) { return; }
var toCheck = Util.deduplicateString(toClean);
toCheck.forEach(function (chan) {
Env.Store.checkDeletedPad(chan);
});
});
}; };
// Rename files or folders // Rename files or folders
var _rename = function (Env, data, cb) { var _rename = function (Env, data, cb) {

View File

@ -1324,7 +1324,16 @@ define([
} }
} catch (e) {} } catch (e) {}
// If our channel was deleted from all of our drives, sitch back to full hash
// in the address bar
Cryptpad.padRpc.onChannelDeleted.reg(function (channel) {
if (channel !== secret.channel) { return; }
var ohc = window.onhashchange;
window.onhashchange = function () {};
window.location.href = currentPad.href;
window.onhashchange = ohc;
ohc({reset: true});
});
// Join the netflux channel // Join the netflux channel
var rtStarted = false; var rtStarted = false;