|
Luc Didry |
91e078 |
// vim:set sw=4 ts=4 sts=4 ft=javascript expandtab:
|
|
Luc Didry |
91e078 |
/*
|
|
Luc Didry |
91e078 |
* Return the deciphering key stored in anchor part of the URL
|
|
Luc Didry |
91e078 |
* Stolen from https://github.com/sebsauvage/ZeroBin/blob/master/js/zerobin.js
|
|
Luc Didry |
91e078 |
*/
|
|
Luc Didry |
91e078 |
function pageKey() {
|
|
Luc Didry |
91e078 |
var key = window.location.hash.substring(1); // Get key
|
|
Luc Didry |
91e078 |
|
|
Luc Didry |
91e078 |
// Some stupid web 2.0 services and redirectors add data AFTER the anchor
|
|
Luc Didry |
91e078 |
// (such as &utm_source=...).
|
|
Luc Didry |
91e078 |
// We will strip any additional data.
|
|
Luc Didry |
91e078 |
|
|
Luc Didry |
91e078 |
// First, strip everything after the equal sign (=) which signals end of base64 string.
|
|
Luc Didry |
91e078 |
i = key.indexOf('='); if (i>-1) { key = key.substring(0,i+1); }
|
|
Luc Didry |
91e078 |
|
|
Luc Didry |
91e078 |
// If the equal sign was not present, some parameters may remain:
|
|
Luc Didry |
91e078 |
i = key.indexOf('&';; if (i>-1) { key = key.substring(0,i); }
|
|
Luc Didry |
91e078 |
|
|
Luc Didry |
91e078 |
// Then add trailing equal sign if it's missing
|
|
Luc Didry |
91e078 |
if (key.charAt(key.length-1)!=='=') key+='=';
|
|
Luc Didry |
91e078 |
|
|
Luc Didry |
91e078 |
return key;
|
|
Luc Didry |
91e078 |
}
|
|
Luc Didry |
91e078 |
function base64ToArrayBuffer(base64) {
|
|
Luc Didry |
91e078 |
var binary_string = window.atob(base64);
|
|
Luc Didry |
91e078 |
var len = binary_string.length;
|
|
Luc Didry |
91e078 |
var bytes = new Uint8Array( len );
|
|
Luc Didry |
91e078 |
for (var i = 0; i < len; i++) {
|
|
Luc Didry |
91e078 |
bytes[i] = binary_string.charCodeAt(i);
|
|
Luc Didry |
91e078 |
}
|
|
Luc Didry |
91e078 |
return bytes.buffer;
|
|
Luc Didry |
91e078 |
}
|
|
Luc Didry |
91e078 |
|
|
Luc Didry |
f66f26 |
// Something's wring
|
|
Luc Didry |
f66f26 |
function addAlert(msg) {
|
|
Luc Didry |
d3222b |
$('#please-wait').remove();
|
|
Luc Didry |
d3222b |
|
|
Luc Didry |
50b1f0 |
var pbd = $('.file-progress');
|
|
Luc Didry |
d3222b |
pbd.attr('role', 'alert');
|
|
Luc Didry |
eb803d |
pbd.removeClass('progress');
|
|
Luc Didry |
d3222b |
pbd.html(['',
|
|
Luc Didry |
d3222b |
'',
|
|
Luc Didry |
d3222b |
'', msg, '',
|
|
Luc Didry |
d3222b |
'',
|
|
Luc Didry |
d3222b |
''].join(''));
|
|
Luc Didry |
f66f26 |
}
|
|
Luc Didry |
f66f26 |
|
|
Luc Didry |
91e078 |
// Spawn WebSocket
|
|
Luc Didry |
a594b9 |
function spawnWebsocket(pa) {
|
|
Luc Didry |
91e078 |
var ws = new WebSocket(ws_url);
|
|
Luc Didry |
91e078 |
ws.onopen = function() {
|
|
Luc Didry |
91e078 |
console.log('Connection is established!');
|
|
Luc Didry |
e6dca3 |
|
|
Luc Didry |
d3222b |
var l = $('#loading');
|
|
Luc Didry |
e14e58 |
l.html(i18n.loading.replace(/XX1/, (pa + 1)));
|
|
Luc Didry |
50b1f0 |
if ($('#file_pwd').length === 1) {
|
|
Luc Didry |
50b1f0 |
window.ws.send('{"part":'+pa+', "file_pwd": "'+$('#file_pwd').val()+'"}');
|
|
Luc Didry |
50b1f0 |
} else {
|
|
Luc Didry |
50b1f0 |
window.ws.send('{"part":'+pa+'}');
|
|
Luc Didry |
50b1f0 |
}
|
|
Luc Didry |
91e078 |
};
|
|
Luc Didry |
91e078 |
ws.onclose = function() {
|
|
Luc Didry |
91e078 |
console.log('Connection is closed');
|
|
Luc Didry |
a594b9 |
if (!window.completed) {
|
|
Luc Didry |
4feff5 |
console.log('Connection closed. Retrying to get slice '+pa);
|
|
Luc Didry |
4feff5 |
window.ws = spawnWebsocket(pa);
|
|
Luc Didry |
a594b9 |
}
|
|
Luc Didry |
91e078 |
}
|
|
Luc Didry |
91e078 |
ws.onmessage = function(e) {
|
|
Luc Didry |
91e078 |
var res = e.data.split('XXMOJOXX');
|
|
Luc Didry |
91e078 |
var json = res.shift();
|
|
Luc Didry |
91e078 |
var data = JSON.parse(json);
|
|
Luc Didry |
91e078 |
|
|
Luc Didry |
91e078 |
if (data.msg !== undefined) {
|
|
Luc Didry |
f66f26 |
addAlert(data.msg);
|
|
Luc Didry |
a594b9 |
console.log(data.msg);
|
|
Luc Didry |
50b1f0 |
if ($('#file_pwd').length === 1) {
|
|
Luc Didry |
50b1f0 |
$('.file-abort').addClass('hide');
|
|
Luc Didry |
50b1f0 |
}
|
|
Luc Didry |
60e157 |
window.onbeforeunload = null;
|
|
Luc Didry |
91e078 |
} else {
|
|
Luc Didry |
a594b9 |
console.log('Getting slice '+(data.part + 1)+' of '+data.total);
|
|
Luc Didry |
91e078 |
var slice = JSON.parse(res.shift());
|
|
Luc Didry |
91e078 |
var percent = Math.round(100 * (data.part + 1)/data.total);
|
|
Luc Didry |
d3222b |
var pb = $('#pb');
|
|
Luc Didry |
d3222b |
pb.css('width', percent+'%');
|
|
Luc Didry |
d3222b |
pb.attr('aria-valuenow', percent);
|
|
Luc Didry |
d3222b |
$('#pbt').html(percent+'%');
|
|
Luc Didry |
f66f26 |
try {
|
|
Luc Didry |
f66f26 |
var b64 = sjcl.decrypt(window.key, slice);
|
|
Luc Didry |
a594b9 |
window.a[data.part] = base64ToArrayBuffer(b64);
|
|
Luc Didry |
f66f26 |
if (data.part + 1 === data.total) {
|
|
Luc Didry |
d9412f |
var blob = new Blob(a, {type: data.type});
|
|
Luc Didry |
91e078 |
|
|
Luc Didry |
d3222b |
$('#please-wait').remove();
|
|
Luc Didry |
d3222b |
$('#loading').remove();
|
|
Luc Didry |
91e078 |
|
|
Luc Didry |
d3222b |
var pbd = $('#pbd');
|
|
Luc Didry |
d3222b |
pbd.attr('class', 'center-align');
|
|
Ilker Kulgu |
f333a9 |
// IE & Edge fix for downloading blob files, gives option to save or open the file when the link is opened.
|
|
Ilker Kulgu |
f333a9 |
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
|
|
Ilker Kulgu |
f333a9 |
var fileName = escapeHtml(data.name);
|
|
Ilker Kulgu |
f333a9 |
window.navigator.msSaveOrOpenBlob(blob, fileName);
|
|
Ilker Kulgu |
f333a9 |
} else {
|
|
Ilker Kulgu |
f333a9 |
var blobURL = URL.createObjectURL(blob);
|
|
Ilker Kulgu |
f333a9 |
}
|
|
Luc Didry |
d94c2b |
var innerHTML = ['', i18n.download, ' '];
|
|
Luc Didry |
e6dca3 |
|
|
Luc Didry |
e6dca3 |
if (data.type.match(/^image\//) !== null) {
|
|
Luc Didry |
d94c2b |
innerHTML.push('');
|
|
Luc Didry |
e6dca3 |
} else if (data.type.match(/^video\//) !== null) {
|
|
Luc Didry |
d3222b |
innerHTML.push('<video class="responsive-video" controls>',
|
|
Luc Didry |
d3222b |
'<source src="', blobURL, '" type="', data.type, '">',
|
|
Luc Didry |
d3222b |
'</video>');
|
|
Luc Didry |
d909b8 |
} else if (data.type.match(/^audio\//) !== null) {
|
|
Luc Didry |
d909b8 |
innerHTML.push('<audio class="responsive-video" controls>',
|
|
Luc Didry |
d909b8 |
'<source src="', blobURL, '" type="', data.type, '">',
|
|
Luc Didry |
d909b8 |
'</audio>');
|
|
Luc Didry |
e6dca3 |
}
|
|
Luc Didry |
d3222b |
pbd.html(innerHTML.join(''));
|
|
Luc Didry |
91e078 |
|
|
Luc Didry |
50b1f0 |
if ($('#file_pwd').length === 1) {
|
|
Luc Didry |
50b1f0 |
window.ws.send('{"ended":true, "file_pwd": "'+$('#file_pwd').val()+'"}');
|
|
Luc Didry |
50b1f0 |
} else {
|
|
Luc Didry |
50b1f0 |
window.ws.send('{"ended":true}');
|
|
Luc Didry |
50b1f0 |
}
|
|
Luc Didry |
f66f26 |
window.onbeforeunload = null;
|
|
Luc Didry |
a594b9 |
window.completed = true;
|
|
Luc Didry |
9cf069 |
$('#abort').remove();
|
|
Luc Didry |
f66f26 |
} else {
|
|
Luc Didry |
d3222b |
var l = $('#loading');
|
|
Luc Didry |
d3222b |
l.html(i18n.loading.replace(/XX1/, (data.part + 1)));
|
|
Luc Didry |
f66f26 |
if (ws.readyState === 3) {
|
|
Luc Didry |
a594b9 |
window.ws = spawnWebsocket(data.part + 1);
|
|
Luc Didry |
a594b9 |
} else {
|
|
Luc Didry |
a594b9 |
window.ws.onclose = function() {
|
|
Luc Didry |
a594b9 |
console.log('Connection is closed');
|
|
Luc Didry |
a594b9 |
if (!window.completed) {
|
|
Luc Didry |
4feff5 |
console.log('Connection closed. Retrying to get slice '+(data.part + 1));
|
|
Luc Didry |
4feff5 |
window.ws = spawnWebsocket(data.part + 1);
|
|
Luc Didry |
a594b9 |
}
|
|
Luc Didry |
a594b9 |
}
|
|
Luc Didry |
a594b9 |
window.ws.onerror = function() {
|
|
Luc Didry |
4feff5 |
console.log('Error. Retrying to get slice '+(data.part + 1));
|
|
Luc Didry |
4feff5 |
window.ws = spawnWebsocket(data.part + 1);
|
|
Luc Didry |
a594b9 |
};
|
|
Luc Didry |
50b1f0 |
if ($('#file_pwd').length === 1) {
|
|
Luc Didry |
50b1f0 |
window.ws.send('{"part":'+(data.part + 1)+', "file_pwd": "'+$('#file_pwd').val()+'"}');
|
|
Luc Didry |
50b1f0 |
} else {
|
|
Luc Didry |
50b1f0 |
window.ws.send('{"part":'+(data.part + 1)+'}');
|
|
Luc Didry |
50b1f0 |
}
|
|
Luc Didry |
f66f26 |
}
|
|
Luc Didry |
f66f26 |
}
|
|
Luc Didry |
f66f26 |
} catch(err) {
|
|
Luc Didry |
f66f26 |
if (err.message === 'ccm: tag doesn\'t match') {
|
|
Luc Didry |
f66f26 |
addAlert(i18n.badkey);
|
|
Luc Didry |
f66f26 |
} else {
|
|
Luc Didry |
f66f26 |
addAlert(err.message);
|
|
Luc Didry |
91e078 |
}
|
|
Luc Didry |
f66f26 |
window.onbeforeunload = null;
|
|
Luc Didry |
91e078 |
}
|
|
Luc Didry |
91e078 |
}
|
|
Luc Didry |
91e078 |
}
|
|
Luc Didry |
91e078 |
ws.onerror = function() {
|
|
Luc Didry |
4feff5 |
console.log('Error. Retrying to get slice '+pa);
|
|
Luc Didry |
4feff5 |
window.ws = spawnWebsocket(pa);
|
|
Luc Didry |
91e078 |
}
|
|
Luc Didry |
a594b9 |
return ws;
|
|
Luc Didry |
91e078 |
}
|
|
Luc Didry |
91e078 |
// When it's ready
|
|
Luc Didry |
d3222b |
$(document).ready(function(){
|
|
Luc Didry |
57cf40 |
$('#abort').click(function() {
|
|
Luc Didry |
57cf40 |
window.ws.onclose = function() {};
|
|
Luc Didry |
57cf40 |
window.ws.close();
|
|
Luc Didry |
57cf40 |
$('#please-wait, #loading, #pbd, #abort').remove();
|
|
Luc Didry |
57cf40 |
$('#filesize').parent().append(''+i18n.aborted1+''+i18n.aborted2+'');
|
|
Luc Didry |
57cf40 |
window.onbeforeunload = null;
|
|
Luc Didry |
57cf40 |
});
|
|
Luc Didry |
d3222b |
$('#filesize').html(filesize($('#filesize').attr('data-filesize'), {base: 10}));
|
|
Luc Didry |
a594b9 |
window.a = new Array();
|
|
Luc Didry |
a594b9 |
window.key = pageKey();
|
|
Luc Didry |
a594b9 |
window.completed = false;
|
|
Luc Didry |
50aa76 |
|
|
Luc Didry |
f66f26 |
if (key !== '=') {
|
|
Luc Didry |
50b1f0 |
var go = true;
|
|
Luc Didry |
50b1f0 |
if ($('#file_pwd').length === 1) {
|
|
Luc Didry |
50b1f0 |
go = false;
|
|
Luc Didry |
50b1f0 |
$('#go').click(function() {
|
|
Luc Didry |
50b1f0 |
$('.file-progress, .file-abort').removeClass('hide');
|
|
Luc Didry |
50b1f0 |
$('#file_pwd').parent().parent().addClass('hide');
|
|
Luc Didry |
50b1f0 |
// Set websocket
|
|
Luc Didry |
50b1f0 |
window.ws = spawnWebsocket(0);
|
|
Luc Didry |
50b1f0 |
|
|
Luc Didry |
50b1f0 |
// Prevent exiting page before full download
|
|
Luc Didry |
50b1f0 |
window.onbeforeunload = confirmExit;
|
|
Luc Didry |
50b1f0 |
});
|
|
Luc Didry |
50b1f0 |
}
|
|
Luc Didry |
50b1f0 |
if (go) {
|
|
Luc Didry |
50b1f0 |
// Set websocket
|
|
Luc Didry |
50b1f0 |
window.ws = spawnWebsocket(0);
|
|
Luc Didry |
50aa76 |
|
|
Luc Didry |
50b1f0 |
// Prevent exiting page before full download
|
|
Luc Didry |
50b1f0 |
window.onbeforeunload = confirmExit;
|
|
Luc Didry |
50b1f0 |
}
|
|
Luc Didry |
f66f26 |
} else {
|
|
Luc Didry |
f66f26 |
addAlert(i18n.nokey);
|
|
Luc Didry |
f66f26 |
}
|
|
Luc Didry |
91e078 |
});
|