made phpUnit and most mocha tests work again, had to remove some injected objects and added a helper method to facilitate a cache reset for the unit tests. Page template is still broken and the JS test for baseUri() fails

This commit is contained in:
El RIDO 2017-02-25 09:35:55 +01:00
parent e880f7924c
commit 131e08ca33
No known key found for this signature in database
GPG Key ID: 0F5C940A6BD81F92
6 changed files with 241 additions and 221 deletions

View File

@ -104,7 +104,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
v = Math.floor(seconds / (60 * 60 * 24 * 30));
return [v, 'month'];
};
}
/**
* checks if a string is valid text (and not onyl whitespace)
@ -117,7 +117,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.isValidText = function(string)
{
return (string.length > 0 && $.trim(string) !== '')
};
}
/**
* text range selection
@ -143,7 +143,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
selection.removeAllRanges();
selection.addRange(range);
}
};
}
/**
* set text of a jQuery element (required for IE),
@ -165,7 +165,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
{
$element.text(text);
}
};
}
/**
* convert URLs to clickable links.
@ -195,7 +195,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
markup
)
);
};
}
/**
* minimal sprintf emulation for %s and %d formats
@ -235,7 +235,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
return val;
});
};
}
/**
* get value of cookie, if it was set, empty string otherwise
@ -261,7 +261,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
}
return '';
};
}
/**
* get the current location (without search or hash part of the URL),
@ -289,7 +289,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
return baseUri;
};
}
/**
* convert all applicable characters to HTML entities
@ -305,7 +305,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/[&<>"'`=\/]/g, function(s) {
return entityMap[s];
});
};
}
return me;
})(window, document);
@ -369,7 +369,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me._ = function()
{
return me.translate.apply(this, arguments);
};
}
/**
* translate a string
@ -467,7 +467,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
return output;
};
}
/**
* per language functions to use to determine the plural form
@ -495,7 +495,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
default:
return (n !== 1 ? 1 : 0);
}
};
}
/**
* load translations into cache
@ -539,7 +539,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
console.error('Language \'%s\' could not be loaded (%s: %s). Translation failed, fallback to English.', newLanguage, textStatus, errorMsg);
language = 'en';
});
};
}
return me;
})(window, document);
@ -603,7 +603,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
return sjcl.encrypt(key, compress(message), options);
}
return sjcl.encrypt(key + sjcl.codec.hex.fromBits(sjcl.hash.sha256.hash(password)), compress(message), options);
};
}
/**
* decrypt message with key, then decompress
@ -629,7 +629,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
}
return '';
};
}
/**
* checks whether the crypt tool is ready.
@ -641,7 +641,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.isEntropyReady = function()
{
return sjcl.random.isReady();
};
}
/**
* checks whether the crypt tool is ready.
@ -653,7 +653,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.addEntropySeedListener = function(func)
{
sjcl.random.addEventListener('seeded', func);
};
}
/**
* returns a random symmetric key
@ -665,7 +665,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getSymmetricKey = function(func)
{
return sjcl.codec.base64.fromBits(sjcl.random.randomWords(8, 0), 0);
};
}
/**
* initialize crypt tool
@ -682,7 +682,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// I18n._('Messages cannot be decrypted or encrypted.')
// );
// }
};
}
return me;
})();
@ -690,11 +690,9 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
/**
* (Model) Data source (aka MVC)
*
* @param {object} window
* @param {object} document
* @class
*/
var Model = (function (window, document) {
var Model = (function () {
var me = {};
var $cipherData,
@ -713,7 +711,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getExpirationDefault = function()
{
return $('#pasteExpiration').val();
};
}
/**
* returns the format set in the HTML
@ -726,7 +724,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getFormatDefault = function()
{
return $('#pasteFormatter').val();
};
}
/**
* check if cipher data was supplied
@ -738,7 +736,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.hasCipherData = function()
{
return (me.getCipherData().length > 0);
};
}
/**
* returns the cipher data
@ -750,7 +748,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getCipherData = function()
{
return $cipherData.text();
};
}
/**
* get the pastes unique identifier from the URL,
@ -772,7 +770,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
return id;
};
}
/**
* return the deciphering key stored in anchor part of the URL
@ -798,11 +796,10 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
{
symmetricKey = symmetricKey.substring(0, ampersandPos);
}
}
return symmetricKey;
};
}
/**
* returns a jQuery copy of the HTML template
@ -820,6 +817,17 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
return $element.prop('id', name);
}
/**
* resets state, used for unit testing
*
* @name Model.reset
* @function
*/
me.reset = function()
{
$cipherData = $templates = id = symmetricKey = null;
}
/**
* init navigation manager
@ -833,10 +841,10 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
{
$cipherData = $('#cipherdata');
$templates = $('#templates');
};
}
return me;
})(window, document);
})();
/**
* Helper functions for user interface
@ -869,7 +877,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// redirect to home page
window.location.href = currentLocation;
}
};
}
/**
* reload the page
@ -882,7 +890,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.reloadHome = function()
{
window.location.href = Helper.baseUri();
};
}
/**
* checks whether the element is currently visible in the viewport (so
@ -903,7 +911,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
var viewportBottom = viewportTop + $(window).height();
return (elementTop > viewportTop && elementTop < viewportBottom);
};
}
/**
* scrolls to a specific element
@ -956,7 +964,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
next();
});
};
}
/**
* initialize
@ -970,7 +978,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$('.reloadlink').prop('href', Helper.baseUri());
$(window).on('popstate', historyChange);
};
}
return me;
})(window, document);
@ -1095,7 +1103,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// @TODO: implement autoclose
handleNotification(1, $statusMessage, message, icon);
};
}
/**
* display an error message
@ -1120,7 +1128,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// @TODO: implement autoclose
handleNotification(3, $errorMessage, message, icon);
};
}
/**
* shows a loading message, optionally with a percentage
@ -1151,7 +1159,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// show loading status (cursor)
$('body').addClass('loading');
};
}
/**
* hides the loading message
@ -1165,7 +1173,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// hide loading cursor
$('body').removeClass('loading');
};
}
/**
* hides any status/error messages
@ -1180,7 +1188,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// also possible: $('.statusmessage').addClass('hidden');
$statusMessage.addClass('hidden');
$errorMessage.addClass('hidden');
};
}
/**
* set a custom handler, which gets all notifications.
@ -1203,7 +1211,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.setCustomHandler = function(newHandler)
{
customHandler = newHandler;
};
}
/**
* init status manager
@ -1234,7 +1242,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
if (Helper.isValidText(serverError)) {
Alert.showError();
}
};
}
return me;
})(window, document);
@ -1296,7 +1304,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
*/
me.createPasteNotification = function(url, deleteUrl)
{
$('#pastelink').find(':first').html(
$('#pastelink').html(
I18n._(
'Your paste is <a id="pasteurl" href="%s">%s</a> <span id="copyhint">(Hit [Ctrl]+[c] to copy)</span>',
url, url
@ -1314,7 +1322,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$pasteSuccess.removeClass('hidden');
// we pre-select the link so that the user only has to [Ctrl]+[c] the link
Helper.selectText($pasteUrl[0]);
};
}
/**
* shows the remaining time
@ -1354,7 +1362,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// in the end, display notification
$remainingTime.removeClass('hidden');
};
}
/**
* hides the remaining time and successful upload notification
@ -1366,7 +1374,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
{
$remainingTime.addClass('hidden');
$pasteSuccess.addClass('hidden');
};
}
/**
* init status manager
@ -1385,7 +1393,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// bind elements
$shortenButton.click(sendToShortener);
};
}
return me;
})(window, document);
@ -1442,7 +1450,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
if (passwordCallback !== null) {
passwordCallback();
}
};
}
/**
* getthe cached password
@ -1457,7 +1465,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getPassword = function()
{
return password;
};
}
/**
* setsthe callback called when password is entered
@ -1469,7 +1477,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.setPasswordCallback = function(callback)
{
passwordCallback = callback;
};
}
/**
* submit a password in the modal dialog
@ -1516,7 +1524,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
});
// handle Model password submission
$passwordForm.submit(submitPasswordModal);
};
}
return me;
})(window, document);
@ -1651,7 +1659,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// clear content
$message.val('');
};
}
/**
* shows the Editor
@ -1663,7 +1671,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
{
$message.removeClass('hidden');
$editorTabs.removeClass('hidden');
};
}
/**
* hides the Editor
@ -1675,7 +1683,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
{
$message.addClass('hidden');
$editorTabs.addClass('hidden');
};
}
/**
* focuses the message input
@ -1686,7 +1694,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.focusInput = function()
{
$message.focus();
};
}
/**
* sets a new text
@ -1698,7 +1706,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.setText = function(newText)
{
$message.val(newText);
};
}
/**
* returns the current text
@ -1710,7 +1718,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getText = function()
{
return $message.val()
};
}
/**
* init status manager
@ -1732,7 +1740,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// (li)
$messageEdit = $('#messageedit').click(viewEditor).parent();
$messagePreview = $('#messagepreview').click(viewPreview).parent();
};
}
return me;
})(window, document);
@ -1860,7 +1868,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
format = newFormat;
isChanged = true;
};
}
/**
* returns the current format
@ -1872,7 +1880,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getFormat = function()
{
return format;
};
}
/**
* returns whether the current view is pretty printed
@ -1884,7 +1892,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.isPrettyPrinted = function()
{
return $prettyPrint.hasClass('prettyprinted');
};
}
/**
* sets the text to show
@ -1899,7 +1907,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
text = newText;
isChanged = true;
}
};
}
/**
* gets the current cached text
@ -1911,7 +1919,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getText = function(newText)
{
return text;
};
}
/**
* show/update the parsed text (preview)
@ -1930,7 +1938,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
showPaste();
isDisplayed = true;
}
};
}
/**
* hide parsed text (preview)
@ -1949,7 +1957,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$placeholder.addClass('hidden');
isDisplayed = false;
};
}
/**
* init status manager
@ -1982,7 +1990,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// get default option from template/HTML or fall back to set value
format = Model.getFormatDefault() || format;
};
}
return me;
})(window, document);
@ -2032,7 +2040,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
attachmentChanged = true;
};
}
/**
* displays the attachment
@ -2102,7 +2110,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.hasAttachment = function()
{
return ($attachmentLink.prop('href') !== '')
};
}
/**
* return the attachment
@ -2117,7 +2125,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$attachmentLink.prop('href'),
$attachmentLink.prop('download')
];
};
}
/**
* moves the attachment link to another element
@ -2136,7 +2144,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// update text
I18n._($attachmentLink, label, $attachmentLink.attr('download'));
};
}
/**
* initiate
@ -2151,7 +2159,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$attachment = $('#attachment');
$attachmentLink = $('#attachment a');
$attachmentPreview = $('#attachmentPreview');
};
}
return me;
})(window, document);
@ -2224,7 +2232,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
return $replyStatus;
};
}
/**
* open the comment entry when clicking the "Reply" button of a comment
@ -2313,7 +2321,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// finally append comment
$place.append($commentEntry);
};
}
/**
* finishes the discussion area after last comment
@ -2328,7 +2336,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// show discussions
$discussion.removeClass('hidden');
};
}
/**
* shows the discussion area
@ -2339,7 +2347,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.showDiscussion = function()
{
$discussion.removeClass('hidden');
};
}
/**
* removes the old discussion and prepares everything for creating a new
@ -2355,7 +2363,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// (re-)init templates
initTemplates();
};
}
/**
* returns the user put into the reply form
@ -2370,7 +2378,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$replyMessage.val(),
$replyNickname.val()
];
};
}
/**
* highlights a specific comment and scrolls to it if necessary
@ -2402,7 +2410,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
UiHelper.scrollTo($comment, 100, 'swing', highlightComment);
};
}
/**
* returns the id of the parent comment the user is replying to
@ -2414,7 +2422,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getReplyCommentId = function()
{
return replyCommentId;
};
}
/**
* initiate
@ -2432,7 +2440,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$commentContainer = $('#commentcontainer');
$discussion = $('#discussion');
};
}
return me;
})(window, document);
@ -2643,7 +2651,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.loadDefaults = function()
{
// @TODO
};
}
/**
* Shows all elements belonging to viwing an existing pastes
@ -2663,7 +2671,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$rawTextButton.removeClass('hidden');
viewButtonsDisplayed = true;
};
}
/**
* Hides all elements belonging to existing pastes
@ -2683,7 +2691,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$rawTextButton.addClass('hidden');
viewButtonsDisplayed = false;
};
}
/**
* Hides all elements belonging to existing pastes
@ -2695,7 +2703,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
{
me.hideViewButtons();
me.hideCreateButtons();
};
}
/**
* shows all elements needed when creating a new paste
@ -2720,7 +2728,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$attach.removeClass('hidden');
createButtonsDisplayed = true;
};
}
/**
* shows all elements needed when creating a new paste
@ -2745,7 +2753,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
$attach.addClass('hidden');
createButtonsDisplayed = false;
};
}
/**
* only shows the "new paste" button
@ -2756,7 +2764,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.showNewPasteButton = function()
{
$newButton.removeClass('hidden');
};
}
/**
* only hides the clone button
@ -2767,7 +2775,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.hideCloneButton = function()
{
$cloneButton.addClass('hidden');
};
}
/**
* only hides the raw text button
@ -2778,7 +2786,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.hideRawButton = function()
{
$rawTextButton.addClass('hidden');
};
}
/**
* hides the file selector in attachment
@ -2789,7 +2797,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.hideFileSelector = function()
{
$fileWrap.addClass('hidden');
};
}
/**
@ -2801,7 +2809,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.showCustomAttachment = function()
{
$customAttachment.removeClass('hidden');
};
}
/**
* collapses the navigation bar if nedded
@ -2818,7 +2826,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// if so, toggle it
$bar.click();
}
};
}
/**
* returns the currently set expiration time
@ -2830,7 +2838,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getExpiration = function()
{
return pasteExpiration;
};
}
/**
* returns the currently selected file(s)
@ -2853,7 +2861,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
return $file[0].files;
};
}
/**
* returns the state of the burn after reading checkbox
@ -2865,7 +2873,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getBurnAfterReading = function()
{
return $burnAfterReading.is(':checked');
};
}
/**
* returns the state of the discussion checkbox
@ -2877,7 +2885,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getOpenDiscussion = function()
{
return $openDiscussion.is(':checked');
};
}
/**
* returns the entered password
@ -2889,7 +2897,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getPassword = function()
{
return $passwordInput.val();
};
}
/**
* returns the element where custom attachments can be placed
@ -2903,7 +2911,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.getCustomAttachment = function()
{
return $customAttachment;
};
}
/**
* init navigation manager
@ -2958,7 +2966,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
pasteExpiration = Model.getExpirationDefault() || pasteExpiration;
me.loadDefaults();
};
}
return me;
})(window, document);
@ -3094,7 +3102,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
console.error(textStatus, errorThrown);
fail(3, jqXHR);
});
};
}
/**
* set success function
@ -3106,7 +3114,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.setUrl = function(newUrl)
{
url = newUrl;
};
}
/**
* sets the password to use (first value) and optionally also the
@ -3126,7 +3134,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
if (typeof newKey !== 'undefined') {
symmetricKey = newKey;
}
};
}
/**
* set success function
@ -3138,7 +3146,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.setSuccess = function(func)
{
successFunc = func;
};
}
/**
* set failure function
@ -3150,7 +3158,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.setFailure = function(func)
{
failureFunc = func;
};
}
/**
* prepares a new upload
@ -3178,7 +3186,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
failureFunc = null;
url = Helper.baseUri();
data = {};
};
}
/**
* encrypts and sets the data
@ -3192,7 +3200,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
{
checkCryptParameters();
data[index] = CryptTool.cipher(symmetricKey, password, element);
};
}
/**
* set the additional metadata to send unencrypted
@ -3205,7 +3213,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.setUnencryptedData = function(index, element)
{
data[index] = element;
};
}
/**
* set the additional metadata to send unencrypted passed at once
@ -3217,7 +3225,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.setUnencryptedBulkData = function(newData)
{
$.extend(data, newData);
};
}
/**
* Helper, which parses shows a general error message based on the result of the Uploader
@ -3258,7 +3266,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.init = function()
{
// nothing yet
};
}
return me;
})();
@ -3381,7 +3389,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// run callback
return callback();
};
}
// actually read first file
reader.readAsDataURL(file);
@ -3413,8 +3421,10 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
TopNav.hideAllButtons();
Alert.showLoading('Sending comment…', 0, 'cloud-upload');
// get data
var [plainText, nickname] = DiscussionViewer.getReplyData(),
// get data, note that "var [x, y] = " structures aren't supported in all JS environments
var replyData = DiscussionViewer.getReplyData(),
plainText = replyData[0],
nickname = replyData[1],
parentid = DiscussionViewer.getReplyCommentId();
// do not send if there is no data
@ -3470,7 +3480,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
}
Uploader.run();
};
}
/**
* sends a new paste to server
@ -3548,7 +3558,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
Uploader.run();
}
);
};
}
/**
* initialize
@ -3559,7 +3569,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.init = function()
{
// nothing yet
};
}
return me;
})();
@ -3795,7 +3805,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
Alert.hideLoading();
TopNav.showViewButtons();
};
}
/**
* initialize
@ -3806,7 +3816,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
me.init = function()
{
// nothing yet
};
}
return me;
})();
@ -3831,7 +3841,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
{
PasteStatus.hideMessages();
Alert.hideMessages();
};
}
/**
* creates a new paste
@ -3855,7 +3865,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
TopNav.loadDefaults();
TopNav.showCreateButtons();
Alert.hideLoading();
};
}
/**
* shows the loaded paste
@ -3882,7 +3892,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// show proper elements on screen
PasteDecrypter.run();
return;
};
}
/**
* refreshes the loaded paste to show potential new data
@ -3916,7 +3926,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
callback();
})
Uploader.run();
};
}
/**
* clone the current paste
@ -3964,7 +3974,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
Alert.hideLoading();
TopNav.showCreateButtons();
};
}
/**
* removes a saved paste
@ -3985,7 +3995,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
Controller.showError(I18n._('Could not delete the paste, it was not stored in burn after reading mode.'));
})
Uploader.run();
};
}
/**
* application start
@ -4022,7 +4032,7 @@ jQuery.PrivateBin = function($, sjcl, Base64, RawDeflate) {
// otherwise create a new paste
me.newPaste();
};
}
return me;
})(window, document);

View File

@ -20,7 +20,7 @@ global.RawDeflate = require('./rawdeflate-0.5');
require('./rawinflate-0.3');
require('./privatebin');
describe('helper', function () {
describe('Helper', function () {
describe('secondsToHuman', function () {
after(function () {
cleanup();
@ -66,7 +66,7 @@ describe('helper', function () {
});
});
describe('scriptLocation', function () {
describe('baseUri', function () {
jsc.property(
'returns the URL without query & fragment',
jsc.nearray(jsc.elements(a2zString)),
@ -76,71 +76,13 @@ describe('helper', function () {
function (schema, address, query, fragment) {
var expected = schema.join('') + '://' + address.join('') + '/',
clean = jsdom('', {url: expected + '?' + query.join('') + '#' + fragment}),
result = $.PrivateBin.Helper.scriptLocation();
result = $.PrivateBin.Helper.baseUri();
clean();
return expected === result;
}
);
});
describe('pasteId', function () {
jsc.property(
'returns the query string without separator, if any',
jsc.nearray(jsc.elements(a2zString)),
jsc.nearray(jsc.elements(a2zString)),
jsc.array(jsc.elements(queryString)),
'string',
function (schema, address, query, fragment) {
var queryString = query.join(''),
clean = jsdom('', {
url: schema.join('') + '://' + address.join('') +
'/?' + queryString + '#' + fragment
}),
result = $.PrivateBin.Helper.pasteId();
clean();
return queryString === result;
}
);
});
describe('pageKey', function () {
jsc.property(
'returns the fragment of the URL',
jsc.nearray(jsc.elements(a2zString)),
jsc.nearray(jsc.elements(a2zString)),
jsc.array(jsc.elements(queryString)),
jsc.array(jsc.elements(base64String)),
function (schema, address, query, fragment) {
var fragmentString = fragment.join(''),
clean = jsdom('', {
url: schema.join('') + '://' + address.join('') +
'/?' + query.join('') + '#' + fragmentString
}),
result = $.PrivateBin.Modal.getPasteKey();
clean();
return fragmentString === result;
}
);
jsc.property(
'returns the fragment stripped of trailing query parts',
jsc.nearray(jsc.elements(a2zString)),
jsc.nearray(jsc.elements(a2zString)),
jsc.array(jsc.elements(queryString)),
jsc.array(jsc.elements(base64String)),
jsc.array(jsc.elements(queryString)),
function (schema, address, query, fragment, trail) {
var fragmentString = fragment.join(''),
clean = jsdom('', {
url: schema.join('') + '://' + address.join('') + '/?' +
query.join('') + '#' + fragmentString + '&' + trail.join('')
}),
result = $.PrivateBin.Modal.getPasteKey();
clean();
return fragmentString === result;
}
);
});
describe('htmlEntities', function () {
after(function () {
cleanup();
@ -156,3 +98,66 @@ describe('helper', function () {
);
});
});
describe('Model', function () {
describe('getPasteId', function () {
jsc.property(
'returns the query string without separator, if any',
jsc.nearray(jsc.elements(a2zString)),
jsc.nearray(jsc.elements(a2zString)),
jsc.nearray(jsc.elements(queryString)),
'string',
function (schema, address, query, fragment) {
var queryString = query.join(''),
clean = jsdom('', {
url: schema.join('') + '://' + address.join('') +
'/?' + queryString + '#' + fragment
}),
result = $.PrivateBin.Model.getPasteId();
$.PrivateBin.Model.reset();
clean();
return queryString === result;
}
);
});
describe('getPasteKey', function () {
jsc.property(
'returns the fragment of the URL',
jsc.nearray(jsc.elements(a2zString)),
jsc.nearray(jsc.elements(a2zString)),
jsc.array(jsc.elements(queryString)),
jsc.nearray(jsc.elements(base64String)),
function (schema, address, query, fragment) {
var fragmentString = fragment.join(''),
clean = jsdom('', {
url: schema.join('') + '://' + address.join('') +
'/?' + query.join('') + '#' + fragmentString
}),
result = $.PrivateBin.Model.getPasteKey();
$.PrivateBin.Model.reset();
clean();
return fragmentString === result;
}
);
jsc.property(
'returns the fragment stripped of trailing query parts',
jsc.nearray(jsc.elements(a2zString)),
jsc.nearray(jsc.elements(a2zString)),
jsc.array(jsc.elements(queryString)),
jsc.nearray(jsc.elements(base64String)),
jsc.array(jsc.elements(queryString)),
function (schema, address, query, fragment, trail) {
var fragmentString = fragment.join(''),
clean = jsdom('', {
url: schema.join('') + '://' + address.join('') + '/?' +
query.join('') + '#' + fragmentString + '&' + trail.join('')
}),
result = $.PrivateBin.Model.getPasteKey();
$.PrivateBin.Model.reset();
clean();
return fragmentString === result;
}
);
});
});

View File

@ -69,7 +69,7 @@ if ($MARKDOWN):
<?php
endif;
?>
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-vYYJYraxQNOf41XtehLBU2JbIQ2Uffe+n8TjHyWkpqoZdZX4aL5zyABrUNvRUP02+AxoRsmNJkpvIbmeQqcIXg==" crossorigin="anonymous"></script>
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-iGFkRUeioseXBM4QLP9xFBK9RaGHPqTnl4NgVhjw0wm0xURcjpL5HE9WP+XJRY0UF3VbIoiuyFXSp0JpxSbc+A==" crossorigin="anonymous"></script>
<!--[if lt IE 10]>
<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
<![endif]-->
@ -122,7 +122,7 @@ endif;
<ul class="nav navbar-nav">
<li id="loadingindicator" class="navbar-text hidden">
<span class="glyphicon glyphicon-time" aria-hidden="true"></span>
<span><?php echo I18n::_('Loading…'), PHP_EOL; ?></span>
<?php echo I18n::_('Loading…'), PHP_EOL; ?>
</li>
<li>
<?php
@ -379,13 +379,13 @@ endif;
if (strlen($NOTICE)):
?>
<div role="alert" class="alert alert-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span><span><?php echo htmlspecialchars($NOTICE), PHP_EOL; ?></span>
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span><?php echo htmlspecialchars($NOTICE), PHP_EOL; ?>
</div>
<?php
endif;
?>
<div id="remainingtime" role="alert" class="hidden alert alert-info">
<span class="glyphicon glyphicon-fire" aria-hidden="true"></span><span></span>
<span class="glyphicon glyphicon-fire" aria-hidden="true"></span>
</div>
<?php
if ($FILEUPLOAD):
@ -398,9 +398,9 @@ endif;
?>
<div id="status" role="alert" class="statusmessage alert alert-info <?php echo empty($STATUS) ? 'hidden' : '' ?>">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
<span><?php echo htmlspecialchars($STATUS); ?></span>
<?php echo htmlspecialchars($STATUS); ?>
</div>
<div id="errormessage" role="alert" class="statusmessage <?php echo empty($ERROR) ? 'hidden' : '' ?> alert alert-danger"><span class="glyphicon glyphicon-alert" aria-hidden="true"></span><span><?php echo htmlspecialchars($ERROR); ?></span></div>
<div id="errormessage" role="alert" class="statusmessage <?php echo empty($ERROR) ? 'hidden' : '' ?> alert alert-danger"><span class="glyphicon glyphicon-alert" aria-hidden="true"></span><?php echo htmlspecialchars($ERROR); ?></div>
<noscript><div id="noscript" role="alert" class="nonworking alert alert-<?php echo $isDark ? 'error' : 'warning'; ?>"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true"></span><?php echo I18n::_('JavaScript is required for %s to work.<br />Sorry for the inconvenience.', I18n::_($NAME)); ?></div></noscript>
<div id="oldienotice" role="alert" class="hidden nonworking alert alert-danger"><span class="glyphicon glyphicon-alert" aria-hidden="true"></span><?php echo I18n::_('%s requires a modern browser to work.', I18n::_($NAME)); ?></div>
<div id="ienotice" role="alert" class="hidden alert alert-<?php echo $isDark ? 'error' : 'warning'; ?>"><span class="glyphicon glyphicon-question-sign" aria-hidden="true"></span><?php echo I18n::_('Still using Internet Explorer? Do yourself a favor, switch to a modern browser:'), PHP_EOL; ?>
@ -413,7 +413,6 @@ endif;
<span class="glyphicon glyphicon-ok" aria-hidden="true"></span>
<div id="deletelink"></div>
<div id="pastelink">
<span></span>
<?php
if (strlen($URLSHORTENER)):
?>
@ -449,7 +448,7 @@ endif;
</section>
<section class="container">
<div id="noscript" role="alert" class="nonworking alert alert-info noscript-hide"><span class="glyphicon glyphicon-exclamation-sign" aria-hidden="true">
<span> <?php echo I18n::_('Loading…'); ?></span><br>
<?php echo I18n::_('Loading…'); ?><br />
<span class="small"><?php echo I18n::_('In case this message never disappears please have a look at <a href="https://github.com/PrivateBin/PrivateBin/wiki/FAQ#why-does-not-the-loading-message-go-away">this FAQ for information to troubleshoot</a>.'); ?></span>
</div>
</section>
@ -465,12 +464,18 @@ endif;
</main>
<div id="serverdata" class="hidden" aria-hidden="true">
<div id="cipherdata"><?php echo htmlspecialchars($CIPHERDATA, ENT_NOQUOTES); ?></div>
<?php
if ($DISCUSSION):
?>
<div id="templates">
<!-- @TODO: when I intend/structure this corrrectly Firefox adds whitespaces everywhere which completly destroy the layout. (same possible when you remove the template data below and show this area in the browser) -->
<article id="commenttemplate" class="comment"><div class="commentmeta"><span class="nickname">name</span><span class="commentdate">0000-00-00</span></div><div class="commentdata">c</div><button class="btn btn-default btn-sm"><?php echo I18n::_('Reply'); ?></button></article>
<div id="commenttailtemplate" class="comment"><button class="btn btn-default btn-sm"><?php echo I18n::_('Add comment'); ?></button></div>
<div id="replytemplate" class="reply hidden"><input type="text" id="nickname" class="form-control" title="<?php echo I18n::_('Optional nickname…'); ?>" placeholder="<?php echo I18n::_('Optional nickname…'); ?>" /><textarea id="replymessage" class="replymessage form-control" cols="80" rows="7"></textarea><br /><div id="replystatus" role="alert" class="statusmessage hidden alert"><span class="glyphicon" aria-hidden="true"></span><span></span></div><button id="replybutton" class="btn btn-default btn-sm"><?php echo I18n::_('Post comment'); ?></button></div>
</div>
<?php
endif;
?>
</div>
</body>
</html>

View File

@ -47,7 +47,7 @@ if ($MARKDOWN):
<?php
endif;
?>
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-vYYJYraxQNOf41XtehLBU2JbIQ2Uffe+n8TjHyWkpqoZdZX4aL5zyABrUNvRUP02+AxoRsmNJkpvIbmeQqcIXg==" crossorigin="anonymous"></script>
<script type="text/javascript" src="js/privatebin.js?<?php echo rawurlencode($VERSION); ?>" integrity="sha512-iGFkRUeioseXBM4QLP9xFBK9RaGHPqTnl4NgVhjw0wm0xURcjpL5HE9WP+XJRY0UF3VbIoiuyFXSp0JpxSbc+A==" crossorigin="anonymous"></script>
<!--[if lt IE 10]>
<style type="text/css">body {padding-left:60px;padding-right:60px;} #ienotice {display:block;} #oldienotice {display:block;}</style>
<![endif]-->
@ -125,7 +125,7 @@ endif;
<?php
if ($DISCUSSION):
?>
<div id="opendisc" class="button hidden">
<div id="opendiscussionoption" class="button hidden">
<input type="checkbox" id="opendiscussion" name="opendiscussion"<?php
if ($OPENDISCUSSION):
?> checked="checked"<?php

View File

@ -739,10 +739,10 @@ class PrivateBinTest extends PHPUnit_Framework_TestCase
new PrivateBin;
$content = ob_get_contents();
ob_end_clean();
$this->assertContains(
'<div id="cipherdata" class="hidden">' .
htmlspecialchars(Helper::getPasteAsJson(), ENT_NOQUOTES) .
'</div>',
$this->assertRegExp(
'#<div id="cipherdata"[^>]*>' .
preg_quote(htmlspecialchars(Helper::getPasteAsJson(), ENT_NOQUOTES)) .
'</div>#',
$content,
'outputs data correctly'
);
@ -818,10 +818,10 @@ class PrivateBinTest extends PHPUnit_Framework_TestCase
$content = ob_get_contents();
ob_end_clean();
unset($burnPaste['meta']['salt']);
$this->assertContains(
'<div id="cipherdata" class="hidden">' .
htmlspecialchars(Helper::getPasteAsJson($burnPaste['meta']), ENT_NOQUOTES) .
'</div>',
$this->assertRegExp(
'#<div id="cipherdata"[^>]*>' .
preg_quote(htmlspecialchars(Helper::getPasteAsJson($burnPaste['meta']), ENT_NOQUOTES)) .
'</div>#',
$content,
'outputs data correctly'
);
@ -889,10 +889,10 @@ class PrivateBinTest extends PHPUnit_Framework_TestCase
$content = ob_get_contents();
ob_end_clean();
$meta['formatter'] = 'syntaxhighlighting';
$this->assertContains(
'<div id="cipherdata" class="hidden">' .
htmlspecialchars(Helper::getPasteAsJson($meta), ENT_NOQUOTES) .
'</div>',
$this->assertRegExp(
'#<div id="cipherdata"[^>]*>' .
preg_quote(htmlspecialchars(Helper::getPasteAsJson($meta), ENT_NOQUOTES)) .
'</div>#',
$content,
'outputs data correctly'
);
@ -914,10 +914,10 @@ class PrivateBinTest extends PHPUnit_Framework_TestCase
ob_end_clean();
$oldPaste['meta']['formatter'] = 'plaintext';
unset($oldPaste['meta']['salt']);
$this->assertContains(
'<div id="cipherdata" class="hidden">' .
htmlspecialchars(Helper::getPasteAsJson($oldPaste['meta']), ENT_NOQUOTES) .
'</div>',
$this->assertRegExp(
'#<div id="cipherdata"[^>]*>' .
preg_quote(htmlspecialchars(Helper::getPasteAsJson($oldPaste['meta']), ENT_NOQUOTES)) .
'</div>#',
$content,
'outputs data correctly'
);

View File

@ -96,10 +96,10 @@ class ViewTest extends PHPUnit_Framework_TestCase
public function testTemplateRendersCorrectly()
{
foreach ($this->_content as $template => $content) {
$this->assertContains(
'<div id="cipherdata" class="hidden">' .
htmlspecialchars(Helper::getPaste()['data'], ENT_NOQUOTES) .
'</div>',
$this->assertRegExp(
'#<div[^>]+id="cipherdata"[^>]*>' .
preg_quote(htmlspecialchars(Helper::getPaste()['data'], ENT_NOQUOTES)) .
'</div>#',
$content,
$template . ': outputs data correctly'
);
@ -119,7 +119,7 @@ class ViewTest extends PHPUnit_Framework_TestCase
$template . ': checked discussion if configured'
);
$this->assertRegExp(
'#<[^>]+id="opendisc"[^>]*>#',
'#<[^>]+id="opendiscussionoption"[^>]*>#',
$content,
$template . ': discussions available if configured'
);