Merge pull request #574 from BeaudanBrown/beta6-bugfixes

Beta6 bugfixes
pull/581/head
Beaudan Campbell-Brown 6 years ago committed by GitHub
commit 9516cce497
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -65,6 +65,7 @@ module.exports = {
// We still want to limit comments as before: // We still want to limit comments as before:
comments: 90, comments: 90,
ignoreUrls: true, ignoreUrls: true,
ignoreRegExpLiterals: true,
}, },
], ],
}, },

@ -1053,7 +1053,7 @@
"Confirmation dialog text that asks the user if they really wish to delete the public channel messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." "Confirmation dialog text that asks the user if they really wish to delete the public channel messages locally. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone."
}, },
"deleteConversationConfirmation": { "deleteConversationConfirmation": {
"message": "Permanently delete this conversation?", "message": "Permanently delete the messages in this conversation?",
"description": "description":
"Confirmation dialog text that asks the user if they really wish to delete the conversation. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone." "Confirmation dialog text that asks the user if they really wish to delete the conversation. Answer buttons use the strings 'ok' and 'cancel'. The deletion is permanent, i.e. it cannot be undone."
}, },
@ -1227,14 +1227,8 @@
"description": "description":
"Option to control creation and send of link previews in setting screen" "Option to control creation and send of link previews in setting screen"
}, },
"linkPreviewsDescription": {
"message":
"Previews are supported for Imgur, Instagram, Reddit, and YouTube links.",
"description":
"Additional detail provided for Link Previews option in settings screen"
},
"linkPreviewsSettingDescription": { "linkPreviewsSettingDescription": {
"message": "Enable local link previews", "message": "Enable link previews",
"description": "Description shown for the Link Preview option " "description": "Description shown for the Link Preview option "
}, },
"spellCheckDescription": { "spellCheckDescription": {

@ -133,12 +133,12 @@
<div class='flex'> <div class='flex'>
<button class='emoji' {{#disable-inputs}} disabled="disabled" {{/disable-inputs}}></button> <button class='emoji' {{#disable-inputs}} disabled="disabled" {{/disable-inputs}}></button>
<textarea maxlength='2000' class='send-message' placeholder='{{ send-message }}' rows='1' dir='auto' {{#disable-inputs}} disabled="disabled" {{/disable-inputs}}></textarea> <textarea maxlength='2000' class='send-message' placeholder='{{ send-message }}' rows='1' dir='auto' {{#disable-inputs}} disabled="disabled" {{/disable-inputs}}></textarea>
<div class='capture-audio hide'> <div class='capture-audio'>
<button class='microphone' {{#disable-inputs}} disabled="disabled" {{/disable-inputs}}></button> <button class='microphone' {{#disable-inputs}} disabled="disabled" {{/disable-inputs}}></button>
</div> </div>
<div id='choose-file' class='choose-file'> <div id='choose-file' class='choose-file'>
<button class='paperclip thumbnail' {{#disable-inputs}} disabled="disabled" {{/disable-inputs}}></button> <button class='paperclip thumbnail' {{#disable-inputs}} disabled="disabled" {{/disable-inputs}}></button>
<input type='file' class='file-input' multiple='multiple' accept='video/* image/*'> <input type='file' class='file-input' multiple='multiple'>
</div> </div>
</div> </div>
</form> </form>
@ -196,7 +196,6 @@
<div class='message'>{{ message }}</div> <div class='message'>{{ message }}</div>
{{ /message }} {{ /message }}
<div class='buttons'> <div class='buttons'>
<button class='clear' tabindex='3'>{{ clear }}</button>
<button class='cancel' tabindex='2'>{{ cancel }}</button> <button class='cancel' tabindex='2'>{{ cancel }}</button>
<button class='ok' tabindex='1'>{{ ok }}</button> <button class='ok' tabindex='1'>{{ ok }}</button>
</div> </div>
@ -646,7 +645,7 @@
<div class='page'> <div class='page'>
<div class='display-name-input'> <div class='display-name-input'>
<div class='input-header'>Enter your public display name (alphanumeric characters and underscores only)</div> <div class='input-header'>Enter your public display name (alphanumeric characters and underscores only)</div>
<input class='form-control' type='text' id='display-name' placeholder='Display Name (optional)' autocomplete='off' spellcheck='false' maxlength='25'> <input class='form-control' type='text' id='display-name' placeholder='Display Name' autocomplete='off' spellcheck='false' maxlength='25'>
</div> </div>
<div class='password-inputs'> <div class='password-inputs'>
<div class='input-header'>Type an optional password for added security</div> <div class='input-header'>Type an optional password for added security</div>
@ -655,8 +654,8 @@
<div class='error'></div> <div class='error'></div>
</div> </div>
<div class='buttons'> <div class='buttons'>
<a class='button grey' id='back-button'>Back</a> <button class='button grey' id='back-button' tabindex='2'>Back</button>
<a class='button' id='save-button' data-loading-text='Please wait...'>Save</a> <button class='button' id='save-button' tabindex='1'>Save</button>
</div> </div>
</div> </div>

@ -2015,7 +2015,9 @@
); );
const ourNumber = textsecure.storage.user.getNumber(); const ourNumber = textsecure.storage.user.getNumber();
return !stillUnread.some( return !stillUnread.some(
m => m.propsForMessage.text.indexOf(`@${ourNumber}`) !== -1 m =>
m.propsForMessage.text &&
m.propsForMessage.text.indexOf(`@${ourNumber}`) !== -1
); );
})(); })();
@ -2419,7 +2421,7 @@
}, },
async deletePublicMessage(message) { async deletePublicMessage(message) {
const channelAPI = this.getPublicSendData(); const channelAPI = await this.getPublicSendData();
if (!channelAPI) { if (!channelAPI) {
return false; return false;
} }
@ -2448,8 +2450,8 @@
}); });
} else { } else {
Whisper.events.trigger('showConfirmationDialog', { Whisper.events.trigger('showConfirmationDialog', {
message: i18n('deleteContactConfirmation'), message: i18n('deleteConversationConfirmation'),
onOk: () => ConversationController.deleteContact(this.id), onOk: () => this.destroyMessages(),
}); });
} }
}, },

