'use strict';
const common = require('../common');
describe('AttachmentViewer', function () {
describe('setAttachment, showAttachment, removeAttachment, hideAttachment, hideAttachmentPreview, hasAttachment, getAttachment & moveAttachmentTo', function () {
this.timeout(30000);
jsc.property(
'displays & hides data as requested',
common.jscMimeTypes(),
'string',
'string',
'string',
'string',
// eslint-disable-next-line complexity
function (mimeType, rawdata, filename, prefix, postfix) {
let clean = globalThis.cleanup(),
data = 'data:' + mimeType + ';base64,' + common.btoa(rawdata),
mimePrefix = mimeType.substring(0, 6),
previewSupported = (
mimePrefix === 'image/' ||
mimePrefix === 'audio/' ||
mimePrefix === 'video/' ||
mimeType.match(/\/pdf/i)
),
results = [],
result = '';
// text node of attachment will truncate at null byte
if (filename === '\u0000') {
filename = '';
}
prefix = prefix.replace(/%(s|d)/g, '%%');
postfix = postfix.replace(/%(s|d)/g, '%%').replace(/<|>/g, '');
document.body.innerHTML = (
'
' +
'' +
''
);
// mock createObjectURL for jsDOM
if (typeof window.URL.createObjectURL === 'undefined') {
Object.defineProperty(
window.URL,
'createObjectURL',
{value: function(blob) {
return 'blob:' + location.origin + '/1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed';
}}
);
}
PrivateBin.AttachmentViewer.init();
PrivateBin.Model.init();
results.push(
!PrivateBin.AttachmentViewer.hasAttachment() &&
document.getElementById('attachment').classList.contains('hidden') &&
document.getElementById('attachment').children.length === 0 &&
document.getElementById('attachmenttemplate').classList.contains('hidden') &&
document.getElementById('attachmentPreview').classList.contains('hidden')
);
global.atob = common.atob;
if (filename.length) {
PrivateBin.AttachmentViewer.setAttachment(data, filename);
} else {
PrivateBin.AttachmentViewer.setAttachment(data);
}
// // beyond this point we will get the blob URL instead of the data
data = window.URL.createObjectURL(data);
const attachment = PrivateBin.AttachmentViewer.getAttachments();
results.push(
PrivateBin.AttachmentViewer.hasAttachment() &&
document.getElementById('attachment').classList.contains('hidden') &&
document.getElementById('attachment').children.length > 0 &&
document.getElementById('attachmentPreview').classList.contains('hidden') &&
attachment[0][0] === data &&
attachment[0][1] === filename
);
PrivateBin.AttachmentViewer.showAttachment();
results.push(
!document.getElementById('attachment').classList.contains('hidden') &&
document.getElementById('attachment').children.length > 0 &&
(previewSupported ? !document.getElementById('attachmentPreview').classList.contains('hidden') : document.getElementById('attachmentPreview').classList.contains('hidden'))
);
PrivateBin.AttachmentViewer.hideAttachment();
results.push(
document.getElementById('attachment').classList.contains('hidden') &&
(previewSupported ? !document.getElementById('attachmentPreview').classList.contains('hidden') : document.getElementById('attachmentPreview').classList.contains('hidden'))
);
if (previewSupported) {
PrivateBin.AttachmentViewer.hideAttachmentPreview();
results.push(document.getElementById('attachmentPreview').classList.contains('hidden'));
}
PrivateBin.AttachmentViewer.showAttachment();
results.push(
!document.getElementById('attachment').classList.contains('hidden') &&
(previewSupported ? !document.getElementById('attachmentPreview').classList.contains('hidden') : document.getElementById('attachmentPreview').classList.contains('hidden'))
);
let element = document.createElement('div');
PrivateBin.AttachmentViewer.moveAttachmentTo(element, attachment[0], prefix + '%s' + postfix);
// messageIDs with links get a relaxed treatment
if (prefix.indexOf(' element);
}
);
it(
'sanitizes file names in attachments',
function() {
const clean = globalThis.cleanup();
document.body.innerHTML = (
'' +
'' +
''
);
// mock createObjectURL for jsDOM
if (typeof window.URL.createObjectURL === 'undefined') {
Object.defineProperty(
window.URL,
'createObjectURL',
{value: function(blob) {
return 'blob:' + location.origin + '/1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed';
}}
);
}
PrivateBin.AttachmentViewer.init();
PrivateBin.Model.init();
global.atob = common.atob;
const maliciousFileNames = [
'