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 1adf8e
    console.log('Spawning websocket…');
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 1adf8e
            window.attempts++;
Luc Didry 1adf8e
            if (window.attempts < 10) {
Luc Didry 1adf8e
                console.log('Connection closed. Retrying to get slice '+pa);
Luc Didry 1adf8e
                window.ws = spawnWebsocket(pa);
Luc Didry 1adf8e
            } else {
Luc Didry 1adf8e
                alert(i18n.tooMuchAttempts);
Luc Didry 1adf8e
            }
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 1adf8e
        // Reset counter since we succeded to open a websocket and got a message
Luc Didry 1adf8e
        window.attempts  = 0;
Luc Didry 1adf8e
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 1adf8e
            window.attempts  = 10;
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 409704
            var percent = Math.round(1000 * (data.part + 1)/data.total)/10;
Luc Didry 409704
            var wClass  = percent.toString().replace('.', '-');
Luc Didry d3222b
            var pb      = $('#pb');
Luc Didry 409704
            pb.removeClass();
Luc Didry 409704
            pb.addClass('determinate');
Luc Didry 409704
            pb.addClass('width-'+wClass);
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
Nicolas Constant b2c4a7
                    notify(i18n.fileDownloaded, data.name);
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 0700ea
                    var isZip = ($('#filesize').attr('data-zipped') === 'true');
Luc Didry e6dca3
                    if (data.type.match(/^image\//) !== null) {
Luc Didry d94c2b
                        innerHTML.push('', escapeHtml(data.name), '');
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 0700ea
                    } else if (isZip) {
Luc Didry 659e43
                        innerHTML.push('

', i18n.showZipContent, '

');
Luc Didry e6dca3
                    }
Luc Didry 659e43
Luc Didry d3222b
                    pbd.html(innerHTML.join(''));
Luc Didry 91e078
Luc Didry 659e43
                    if (isZip) {
Luc Didry 659e43
                        $('#showZipContent').click(function() {
Luc Didry 659e43
                            JSZip.loadAsync(blob)
Luc Didry 659e43
                            .then(function (zip) {
Luc Didry 074729
                                var innerHTML = ['

', i18n.zipContent, '

    '];
Luc Didry 659e43
                                zip.forEach(function (relativePath, zipEntry) {
Luc Didry 0700ea
                                    innerHTML.push(
Luc Didry 0700ea
                                        '
  • ',
  • Luc Didry e32ef3
                                                escapeHtml(zipEntry.name),
    Luc Didry 0700ea
                                                ' (', filesize(zipEntry._data.uncompressedSize, {base: 10}), ') ',
    Luc Didry e32ef3
                                                '',
    Luc Didry 0700ea
                                                    '',
    Luc Didry 0700ea
                                                '',
    Luc Didry 0700ea
                                            ''
    Luc Didry 0700ea
                                        );
    Luc Didry 659e43
                                    });
    Luc Didry 659e43
                                    innerHTML.push('');
    Luc Didry 659e43
                                    pbd.append(innerHTML.join(''));
    Luc Didry 0700ea
                                    $('.download-zip-content').click(function(e) {
    Luc Didry 0700ea
                                        e.preventDefault();
    Luc Didry 0700ea
                                        var t = $(this);
    Luc Didry 0700ea
                                        var filename = t.attr('download');
    Luc Didry 0700ea
                                        zip.files[filename].async('blob').then(function(blob) {
    Luc Didry 0700ea
                                            t.unbind('click');
    Luc Didry 0700ea
                                            t.attr('href', URL.createObjectURL(blob));
    Luc Didry 0700ea
                                            t[0].click();
    Luc Didry 0700ea
                                        });
    Luc Didry 0700ea
                                    })
    Luc Didry 659e43
                                    $('#showZipContent').hide();
    Luc Didry 659e43
                                    $('#showZipContent').unbind('click');
    Luc Didry 659e43
                                });
    Luc Didry 659e43
                            });
    Luc Didry 659e43
                        }
    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 1adf8e
            window.attempts++;
    Luc Didry 1adf8e
            if (window.attempts < 10) {
    Luc Didry 1adf8e
                console.log('Error. Retrying to get slice '+pa);
    Luc Didry 1adf8e
                window.ws = spawnWebsocket(pa);
    Luc Didry 1adf8e
            } else {
    Luc Didry 1adf8e
                alert(i18n.tooMuchAttempts);
    Luc Didry 1adf8e
            }
    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 377ba0
            $('#filesize').parent().append('

    '+i18n.aborted1+'

    '+i18n.aborted2+'

    ');
    Luc Didry 57cf40
            window.onbeforeunload = null;
    Luc Didry 377ba0
            $('#reloadLocation').on('click', function(e) {
    Luc Didry 377ba0
                e.preventDefault();
    Luc Didry 377ba0
                window.location.reload();
    Luc Didry 377ba0
            })
    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 1adf8e
        window.attempts  = 0;
    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
    });