@ -942,7 +942,16 @@ class LokiPublicChannelAPI {
} }
static getAnnotationFromAttachment(attachment) { static getAnnotationFromAttachment(attachment) {
const type = attachment.contentType.match(/^image/) ? 'photo' : 'video'; let type;
if (attachment.contentType.match(/^image/)) {
type = 'photo';
} else if (attachment.contentType.match(/^video/)) {
type = 'video';
} else if (attachment.contentType.match(/^audio/)) {
type = 'audio';
} else {
type = 'other';
}
const annotation = { const annotation = {
type: ATTACHMENT_TYPE, type: ATTACHMENT_TYPE,
value: { value: {

@ -636,10 +636,6 @@
}, },
toggleMicrophone() { toggleMicrophone() {
// ALWAYS HIDE until we support audio
this.$('.capture-audio').hide();
/*
if ( if (
this.$('.send-message').val().length > 0 || this.$('.send-message').val().length > 0 ||
this.fileInput.hasFiles() this.fileInput.hasFiles()
@ -648,7 +644,6 @@
} else { } else {
this.$('.capture-audio').show(); this.$('.capture-audio').show();
} }
*/
}, },
captureAudio(e) { captureAudio(e) {
e.preventDefault(); e.preventDefault();

@ -1,4 +1,4 @@
/* global Whisper, i18n, _ */ /* global Whisper, i18n, _, displayNameRegex */
// eslint-disable-next-line func-names // eslint-disable-next-line func-names
(function() { (function() {
@ -19,9 +19,6 @@
this.reject = options.reject; this.reject = options.reject;
this.cancelText = options.cancelText || i18n('cancel'); this.cancelText = options.cancelText || i18n('cancel');
this.clear = options.clear;
this.clearText = options.clearText || i18n('clear');
this.title = options.title; this.title = options.title;
this.render(); this.render();
@ -34,7 +31,7 @@
const sanitiseNameInput = () => { const sanitiseNameInput = () => {
const oldVal = this.$input.val(); const oldVal = this.$input.val();
this.$input.val(oldVal.replace(/[^a-zA-Z0-9_]/g, '')); this.$input.val(oldVal.replace(displayNameRegex, ''));
}; };
this.$input[0].oninput = () => { this.$input[0].oninput = () => {
@ -52,17 +49,17 @@
keyup: 'onKeyup', keyup: 'onKeyup',
'click .ok': 'ok', 'click .ok': 'ok',
'click .cancel': 'cancel', 'click .cancel': 'cancel',
'click .clear': 'clear',
change: 'validateNickname', change: 'validateNickname',
}, },
validateNickname() { validateNickname() {
const nickname = this.$input.val(); const nickname = this.$input.val();
if (_.isEmpty(nickname)) { if (_.isEmpty(nickname)) {
this.$('.clear').hide(); this.$('.ok').attr('disabled', 'disabled');
} else { return false;
this.$('.clear').show();
} }
this.$('.ok').removeAttr('disabled');
return true;
}, },
render_attributes() { render_attributes() {
return { return {
@ -70,7 +67,6 @@
showCancel: !this.hideCancel, showCancel: !this.hideCancel,
cancel: this.cancelText, cancel: this.cancelText,
ok: this.okText, ok: this.okText,
clear: this.clearText,
title: this.title, title: this.title,
}; };
}, },
@ -88,14 +84,13 @@
this.reject(); this.reject();
} }
}, },
clear() {
this.$input.val('').trigger('change');
},
onKeyup(event) { onKeyup(event) {
this.validateNickname(); const valid = this.validateNickname();
switch (event.key) { switch (event.key) {
case 'Enter': case 'Enter':
this.ok(); if (valid) {
this.ok();
}
break; break;
case 'Escape': case 'Escape':
case 'Esc': case 'Esc':

@ -250,7 +250,6 @@
spellCheckDescription: i18n('spellCheckDescription'), spellCheckDescription: i18n('spellCheckDescription'),
blockedHeader: 'Blocked Users', blockedHeader: 'Blocked Users',
linkPreviews: i18n('linkPreviews'), linkPreviews: i18n('linkPreviews'),
linkPreviewsDescription: i18n('linkPreviewsDescription'),
linkPreviewsSettingDescription: i18n('linkPreviewsSettingDescription'), linkPreviewsSettingDescription: i18n('linkPreviewsSettingDescription'),
}; };
}, },

@ -1,4 +1,5 @@
/* global Whisper, $, getAccountManager, textsecure, i18n, passwordUtil, _, setTimeout */ /* global Whisper, $, getAccountManager, textsecure,
i18n, passwordUtil, _, setTimeout, displayNameRegex */
/* eslint-disable more/no-then */ /* eslint-disable more/no-then */
@ -57,21 +58,13 @@
this.onValidatePassword(); this.onValidatePassword();
const sanitiseNameInput = () => {
const oldVal = this.$('#display-name').val();
this.$('#display-name').val(oldVal.replace(/[^a-zA-Z0-9_]/g, ''));
};
this.$('#display-name').get(0).oninput = () => {
sanitiseNameInput();
};
this.$('#display-name').get(0).onpaste = () => { this.$('#display-name').get(0).onpaste = () => {
// Sanitise data immediately after paste because it's easier // Sanitise data immediately after paste because it's easier
setTimeout(() => { setTimeout(() => {
sanitiseNameInput(); this.sanitiseNameInput();
}); });
}; };
this.sanitiseNameInput();
}, },
events: { events: {
keyup: 'onKeyup', keyup: 'onKeyup',
@ -91,6 +84,17 @@
'keyup #password': 'onValidatePassword', 'keyup #password': 'onValidatePassword',
'keyup #password-confirmation': 'onValidatePassword', 'keyup #password-confirmation': 'onValidatePassword',
}, },
sanitiseNameInput() {
const oldVal = this.$('#display-name').val();
const newVal = oldVal.replace(displayNameRegex, '');
this.$('#display-name').val(newVal);
if (_.isEmpty(newVal)) {
this.$('#save-button').attr('disabled', 'disabled');
return false;
}
this.$('#save-button').removeAttr('disabled');
return true;
},
async showPage(pageIndex) { async showPage(pageIndex) {
// eslint-disable-next-line func-names // eslint-disable-next-line func-names
this.$pages.each(function(index) { this.$pages.each(function(index) {
@ -123,9 +127,12 @@
return; return;
} }
const validName = this.sanitiseNameInput();
switch (event.key) { switch (event.key) {
case 'Enter': case 'Enter':
this.onSaveProfile(); if (validName) {
this.onSaveProfile();
}
break; break;
case 'Escape': case 'Escape':
case 'Esc': case 'Esc':
@ -148,7 +155,7 @@
await this.accountManager.registerSingleDevice( await this.accountManager.registerSingleDevice(
mnemonic, mnemonic,
language, language,
this.$('#display-name').val() this.trim(this.$('#display-name').val())
); );
this.$el.trigger('openInbox'); this.$el.trigger('openInbox');
} catch (e) { } catch (e) {

@ -24,6 +24,9 @@ if (config.appInstance) {
window.Lodash = require('lodash'); window.Lodash = require('lodash');
// Regex to match all characters which are *not* supported in display names
window.displayNameRegex = /[^\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC _0-9]*/g;
window.platform = process.platform; window.platform = process.platform;
window.getDefaultPoWDifficulty = () => config.defaultPoWDifficulty; window.getDefaultPoWDifficulty = () => config.defaultPoWDifficulty;
window.getTitle = () => title; window.getTitle = () => title;

@ -100,15 +100,11 @@
<input type='checkbox' name='spell-check-setting' id='spell-check-setting' /> <input type='checkbox' name='spell-check-setting' id='spell-check-setting' />
<label for='spell-check-setting'>{{ spellCheckDescription }}</label> <label for='spell-check-setting'>{{ spellCheckDescription }}</label>
</div> </div>
<div class='link-preview-setting'>
<input type='checkbox' name='link-preview-setting' id='link-preview-setting' />
<label for='link-preview-setting'>{{ linkPreviewsSettingDescription }}</label>
</div>
<hr>
<h3>{{ linkPreviews }}</h3>
<div>{{ linkPreviewsDescription }}<div>
</br>
<div class='link-preview-setting'>
<input type='checkbox' name='link-preview-setting' id='link-preview-setting' />
<label for='link-preview-setting'>{{ linkPreviewsSettingDescription }}</label>
</div>
<hr> <hr>
<div class='permissions-setting'> <div class='permissions-setting'>
<h3>{{ permissions }}</h3> <h3>{{ permissions }}</h3>

@ -69,6 +69,15 @@ audio {
button { button {
cursor: pointer; cursor: pointer;
font-size: inherit; font-size: inherit;
&[disabled='disabled'] {
&,
&:hover {
opacity: 0.5;
box-shadow: none;
cursor: default;
}
}
} }
button.grey { button.grey {
border-radius: $border-radius; border-radius: $border-radius;

Loading…
Cancel
Save