Hidden hash for files
This commit is contained in:
parent
7b9f86157e
commit
7a02b074b7
@ -60,10 +60,14 @@ var factory = function (Util, Crypto, Nacl) {
|
|||||||
return '/2/' + secret.type + '/view/' + Crypto.b64RemoveSlashes(data.viewKeyStr) + '/' + pass;
|
return '/2/' + secret.type + '/view/' + Crypto.b64RemoveSlashes(data.viewKeyStr) + '/' + pass;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Hash.getHiddenHashFromKeys = function (type, secret, opts) {
|
Hash.getHiddenHashFromKeys = function (type, secret, opts) {
|
||||||
var mode = ((secret.keys && secret.keys.editKeyStr) || secret.key) ? 'edit' : 'view';
|
var mode = ((secret.keys && secret.keys.editKeyStr) || secret.key) ? 'edit/' : 'view/';
|
||||||
var pass = secret.password ? 'p/' : '';
|
var pass = secret.password ? 'p/' : '';
|
||||||
var hash = '/3/' + type + '/' + mode + '/' + secret.channel + '/' + pass;
|
|
||||||
|
if (secret.keys && secret.keys.fileKeyStr) { mode = ''; }
|
||||||
|
|
||||||
|
var hash = '/3/' + type + '/' + mode + secret.channel + '/' + pass;
|
||||||
var href = '/' + type + '/#' + hash;
|
var href = '/' + type + '/#' + hash;
|
||||||
var parsed = Hash.parsePadUrl(href);
|
var parsed = Hash.parsePadUrl(href);
|
||||||
if (parsed.hashData && parsed.hashData.getHash) {
|
if (parsed.hashData && parsed.hashData.getHash) {
|
||||||
@ -175,6 +179,14 @@ Version 1
|
|||||||
var options = [];
|
var options = [];
|
||||||
var parsed = {};
|
var parsed = {};
|
||||||
var hashArr = fixDuplicateSlashes(hash).split('/');
|
var hashArr = fixDuplicateSlashes(hash).split('/');
|
||||||
|
|
||||||
|
var addOptions = function () {
|
||||||
|
parsed.password = options.indexOf('p') !== -1;
|
||||||
|
parsed.present = options.indexOf('present') !== -1;
|
||||||
|
parsed.embed = options.indexOf('embed') !== -1;
|
||||||
|
parsed.ownerKey = getOwnerKey(options);
|
||||||
|
};
|
||||||
|
|
||||||
if (['media', 'file', 'user', 'invite'].indexOf(type) === -1) {
|
if (['media', 'file', 'user', 'invite'].indexOf(type) === -1) {
|
||||||
parsed.type = 'pad';
|
parsed.type = 'pad';
|
||||||
parsed.getHash = function () { return hash; };
|
parsed.getHash = function () { return hash; };
|
||||||
@ -203,12 +215,6 @@ Version 1
|
|||||||
if (opts.present) { hash += 'present/'; }
|
if (opts.present) { hash += 'present/'; }
|
||||||
return hash;
|
return hash;
|
||||||
};
|
};
|
||||||
var addOptions = function () {
|
|
||||||
parsed.password = options.indexOf('p') !== -1;
|
|
||||||
parsed.present = options.indexOf('present') !== -1;
|
|
||||||
parsed.embed = options.indexOf('embed') !== -1;
|
|
||||||
parsed.ownerKey = getOwnerKey(options);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (hashArr[1] && hashArr[1] === '1') { // Version 1
|
if (hashArr[1] && hashArr[1] === '1') { // Version 1
|
||||||
parsed.version = 1;
|
parsed.version = 1;
|
||||||
@ -248,24 +254,14 @@ Version 1
|
|||||||
parsed.getHash = function () { return hashArr.join('/'); };
|
parsed.getHash = function () { return hashArr.join('/'); };
|
||||||
if (['media', 'file'].indexOf(type) !== -1) {
|
if (['media', 'file'].indexOf(type) !== -1) {
|
||||||
parsed.type = 'file';
|
parsed.type = 'file';
|
||||||
if (hashArr[1] && hashArr[1] === '1') {
|
|
||||||
parsed.version = 1;
|
|
||||||
parsed.channel = hashArr[2].replace(/-/g, '/');
|
|
||||||
parsed.key = hashArr[3].replace(/-/g, '/');
|
|
||||||
options = hashArr.slice(4);
|
|
||||||
parsed.ownerKey = getOwnerKey(options);
|
|
||||||
return parsed;
|
|
||||||
}
|
|
||||||
if (hashArr[1] && hashArr[1] === '2') { // Version 2
|
|
||||||
parsed.version = 2;
|
|
||||||
parsed.app = hashArr[2];
|
|
||||||
parsed.key = hashArr[3];
|
|
||||||
|
|
||||||
options = hashArr.slice(4);
|
parsed.getOptions = function () {
|
||||||
parsed.password = options.indexOf('p') !== -1;
|
return {
|
||||||
parsed.present = options.indexOf('present') !== -1;
|
embed: parsed.embed,
|
||||||
parsed.embed = options.indexOf('embed') !== -1;
|
present: parsed.present,
|
||||||
parsed.ownerKey = getOwnerKey(options);
|
ownerKey: parsed.ownerKey
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
parsed.getHash = function (opts) {
|
parsed.getHash = function (opts) {
|
||||||
var hash = hashArr.slice(0, 4).join('/') + '/';
|
var hash = hashArr.slice(0, 4).join('/') + '/';
|
||||||
@ -276,13 +272,35 @@ Version 1
|
|||||||
if (opts.present) { hash += 'present/'; }
|
if (opts.present) { hash += 'present/'; }
|
||||||
return hash;
|
return hash;
|
||||||
};
|
};
|
||||||
parsed.getOptions = function () {
|
|
||||||
return {
|
if (hashArr[1] && hashArr[1] === '1') {
|
||||||
embed: parsed.embed,
|
parsed.version = 1;
|
||||||
present: parsed.present,
|
parsed.channel = hashArr[2].replace(/-/g, '/');
|
||||||
ownerKey: parsed.ownerKey
|
parsed.key = hashArr[3].replace(/-/g, '/');
|
||||||
};
|
options = hashArr.slice(4);
|
||||||
};
|
addOptions();
|
||||||
|
return parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hashArr[1] && hashArr[1] === '2') { // Version 2
|
||||||
|
parsed.version = 2;
|
||||||
|
parsed.app = hashArr[2];
|
||||||
|
parsed.key = hashArr[3];
|
||||||
|
|
||||||
|
options = hashArr.slice(4);
|
||||||
|
addOptions();
|
||||||
|
|
||||||
|
return parsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hashArr[1] && hashArr[1] === '3') { // Version 3: hidden hash
|
||||||
|
parsed.version = 3;
|
||||||
|
parsed.app = hashArr[2];
|
||||||
|
parsed.channel = hashArr[3];
|
||||||
|
|
||||||
|
options = hashArr.slice(4);
|
||||||
|
addOptions();
|
||||||
|
|
||||||
return parsed;
|
return parsed;
|
||||||
}
|
}
|
||||||
return parsed;
|
return parsed;
|
||||||
|
|||||||
@ -51,7 +51,7 @@ define([
|
|||||||
|
|
||||||
// Store the href in memory
|
// Store the href in memory
|
||||||
// This is a placeholder value overriden in common.ready from sframe-common-outer
|
// This is a placeholder value overriden in common.ready from sframe-common-outer
|
||||||
var currentPad = {
|
var currentPad = common.currentPad = {
|
||||||
href: window.location.href
|
href: window.location.href
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -763,7 +763,7 @@ define([
|
|||||||
};
|
};
|
||||||
// Get data about a given channel: use with hidden hashes
|
// Get data about a given channel: use with hidden hashes
|
||||||
common.getPadDataFromChannel = function (obj, cb) {
|
common.getPadDataFromChannel = function (obj, cb) {
|
||||||
if (!obj || !obj.channel || !obj.edit) { return void cb('EINVAL'); }
|
if (!obj || !obj.channel) { return void cb('EINVAL'); }
|
||||||
postMessage("GET_PAD_DATA_FROM_CHANNEL", obj, function (data) {
|
postMessage("GET_PAD_DATA_FROM_CHANNEL", obj, function (data) {
|
||||||
cb(void 0, data);
|
cb(void 0, data);
|
||||||
});
|
});
|
||||||
@ -1795,7 +1795,7 @@ define([
|
|||||||
rdyCfg = rdyCfg || {};
|
rdyCfg = rdyCfg || {};
|
||||||
|
|
||||||
if (rdyCfg.currentPad) {
|
if (rdyCfg.currentPad) {
|
||||||
currentPad = rdyCfg.currentPad;
|
currentPad = common.currentPad = rdyCfg.currentPad;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (initialized) {
|
if (initialized) {
|
||||||
|
|||||||
@ -1208,6 +1208,7 @@ define([
|
|||||||
Store.getPadDataFromChannel = function (clientId, obj, cb) {
|
Store.getPadDataFromChannel = function (clientId, obj, cb) {
|
||||||
var channel = obj.channel;
|
var channel = obj.channel;
|
||||||
var edit = obj.edit;
|
var edit = obj.edit;
|
||||||
|
var isFile = obj.file;
|
||||||
var res;
|
var res;
|
||||||
var viewRes;
|
var viewRes;
|
||||||
getAllStores().some(function (s) {
|
getAllStores().some(function (s) {
|
||||||
@ -1217,7 +1218,7 @@ define([
|
|||||||
if (!pad || !pad.data) { return; }
|
if (!pad || !pad.data) { return; }
|
||||||
var data = pad.data;
|
var data = pad.data;
|
||||||
// We've found a match: return the value and stop the loops
|
// We've found a match: return the value and stop the loops
|
||||||
if ((edit && data.href) || (!edit && data.roHref)) {
|
if ((edit && data.href) || (!edit && data.roHref) || isFile) {
|
||||||
res = data;
|
res = data;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -284,7 +284,8 @@ define([
|
|||||||
if (!parsed.hashData.key && parsed.hashData.channel) {
|
if (!parsed.hashData.key && parsed.hashData.channel) {
|
||||||
Cryptpad.getPadDataFromChannel({
|
Cryptpad.getPadDataFromChannel({
|
||||||
channel: parsed.hashData.channel,
|
channel: parsed.hashData.channel,
|
||||||
edit: parsed.hashData.mode === 'edit'
|
edit: parsed.hashData.mode === 'edit',
|
||||||
|
file: parsed.hashData.type === 'file'
|
||||||
}, w(function (err, res) {
|
}, w(function (err, res) {
|
||||||
// Error while getting data? abort
|
// Error while getting data? abort
|
||||||
if (err || !res || res.error) {
|
if (err || !res || res.error) {
|
||||||
|
|||||||
@ -9,6 +9,7 @@ define([
|
|||||||
var requireConfig = RequireConfig();
|
var requireConfig = RequireConfig();
|
||||||
|
|
||||||
// Loaded in load #2
|
// Loaded in load #2
|
||||||
|
var hash, href;
|
||||||
nThen(function (waitFor) {
|
nThen(function (waitFor) {
|
||||||
DomReady.onReady(waitFor());
|
DomReady.onReady(waitFor());
|
||||||
}).nThen(function (waitFor) {
|
}).nThen(function (waitFor) {
|
||||||
@ -19,6 +20,14 @@ define([
|
|||||||
};
|
};
|
||||||
window.rc = requireConfig;
|
window.rc = requireConfig;
|
||||||
window.apiconf = ApiConfig;
|
window.apiconf = ApiConfig;
|
||||||
|
|
||||||
|
// Hidden hash
|
||||||
|
hash = window.location.hash;
|
||||||
|
href = window.location.href;
|
||||||
|
if (window.history && window.history.replaceState && hash) {
|
||||||
|
window.history.replaceState({}, window.document.title, '#');
|
||||||
|
}
|
||||||
|
|
||||||
document.getElementById('sbox-iframe').setAttribute('src',
|
document.getElementById('sbox-iframe').setAttribute('src',
|
||||||
ApiConfig.httpSafeOrigin + '/file/inner.html?' + requireConfig.urlArgs +
|
ApiConfig.httpSafeOrigin + '/file/inner.html?' + requireConfig.urlArgs +
|
||||||
'#' + encodeURIComponent(JSON.stringify(req)));
|
'#' + encodeURIComponent(JSON.stringify(req)));
|
||||||
@ -36,10 +45,12 @@ define([
|
|||||||
};
|
};
|
||||||
window.addEventListener('message', onMsg);
|
window.addEventListener('message', onMsg);
|
||||||
}).nThen(function (/*waitFor*/) {
|
}).nThen(function (/*waitFor*/) {
|
||||||
var addData = function (meta) {
|
var addData = function (meta, Cryptpad) {
|
||||||
meta.filehash = window.location.hash;
|
meta.filehash = Cryptpad.currentPad.hash;
|
||||||
};
|
};
|
||||||
SFCommonO.start({
|
SFCommonO.start({
|
||||||
|
hash: hash,
|
||||||
|
href: href,
|
||||||
noRealtime: true,
|
noRealtime: true,
|
||||||
addData: addData
|
addData: addData
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user