diff --git a/index.php b/index.php index 2610719..ddd28f6 100644 --- a/index.php +++ b/index.php @@ -286,7 +286,7 @@ if (!empty($_SERVER['QUERY_STRING'])) // Display an existing paste. if ($ERRORMESSAGE=='') // If no error, return the paste. { // We kindly provide the remaining time before expiration (in seconds) - if ($paste->meta->expire_date) $paste->meta->remaining_time = $paste->meta->expire_date - time(); + if (property_exists($paste->meta, 'expire_date')) $paste->meta->remaining_time = $paste->meta->expire_date - time(); $messages = array($paste); // The paste itself is the first in the list of encrypted messages. // If it's a discussion, get all comments. diff --git a/js/zerobin.js b/js/zerobin.js index 951ba1f5..9b5b35b 100644 --- a/js/zerobin.js +++ b/js/zerobin.js @@ -1,7 +1,7 @@ /** * ZeroBin 0.15 - * - * @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin + * + * @link http://sebsauvage.net/wiki/doku.php?id=php:zerobin * @author sebsauvage */ @@ -10,7 +10,7 @@ sjcl.random.startCollectors(); /** * Converts a duration (in seconds) into human readable format. - * + * * @param int seconds * @return string */ @@ -26,24 +26,24 @@ function secondsToHuman(seconds) /** * Compress a message (deflate compression). Returns base64 encoded data. - * + * * @param string message * @return base64 string data */ function compress(message) { - return Base64.toBase64( RawDeflate.deflate( Base64.utob(message) ) ); + return Base64.toBase64( RawDeflate.deflate( Base64.utob(message) ) ); } /** * Decompress a message compressed with compress(). */ function decompress(data) { - return Base64.btou( RawDeflate.inflate( Base64.fromBase64(data) ) ); + return Base64.btou( RawDeflate.inflate( Base64.fromBase64(data) ) ); } /** * Compress, then encrypt message with key. - * + * * @param string key * @param string message * @return encrypted string data @@ -53,7 +53,7 @@ function zeroCipher(key, message) { } /** * Decrypt message with key, then decompress. - * + * * @param key * @param encrypted string data * @return string readable message @@ -71,7 +71,7 @@ function scriptLocation() { -window.location.search.length -window.location.hash.length); } -/** +/** * @return the paste unique identifier from the URL * eg. 'c05354954c49a487' */ @@ -100,43 +100,43 @@ function setElementText(element, text) { /** * Show decrypted text in the display area, including discussion (if open) - * + * * @param string key : decryption key * @param array comments : Array of messages to display (items = array with keys ('data','meta') */ function displayMessages(key, comments) { try { // Try to decrypt the paste. - var cleartext = zeroDecipher(key, comments[0].data); - } catch(err) { + var cleartext = zeroDecipher(key, comments[0].data); + } catch(err) { $('div#cleartext').hide(); $('button#clonebutton').hide(); - showError('Could not decrypt data (Wrong key ?)'); + showError('Could not decrypt data (Wrong key ?)'); return; } setElementText($('div#cleartext'), cleartext); urls2links($('div#cleartext')); // Convert URLs to clickable links. - + // Display paste expiration. if (comments[0].meta.expire_date) $('div#remainingtime').removeClass('foryoureyesonly').text('This document will expire in '+secondsToHuman(comments[0].meta.remaining_time)+'.').show(); if (comments[0].meta.burnafterreading) { $('div#remainingtime').addClass('foryoureyesonly').text('FOR YOUR EYES ONLY. Don\'t close this window, this message can\'t be displayed again.').show(); $('button#clonebutton').hide(); // Discourage cloning (as it can't really be prevented). } - - // If the discussion is opened on this paste, display it. + + // If the discussion is opened on this paste, display it. if (comments[0].meta.opendiscussion) { $('div#comments').html(''); - // For each comment. + // For each comment. for (var i = 1; i < comments.length; i++) { - var comment=comments[i]; - var cleartext="[Could not decrypt comment ; Wrong key ?]"; + var comment=comments[i]; + var cleartext="[Could not decrypt comment ; Wrong key ?]"; try { - cleartext = zeroDecipher(key, comment.data); - } catch(err) { } + cleartext = zeroDecipher(key, comment.data); + } catch(err) { } var place = $('div#comments'); // If parent comment exists, display below (CSS will automatically shift it right.) var cname = 'div#comment_'+comment.meta.parentid - + // If the element exists in page if ($(cname).length) { place = $(cname); @@ -149,18 +149,18 @@ function displayMessages(key, comments) { // Convert URLs to clickable links in comment. urls2links(divComment.find('div.commentdata')); divComment.find('span.nickname').html('(Anonymous)'); - + // Try to get optional nickname: - try { + try { divComment.find('span.nickname').text(zeroDecipher(key, comment.meta.nickname)); - } catch(err) { } + } catch(err) { } divComment.find('span.commentdate').text(' ('+(new Date(comment.meta.postdate*1000).toUTCString())+')').attr('title','CommentID: ' + comment.meta.commentid); - + // If an avatar is available, display it. if (comment.meta.vizhash) { divComment.find('span.nickname').before(''); } - + place.append(divComment); } $('div#comments').append('
'); @@ -186,7 +186,7 @@ function open_reply(source, commentid) { if ($(this).val() == $(this).attr('title')) { $(this).val(''); } - }); + }); $('textarea#replymessage').focus(); } @@ -199,8 +199,8 @@ function send_comment(parentid) { if ($('textarea#replymessage').val().length==0) { return; } - - showStatus('Sending comment...', spin=true); + + showStatus('Sending comment...', spin=true); var cipherdata = zeroCipher(pageKey(), $('textarea#replymessage').val()); var ciphernickname = ''; var nick=$('input#nickname').val(); @@ -223,10 +223,10 @@ function send_comment(parentid) { location.reload(); } else if (data.status==1) { - showError('Could not post comment: '+data.message); + showError('Could not post comment: '+data.message); } else { - showError('Could not post comment.'); + showError('Could not post comment.'); } }); } @@ -239,13 +239,13 @@ function send_data() { if ($('textarea#message').val().length == 0) { return; } - showStatus('Sending paste...', spin=true); + showStatus('Sending paste...', spin=true); var randomkey = sjcl.codec.base64.fromBits(sjcl.random.randomWords(8, 0), 0); var cipherdata = zeroCipher(randomkey, $('textarea#message').val()); var data_to_send = { data: cipherdata, expire: $('select#pasteExpiration').val(), opendiscussion: $('input#opendiscussion').is(':checked') ? 1 : 0 - }; + }; $.post(scriptLocation(), data_to_send, 'json') .error(function() { showError('Data could not be sent (serveur error or not responding).'); @@ -253,21 +253,21 @@ function send_data() { .success(function(data) { if (data.status == 0) { stateExistingPaste(); - var url = scriptLocation() + "?" + data.id + '#' + randomkey; + var url = scriptLocation() + "?" + data.id + '#' + randomkey; showStatus(''); $('div#pastelink').html('Your paste is ' + url + ''); $('div#pastelink') - .append('  ') + .append('  ') .show(); - setElementText($('div#cleartext'), $('textarea#message').val()); - urls2links($('div#cleartext')); + setElementText($('div#cleartext'), $('textarea#message').val()); + urls2links($('div#cleartext')); showStatus(''); } else if (data.status==1) { - showError('Could not create paste: '+data.message); + showError('Could not create paste: '+data.message); } else { - showError('Could not create paste.'); + showError('Could not create paste.'); } }); } @@ -297,15 +297,15 @@ function stateNewPaste() { */ function stateExistingPaste() { $('button#sendbutton').hide(); - + // No "clone" for IE<10. if ($('div#oldienotice').is(":visible")) { - $('button#clonebutton').hide(); + $('button#clonebutton').hide(); } else { - $('button#clonebutton').show(); + $('button#clonebutton').show(); } - + $('div#expiration').hide(); $('div#language').hide(); $('input#password').hide(); @@ -346,20 +346,20 @@ function showError(message) { /** * Display status * (We use the same function for paste and reply to comments) - * + * * @param string message : text to display * @param boolean spin (optional) : tell if the "spinning" animation should be displayed. */ function showStatus(message, spin) { $('div#replystatus').removeClass('errorMessage'); $('div#replystatus').text(message); - if (!message) { - $('div#status').html(' '); + if (!message) { + $('div#status').html(' '); return; } if (message == '') { - $('div#status').html(' '); - return; + $('div#status').html(' '); + return; } $('div#status').removeClass('errorMessage'); $('div#status').text(message); @@ -385,7 +385,7 @@ function shortenUrl(url) { * http://localhost:8800/zero/?6f09182b8ea51997#WtLEUO5Epj9UHAV9JFs+6pUQZp13TuspAUjnF+iM+dM= * http://user:password@localhost:8800/zero/?6f09182b8ea51997#WtLEUO5Epj9UHAV9JFs+6pUQZp13TuspAUjnF+iM+dM= * - * + * * @param object element : a jQuery DOM element. * @FIXME: add ppa & apt links. */ @@ -401,17 +401,17 @@ function urls2links(element) { */ function pageKey() { var key = window.location.hash.substring(1); // Get key - + // Some stupid web 2.0 services and redirectors add data AFTER the anchor // (such as &utm_source=...). // We will strip any additional data. - + // First, strip everything after the equal sign (=) which signals end of base64 string. i = key.indexOf('='); if (i>-1) { key = key.substring(0,i+1); } - + // If the equal sign was not present, some parameters may remain: i = key.indexOf('&'); if (i>-1) { key = key.substring(0,i); } - + // Then add trailing equal sign if it's missing if (key.charAt(key.length-1)!=='=') key+='='; @@ -433,18 +433,18 @@ $(function() { // Display an existing paste if ($('div#cipherdata').text().length > 1) { - // Missing decryption key in URL ? + // Missing decryption key in URL ? if (window.location.hash.length == 0) { showError('Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL ?)'); return; } - + // List of messages to display var messages = jQuery.parseJSON($('div#cipherdata').text()); - - // Show proper elements on screen. + + // Show proper elements on screen. stateExistingPaste(); - + displayMessages(pageKey(), messages); } // Display error message from php code.