Hidden hash for files

pull/1/head
yflory 5 years ago
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,41 +254,53 @@ 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';
parsed.getOptions = function () {
return {
embed: parsed.embed,
present: parsed.present,
ownerKey: parsed.ownerKey
};
};
parsed.getHash = function (opts) {
var hash = hashArr.slice(0, 4).join('/') + '/';
var owner = typeof(opts.ownerKey) !== "undefined" ? opts.ownerKey : parsed.ownerKey;
if (owner) { hash += owner + '/'; }
if (parsed.password) { hash += 'p/'; }
if (opts.embed) { hash += 'embed/'; }
if (opts.present) { hash += 'present/'; }
return hash;
};
if (hashArr[1] && hashArr[1] === '1') { if (hashArr[1] && hashArr[1] === '1') {
parsed.version = 1; parsed.version = 1;
parsed.channel = hashArr[2].replace(/-/g, '/'); parsed.channel = hashArr[2].replace(/-/g, '/');
parsed.key = hashArr[3].replace(/-/g, '/'); parsed.key = hashArr[3].replace(/-/g, '/');
options = hashArr.slice(4); options = hashArr.slice(4);
parsed.ownerKey = getOwnerKey(options); addOptions();
return parsed; return parsed;
} }
if (hashArr[1] && hashArr[1] === '2') { // Version 2 if (hashArr[1] && hashArr[1] === '2') { // Version 2
parsed.version = 2; parsed.version = 2;
parsed.app = hashArr[2]; parsed.app = hashArr[2];
parsed.key = hashArr[3]; parsed.key = hashArr[3];
options = hashArr.slice(4); options = hashArr.slice(4);
parsed.password = options.indexOf('p') !== -1; addOptions();
parsed.present = options.indexOf('present') !== -1;
parsed.embed = options.indexOf('embed') !== -1; return parsed;
parsed.ownerKey = getOwnerKey(options); }
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();
parsed.getHash = function (opts) {
var hash = hashArr.slice(0, 4).join('/') + '/';
var owner = typeof(opts.ownerKey) !== "undefined" ? opts.ownerKey : parsed.ownerKey;
if (owner) { hash += owner + '/'; }
if (parsed.password) { hash += 'p/'; }
if (opts.embed) { hash += 'embed/'; }
if (opts.present) { hash += 'present/'; }
return hash;
};
parsed.getOptions = function () {
return {
embed: parsed.embed,
present: parsed.present,
ownerKey: parsed.ownerKey
};
};
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…
Cancel
Save