From b7709c8117cc253ed0c442a44b2e499fa6311c40 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Mon, 6 Apr 2015 23:32:19 +0400 Subject: [PATCH 1/6] Code refactoring --- dev/App/User.js | 7 +- dev/Common/Cache.js | 7 -- dev/External/Opentip.js | 3 +- dev/External/ko.js | 33 +++++++ dev/Model/MessageSimple.js | 12 +-- dev/Model/MessageStates.js | 66 -------------- dev/Promises/User/Ajax.js | 43 +++++++++ dev/Screen/User/MailBox.js | 5 -- dev/Stores/User/Message.js | 38 ++++---- dev/Styles/Ui.less | 8 +- dev/Styles/_CkeFix.less | 28 ++++++ dev/Styles/_End.less | 4 + dev/View/Popup/Compose.js | 87 +++++++++++-------- dev/View/Popup/Identity.js | 41 +-------- dev/View/Popup/NewOpenPgpKey.js | 17 ++-- .../Views/Admin/AdminSettingsLicensing.html | 2 + .../templates/Views/User/PopupsCompose.html | 6 +- .../templates/Views/User/PopupsIdentity.html | 2 +- .../templates/Views/User/PopupsTwoStep.html | 64 ++++++++++++++ rainloop/v/0.0.0/static/ckeditor/CUSTOMS | 8 +- vendors/ckeditor/CUSTOMS | 2 +- 21 files changed, 291 insertions(+), 192 deletions(-) delete mode 100644 dev/Model/MessageStates.js create mode 100644 rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoStep.html diff --git a/dev/App/User.js b/dev/App/User.js index 1b9568f5d..72849500c 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -209,11 +209,6 @@ Remote.messageList(Utils.emptyFunction, Cache.getFolderInboxName(), 0, SettingsStore.messagesPerPage(), '', true); }; - AppUser.prototype.reloadMessageListHelper = function (bEmptyList) - { - this.reloadMessageList(bEmptyList); - }; - /** * @param {Function} fResultFunc * @returns {boolean} @@ -316,7 +311,7 @@ } } - this.reloadMessageListHelper(0 === MessageStore.messageList().length); + this.reloadMessageList(0 === MessageStore.messageList().length); this.quotaDebounce(); } }; diff --git a/dev/Common/Cache.js b/dev/Common/Cache.js index d9f38ef3f..23805973b 100644 --- a/dev/Common/Cache.js +++ b/dev/Common/Cache.js @@ -65,11 +65,6 @@ */ CacheUserStorage.prototype.oMessageFlagsCache = {}; - /** - * @type {Object} - */ - CacheUserStorage.prototype.oBodies = {}; - /** * @type {Object} */ @@ -88,10 +83,8 @@ this.oFolderUidNextCache = {}; this.oMessageListHashCache = {}; this.oMessageFlagsCache = {}; - this.oBodies = {}; }; - /** * @param {string} sEmail * @param {Function} fCallback diff --git a/dev/External/Opentip.js b/dev/External/Opentip.js index 5063edf5e..d4530d84d 100644 --- a/dev/External/Opentip.js +++ b/dev/External/Opentip.js @@ -30,7 +30,8 @@ }; Opentip.styles.rainloopTestTip = { - 'extends': 'rainloop' + 'extends': 'rainloop', + 'className': 'rainloopTestTip' }; module.exports = Opentip; diff --git a/dev/External/ko.js b/dev/External/ko.js index cbd3279f4..61972672f 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -20,6 +20,39 @@ } ; + ko.bindingHandlers.editor = { + 'init': function (oElement, fValueAccessor) { + + var + fValue = fValueAccessor(), + oEditor = null, + fUpdateEditorValue = function () { + if (oEditor) + { + oEditor.setHtmlOrPlain(fValue()); + } + }, + fUpdateKoValue = function () { + if (oEditor) + { + fValue(oEditor.getDataWithHtmlMark()); + } + }, + HtmlEditor = require('Common/HtmlEditor') + ; + + if (fValue) + { + oEditor = new HtmlEditor(oElement, fUpdateKoValue, fUpdateEditorValue, fUpdateKoValue); + fValue.__editor = oEditor; + fValue.__fetchEditorValue = fUpdateKoValue; + fValue.__updateEditorValue = fUpdateEditorValue; + + fValue.subscribe(fUpdateEditorValue); + } + } + }; + ko.bindingHandlers.tooltip = { 'init': function (oElement, fValueAccessor) { diff --git a/dev/Model/MessageSimple.js b/dev/Model/MessageSimple.js index 00b582a20..ed994eebd 100644 --- a/dev/Model/MessageSimple.js +++ b/dev/Model/MessageSimple.js @@ -71,7 +71,7 @@ }; /** - * @param {AjaxJsonMessage} oJson + * @param {Object} oJson * @return {boolean} */ MessageSimpleModel.prototype.initByJson = function (oJson) @@ -85,14 +85,16 @@ this.subject = Utils.pString(oJson.Subject); - this.subjectPrefix = ''; - this.subjectSuffix = this.subject; - if (Utils.isArray(oJson.SubjectParts)) { this.subjectPrefix = Utils.pString(oJson.SubjectParts[0]); this.subjectSuffix = Utils.pString(oJson.SubjectParts[1]); } + else + { + this.subjectPrefix = ''; + this.subjectSuffix = this.subject; + } this.from = MessageHelper.emailArrayFromJson(oJson.From); this.to = MessageHelper.emailArrayFromJson(oJson.To); @@ -132,7 +134,7 @@ /** * @static - * @param {AjaxJsonMessage} oJson + * @param {Object} oJson * @return {?MessageSimpleModel} */ MessageSimpleModel.newInstanceFromJson = function (oJson) diff --git a/dev/Model/MessageStates.js b/dev/Model/MessageStates.js deleted file mode 100644 index cba0a2fd0..000000000 --- a/dev/Model/MessageStates.js +++ /dev/null @@ -1,66 +0,0 @@ - -(function () { - - 'use strict'; - - var - _ = require('_'), - ko = require('ko'), - -// Enums = require('Common/Enums'), -// Utils = require('Common/Utils'), -// -// MessageHelper = require('Helper/Message'), - - AbstractModel = require('Knoin/AbstractModel') - ; - - /** - * @constructor - */ - function MessageStatesModel() - { - AbstractModel.call(this, 'MessageStatesModel'); - - this.flags = {}; - this.states = {}; - - this.flags.unseen = ko.observable(false); - this.flags.deleted = ko.observable(false); - this.flags.flagged = ko.observable(false); - this.flags.answered = ko.observable(false); - this.flags.forwarded = ko.observable(false); - - this.states.checked = ko.observable(false); - this.states.deleted = ko.observable(false); - this.states.selected = ko.observable(false); - this.states.focused = ko.observable(false); - - this.states.showReadReceipt = ko.observable(false); - this.states.showExternalImages = ko.observable(false); - - this.states.hasUnseenSubMessages = ko.observable(false); - this.states.hasFlaggedSubMessages = ko.observable(false); - - this.threads = ko.observableArray([]); - } - - _.extend(MessageStatesModel.prototype, AbstractModel.prototype); - - MessageStatesModel.prototype.flags = {}; - MessageStatesModel.prototype.states = {}; - - MessageStatesModel.prototype.clear = function () - { - this.flags.unseen(false); - this.flags.deleted(false); - this.flags.flagged(false); - this.flags.answered(false); - this.flags.forwarded(false); - - this.threads([]); - }; - - module.exports = MessageStatesModel; - -}()); \ No newline at end of file diff --git a/dev/Promises/User/Ajax.js b/dev/Promises/User/Ajax.js index 2d81901ff..3f566c05e 100644 --- a/dev/Promises/User/Ajax.js +++ b/dev/Promises/User/Ajax.js @@ -113,6 +113,49 @@ }); }; +// UserAjaxUserPromises.prototype.messageList = function (sFolderFullNameRaw, iOffset, iLimit, sSearch, fTrigger) +// { +// sFolderFullNameRaw = Utils.pString(sFolderFullNameRaw); +// sSearch = Utils.pString(sSearch); +// iOffset = Utils.pInt(iOffset); +// iLimit = Utils.pInt(iLimit); +// +// var sFolderHash = Cache.getFolderHash(sFolderFullNameRaw); +// +// if ('' !== sFolderHash && ('' === sSearch || -1 === sSearch.indexOf('is:'))) +// { +// return this.abort('MessageList') +// .getRequest('MessageList', fTrigger, +// Links.subQueryPrefix() + '/' + Base64.urlsafe_encode([ +// sFolderFullNameRaw, +// iOffset, +// iLimit, +// sSearch, +// AppStore.projectHash(), +// sFolderHash, +// Cache.getFolderInboxName() === sFolderFullNameRaw ? Cache.getFolderUidNext(sFolderFullNameRaw) : '', +// AppStore.threadsAllowed() && SettingsStore.useThreads() ? '1' : '0', +// '' +// ].join(String.fromCharCode(0)))) +// .then(PromisesPopulator.messageList); +// } +// else +// { +// return this.abort('MessageList') +// .postRequest('MessageList', fTrigger,{ +// 'Folder': sFolderFullNameRaw, +// 'Offset': iOffset, +// 'Limit': iLimit, +// 'Search': sSearch, +// 'UidNext': Cache.getFolderInboxName() === sFolderFullNameRaw ? Cache.getFolderUidNext(sFolderFullNameRaw) : '', +// 'UseThreads': AppStore.threadsAllowed() && SettingsStore.useThreads() ? '1' : '0' +// }) +// .then(PromisesPopulator.messageList); +// } +// +// return this.fastReject(Enums.Notification.UnknownError); +// }; +// // UserAjaxUserPromises.prototype.message = function (sFolderFullNameRaw, iUid, fTrigger) // { // sFolderFullNameRaw = Utils.pString(sFolderFullNameRaw); diff --git a/dev/Screen/User/MailBox.js b/dev/Screen/User/MailBox.js index 3c73ae1a1..64bb526cf 100644 --- a/dev/Screen/User/MailBox.js +++ b/dev/Screen/User/MailBox.js @@ -85,11 +85,6 @@ MessageStore.messageListPage(iPage); MessageStore.messageListSearch(sSearch); -// if (Enums.Layout.NoPreview === SettingsStore.layout() && MessageStore.message()) -// { -// MessageStore.message(null); -// } - require('App/User').reloadMessageList(); } }; diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index 54222b153..2a93eaa24 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -55,12 +55,12 @@ this.messageListDisableAutoSelect = ko.observable(false).extend({'falseTimeout': 500}); - // message viewer - this.message = ko.observable(null); - this.selectorMessageSelected = ko.observable(null); this.selectorMessageFocused = ko.observable(null); + // message viewer + this.message = ko.observable(null); + this.message.viewTrigger = ko.observable(false); this.messageLastThreadUidsData = ko.observable(null); @@ -403,6 +403,24 @@ } }; + MessageUserStore.prototype.addBlockquoteSwitcherCallback = function () + { + var $self = $(this); + if ('' !== Utils.trim(($self.text()))) + { + $self.addClass('rl-bq-switcher hidden-bq'); + $('') + .insertBefore($self) + .on('click.rlBlockquoteSwitcher', function () { + $self.toggleClass('hidden-bq'); + Utils.windowResize(); + }) + .after('
') + .before('
') + ; + } + }; + /** * @param {Object} oMessageTextBody */ @@ -416,19 +434,7 @@ if ($oList && 0 < $oList.length) { - $oList.each(function () { - var $self = $(this); - $self.addClass('rl-bq-switcher hidden-bq'); - $('') - .insertBefore($self) - .click(function () { - $self.toggleClass('hidden-bq'); - Utils.windowResize(); - }) - .after('
') - .before('
') - ; - }); + $oList.each(this.addBlockquoteSwitcherCallback); } } }; diff --git a/dev/Styles/Ui.less b/dev/Styles/Ui.less index 17d320aec..94e44bad7 100644 --- a/dev/Styles/Ui.less +++ b/dev/Styles/Ui.less @@ -1,9 +1,9 @@ .g-ui-user-select-none { - webkit-touch-callout: none; - user-select: none; - standard-user-select: none; - touch-callout: none; +// webkit-touch-callout: none; +// user-select: none; +// standard-user-select: none; +// touch-callout: none; } .g-ui-user-select-allow { diff --git a/dev/Styles/_CkeFix.less b/dev/Styles/_CkeFix.less index d022d8a71..a7b486efc 100644 --- a/dev/Styles/_CkeFix.less +++ b/dev/Styles/_CkeFix.less @@ -130,3 +130,31 @@ } } } + +.cke_dialog { + + a:hover { + text-decoration: none; + } + + .cke_dialog_ui_labeled_content { + margin-top: 5px; + margin-bottom: 5px; + } + + .cke_dialog_ui_input_select, .cke_dialog_ui_input_text, .cke_dialog_ui_input_textarea { + + box-shadow: none; + border-radius: 2px; + + &:focus { + outline: 0; + border: 1px solid #999; + } + } + + .cke_dialog_ui_input_select, .cke_dialog_ui_input_text { + height: 25px; + line-height: 25px; + } +} \ No newline at end of file diff --git a/dev/Styles/_End.less b/dev/Styles/_End.less index a0b0e8c4a..73eb20bbe 100644 --- a/dev/Styles/_End.less +++ b/dev/Styles/_End.less @@ -37,4 +37,8 @@ .ot-content { font-size: 13px; } + + &.style-rainloopTestTip .ot-content { + color: red; + } } diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 099417aba..5e07444d8 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -131,10 +131,42 @@ this.sendSuccessButSaveError = ko.observable(false); this.savedError = ko.observable(false); + this.sendErrorDesc = ko.observable(''); + this.savedErrorDesc = ko.observable(''); + + this.sendError.subscribe(function (bValue) { + if (!bValue) + { + this.sendErrorDesc(''); + } + }, this); + + this.savedError.subscribe(function (bValue) { + if (!bValue) + { + this.savedErrorDesc(''); + } + }, this); + + this.sendSuccessButSaveError.subscribe(function (bValue) { + if (!bValue) + { + this.savedErrorDesc(''); + } + }, this); + this.savedTime = ko.observable(0); - this.savedOrSendingText = ko.observable(''); + this.savedTimeText = ko.computed(function () { + return 0 < this.savedTime() ? Translator.i18n('COMPOSE/SAVED_TIME', { + 'TIME': Momentor.format(this.savedTime() - 1, 'LT') + }) : ''; + }, this); this.emptyToError = ko.observable(false); + this.emptyToErrorTooltip = ko.computed(function () { + return this.emptyToError() ? Translator.i18n('COMPOSE/EMPTY_TO_ERROR_DESC') : ''; + }, this); + this.attachmentsInProcessError = ko.observable(false); this.attachmentsInErrorError = ko.observable(false); @@ -597,27 +629,25 @@ { var aIdentities = IdentityStore.identities(), + iResultIndex = 1000, oResultIdentity = null, oIdentitiesCache = {}, - fFindHelper = function (oItem) { - if (oResultIdentity) - { - return true; - } + fEachHelper = function (oItem) { - if (!oResultIdentity && oItem && oItem.email && oIdentitiesCache[oItem.email]) + if (oItem && oItem.email && oIdentitiesCache[oItem.email]) { - oResultIdentity = oIdentitiesCache[oItem.email]; - return true; + if (!oResultIdentity || iResultIndex > oIdentitiesCache[oItem.email][1]) + { + oResultIdentity = oIdentitiesCache[oItem.email][0]; + iResultIndex = oIdentitiesCache[oItem.email][1]; + } } - - return false; } ; - _.each(aIdentities, function (oItem) { - oIdentitiesCache[oItem.email()] = oItem; + _.each(aIdentities, function (oItem, iIndex) { + oIdentitiesCache[oItem.email()] = [oItem, iIndex]; }); if (oMessage) @@ -630,10 +660,10 @@ case Enums.ComposeType.ReplyAll: case Enums.ComposeType.Forward: case Enums.ComposeType.ForwardAsAttachment: - _.find(_.union(oMessage.to, oMessage.cc, oMessage.bcc, oMessage.deliveredTo), fFindHelper); + _.each(_.union(oMessage.to, oMessage.cc, oMessage.bcc, oMessage.deliveredTo), fEachHelper); break; case Enums.ComposeType.Draft: - _.find(_.union(oMessage.from, oMessage.replyTo), fFindHelper); + _.each(_.union(oMessage.from, oMessage.replyTo), fEachHelper); break; } } @@ -673,7 +703,7 @@ if (oData && Enums.Notification.CantSaveMessage === oData.ErrorCode) { this.sendSuccessButSaveError(true); - window.alert(Utils.trim(Translator.i18n('COMPOSE/SAVED_ERROR_ON_SEND'))); + this.savedErrorDesc(Utils.trim(Translator.i18n('COMPOSE/SAVED_ERROR_ON_SEND'))); } else { @@ -681,7 +711,7 @@ oData && oData.ErrorMessage ? oData.ErrorMessage : ''); this.sendError(true); - window.alert(sMessage || Translator.getNotification(Enums.Notification.CantSendMessage)); + this.sendErrorDesc(sMessage || Translator.getNotification(Enums.Notification.CantSendMessage)); } } @@ -717,12 +747,6 @@ this.savedTime(window.Math.round((new window.Date()).getTime() / 1000)); - this.savedOrSendingText( - 0 < this.savedTime() ? Translator.i18n('COMPOSE/SAVED_TIME', { - 'TIME': Momentor.format(this.savedTime() - 1, 'LT') - }) : '' - ); - if (this.bFromDraft) { Cache.setFolderHash(this.draftFolder(), ''); @@ -733,7 +757,7 @@ if (!bResult) { this.savedError(true); - this.savedOrSendingText(Translator.getNotification(Enums.Notification.CantSaveMessage)); + this.savedErrorDesc(Translator.getNotification(Enums.Notification.CantSaveMessage)); } this.reloadDraftFolder(); @@ -1046,16 +1070,12 @@ oText = $(oMessage.body).clone(); if (oText) { - oText.find('blockquote.rl-bq-switcher').each(function () { - $(this).removeClass('rl-bq-switcher hidden-bq'); - }); - oText.find('.rlBlockquoteSwitcher').each(function () { - $(this).remove(); - }); - } + oText.find('blockquote.rl-bq-switcher').removeClass('rl-bq-switcher hidden-bq'); + oText.find('.rlBlockquoteSwitcher').off('.rlBlockquoteSwitcher').remove(); + oText.find('[data-html-editor-font-wrapper]').removeAttr('data-html-editor-font-wrapper'); - oText.find('[data-html-editor-font-wrapper]').removeAttr('data-html-editor-font-wrapper'); - sText = oText.html(); + sText = oText.html(); + } switch (sComposeType) { @@ -2058,7 +2078,6 @@ this.sendSuccessButSaveError(false); this.savedError(false); this.savedTime(0); - this.savedOrSendingText(''); this.emptyToError(false); this.attachmentsInProcessError(false); diff --git a/dev/View/Popup/Identity.js b/dev/View/Popup/Identity.js index dbfe4ff15..92c931230 100644 --- a/dev/View/Popup/Identity.js +++ b/dev/View/Popup/Identity.js @@ -11,7 +11,6 @@ Globals = require('Common/Globals'), Utils = require('Common/Utils'), Translator = require('Common/Translator'), - HtmlEditor = require('Common/HtmlEditor'), Remote = require('Remote/User/Ajax'), @@ -33,9 +32,6 @@ this.edit = ko.observable(false); this.owner = ko.observable(false); - this.editor = null; - this.signatureDom = ko.observable(null); - this.email = ko.observable('').validateEmail(); this.email.focused = ko.observable(false); this.name = ko.observable(''); @@ -70,7 +66,10 @@ this.addOrEditIdentityCommand = Utils.createCommand(this, function () { - this.populateSignatureFromEditor(); + if (this.signature && this.signature.__fetchEditorValue) + { + this.signature.__fetchEditorValue(); + } if (!this.email.hasError()) { @@ -158,36 +157,6 @@ this.submitRequest(false); this.submitError(''); - - if (this.editor) - { - this.editor.setPlain('', false); - } - }; - - IdentityPopupView.prototype.populateSignatureFromEditor = function () - { - if (this.editor) - { - this.signature(this.editor.getDataWithHtmlMark()); - } - }; - - IdentityPopupView.prototype.editorSetSignature = function (sSignature) - { - if (!this.editor && this.signatureDom()) - { - var self = this; - this.editor = new HtmlEditor(self.signatureDom(), function () { - self.populateSignatureFromEditor(); - }, function () { - self.editor.setHtmlOrPlain(sSignature); - }); - } - else - { - this.editor.setHtmlOrPlain(sSignature); - } }; /** @@ -215,8 +184,6 @@ { this.id = Utils.fakeMd5(); } - - this.editorSetSignature(this.signature()); }; IdentityPopupView.prototype.onShowWithDelay = function () diff --git a/dev/View/Popup/NewOpenPgpKey.js b/dev/View/Popup/NewOpenPgpKey.js index 83e0ac2bf..e929a438a 100644 --- a/dev/View/Popup/NewOpenPgpKey.js +++ b/dev/View/Popup/NewOpenPgpKey.js @@ -61,11 +61,17 @@ this.submitRequest(true); _.delay(function () { - mKeyPair = PgpStore.openpgp.generateKeyPair({ - 'userId': sUserID, - 'numBits': Utils.pInt(self.keyBitLength()), - 'passphrase': Utils.trim(self.password()) - }); + + mKeyPair = false; + try { + mKeyPair = PgpStore.openpgp.generateKeyPair({ + 'userId': sUserID, + 'numBits': Utils.pInt(self.keyBitLength()), + 'passphrase': Utils.trim(self.password()) + }); + } catch (e) { +// window.console.log(e); + } if (mKeyPair && mKeyPair.privateKeyArmored) { @@ -78,6 +84,7 @@ } self.submitRequest(false); + }, 100); return true; diff --git a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsLicensing.html b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsLicensing.html index 9c6e7ed24..89a19ccd0 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsLicensing.html +++ b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsLicensing.html @@ -79,12 +79,14 @@    + diff --git a/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html b/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html index 85f88b210..820119068 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/PopupsCompose.html @@ -1,12 +1,12 @@
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoStep.html b/rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoStep.html new file mode 100644 index 000000000..b82169a7e --- /dev/null +++ b/rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoStep.html @@ -0,0 +1,64 @@ +
+ +
diff --git a/rainloop/v/0.0.0/static/ckeditor/CUSTOMS b/rainloop/v/0.0.0/static/ckeditor/CUSTOMS index a3c9e8fa1..7ceb2db01 100644 --- a/rainloop/v/0.0.0/static/ckeditor/CUSTOMS +++ b/rainloop/v/0.0.0/static/ckeditor/CUSTOMS @@ -27,4 +27,10 @@ disableContextMenu:function(){return false;this.on("contextmenu", proto:{addTarget:function(a,e){a.on("contextmenu",function(a){ --> -proto:{addTarget:function(a,e){a.on("contextmenu",function(a){return false; \ No newline at end of file +proto:{addTarget:function(a,e){a.on("contextmenu",function(a){return false; + +--- + +var a=this.$.nodeName.toLowerCase(); +--> +var a=(this.$?(this.$.nodeName||''):'').toLowerCase(); \ No newline at end of file diff --git a/vendors/ckeditor/CUSTOMS b/vendors/ckeditor/CUSTOMS index a3c9e8fa1..6713c8963 100644 --- a/vendors/ckeditor/CUSTOMS +++ b/vendors/ckeditor/CUSTOMS @@ -27,4 +27,4 @@ disableContextMenu:function(){return false;this.on("contextmenu", proto:{addTarget:function(a,e){a.on("contextmenu",function(a){ --> -proto:{addTarget:function(a,e){a.on("contextmenu",function(a){return false; \ No newline at end of file +proto:{addTarget:function(a,e){a.on("contextmenu",function(a){return false; From acb013fbb5fdace4d6f986df3f8df6f4241e95ec Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Tue, 7 Apr 2015 20:39:43 +0400 Subject: [PATCH 2/6] Added "Enforce 2-Step verification" setting --- dev/App/User.js | 314 +++++++++--------- dev/Common/Enums.js | 1 + dev/External/ko.js | 6 + dev/Settings/Admin/Security.js | 22 ++ dev/Settings/User/Security.js | 169 +--------- dev/Stores/Admin/Capa.js | 2 + dev/Styles/MessageView.less | 1 + dev/Styles/TwoFactor.less | 14 + dev/View/Popup/TwoFactorConfiguration.js | 232 +++++++++++++ package.json | 2 +- .../0.0.0/app/libraries/RainLoop/Actions.php | 25 ++ .../libraries/RainLoop/Config/Application.php | 1 + .../libraries/RainLoop/Enumerations/Capa.php | 1 + .../Views/Admin/AdminSettingsSecurity.html | 35 +- .../User/PopupsTwoFactorConfiguration.html | 110 ++++++ .../templates/Views/User/PopupsTwoStep.html | 64 ---- .../Views/User/SettingsSecurity.html | 82 +---- rainloop/v/0.0.0/langs/admin/en.ini | 1 + rainloop/v/0.0.0/langs/admin/ru.ini | 1 + rainloop/v/0.0.0/langs/bg.ini | 40 ++- rainloop/v/0.0.0/langs/cs.ini | 40 ++- rainloop/v/0.0.0/langs/de.ini | 42 ++- rainloop/v/0.0.0/langs/en-gb.ini | 40 ++- rainloop/v/0.0.0/langs/en.ini | 40 ++- rainloop/v/0.0.0/langs/es.ini | 40 ++- rainloop/v/0.0.0/langs/fr.ini | 40 ++- rainloop/v/0.0.0/langs/hu.ini | 40 ++- rainloop/v/0.0.0/langs/is.ini | 40 ++- rainloop/v/0.0.0/langs/it.ini | 40 ++- rainloop/v/0.0.0/langs/ja-jp.ini | 40 ++- rainloop/v/0.0.0/langs/ko-kr.ini | 40 ++- rainloop/v/0.0.0/langs/lt.ini | 40 ++- rainloop/v/0.0.0/langs/lv.ini | 40 ++- rainloop/v/0.0.0/langs/nl.ini | 42 ++- rainloop/v/0.0.0/langs/no.ini | 40 ++- rainloop/v/0.0.0/langs/pl.ini | 42 ++- rainloop/v/0.0.0/langs/pt-br.ini | 42 ++- rainloop/v/0.0.0/langs/pt-pt.ini | 42 ++- rainloop/v/0.0.0/langs/ro.ini | 40 ++- rainloop/v/0.0.0/langs/ru.ini | 40 ++- rainloop/v/0.0.0/langs/sk.ini | 40 ++- rainloop/v/0.0.0/langs/sv.ini | 40 ++- rainloop/v/0.0.0/langs/tr.ini | 40 ++- rainloop/v/0.0.0/langs/ua.ini | 40 ++- rainloop/v/0.0.0/langs/zh-cn.ini | 40 ++- rainloop/v/0.0.0/langs/zh-tw.ini | 40 ++- rainloop/v/0.0.0/static/ckeditor/CUSTOMS | 6 - 47 files changed, 1271 insertions(+), 908 deletions(-) create mode 100644 dev/View/Popup/TwoFactorConfiguration.js create mode 100644 rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoFactorConfiguration.html delete mode 100644 rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoStep.html diff --git a/dev/App/User.js b/dev/App/User.js index 72849500c..6cf839026 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -1214,6 +1214,11 @@ }); }; + AppUser.prototype.bootstartTwoFactorScreen = function () + { + kn.showScreenPopup(require('View/Popup/TwoFactorConfiguration'), [true]); + }; + AppUser.prototype.bootstartLoginScreen = function () { Globals.$html.removeClass('rl-user-auth').addClass('rl-user-no-auth'); @@ -1221,8 +1226,6 @@ var sCustomLoginLink = Utils.pString(Settings.settingsGet('CustomLoginLink')); if (!sCustomLoginLink) { - kn.hideLoading(); - kn.startScreens([ require('Screen/User/Login') ]); @@ -1242,6 +1245,16 @@ } }; + AppUser.prototype.bootend = function () + { + kn.hideLoading(); + + if (SimplePace) + { + SimplePace.set(100); + } + }; + AppUser.prototype.bootstart = function () { AbstractApp.prototype.bootstart.call(this); @@ -1272,183 +1285,186 @@ Events.pub('left-panel.' + (bValue ? 'off' : 'on')); }); + this.setWindowTitle(''); if (!!Settings.settingsGet('Auth')) { Globals.$html.addClass('rl-user-auth'); - this.setWindowTitle(Translator.i18n('TITLES/LOADING')); + if (Settings.capa(Enums.Capa.TwoFactor) && + Settings.capa(Enums.Capa.TwoFactorForce) && + Settings.settingsGet('RequireTwoFactor')) + { + + this.bootend(); + this.bootstartTwoFactorScreen(); + } + else + { + this.setWindowTitle(Translator.i18n('TITLES/LOADING')); //require.ensure([], function() { // require code splitting - self.foldersReload(_.bind(function (bValue) { + self.foldersReload(_.bind(function (bValue) { - kn.hideLoading(); + this.bootend(); - if (bValue) - { - if ($LAB && window.crypto && window.crypto.getRandomValues && Settings.capa(Enums.Capa.OpenPGP)) + if (bValue) { - var fOpenpgpCallback = function (openpgp) { - PgpStore.openpgp = openpgp; - PgpStore.openpgpKeyring = new openpgp.Keyring(); - PgpStore.capaOpenPGP(true); - - Events.pub('openpgp.init'); - - self.reloadOpenPgpKeys(); - }; - - if (window.openpgp) + if ($LAB && window.crypto && window.crypto.getRandomValues && Settings.capa(Enums.Capa.OpenPGP)) { - fOpenpgpCallback(window.openpgp); + var fOpenpgpCallback = function (openpgp) { + PgpStore.openpgp = openpgp; + PgpStore.openpgpKeyring = new openpgp.Keyring(); + PgpStore.capaOpenPGP(true); + + Events.pub('openpgp.init'); + + self.reloadOpenPgpKeys(); + }; + + if (window.openpgp) + { + fOpenpgpCallback(window.openpgp); + } + else + { + $LAB.script(Links.openPgpJs()).wait(function () { + if (window.openpgp) + { + fOpenpgpCallback(window.openpgp); + } + }); + } } else { - $LAB.script(Links.openPgpJs()).wait(function () { - if (window.openpgp) + PgpStore.capaOpenPGP(false); + } + + kn.startScreens([ + require('Screen/User/MailBox'), + require('Screen/User/Settings'), + require('Screen/User/About') + ]); + + if (bGoogle || bFacebook || bTwitter) + { + self.socialUsers(true); + } + + Events.sub('interval.2m', function () { + self.folderInformation(Cache.getFolderInboxName()); + }); + + Events.sub('interval.3m', function () { + var sF = FolderStore.currentFolderFullNameRaw(); + if (Cache.getFolderInboxName() !== sF) + { + self.folderInformation(sF); + } + }); + + Events.sub('interval.5m-after5m', function () { + self.folderInformationMultiply(); + }); + + Events.sub('interval.15m', function () { + self.quota(); + }); + + Events.sub('interval.20m', function () { + self.foldersReload(); + }); + + iContactsSyncInterval = 5 <= iContactsSyncInterval ? iContactsSyncInterval : 20; + iContactsSyncInterval = 320 >= iContactsSyncInterval ? iContactsSyncInterval : 320; + + _.delay(function () { + self.contactsSync(); + }, 10000); + + _.delay(function () { + self.folderInformationMultiply(true); + }, 2000); + + window.setInterval(function () { + self.contactsSync(); + }, iContactsSyncInterval * 60000 + 5000); + + self.accountsAndIdentities(true); + + _.delay(function () { + var sF = FolderStore.currentFolderFullNameRaw(); + if (Cache.getFolderInboxName() !== sF) + { + self.folderInformation(sF); + } + }, 1000); + + _.delay(function () { + self.quota(); + }, 5000); + + _.delay(function () { + Remote.appDelayStart(Utils.emptyFunction); + }, 35000); + + Events.sub('rl.auto-logout', function () { + self.logout(); + }); + + Plugins.runHook('rl-start-user-screens'); + Events.pub('rl.bootstart-user-screens'); + + if (!!Settings.settingsGet('AccountSignMe') && window.navigator.registerProtocolHandler) + { + _.delay(function () { + try { + window.navigator.registerProtocolHandler('mailto', + window.location.protocol + '//' + window.location.host + window.location.pathname + '?mailto&to=%s', + '' + (Settings.settingsGet('Title') || 'RainLoop')); + } catch(e) {} + + if (Settings.settingsGet('MailToEmail')) { - fOpenpgpCallback(window.openpgp); + Utils.mailToHelper(Settings.settingsGet('MailToEmail'), require('View/Popup/Compose')); } + }, 500); + } + + if (!Globals.bMobileDevice) + { + _.defer(function () { + self.initVerticalLayoutResizer(Enums.ClientSideKeyName.FolderListSize); }); + + if (Tinycon) + { + Tinycon.setOptions({ + fallback: false + }); + + Events.sub('mailbox.inbox-unread-count', function (iCount) { + Tinycon.setBubble(0 < iCount ? (99 < iCount ? 99 : iCount) : 0); + }); + } } } else { - PgpStore.capaOpenPGP(false); + this.bootstartLoginScreen(); } - kn.startScreens([ - require('Screen/User/MailBox'), - require('Screen/User/Settings'), - require('Screen/User/About') - ]); - - if (bGoogle || bFacebook || bTwitter) - { - self.socialUsers(true); - } - - Events.sub('interval.2m', function () { - self.folderInformation(Cache.getFolderInboxName()); - }); - - Events.sub('interval.3m', function () { - var sF = FolderStore.currentFolderFullNameRaw(); - if (Cache.getFolderInboxName() !== sF) - { - self.folderInformation(sF); - } - }); - - Events.sub('interval.5m-after5m', function () { - self.folderInformationMultiply(); - }); - - Events.sub('interval.15m', function () { - self.quota(); - }); - - Events.sub('interval.20m', function () { - self.foldersReload(); - }); - - iContactsSyncInterval = 5 <= iContactsSyncInterval ? iContactsSyncInterval : 20; - iContactsSyncInterval = 320 >= iContactsSyncInterval ? iContactsSyncInterval : 320; - - _.delay(function () { - self.contactsSync(); - }, 10000); - - _.delay(function () { - self.folderInformationMultiply(true); - }, 2000); - - window.setInterval(function () { - self.contactsSync(); - }, iContactsSyncInterval * 60000 + 5000); - - self.accountsAndIdentities(true); - - _.delay(function () { - var sF = FolderStore.currentFolderFullNameRaw(); - if (Cache.getFolderInboxName() !== sF) - { - self.folderInformation(sF); - } - }, 1000); - - _.delay(function () { - self.quota(); - }, 5000); - - _.delay(function () { - Remote.appDelayStart(Utils.emptyFunction); - }, 35000); - - Events.sub('rl.auto-logout', function () { - self.logout(); - }); - - Plugins.runHook('rl-start-user-screens'); - Events.pub('rl.bootstart-user-screens'); - - if (!!Settings.settingsGet('AccountSignMe') && window.navigator.registerProtocolHandler) - { - _.delay(function () { - try { - window.navigator.registerProtocolHandler('mailto', - window.location.protocol + '//' + window.location.host + window.location.pathname + '?mailto&to=%s', - '' + (Settings.settingsGet('Title') || 'RainLoop')); - } catch(e) {} - - if (Settings.settingsGet('MailToEmail')) - { - Utils.mailToHelper(Settings.settingsGet('MailToEmail'), require('View/Popup/Compose')); - } - }, 500); - } - - if (!Globals.bMobileDevice) - { - _.defer(function () { - self.initVerticalLayoutResizer(Enums.ClientSideKeyName.FolderListSize); - }); - - if (Tinycon) - { - Tinycon.setOptions({ - fallback: false - }); - - Events.sub('mailbox.inbox-unread-count', function (iCount) { - Tinycon.setBubble(0 < iCount ? (99 < iCount ? 99 : iCount) : 0); - }); - } - } - } - else - { - this.bootstartLoginScreen(); - } - - if (SimplePace) - { - SimplePace.set(100); - } - - }, self)); + }, self)); //}); // require code splitting + } } else { + this.bootend(); this.bootstartLoginScreen(); - - if (SimplePace) - { - SimplePace.set(100); - } } if (bGoogle) diff --git a/dev/Common/Enums.js b/dev/Common/Enums.js index 4bf53cc4e..2a18a0d0d 100644 --- a/dev/Common/Enums.js +++ b/dev/Common/Enums.js @@ -47,6 +47,7 @@ */ Enums.Capa = { 'TwoFactor': 'TWO_FACTOR', + 'TwoFactorForce': 'TWO_FACTOR_FORCE', 'OpenPGP': 'OPEN_PGP', 'Prefetch': 'PREFETCH', 'Gravatar': 'GRAVATAR', diff --git a/dev/External/ko.js b/dev/External/ko.js index 61972672f..189d7fb98 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -130,9 +130,15 @@ if (sValue) { + oElement.__opentip.activate(); oElement.__opentip.setContent( bi18n ? require('Common/Translator').i18n(sValue) : sValue); } + else + { + oElement.__opentip.setContent(''); + oElement.__opentip.deactivate(); + } } } }; diff --git a/dev/Settings/Admin/Security.js b/dev/Settings/Admin/Security.js index 9d0ac8cd0..f8bdaa220 100644 --- a/dev/Settings/Admin/Security.js +++ b/dev/Settings/Admin/Security.js @@ -28,11 +28,27 @@ this.weakPassword = AppAdminStore.weakPassword; this.capaOpenPGP = CapaAdminStore.openPGP; + this.capaTwoFactorAuth = CapaAdminStore.twoFactorAuth; + this.capaTwoFactorAuthForce = CapaAdminStore.twoFactorAuthForce; + + this.capaTwoFactorAuth.subscribe(function (bValue) { + if (!bValue) + { + this.capaTwoFactorAuthForce(false); + } + }, this); this.verifySslCertificate = ko.observable(!!Settings.settingsGet('VerifySslCertificate')); this.allowSelfSigned = ko.observable(!!Settings.settingsGet('AllowSelfSigned')); + this.verifySslCertificate.subscribe(function (bValue) { + if (!bValue) + { + this.allowSelfSigned(true); + } + }, this); + this.adminLogin = ko.observable(Settings.settingsGet('AdminLogin')); this.adminLoginError = ko.observable(false); this.adminPassword = ko.observable(''); @@ -126,6 +142,12 @@ }); }); + this.capaTwoFactorAuthForce.subscribe(function (bValue) { + Remote.saveAdminConfig(Utils.emptyFunction, { + 'CapaTwoFactorAuthForce': bValue ? '1' : '0' + }); + }); + this.useLocalProxyForExternalImages.subscribe(function (bValue) { Remote.saveAdminConfig(null, { 'UseLocalProxyForExternalImages': bValue ? '1' : '0' diff --git a/dev/Settings/User/Security.js b/dev/Settings/User/Security.js index 7e87765a3..d771a8743 100644 --- a/dev/Settings/User/Security.js +++ b/dev/Settings/User/Security.js @@ -39,180 +39,15 @@ {'id': 60, 'name': Translator.i18n('SETTINGS_SECURITY/AUTOLOGIN_MINUTES_OPTION_NAME', {'MINUTES': 60})} ]; }); - - this.processing = ko.observable(false); - this.clearing = ko.observable(false); - this.secreting = ko.observable(false); - - this.viewUser = ko.observable(''); - this.twoFactorStatus = ko.observable(false); - - this.twoFactorTested = ko.observable(false); - - this.viewSecret = ko.observable(''); - this.viewBackupCodes = ko.observable(''); - this.viewUrl = ko.observable(''); - - this.viewEnable_ = ko.observable(false); - - this.viewEnable = ko.computed({ - 'owner': this, - 'read': this.viewEnable_, - 'write': function (bValue) { - - var self = this; - - bValue = !!bValue; - - if (bValue && this.twoFactorTested()) - { - this.viewEnable_(bValue); - - Remote.enableTwoFactor(function (sResult, oData) { - if (Enums.StorageResultType.Success !== sResult || !oData || !oData.Result) - { - self.viewEnable_(false); - } - - }, true); - } - else - { - if (!bValue) - { - this.viewEnable_(bValue); - } - - Remote.enableTwoFactor(function (sResult, oData) { - if (Enums.StorageResultType.Success !== sResult || !oData || !oData.Result) - { - self.viewEnable_(false); - } - - }, false); - } - } - }); - - this.viewTwoFactorEnableTooltip = ko.computed(function () { - Translator.trigger(); - return this.twoFactorTested() || this.viewEnable_() ? '' : - Translator.i18n('SETTINGS_SECURITY/TWO_FACTOR_SECRET_TEST_BEFORE_DESC'); - }, this); - - this.viewTwoFactorStatus = ko.computed(function () { - Translator.trigger(); - return Translator.i18n( - this.twoFactorStatus() ? - 'SETTINGS_SECURITY/TWO_FACTOR_SECRET_CONFIGURED_DESC' : - 'SETTINGS_SECURITY/TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC' - ); - }, this); - - this.twoFactorAllowedEnable = ko.computed(function () { - return this.viewEnable() || this.twoFactorTested(); - }, this); - - this.onResult = _.bind(this.onResult, this); - this.onShowSecretResult = _.bind(this.onShowSecretResult, this); } - SecurityUserSettings.prototype.showSecret = function () + SecurityUserSettings.prototype.configureTwoFactor = function () { - this.secreting(true); - Remote.showTwoFactorSecret(this.onShowSecretResult); - }; - - SecurityUserSettings.prototype.hideSecret = function () - { - this.viewSecret(''); - this.viewBackupCodes(''); - this.viewUrl(''); - }; - - SecurityUserSettings.prototype.createTwoFactor = function () - { - this.processing(true); - Remote.createTwoFactor(this.onResult); - }; - - SecurityUserSettings.prototype.testTwoFactor = function () - { - require('Knoin/Knoin').showScreenPopup(require('View/Popup/TwoFactorTest'), [this.twoFactorTested]); - }; - - SecurityUserSettings.prototype.clearTwoFactor = function () - { - this.viewSecret(''); - this.viewBackupCodes(''); - this.viewUrl(''); - - this.twoFactorTested(false); - - this.clearing(true); - Remote.clearTwoFactor(this.onResult); - }; - - SecurityUserSettings.prototype.onShow = function () - { - this.viewSecret(''); - this.viewBackupCodes(''); - this.viewUrl(''); - }; - - SecurityUserSettings.prototype.onResult = function (sResult, oData) - { - this.processing(false); - this.clearing(false); - - if (Enums.StorageResultType.Success === sResult && oData && oData.Result) - { - this.viewUser(Utils.pString(oData.Result.User)); - this.viewEnable_(!!oData.Result.Enable); - this.twoFactorStatus(!!oData.Result.IsSet); - this.twoFactorTested(!!oData.Result.Tested); - - this.viewSecret(Utils.pString(oData.Result.Secret)); - this.viewBackupCodes(Utils.pString(oData.Result.BackupCodes).replace(/[\s]+/g, ' ')); - this.viewUrl(Utils.pString(oData.Result.Url)); - } - else - { - this.viewUser(''); - this.viewEnable_(false); - this.twoFactorStatus(false); - this.twoFactorTested(false); - - this.viewSecret(''); - this.viewBackupCodes(''); - this.viewUrl(''); - } - }; - - SecurityUserSettings.prototype.onShowSecretResult = function (sResult, oData) - { - this.secreting(false); - - if (Enums.StorageResultType.Success === sResult && oData && oData.Result) - { - this.viewSecret(Utils.pString(oData.Result.Secret)); - this.viewUrl(Utils.pString(oData.Result.Url)); - } - else - { - this.viewSecret(''); - this.viewUrl(''); - } + require('Knoin/Knoin').showScreenPopup(require('View/Popup/TwoFactorConfiguration')); }; SecurityUserSettings.prototype.onBuild = function () { - if (this.capaTwoFactor) - { - this.processing(true); - Remote.getTwoFactor(this.onResult); - } - if (this.capaAutoLogout) { var self = this; diff --git a/dev/Stores/Admin/Capa.js b/dev/Stores/Admin/Capa.js index 55b7886cc..a2dfcf963 100644 --- a/dev/Stores/Admin/Capa.js +++ b/dev/Stores/Admin/Capa.js @@ -25,6 +25,7 @@ this.userBackground = ko.observable(false); this.openPGP = ko.observable(false); this.twoFactorAuth = ko.observable(false); + this.twoFactorAuthForce = ko.observable(false); this.templates = ko.observable(false); } @@ -39,6 +40,7 @@ this.userBackground(Settings.capa(Enums.Capa.UserBackground)); this.openPGP(Settings.capa(Enums.Capa.OpenPGP)); this.twoFactorAuth(Settings.capa(Enums.Capa.TwoFactor)); + this.twoFactorAuthForce(Settings.capa(Enums.Capa.TwoFactorForce)); this.templates(Settings.capa(Enums.Capa.Templates)); }; diff --git a/dev/Styles/MessageView.less b/dev/Styles/MessageView.less index 4489ba028..168970bfc 100644 --- a/dev/Styles/MessageView.less +++ b/dev/Styles/MessageView.less @@ -149,6 +149,7 @@ html.rl-no-preview-pane { background-color: #fff; border-radius: 5px; padding: 10px 15px; + overflow: hidden; } .emptySubjectText { diff --git a/dev/Styles/TwoFactor.less b/dev/Styles/TwoFactor.less index 6b480cc48..4cb3e23bb 100644 --- a/dev/Styles/TwoFactor.less +++ b/dev/Styles/TwoFactor.less @@ -1,4 +1,18 @@ .popups { + + .b-two-factor-content { + + width: 750px; + + .modal-body { + min-height: 100px; + } + + .modal-header { + background-color: #fff; + } + } + .b-two-factor-test-content { .modal-header { background-color: #fff; diff --git a/dev/View/Popup/TwoFactorConfiguration.js b/dev/View/Popup/TwoFactorConfiguration.js new file mode 100644 index 000000000..4258740c9 --- /dev/null +++ b/dev/View/Popup/TwoFactorConfiguration.js @@ -0,0 +1,232 @@ + +(function () { + + 'use strict'; + + var + window = require('window'), + _ = require('_'), + ko = require('ko'), + + Enums = require('Common/Enums'), + Utils = require('Common/Utils'), + Translator = require('Common/Translator'), + + Settings = require('Storage/Settings'), + + Remote = require('Remote/User/Ajax'), + + kn = require('Knoin/Knoin'), + AbstractView = require('Knoin/AbstractView') + ; + + /** + * @constructor + * @extends AbstractView + */ + function TwoFactorConfigurationPopupView() + { + AbstractView.call(this, 'Popups', 'PopupsTwoFactorConfiguration'); + + this.lock = ko.observable(false); + + this.capaTwoFactor = Settings.capa(Enums.Capa.TwoFactor); + + this.processing = ko.observable(false); + this.clearing = ko.observable(false); + this.secreting = ko.observable(false); + + this.viewUser = ko.observable(''); + this.twoFactorStatus = ko.observable(false); + + this.twoFactorTested = ko.observable(false); + + this.viewSecret = ko.observable(''); + this.viewBackupCodes = ko.observable(''); + this.viewUrl = ko.observable(''); + + this.viewEnable_ = ko.observable(false); + + this.viewEnable = ko.computed({ + 'owner': this, + 'read': this.viewEnable_, + 'write': function (bValue) { + + var self = this; + + bValue = !!bValue; + + if (bValue && this.twoFactorTested()) + { + this.viewEnable_(bValue); + + Remote.enableTwoFactor(function (sResult, oData) { + if (Enums.StorageResultType.Success !== sResult || !oData || !oData.Result) + { + self.viewEnable_(false); + } + + }, true); + } + else + { + if (!bValue) + { + this.viewEnable_(bValue); + } + + Remote.enableTwoFactor(function (sResult, oData) { + if (Enums.StorageResultType.Success !== sResult || !oData || !oData.Result) + { + self.viewEnable_(false); + } + + }, false); + } + } + }); + + this.viewTwoFactorEnableTooltip = ko.computed(function () { + Translator.trigger(); + return this.twoFactorTested() || this.viewEnable_() ? '' : + Translator.i18n('POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_TEST_BEFORE_DESC'); + }, this); + + this.viewTwoFactorStatus = ko.computed(function () { + Translator.trigger(); + return Translator.i18n( + this.twoFactorStatus() ? + 'POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_CONFIGURED_DESC' : + 'POPUPS_TWO_FACTOR_CFG/TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC' + ); + }, this); + + this.twoFactorAllowedEnable = ko.computed(function () { + return this.viewEnable() || this.twoFactorTested(); + }, this); + + this.onResult = _.bind(this.onResult, this); + this.onShowSecretResult = _.bind(this.onShowSecretResult, this); + + kn.constructorEnd(this); + } + + kn.extendAsViewModel(['View/Popup/TwoFactorConfiguration', 'TwoFactorConfigurationPopupView'], TwoFactorConfigurationPopupView); + _.extend(TwoFactorConfigurationPopupView.prototype, AbstractView.prototype); + + + TwoFactorConfigurationPopupView.prototype.showSecret = function () + { + this.secreting(true); + Remote.showTwoFactorSecret(this.onShowSecretResult); + }; + + TwoFactorConfigurationPopupView.prototype.hideSecret = function () + { + this.viewSecret(''); + this.viewBackupCodes(''); + this.viewUrl(''); + }; + + TwoFactorConfigurationPopupView.prototype.createTwoFactor = function () + { + this.processing(true); + Remote.createTwoFactor(this.onResult); + }; + + TwoFactorConfigurationPopupView.prototype.logout = function () + { + require('App/User').logout(); + }; + + TwoFactorConfigurationPopupView.prototype.testTwoFactor = function () + { + require('Knoin/Knoin').showScreenPopup(require('View/Popup/TwoFactorTest'), [this.twoFactorTested]); + }; + + TwoFactorConfigurationPopupView.prototype.clearTwoFactor = function () + { + this.viewSecret(''); + this.viewBackupCodes(''); + this.viewUrl(''); + + this.twoFactorTested(false); + + this.clearing(true); + Remote.clearTwoFactor(this.onResult); + }; + + TwoFactorConfigurationPopupView.prototype.onShow = function (bLock) + { + this.lock(!!bLock); + + this.viewSecret(''); + this.viewBackupCodes(''); + this.viewUrl(''); + }; + + TwoFactorConfigurationPopupView.prototype.onHide = function () + { + if (this.lock()) + { + window.location.reload(); + } + }; + + TwoFactorConfigurationPopupView.prototype.onResult = function (sResult, oData) + { + this.processing(false); + this.clearing(false); + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + this.viewUser(Utils.pString(oData.Result.User)); + this.viewEnable_(!!oData.Result.Enable); + this.twoFactorStatus(!!oData.Result.IsSet); + this.twoFactorTested(!!oData.Result.Tested); + + this.viewSecret(Utils.pString(oData.Result.Secret)); + this.viewBackupCodes(Utils.pString(oData.Result.BackupCodes).replace(/[\s]+/g, ' ')); + this.viewUrl(Utils.pString(oData.Result.Url)); + } + else + { + this.viewUser(''); + this.viewEnable_(false); + this.twoFactorStatus(false); + this.twoFactorTested(false); + + this.viewSecret(''); + this.viewBackupCodes(''); + this.viewUrl(''); + } + }; + + TwoFactorConfigurationPopupView.prototype.onShowSecretResult = function (sResult, oData) + { + this.secreting(false); + + if (Enums.StorageResultType.Success === sResult && oData && oData.Result) + { + this.viewSecret(Utils.pString(oData.Result.Secret)); + this.viewUrl(Utils.pString(oData.Result.Url)); + } + else + { + this.viewSecret(''); + this.viewUrl(''); + } + }; + + TwoFactorConfigurationPopupView.prototype.onBuild = function () + { + if (this.capaTwoFactor) + { + this.processing(true); + Remote.getTwoFactor(this.onResult); + } + }; + + module.exports = TwoFactorConfigurationPopupView; + +}()); \ No newline at end of file diff --git a/package.json b/package.json index 5f000ca45..bb35f6ad7 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "RainLoop", "title": "RainLoop Webmail", "version": "1.8.3", - "release": "292", + "release": "295", "description": "Simple, modern & fast web-based email client", "homepage": "http://rainloop.net", "main": "gulpfile.js", diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 02219378f..3c02a4bf1 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1306,6 +1306,7 @@ class Actions 'RegistrationLinkUrl' => \trim($oConfig->Get('login', 'registration_link_url', '')), 'ContactsIsAllowed' => false, 'ChangePasswordIsAllowed' => false, + 'RequireTwoFactor' => false, 'JsHash' => \md5(\RainLoop\Utils::GetConnectionToken()), 'UseImapThread' => (bool) $oConfig->Get('labs', 'use_imap_thread', false), 'UseImapSubscribe' => (bool) $oConfig->Get('labs', 'use_imap_list_subscribe', true), @@ -1479,6 +1480,20 @@ class Actions } $aResult['Capa'] = $this->Capa(false, $oAccount); + + if ($aResult['Auth'] && !$aResult['RequireTwoFactor']) + { + if ($this->GetCapa(false, \RainLoop\Enumerations\Capa::TWO_FACTOR, $oAccount) && + $this->GetCapa(false, \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE, $oAccount) && + $this->TwoFactorAuthProvider()->IsActive()) + { + $aData = $this->getTwoFactorInfo($oAccount, true); + + $aResult['RequireTwoFactor'] = !$aData || + !isset($aData['User'], $aData['IsSet'], $aData['Enable']) || + !($aData['IsSet'] && $aData['Enable']); + } + } } else { @@ -3111,6 +3126,9 @@ class Actions case \RainLoop\Enumerations\Capa::TWO_FACTOR: $this->setConfigFromParams($oConfig, $sParamName, 'security', 'allow_two_factor_auth', 'bool'); break; + case \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE: + $this->setConfigFromParams($oConfig, $sParamName, 'security', 'force_two_factor_auth', 'bool'); + break; case \RainLoop\Enumerations\Capa::GRAVATAR: $this->setConfigFromParams($oConfig, $sParamName, 'labs', 'allow_gravatar', 'bool'); break; @@ -3216,6 +3234,7 @@ class Actions $this->setCapaFromParams($oConfig, 'CapaAdditionalAccounts', \RainLoop\Enumerations\Capa::ADDITIONAL_ACCOUNTS); $this->setCapaFromParams($oConfig, 'CapaTemplates', \RainLoop\Enumerations\Capa::TEMPLATES); $this->setCapaFromParams($oConfig, 'CapaTwoFactorAuth', \RainLoop\Enumerations\Capa::TWO_FACTOR); + $this->setCapaFromParams($oConfig, 'CapaTwoFactorAuthForce', \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE); $this->setCapaFromParams($oConfig, 'CapaOpenPGP', \RainLoop\Enumerations\Capa::OPEN_PGP); $this->setCapaFromParams($oConfig, 'CapaGravatar', \RainLoop\Enumerations\Capa::GRAVATAR); $this->setCapaFromParams($oConfig, 'CapaThemes', \RainLoop\Enumerations\Capa::THEMES); @@ -7772,6 +7791,12 @@ class Actions ($bAdmin || ($oAccount && !$oAccount->IsAdditionalAccount()))) { $aResult[] = \RainLoop\Enumerations\Capa::TWO_FACTOR; + + if ($oConfig->Get('security', 'force_two_factor_auth', false) && + ($bAdmin || ($oAccount && !$oAccount->IsAdditionalAccount()))) + { + $aResult[] = \RainLoop\Enumerations\Capa::TWO_FACTOR_FORCE; + } } if ($oConfig->Get('labs', 'allow_gravatar', false)) diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php index b2b641804..06cd00b65 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Config/Application.php @@ -116,6 +116,7 @@ class Application extends \RainLoop\Config\AbstractConfig 'admin_password' => array('12345'), 'allow_admin_panel' => array(true, 'Access settings'), 'allow_two_factor_auth' => array(false), + 'force_two_factor_auth' => array(false), 'allow_universal_login' => array(false), 'admin_panel_host' => array(''), 'core_install_access_domain' => array('') diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/Capa.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/Capa.php index 8cf16ca35..2770881af 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/Capa.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Enumerations/Capa.php @@ -6,6 +6,7 @@ class Capa { const PREM = 'PREM'; const TWO_FACTOR = 'TWO_FACTOR'; + const TWO_FACTOR_FORCE = 'TWO_FACTOR_FORCE'; const OPEN_PGP = 'OPEN_PGP'; const PREFETCH = 'PREFETCH'; const GRAVATAR = 'GRAVATAR'; diff --git a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsSecurity.html b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsSecurity.html index b50e2b812..b9aebcbdf 100644 --- a/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsSecurity.html +++ b/rainloop/v/0.0.0/app/templates/Views/Admin/AdminSettingsSecurity.html @@ -5,15 +5,38 @@
+      +
+
+
+
-
   () diff --git a/rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoFactorConfiguration.html b/rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoFactorConfiguration.html new file mode 100644 index 000000000..533597edf --- /dev/null +++ b/rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoFactorConfiguration.html @@ -0,0 +1,110 @@ +
+ +
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoStep.html b/rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoStep.html deleted file mode 100644 index b82169a7e..000000000 --- a/rainloop/v/0.0.0/app/templates/Views/User/PopupsTwoStep.html +++ /dev/null @@ -1,64 +0,0 @@ -
- -
diff --git a/rainloop/v/0.0.0/app/templates/Views/User/SettingsSecurity.html b/rainloop/v/0.0.0/app/templates/Views/User/SettingsSecurity.html index 1ffb2b561..5bad7df61 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/SettingsSecurity.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/SettingsSecurity.html @@ -22,86 +22,12 @@

- -
-
- -
-
-
-
-
-
-
- -
- -
-
-
+ -
-
- ... - -
-
-
- -
- +    - -
-
-
-

-
- - - -
-
-
- -
-

-				
-
-

-
+
diff --git a/rainloop/v/0.0.0/langs/admin/en.ini b/rainloop/v/0.0.0/langs/admin/en.ini index 887c0879a..ef7442df9 100644 --- a/rainloop/v/0.0.0/langs/admin/en.ini +++ b/rainloop/v/0.0.0/langs/admin/en.ini @@ -90,6 +90,7 @@ HTML_DOMAINS_HELPER = "List of domains webmail is allowed to access. [TAB_SECURITY] LEGEND_SECURITY = "Security" LABEL_ALLOW_TWO_STEP = "Allow 2-Step Verification" +LABEL_FORCE_TWO_STEP = "Enforce 2-Step Verification" LABEL_USE_IMAGE_PROXY = "Use local proxy for external images" LABEL_ALLOW_OPEN_PGP = "Allow OpenPGP" LABEL_SHOW_PHP_INFO = "Show PHP information" diff --git a/rainloop/v/0.0.0/langs/admin/ru.ini b/rainloop/v/0.0.0/langs/admin/ru.ini index efb6bc9c0..65337b4bf 100644 --- a/rainloop/v/0.0.0/langs/admin/ru.ini +++ b/rainloop/v/0.0.0/langs/admin/ru.ini @@ -89,6 +89,7 @@ HTML_DOMAINS_HELPER = "Список доменов к которым разре [TAB_SECURITY] LEGEND_SECURITY = "Безопасность" LABEL_ALLOW_TWO_STEP = "Разрешить 2-шаговую проверку" +LABEL_FORCE_TWO_STEP = "Форсировать 2-шаговую проверку" LABEL_USE_IMAGE_PROXY = "Использовать локальный прокси для внешних изображений" LABEL_ALLOW_OPEN_PGP = "Разрешить OpenPGP" LABEL_SHOW_PHP_INFO = "Показать PHP информацию" diff --git a/rainloop/v/0.0.0/langs/bg.ini b/rainloop/v/0.0.0/langs/bg.ini index 14e89e4b5..66dd089a5 100644 --- a/rainloop/v/0.0.0/langs/bg.ini +++ b/rainloop/v/0.0.0/langs/bg.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Не сте избрали системна папка, в Ако желаете да премахнете съобщенията окончателно, моля изберете опцията \"Не използвай\"." NOTIFICATION_ARCHIVE = "Не сте избрали истемна папка, в която архивираните съобщения \"Архив\" да бъдат поставяни." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Зареждане" LOGIN = "Вписване" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Общи" diff --git a/rainloop/v/0.0.0/langs/cs.ini b/rainloop/v/0.0.0/langs/cs.ini index 6633f443f..569890c9e 100644 --- a/rainloop/v/0.0.0/langs/cs.ini +++ b/rainloop/v/0.0.0/langs/cs.ini @@ -376,6 +376,29 @@ NOTIFICATION_TRASH = "Nevybrali jste systémovou složku pro \"Koš\" kam jsou z POkud chcete zprávy odstranit natrvalo, vyberte prosím možnost \"Nepoužívat\"." NOTIFICATION_ARCHIVE = "Nevybrali jste systémovou \"Archiv\", kam se ukládají archivované zprávy." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Načítám" LOGIN = "Uživatelské jméno" @@ -440,25 +463,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Připojit podpis ke všem odchozím zprávám" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Všeobecné" diff --git a/rainloop/v/0.0.0/langs/de.ini b/rainloop/v/0.0.0/langs/de.ini index 3c97a7266..c8dbfa96b 100644 --- a/rainloop/v/0.0.0/langs/de.ini +++ b/rainloop/v/0.0.0/langs/de.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Sie haben keinen \"Papierkorb\"-Systemordner gewählt, in Falls Sie gelöschte Nachrichten endgültig löschen möchten, wählen Sie die Option \"Nicht anwenden\"." NOTIFICATION_ARCHIVE = "Sie haben keinen \"Archiv\"-Systemordner gewählt, in dem die archivierten Nachrichten abgelegt werden." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Wird geladen" LOGIN = "Anmeldung" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Signatur zu allen ausgehenden Nachrichten hinzufü [SETTINGS_SECURITY] LEGEND_SECURITY = "Sicherheit" -LEGEND_TWO_FACTOR_AUTH = "Zwei-Faktor-Authentifizierung" -LABEL_ENABLE_TWO_FACTOR = "Zwei-Faktor-Authentifizierung aktivieren" -LABEL_TWO_FACTOR_USER = "Benutzer" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup-Codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Automatische Abmeldung" AUTOLOGIN_NEVER_OPTION_NAME = "Nie" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% Minute(n)" -BUTTON_CREATE = "Neuen Secret erstellen" -BUTTON_CLEAR = "Zurücksetzen" -BUTTON_TEST = "Testen" -BUTTON_SHOW_SECRET = "Secret anzeigen" -BUTTON_HIDE_SECRET = "Secret verbergen" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Konfiguriert" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Nicht konfiguriert" -TWO_FACTOR_SECRET_DESC = "Importieren Sie diese Informationen in Ihren Google-Authenticator-Client (oder andere TOTP-Clients) mit Hilfe des mitgelieferten QR-Codes unten oder durch manuelle Eingabe des Codes." -TWO_FACTOR_BACKUP_CODES_DESC = "Wenn Sie keine Codes via Google Authenticator erhalten können, können Sie Backup-Codes für die Anmeldung verwenden. Nachdem Sie einen Backup-Code verwendet haben, um sich anzumelden, wird dieser inaktiv." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Sie können diese Einstellung nicht vor einer Prüfung ändern." [SETTINGS_GENERAL] LEGEND_GENERAL = "Allgemein" @@ -697,4 +705,4 @@ NO_COOKIE_DESC = "Ihr Browser unterstützt Cookies nicht. Aktivieren Sie bitte die Cookie-Unterstützung in Ihrem Browser und versuchen Sie es erneut." BAD_BROWSER_TITLE = "Ihr Browser ist veraltet." BAD_BROWSER_DESC = "Um alle Funktionen dieser Anwendung nutzen zu können, -sollten Sie einen der folgenden Browser herunterladen und installieren:" \ No newline at end of file +sollten Sie einen der folgenden Browser herunterladen und installieren:" diff --git a/rainloop/v/0.0.0/langs/en-gb.ini b/rainloop/v/0.0.0/langs/en-gb.ini index d6804435f..24023d579 100644 --- a/rainloop/v/0.0.0/langs/en-gb.ini +++ b/rainloop/v/0.0.0/langs/en-gb.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "You haven't selected \"Trash\" system folder deleted messa If you wish to remove messages permanently, please select \"Do not use\" option." NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification (TOTP)" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create a secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator (or other TOTP client), you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Loading" LOGIN = "Login" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification (TOTP)" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create a secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator (or other TOTP client), you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "General" diff --git a/rainloop/v/0.0.0/langs/en.ini b/rainloop/v/0.0.0/langs/en.ini index d6804435f..24023d579 100644 --- a/rainloop/v/0.0.0/langs/en.ini +++ b/rainloop/v/0.0.0/langs/en.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "You haven't selected \"Trash\" system folder deleted messa If you wish to remove messages permanently, please select \"Do not use\" option." NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification (TOTP)" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create a secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator (or other TOTP client), you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Loading" LOGIN = "Login" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification (TOTP)" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create a secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator (or other TOTP client), you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "General" diff --git a/rainloop/v/0.0.0/langs/es.ini b/rainloop/v/0.0.0/langs/es.ini index c08a87e80..ae79411aa 100644 --- a/rainloop/v/0.0.0/langs/es.ini +++ b/rainloop/v/0.0.0/langs/es.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Usted no ha seleccionado la carpeta del sistema para aloja Si desea eliminar los mensajes permanentemente, por favor seleccione la opción \"No usar\"." NOTIFICATION_ARCHIVE = "Usted no ha seleccionado la carpeta del sistema para alojar los mensajes enviados al \"Archivo\"." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "Verificación de 2 Pasos" +LABEL_ENABLE_TWO_FACTOR = "Activar la verificación de 2 pasos" +LABEL_TWO_FACTOR_USER = "Usuario" +LABEL_TWO_FACTOR_STATUS = "Estado" +LABEL_TWO_FACTOR_SECRET = "Clave secreta" +LABEL_TWO_FACTOR_BACKUP_CODES = "Códigos de copia de seguridad" +BUTTON_CREATE = "Crear nueva clave secreta" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Borrar" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Probar" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Mostrar clave secreta" +BUTTON_HIDE_SECRET = "Ocultar clave secreta" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configurado" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "No configurado" +TWO_FACTOR_SECRET_DESC = "Importar esta información en su cliente Google Authenticator (u otro cliente TOTP) utilizando el código QR ​​se indica debajo o introduciendo el código manualmente." +TWO_FACTOR_BACKUP_CODES_DESC = "Si usted no puede recibir los códigos a través de Google Authenticator, puede utilizar códigos de copia de seguridad para firmar pulg Después de que usted ha utilizado un código de copia de seguridad para iniciar sesión, se convertirá en inactiva." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Cargando" LOGIN = "Ingresar" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Agregar su firma a todos los mensajes salientes" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "Verificación de 2 Pasos" -LABEL_ENABLE_TWO_FACTOR = "Activar la verificación de 2 pasos" -LABEL_TWO_FACTOR_USER = "Usuario" -LABEL_TWO_FACTOR_STATUS = "Estado" -LABEL_TWO_FACTOR_SECRET = "Clave secreta" -LABEL_TWO_FACTOR_BACKUP_CODES = "Códigos de copia de seguridad" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Crear nueva clave secreta" -BUTTON_CLEAR = "Borrar" -BUTTON_TEST = "Probar" -BUTTON_SHOW_SECRET = "Mostrar clave secreta" -BUTTON_HIDE_SECRET = "Ocultar clave secreta" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configurado" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "No configurado" -TWO_FACTOR_SECRET_DESC = "Importar esta información en su cliente Google Authenticator (u otro cliente TOTP) utilizando el código QR ​​se indica debajo o introduciendo el código manualmente." -TWO_FACTOR_BACKUP_CODES_DESC = "Si usted no puede recibir los códigos a través de Google Authenticator, puede utilizar códigos de copia de seguridad para firmar pulg Después de que usted ha utilizado un código de copia de seguridad para iniciar sesión, se convertirá en inactiva." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "General" diff --git a/rainloop/v/0.0.0/langs/fr.ini b/rainloop/v/0.0.0/langs/fr.ini index e48437f89..44d485ffa 100644 --- a/rainloop/v/0.0.0/langs/fr.ini +++ b/rainloop/v/0.0.0/langs/fr.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Vous n'avez pas sélectionné de dossier \"Corbeille\" où Si vous ne souhaitez supprimer définitivement les messages, sélectionner l'option \"Ne pas utiliser\"." NOTIFICATION_ARCHIVE = "Vous n'avez pas sélectionné de dossier \"Archive\" où placer les messages archivés." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "Authentification en deux étapes" +LABEL_ENABLE_TWO_FACTOR = "Activer l'authentification en deux étapes" +LABEL_TWO_FACTOR_USER = "Utilisateur" +LABEL_TWO_FACTOR_STATUS = "Statut" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Code de sauvegarde" +BUTTON_CREATE = "Créer une nouvelle clef secrète" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Effacer" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Tester" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Montrer la clef secrète" +BUTTON_HIDE_SECRET = "Masquer la clef secrète" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configurer" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Non configuré" +TWO_FACTOR_SECRET_DESC = "Importez ces informations dans votre client Google Authenticator (ou un autre client TOTP) en utilisant le code QR fourni ci-dessous ou en entrant les valeurs manuellement." +TWO_FACTOR_BACKUP_CODES_DESC = "Si vous ne pouvez pas recevoir les codes par Google Authenticator, vous pouvez utiliser les codes de sauvegarde pour vous connecter. Après avoir fait cela, il deviendra inactif." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Vous ne pouvez pas modifier ce paramètre avant de l'avoir essayé." + [TITLES] LOADING = "Chargement" LOGIN = "Identifiant" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Ajouter votre signature à tous les messages sorta [SETTINGS_SECURITY] LEGEND_SECURITY = "Sécurité" -LEGEND_TWO_FACTOR_AUTH = "Authentification en deux étapes" -LABEL_ENABLE_TWO_FACTOR = "Activer l'authentification en deux étapes" -LABEL_TWO_FACTOR_USER = "Utilisateur" -LABEL_TWO_FACTOR_STATUS = "Statut" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Code de sauvegarde" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Déconnexion automatique" AUTOLOGIN_NEVER_OPTION_NAME = "Jamais" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Créer une nouvelle clef secrète" -BUTTON_CLEAR = "Effacer" -BUTTON_TEST = "Tester" -BUTTON_SHOW_SECRET = "Montrer la clef secrète" -BUTTON_HIDE_SECRET = "Masquer la clef secrète" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configurer" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Non configuré" -TWO_FACTOR_SECRET_DESC = "Importez ces informations dans votre client Google Authenticator (ou un autre client TOTP) en utilisant le code QR fourni ci-dessous ou en entrant les valeurs manuellement." -TWO_FACTOR_BACKUP_CODES_DESC = "Si vous ne pouvez pas recevoir les codes par Google Authenticator, vous pouvez utiliser les codes de sauvegarde pour vous connecter. Après avoir fait cela, il deviendra inactif." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Vous ne pouvez pas modifier ce paramètre avant de l'avoir essayé." [SETTINGS_GENERAL] LEGEND_GENERAL = "Général" diff --git a/rainloop/v/0.0.0/langs/hu.ini b/rainloop/v/0.0.0/langs/hu.ini index 40f3c4011..3a2dd01ac 100644 --- a/rainloop/v/0.0.0/langs/hu.ini +++ b/rainloop/v/0.0.0/langs/hu.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "You haven't selected \"Trash\" system folder deleted messa If you wish to remove messages permanently, please select \"Do not use\" option." NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Betöltés" LOGIN = "Belépés" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "General" diff --git a/rainloop/v/0.0.0/langs/is.ini b/rainloop/v/0.0.0/langs/is.ini index 50aadb58d..c604aa016 100644 --- a/rainloop/v/0.0.0/langs/is.ini +++ b/rainloop/v/0.0.0/langs/is.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Þú hefur ekki valið \"Ruslatunna\" kerfismöppu sem eyd Ef þú vilt fjarlægja bréfið endanlega, vinsamlegast veldu \"Ekki nota\" valmöguleikann." NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Hleð" LOGIN = "Innskrá" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Almennt" diff --git a/rainloop/v/0.0.0/langs/it.ini b/rainloop/v/0.0.0/langs/it.ini index 07d1b8aff..b91b95cbb 100644 --- a/rainloop/v/0.0.0/langs/it.ini +++ b/rainloop/v/0.0.0/langs/it.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Non hai selezionato una cartella di sistema per il cestino Se non lo vuoi usare (e quindi eliminare i messaggi permanentemente) seleziona \"Non usarla\"." NOTIFICATION_ARCHIVE = "Non hai selezionato una cartella di sistema per i messaggi archiviati." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "Autenticazione a due fattori" +LABEL_ENABLE_TWO_FACTOR = "Abilita autenticazione a due fattori" +LABEL_TWO_FACTOR_USER = "Utente" +LABEL_TWO_FACTOR_STATUS = "Stato" +LABEL_TWO_FACTOR_SECRET = "Codice segreto" +LABEL_TWO_FACTOR_BACKUP_CODES = "Codici di riserva" +BUTTON_CREATE = "Crea un nuovo codice segreto" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Pulisci" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Esegui test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Mostra codice segreto" +BUTTON_HIDE_SECRET = "Nascondi codice segreto" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configurato" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Non configurato" +TWO_FACTOR_SECRET_DESC = "Importa questo codice nel tuo client di Google Authenticator (o un altro client TOTP) usando il codice QR presente sotto o inserendo il codice manualmente." +TWO_FACTOR_BACKUP_CODES_DESC = "Se non puoi ricevere codici da Google Authenticator, puoi usare i codici di riserva per entrare. Dopo aver usato un codice di riserva per entrare, esso si disattiverà." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Caricamento..." LOGIN = "Accedi" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Aggiungi la firma a tutti i messaggi in uscita" [SETTINGS_SECURITY] LEGEND_SECURITY = "Sicurezza" -LEGEND_TWO_FACTOR_AUTH = "Autenticazione a due fattori" -LABEL_ENABLE_TWO_FACTOR = "Abilita autenticazione a due fattori" -LABEL_TWO_FACTOR_USER = "Utente" -LABEL_TWO_FACTOR_STATUS = "Stato" -LABEL_TWO_FACTOR_SECRET = "Codice segreto" -LABEL_TWO_FACTOR_BACKUP_CODES = "Codici di riserva" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Disconnessione automatica" AUTOLOGIN_NEVER_OPTION_NAME = "Mai" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minuti" -BUTTON_CREATE = "Crea un nuovo codice segreto" -BUTTON_CLEAR = "Pulisci" -BUTTON_TEST = "Esegui test" -BUTTON_SHOW_SECRET = "Mostra codice segreto" -BUTTON_HIDE_SECRET = "Nascondi codice segreto" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configurato" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Non configurato" -TWO_FACTOR_SECRET_DESC = "Importa questo codice nel tuo client di Google Authenticator (o un altro client TOTP) usando il codice QR presente sotto o inserendo il codice manualmente." -TWO_FACTOR_BACKUP_CODES_DESC = "Se non puoi ricevere codici da Google Authenticator, puoi usare i codici di riserva per entrare. Dopo aver usato un codice di riserva per entrare, esso si disattiverà." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Generali" diff --git a/rainloop/v/0.0.0/langs/ja-jp.ini b/rainloop/v/0.0.0/langs/ja-jp.ini index c656ddb8c..c1f52c504 100644 --- a/rainloop/v/0.0.0/langs/ja-jp.ini +++ b/rainloop/v/0.0.0/langs/ja-jp.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "You haven't selected \"Trash\" system folder deleted messa If you wish to remove messages permanently, please select \"Do not use\" option." NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Loading" LOGIN = "Login" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "すべての送信メッセージに署名を追 [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "全般" diff --git a/rainloop/v/0.0.0/langs/ko-kr.ini b/rainloop/v/0.0.0/langs/ko-kr.ini index cbc942051..0eb9c060e 100644 --- a/rainloop/v/0.0.0/langs/ko-kr.ini +++ b/rainloop/v/0.0.0/langs/ko-kr.ini @@ -374,6 +374,29 @@ NOTIFICATION_SPAM = "스팸함 폴더가 지정되지 않았습니다. 스팸처 NOTIFICATION_TRASH = "휴지통 폴더가 지정되지 않았습니다. 삭제한 메시지를 휴지통에 보관하지 않고 바로 삭제하려면 \"사용하지 않음\" 옵션을 선택해주세요." NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "로딩 중" LOGIN = "로그인" @@ -438,25 +461,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "일반" diff --git a/rainloop/v/0.0.0/langs/lt.ini b/rainloop/v/0.0.0/langs/lt.ini index 0592ee047..b2a46c5aa 100644 --- a/rainloop/v/0.0.0/langs/lt.ini +++ b/rainloop/v/0.0.0/langs/lt.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Nepasirinkote \"Šiukšliadėžė\" sisteminio katalogo i Jei nenorite naudotis šiukšliadėže ir išmesti laiškus visam laikui iškart juos trinant, pasirinkite \"Nenaudoti\" variantą." NOTIFICATION_ARCHIVE = "Nepasirinkote \"Archyvas\" sisteminio katalogo." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-jų žingsnių patikrinimas" +LABEL_ENABLE_TWO_FACTOR = "Įjungti 2-jų žingsnių patikrinimą" +LABEL_TWO_FACTOR_USER = "Vartotojas" +LABEL_TWO_FACTOR_STATUS = "Statusas" +LABEL_TWO_FACTOR_SECRET = "Slaptažodis" +LABEL_TWO_FACTOR_BACKUP_CODES = "Sukurti kodų atsarginę kopiją" +BUTTON_CREATE = "Sukurti naują slaptažodį" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Išvalytis" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Bandyti" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Rodyti slaptažodį" +BUTTON_HIDE_SECRET = "Slėpti slaptažodį" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Sukonfiguruota" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Nesukonfiguruota" +TWO_FACTOR_SECRET_DESC = "Importuoti šią informaciją į Google autentifikavimo klientą naudojant žemiau pateiktą QR kodą arba įveskite kodą rankiniu būdu." +TWO_FACTOR_BACKUP_CODES_DESC = "Jei negaunate kodo per Google autentifikavimo klientą, galite nautotis savo sukurta atsargine kodų kopija. Kai panaudosite atsarginę kopiją prisijungimui, ji taps neaktyvi." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Negalite paksiti šio nustatymo nepratestavę." + [TITLES] LOADING = "Kraunasi" LOGIN = "Vartotojas" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Pridėti parašą visiems rašomiems laiškams" [SETTINGS_SECURITY] LEGEND_SECURITY = "Sauga" -LEGEND_TWO_FACTOR_AUTH = "2-jų žingsnių patikrinimas" -LABEL_ENABLE_TWO_FACTOR = "Įjungti 2-jų žingsnių patikrinimą" -LABEL_TWO_FACTOR_USER = "Vartotojas" -LABEL_TWO_FACTOR_STATUS = "Statusas" -LABEL_TWO_FACTOR_SECRET = "Slaptažodis" -LABEL_TWO_FACTOR_BACKUP_CODES = "Sukurti kodų atsarginę kopiją" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Automatinis atsijungimas" AUTOLOGIN_NEVER_OPTION_NAME = "Niekada" AUTOLOGIN_MINUTES_OPTION_NAME = "po %MINUTES% minučių" -BUTTON_CREATE = "Sukurti naują slaptažodį" -BUTTON_CLEAR = "Išvalytis" -BUTTON_TEST = "Bandyti" -BUTTON_SHOW_SECRET = "Rodyti slaptažodį" -BUTTON_HIDE_SECRET = "Slėpti slaptažodį" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Sukonfiguruota" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Nesukonfiguruota" -TWO_FACTOR_SECRET_DESC = "Importuoti šią informaciją į Google autentifikavimo klientą naudojant žemiau pateiktą QR kodą arba įveskite kodą rankiniu būdu." -TWO_FACTOR_BACKUP_CODES_DESC = "Jei negaunate kodo per Google autentifikavimo klientą, galite nautotis savo sukurta atsargine kodų kopija. Kai panaudosite atsarginę kopiją prisijungimui, ji taps neaktyvi." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Negalite paksiti šio nustatymo nepratestavę." [SETTINGS_GENERAL] LEGEND_GENERAL = "Pagrindiniai" diff --git a/rainloop/v/0.0.0/langs/lv.ini b/rainloop/v/0.0.0/langs/lv.ini index 0253358a5..ccb5d4bd4 100644 --- a/rainloop/v/0.0.0/langs/lv.ini +++ b/rainloop/v/0.0.0/langs/lv.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Tu neesi izvēlējies \"Miskaste\" sistēmas mapi. Ja tu vēlies izdzēst ziņojumus pavisam, izvēlies \"Neizmantot\" opciju." NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Lādējas" LOGIN = "Ielogoties" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Vispārējie" diff --git a/rainloop/v/0.0.0/langs/nl.ini b/rainloop/v/0.0.0/langs/nl.ini index e9315fc60..767760c07 100644 --- a/rainloop/v/0.0.0/langs/nl.ini +++ b/rainloop/v/0.0.0/langs/nl.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "U heeft nog geen \"Verwijderde items\" folder aangeduid wa Indien u berichten permanent wilt verwijderen, kies de \"Niet gebruiken\" optie." NOTIFICATION_ARCHIVE = "U heeft nog geen \"Archief\" map aangeduid waar de gearchiveerde berichten geplaatst worden." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Stap verificatie" +LABEL_ENABLE_TWO_FACTOR = "Gebruik 2-Stap verificatie" +LABEL_TWO_FACTOR_USER = "Gebruikersnaam" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Geheime sleutel" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Nieuwe geheime sleutel aanmaken" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Wissen" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Bekijk geheime sleutel" +BUTTON_HIDE_SECRET = "Verberg geheime sleutel" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Geconfigureerd" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Niet geconfigureerd" +TWO_FACTOR_SECRET_DESC = "Importeer deze informatie in uw Google Authenticator-client (of andere TOTP-client) door gebruik te maken van de QR code hier beneden of door de code handmatig in te voeren." +TWO_FACTOR_BACKUP_CODES_DESC = "Als u geen codes ontvangt via de Google Authenticator kan je de backup codes gebruiken om in te loggen. Na gebruik van de backup code wordt deze inactief." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Ophalen..." LOGIN = "Inloggen" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Handtekening standaard toevoegen aan bericht" [SETTINGS_SECURITY] LEGEND_SECURITY = "Beveiliging" -LEGEND_TWO_FACTOR_AUTH = "2-Stap verificatie" -LABEL_ENABLE_TWO_FACTOR = "Gebruik 2-Stap verificatie" -LABEL_TWO_FACTOR_USER = "Gebruikersnaam" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Geheime sleutel" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Automatisch uitloggen" AUTOLOGIN_NEVER_OPTION_NAME = "Nooit" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minuten" -BUTTON_CREATE = "Nieuwe geheime sleutel aanmaken" -BUTTON_CLEAR = "Wissen" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Bekijk geheime sleutel" -BUTTON_HIDE_SECRET = "Verberg geheime sleutel" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Geconfigureerd" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Niet geconfigureerd" -TWO_FACTOR_SECRET_DESC = "Importeer deze informatie in uw Google Authenticator-client (of andere TOTP-client) door gebruik te maken van de QR code hier beneden of door de code handmatig in te voeren." -TWO_FACTOR_BACKUP_CODES_DESC = "Als u geen codes ontvangt via de Google Authenticator kan je de backup codes gebruiken om in te loggen. Na gebruik van de backup code wordt deze inactief." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Algemeen" @@ -697,4 +705,4 @@ NO_COOKIE_DESC = "Cookies ondersteuning is niet beschikbaar in uw browser. Gelieve Cookies in te schakelen en opnieuw te proberen." BAD_BROWSER_TITLE = "Uw browser is verouderd" BAD_BROWSER_DESC = "Om alle functies van deze applicatie te gebruiken, -download en installeer een van de volgende browsers:" +download en installeer een van de volgende browsers:" \ No newline at end of file diff --git a/rainloop/v/0.0.0/langs/no.ini b/rainloop/v/0.0.0/langs/no.ini index 10971f3c1..41a70ad15 100644 --- a/rainloop/v/0.0.0/langs/no.ini +++ b/rainloop/v/0.0.0/langs/no.ini @@ -376,6 +376,29 @@ NOTIFICATION_TRASH = "Du har ikke valgt \"Søppel\" som mappen hvor slettede mel Hvis du ønsker å fjerne meldinger permanent, velger du \"Ikke bruk\" alternativet ." NOTIFICATION_ARCHIVE = "Du har ikke valgt \"Arkiv\" som mappen hvor arkiverte meldinger blir flyttet til." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-stegs verifisering" +LABEL_ENABLE_TWO_FACTOR = "Aktiver 2-stegs verifisering" +LABEL_TWO_FACTOR_USER = "Bruker" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backupkoder" +BUTTON_CREATE = "Lag ny secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Tøm" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Vis secret" +BUTTON_HIDE_SECRET = "Skjul Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Konfigurert" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Ikke konfigurert" +TWO_FACTOR_SECRET_DESC = "Importer denne informasjonen til din Google Authenticator klient (eller andre klienter) ved å bruke QR-koden under, eller ved å skrive inn koden manuelt." +TWO_FACTOR_BACKUP_CODES_DESC = "Om du ikke mottar koder fra Google Authenticator, kan du brukeyou can use backupkodene for å logge inn. Disse kodene vil bli deaktivert etter bruk." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Laster" LOGIN = "Logg inn" @@ -440,25 +463,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Vil du legge til signatur i alle utgående melding [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-stegs verifisering" -LABEL_ENABLE_TWO_FACTOR = "Aktiver 2-stegs verifisering" -LABEL_TWO_FACTOR_USER = "Bruker" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backupkoder" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Lag ny secret" -BUTTON_CLEAR = "Tøm" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Vis secret" -BUTTON_HIDE_SECRET = "Skjul Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Konfigurert" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Ikke konfigurert" -TWO_FACTOR_SECRET_DESC = "Importer denne informasjonen til din Google Authenticator klient (eller andre klienter) ved å bruke QR-koden under, eller ved å skrive inn koden manuelt." -TWO_FACTOR_BACKUP_CODES_DESC = "Om du ikke mottar koder fra Google Authenticator, kan du brukeyou can use backupkodene for å logge inn. Disse kodene vil bli deaktivert etter bruk." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Generelt" diff --git a/rainloop/v/0.0.0/langs/pl.ini b/rainloop/v/0.0.0/langs/pl.ini index a9bda0155..30e04a22c 100644 --- a/rainloop/v/0.0.0/langs/pl.ini +++ b/rainloop/v/0.0.0/langs/pl.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Nie został wybrany folder \"Kosz\", do którego przenoszo Jeżeli wiadomości usunięte mają być usuwane na stałe, proszę o zaznaczenie opcji: \"Nie używaj\"." NOTIFICATION_ARCHIVE = "Nie został wybrany folder \"Archiwum\", zostanie użyty systemowy folder archiwizowanych wiadomości." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "Weryfikacja 2-stopniowa" +LABEL_ENABLE_TWO_FACTOR = "Włącz 2-stopniową weryfikację" +LABEL_TWO_FACTOR_USER = "Użytkownik" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Tajna fraza" +LABEL_TWO_FACTOR_BACKUP_CODES = "Kody zapasowe" +BUTTON_CREATE = "Utwórz nową frazę" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Wyczyść" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Testuj" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Pokaż frazę" +BUTTON_HIDE_SECRET = "Ukryj frazę" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Skonfigurowane" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Nie skonfigurowane" +TWO_FACTOR_SECRET_DESC = "Zaimportuj te informacje do swojego klienta usługi Google Authenticator (lub innego klienta TOTP), używając poniższego kodu QR lub wpisując kod ręcznie." +TWO_FACTOR_BACKUP_CODES_DESC = "Jeżeli nie możesz otrzymać kodu poprzez apikację Google Authenticator, możesz użyć kodów zapasowych. Po zużyciu kodów, opcja ta będzie nieaktywna." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Nie możesz zmienić tego ustawienia przed jego przetestowaniem." + [TITLES] LOADING = "Ładowanie" LOGIN = "Login" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Dadawaj podpis do wszystkich wysyłanych wiadomoś [SETTINGS_SECURITY] LEGEND_SECURITY = "Bezpieczeństwo" -LEGEND_TWO_FACTOR_AUTH = "Weryfikacja 2-stopniowa" -LABEL_ENABLE_TWO_FACTOR = "Włącz 2-stopniową weryfikację" -LABEL_TWO_FACTOR_USER = "Użytkownik" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Tajna fraza" -LABEL_TWO_FACTOR_BACKUP_CODES = "Kody zapasowe" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Automatyczne wylogowanie" AUTOLOGIN_NEVER_OPTION_NAME = "Nidgy" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minut" -BUTTON_CREATE = "Utwórz nową frazę" -BUTTON_CLEAR = "Wyczyść" -BUTTON_TEST = "Testuj" -BUTTON_SHOW_SECRET = "Pokaż frazę" -BUTTON_HIDE_SECRET = "Ukryj frazę" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Skonfigurowane" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Nie skonfigurowane" -TWO_FACTOR_SECRET_DESC = "Zaimportuj te informacje do swojego klienta usługi Google Authenticator (lub innego klienta TOTP), używając poniższego kodu QR lub wpisując kod ręcznie." -TWO_FACTOR_BACKUP_CODES_DESC = "Jeżeli nie możesz otrzymać kodu poprzez apikację Google Authenticator, możesz użyć kodów zapasowych. Po zużyciu kodów, opcja ta będzie nieaktywna." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Nie możesz zmienić tego ustawienia przed jego przetestowaniem." [SETTINGS_GENERAL] LEGEND_GENERAL = "Ogólne" @@ -697,4 +705,4 @@ NO_COOKIE_DESC = "Obsługa Cookies jest wyłączona w twojej przeglądarce Proszę o umożliwienie obsługi plików Cookie w przeglądarce oraz ponowne uruchomienie tej strony." BAD_BROWSER_TITLE = "Twoja przeglądarka jest przestarzała!" BAD_BROWSER_DESC = "W celu wykorzystania wszystkich funkcji tej aplikacji, -zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek:" +zaktualizuj aktualnie używaną lub pobierz i zainstaluj jedną z poniższych przeglądarek:" \ No newline at end of file diff --git a/rainloop/v/0.0.0/langs/pt-br.ini b/rainloop/v/0.0.0/langs/pt-br.ini index fef2a50f4..fe121414c 100644 --- a/rainloop/v/0.0.0/langs/pt-br.ini +++ b/rainloop/v/0.0.0/langs/pt-br.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Você não selecionou a pasta do sistema que serão coloca Se você deseja remover a mensagem permanentemente, por favor selecione a opção\"Não usar\"." NOTIFICATION_ARCHIVE = "Você não selecionou a pasta \"Arquivadas\" do sistema que serão colocadas as mensagens arquivadas." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "Verificação de duas etapas" +LABEL_ENABLE_TWO_FACTOR = "Habilitar verificação de duas etapas" +LABEL_TWO_FACTOR_USER = "Usuário" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Segredo" +LABEL_TWO_FACTOR_BACKUP_CODES = "Códigos de backup" +BUTTON_CREATE = "Criar novo segredo" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Limpar" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Testar" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Mostrar segredo" +BUTTON_HIDE_SECRET = "Esconder segredo" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configurado" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Não configurado" +TWO_FACTOR_SECRET_DESC = "Importe este código no seu cliente Google Authenticator (ou outro cliente TOTP) usando o QR code abaixo ou informando o código manualmente." +TWO_FACTOR_BACKUP_CODES_DESC = "Se você não puder receber os códigos via Google Authenticator, você pode usar esses códigos de backup para acessar sua conta. Depois de você usar um código de backup, ele se expira." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Você não pode alterar essa configuração antes do teste." + [TITLES] LOADING = "Carregando" LOGIN = "Login" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Adicionar sua assinatura em todas as mensagens de [SETTINGS_SECURITY] LEGEND_SECURITY = "Segurança" -LEGEND_TWO_FACTOR_AUTH = "Verificação de duas etapas" -LABEL_ENABLE_TWO_FACTOR = "Habilitar verificação de duas etapas" -LABEL_TWO_FACTOR_USER = "Usuário" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Segredo" -LABEL_TWO_FACTOR_BACKUP_CODES = "Códigos de backup" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Deslogar Automaticamente" AUTOLOGIN_NEVER_OPTION_NAME = "Nunca" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minuto(s)" -BUTTON_CREATE = "Criar novo segredo" -BUTTON_CLEAR = "Limpar" -BUTTON_TEST = "Testar" -BUTTON_SHOW_SECRET = "Mostrar segredo" -BUTTON_HIDE_SECRET = "Esconder segredo" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configurado" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Não configurado" -TWO_FACTOR_SECRET_DESC = "Importe este código no seu cliente Google Authenticator (ou outro cliente TOTP) usando o QR code abaixo ou informando o código manualmente." -TWO_FACTOR_BACKUP_CODES_DESC = "Se você não puder receber os códigos via Google Authenticator, você pode usar esses códigos de backup para acessar sua conta. Depois de você usar um código de backup, ele se expira." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Você não pode alterar essa configuração antes do teste." [SETTINGS_GENERAL] LEGEND_GENERAL = "Geral" @@ -697,4 +705,4 @@ NO_COOKIE_DESC = "Os Cookies não estão disponíveis em seu navegador. Por favor ative o suporte a Cookies nas configurações do seu navegador e tente novamente." BAD_BROWSER_TITLE = "Seu navegador está desatualizado." BAD_BROWSER_DESC = "Para usar todos os recursos do aplicativo, -baixe e instale um desses navegadores:" +baixe e instale um desses navegadores:" \ No newline at end of file diff --git a/rainloop/v/0.0.0/langs/pt-pt.ini b/rainloop/v/0.0.0/langs/pt-pt.ini index 8845d7b6a..f86c227c5 100644 --- a/rainloop/v/0.0.0/langs/pt-pt.ini +++ b/rainloop/v/0.0.0/langs/pt-pt.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Você não selecionou a pasta \"Trash\" de sistema, onde a Se você deseja remover as mensagens definitivamente, por favor selecione a opção \"Do not use\"." NOTIFICATION_ARCHIVE = "Você não selecionou a pasta \"Archive\" de sistema, onde as mensagens arquivadas são colocadas." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "Verificação em 2-Etapas" +LABEL_ENABLE_TWO_FACTOR = "Ativar verificação em 2-Etapas" +LABEL_TWO_FACTOR_USER = "Utilizador" +LABEL_TWO_FACTOR_STATUS = "Estado" +LABEL_TWO_FACTOR_SECRET = "Segredo" +LABEL_TWO_FACTOR_BACKUP_CODES = "Códigos secundários" +BUTTON_CREATE = "Criar novo Segredo" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Limpar" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Testar" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Mostrar Segredo" +BUTTON_HIDE_SECRET = "Ocultar Segredo" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configurado" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Não configurado" +TWO_FACTOR_SECRET_DESC = "Importe esta informação no seu cliente Google Authenticator (ou outro cliente TOTP) utilizando o código QR fornecido abaixo ou introduzindo o código manualmente." +TWO_FACTOR_BACKUP_CODES_DESC = "Se não consegue receber códigos através do Google Authenticator, pode usar os códigos secundários para entrar. Após ter usado um código secundário para entrar, este será desativado." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Não pode alterar este parâmetro antes de testar." + [TITLES] LOADING = "A carregar" LOGIN = "Utilizador" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Adicionar a sua assinatura a todas as mensagens de [SETTINGS_SECURITY] LEGEND_SECURITY = "Segurança" -LEGEND_TWO_FACTOR_AUTH = "Verificação em 2-Etapas" -LABEL_ENABLE_TWO_FACTOR = "Ativar verificação em 2-Etapas" -LABEL_TWO_FACTOR_USER = "Utilizador" -LABEL_TWO_FACTOR_STATUS = "Estado" -LABEL_TWO_FACTOR_SECRET = "Segredo" -LABEL_TWO_FACTOR_BACKUP_CODES = "Códigos secundários" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Terminar sessão auto." AUTOLOGIN_NEVER_OPTION_NAME = "Nunca" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minuto(s)" -BUTTON_CREATE = "Criar novo Segredo" -BUTTON_CLEAR = "Limpar" -BUTTON_TEST = "Testar" -BUTTON_SHOW_SECRET = "Mostrar Segredo" -BUTTON_HIDE_SECRET = "Ocultar Segredo" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configurado" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Não configurado" -TWO_FACTOR_SECRET_DESC = "Importe esta informação no seu cliente Google Authenticator (ou outro cliente TOTP) utilizando o código QR fornecido abaixo ou introduzindo o código manualmente." -TWO_FACTOR_BACKUP_CODES_DESC = "Se não consegue receber códigos através do Google Authenticator, pode usar os códigos secundários para entrar. Após ter usado um código secundário para entrar, este será desativado." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Não pode alterar este parâmetro antes de testar." [SETTINGS_GENERAL] LEGEND_GENERAL = "Geral" @@ -697,4 +705,4 @@ NO_COOKIE_DESC = "O suport de Cookies não está disponível no seu navegador. Por favor ative o suporte de Cookies nas definições do seu navegador e tente novamente." BAD_BROWSER_TITLE = "O seu navegador está desatualizado." BAD_BROWSER_DESC = "Para usar todas as funções da aplicação, -transfira e instale um destes navegadores:" +transfira e instale um destes navegadores:" \ No newline at end of file diff --git a/rainloop/v/0.0.0/langs/ro.ini b/rainloop/v/0.0.0/langs/ro.ini index d7b0ee646..da9569ca9 100644 --- a/rainloop/v/0.0.0/langs/ro.ini +++ b/rainloop/v/0.0.0/langs/ro.ini @@ -376,6 +376,29 @@ NOTIFICATION_TRASH = "Вы еще не выбрали системную пап Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт \"Не использовать\"." NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Se încarcă" LOGIN = "Conectare" @@ -440,25 +463,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Adăugă semnătura la toate mesajele trimise" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Setări de bază" diff --git a/rainloop/v/0.0.0/langs/ru.ini b/rainloop/v/0.0.0/langs/ru.ini index e5ccf2006..537b2fbf9 100644 --- a/rainloop/v/0.0.0/langs/ru.ini +++ b/rainloop/v/0.0.0/langs/ru.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Вы еще не выбрали системную пап Если же вы хотите удалять письма сразу, пожалуйста, выберите пункт \"Не использовать\"." NOTIFICATION_ARCHIVE = "Вы еще не выбрали системную папку \"Архив\", в которую складываются все сообщения после архивации." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "Двухфакторная верификация" +LABEL_ENABLE_TWO_FACTOR = "Включить двухфакторную верификацию" +LABEL_TWO_FACTOR_USER = "Пользователь" +LABEL_TWO_FACTOR_STATUS = "Статус" +LABEL_TWO_FACTOR_SECRET = "Секретный ключ" +LABEL_TWO_FACTOR_BACKUP_CODES = "Резервные коды" +BUTTON_CREATE = "Создать новый секретный ключ" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Очистить" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Тест" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Показать секретный ключ" +BUTTON_HIDE_SECRET = "Скрыть секретный ключ" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Настроен" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Не настроен" +TWO_FACTOR_SECRET_DESC = "Используйте эту информацию для настройки Google Authenticator клиента (или другого TOTP клиента) с помощью прилагаемого QR-кода, или вручную." +TWO_FACTOR_BACKUP_CODES_DESC = "Если вы не можете получить коды через Google Authenticator, вы можете использовать резервные коды, чтобы войти. После того как вы использовали резервный код для входа в систему, он становится неактивным." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Вы должны выполнить тест перед тем, как вы сможете поменять эту настройку." + [TITLES] LOADING = "Загрузка" LOGIN = "Вход" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Добавлять подпись ко всем и [SETTINGS_SECURITY] LEGEND_SECURITY = "Безопасность" -LEGEND_TWO_FACTOR_AUTH = "Двухфакторная верификация" -LABEL_ENABLE_TWO_FACTOR = "Включить двухфакторную верификацию" -LABEL_TWO_FACTOR_USER = "Пользователь" -LABEL_TWO_FACTOR_STATUS = "Статус" -LABEL_TWO_FACTOR_SECRET = "Секретный ключ" -LABEL_TWO_FACTOR_BACKUP_CODES = "Резервные коды" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Автоматический выход" AUTOLOGIN_NEVER_OPTION_NAME = "Никогда" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% минут(ы)" -BUTTON_CREATE = "Создать новый секретный ключ" -BUTTON_CLEAR = "Очистить" -BUTTON_TEST = "Тест" -BUTTON_SHOW_SECRET = "Показать секретный ключ" -BUTTON_HIDE_SECRET = "Скрыть секретный ключ" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Настроен" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Не настроен" -TWO_FACTOR_SECRET_DESC = "Используйте эту информацию для настройки Google Authenticator клиента (или другого TOTP клиента) с помощью прилагаемого QR-кода, или вручную." -TWO_FACTOR_BACKUP_CODES_DESC = "Если вы не можете получить коды через Google Authenticator, вы можете использовать резервные коды, чтобы войти. После того как вы использовали резервный код для входа в систему, он становится неактивным." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "Вы должны выполнить тест перед тем, как вы сможете поменять эту настройку." [SETTINGS_GENERAL] LEGEND_GENERAL = "Основные Настройки" diff --git a/rainloop/v/0.0.0/langs/sk.ini b/rainloop/v/0.0.0/langs/sk.ini index 02b19a04f..90fad9af8 100644 --- a/rainloop/v/0.0.0/langs/sk.ini +++ b/rainloop/v/0.0.0/langs/sk.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Nepriradili ste systémový priečinok pre \"Kôš\" kam s Ak si želáte takéto správy odstraňovať natrvalo, vyberte prosím možnosť \"Nepoužívať\"." NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" +LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" +LABEL_TWO_FACTOR_USER = "User" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Načítavam" LOGIN = "Používateľské meno" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Pripojiť podpis k všetkých odchádzajúcim spr [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Step Verification" -LABEL_ENABLE_TWO_FACTOR = "Enable 2-Step verification" -LABEL_TWO_FACTOR_USER = "User" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backup codes" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Všeobecné" diff --git a/rainloop/v/0.0.0/langs/sv.ini b/rainloop/v/0.0.0/langs/sv.ini index 241e8a65d..18e4be181 100644 --- a/rainloop/v/0.0.0/langs/sv.ini +++ b/rainloop/v/0.0.0/langs/sv.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Du har inte valt \"Papperskorg\" systemmapp, där borttagn Om du vill ta meddelanden permanent, väl då \"Använd inte\" valet." NOTIFICATION_ARCHIVE = "Du har inte valt \"Arkiv\" systemmapp, där arkiverade meddelanden ska läggas." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Stegs Verifikation" +LABEL_ENABLE_TWO_FACTOR = "Aktivera 2-Stegs verifikation" +LABEL_TWO_FACTOR_USER = "Användare" +LABEL_TWO_FACTOR_STATUS = "Status" +LABEL_TWO_FACTOR_SECRET = "Hemlig kod" +LABEL_TWO_FACTOR_BACKUP_CODES = "Backupkoder" +BUTTON_CREATE = "Skapa ny hemlig kod" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Rensa" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Testa" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Visa hemlig kod" +BUTTON_HIDE_SECRET = "Göm hemlig kod" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Konfigurerad" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Inte konfigurarad" +TWO_FACTOR_SECRET_DESC = "Importera denna information till din Google Authenticator klient (eller annan TOTP klient) med denna QR kod eller manuellt med koden här nedan." +TWO_FACTOR_BACKUP_CODES_DESC = "Om du inte kan ta emot koderna med Google Authenticator, så använd backupkoderna för att logga in. När du använt backupkoderna för att logga in så blir dom inaktiva." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Laddar" LOGIN = "Logga in" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Lägg till din signatur på alla utgående meddela [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Stegs Verifikation" -LABEL_ENABLE_TWO_FACTOR = "Aktivera 2-Stegs verifikation" -LABEL_TWO_FACTOR_USER = "Användare" -LABEL_TWO_FACTOR_STATUS = "Status" -LABEL_TWO_FACTOR_SECRET = "Hemlig kod" -LABEL_TWO_FACTOR_BACKUP_CODES = "Backupkoder" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Skapa ny hemlig kod" -BUTTON_CLEAR = "Rensa" -BUTTON_TEST = "Testa" -BUTTON_SHOW_SECRET = "Visa hemlig kod" -BUTTON_HIDE_SECRET = "Göm hemlig kod" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Konfigurerad" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Inte konfigurarad" -TWO_FACTOR_SECRET_DESC = "Importera denna information till din Google Authenticator klient (eller annan TOTP klient) med denna QR kod eller manuellt med koden här nedan." -TWO_FACTOR_BACKUP_CODES_DESC = "Om du inte kan ta emot koderna med Google Authenticator, så använd backupkoderna för att logga in. När du använt backupkoderna för att logga in så blir dom inaktiva." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Allmänt" diff --git a/rainloop/v/0.0.0/langs/tr.ini b/rainloop/v/0.0.0/langs/tr.ini index f15881c39..3fb214e83 100644 --- a/rainloop/v/0.0.0/langs/tr.ini +++ b/rainloop/v/0.0.0/langs/tr.ini @@ -375,6 +375,29 @@ NOTIFICATION_SPAM = "Herhangi bir sistem spam klasörü seçmediniz.\"Spam\" kla NOTIFICATION_TRASH = "Herhangi bir sistem çöp kutusu klasörü seçmediniz normalde mesaj silindikten sonra \"Çöp Kutusu\" klasörüne kaydedilir" NOTIFICATION_ARCHIVE = "Herhangi bir sistem arşiv klasörü seçmediniz." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "2-Basamaklı doğrumalama" +LABEL_ENABLE_TWO_FACTOR = "2-Basamaklı Doğrulama Etkinleştir" +LABEL_TWO_FACTOR_USER = "Kullanıcı Adı" +LABEL_TWO_FACTOR_STATUS = "Durum" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "Kodları yedekle" +BUTTON_CREATE = "Yeni Secret kodu oluştur" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Temizle" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Test" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Secret kodu göster" +BUTTON_HIDE_SECRET = "Secret kodu gizle" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Yapılandırılmış" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Yapılandırılmamış" +TWO_FACTOR_SECRET_DESC = "Aşağıda sunulan QR kodu kullanarak Google Şifrematik istemcisi (veya başka TOTP istemci) içine veya elle kod girerek bu bilgi aktarın." +TWO_FACTOR_BACKUP_CODES_DESC = "Google Şifrematik'te aracılığıyla kodları alamıyorsa Eğer oturum için bir yedek kod kullandım sonra, bunu pasif olacaktır, oturum yedekleme kodlarını kullanabilirsiniz." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Yükleniyor" LOGIN = "Giriş" @@ -439,25 +462,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Tüm giden iletilere imza ekle" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "2-Basamaklı doğrumalama" -LABEL_ENABLE_TWO_FACTOR = "2-Basamaklı Doğrulama Etkinleştir" -LABEL_TWO_FACTOR_USER = "Kullanıcı Adı" -LABEL_TWO_FACTOR_STATUS = "Durum" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "Kodları yedekle" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Yeni Secret kodu oluştur" -BUTTON_CLEAR = "Temizle" -BUTTON_TEST = "Test" -BUTTON_SHOW_SECRET = "Secret kodu göster" -BUTTON_HIDE_SECRET = "Secret kodu gizle" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Yapılandırılmış" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Yapılandırılmamış" -TWO_FACTOR_SECRET_DESC = "Aşağıda sunulan QR kodu kullanarak Google Şifrematik istemcisi (veya başka TOTP istemci) içine veya elle kod girerek bu bilgi aktarın." -TWO_FACTOR_BACKUP_CODES_DESC = "Google Şifrematik'te aracılığıyla kodları alamıyorsa Eğer oturum için bir yedek kod kullandım sonra, bunu pasif olacaktır, oturum yedekleme kodlarını kullanabilirsiniz." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Genel" diff --git a/rainloop/v/0.0.0/langs/ua.ini b/rainloop/v/0.0.0/langs/ua.ini index 53603bd49..1bb3f840d 100644 --- a/rainloop/v/0.0.0/langs/ua.ini +++ b/rainloop/v/0.0.0/langs/ua.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "Ви ще не обрали системну теку \"У Якщо ви не хочете видаляти листи одразу, будь ласка, выберіть пункт \"Не використовувати\"." NOTIFICATION_ARCHIVE = "Ви ще не обрали системну теку \"Архив\", в яку складаються всі повідомлення після архівації." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "Двофакторна верификація" +LABEL_ENABLE_TWO_FACTOR = "Увімкнути двофакторну верифікацію" +LABEL_TWO_FACTOR_USER = "Користувач" +LABEL_TWO_FACTOR_STATUS = "Статус" +LABEL_TWO_FACTOR_SECRET = "Секретний ключ" +LABEL_TWO_FACTOR_BACKUP_CODES = "Резервні коди" +BUTTON_CREATE = "Створити новий секретний ключ" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Очистити" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "Тест" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Показати секретний ключ" +BUTTON_HIDE_SECRET = "Приховати секретний ключ" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Налаштований" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Не налаштований" +TWO_FACTOR_SECRET_DESC = "Використовуйте цю інформацію для налаштування Google Authenticator клиенту (чи іншого TOTP клиенту) за допомогою прикладеного QR-коду, чи вручну." +TWO_FACTOR_BACKUP_CODES_DESC = "Якщо Ви не можете отримати коди через Google Authenticator, ви можете використовувати резервні коди, щоб увійти. Після того як Ви використали резервний код для входу в систему, він стає неактивним." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "Завантаження" LOGIN = "Вхід" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Додавати Ваш підпис до всіх [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "Двофакторна верификація" -LABEL_ENABLE_TWO_FACTOR = "Увімкнути двофакторну верифікацію" -LABEL_TWO_FACTOR_USER = "Користувач" -LABEL_TWO_FACTOR_STATUS = "Статус" -LABEL_TWO_FACTOR_SECRET = "Секретний ключ" -LABEL_TWO_FACTOR_BACKUP_CODES = "Резервні коди" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Створити новий секретний ключ" -BUTTON_CLEAR = "Очистити" -BUTTON_TEST = "Тест" -BUTTON_SHOW_SECRET = "Показати секретний ключ" -BUTTON_HIDE_SECRET = "Приховати секретний ключ" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Налаштований" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Не налаштований" -TWO_FACTOR_SECRET_DESC = "Використовуйте цю інформацію для налаштування Google Authenticator клиенту (чи іншого TOTP клиенту) за допомогою прикладеного QR-коду, чи вручну." -TWO_FACTOR_BACKUP_CODES_DESC = "Якщо Ви не можете отримати коди через Google Authenticator, ви можете використовувати резервні коди, щоб увійти. Після того як Ви використали резервний код для входу в систему, він стає неактивним." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "Основні Налаштування" diff --git a/rainloop/v/0.0.0/langs/zh-cn.ini b/rainloop/v/0.0.0/langs/zh-cn.ini index 61cec669b..9375da316 100644 --- a/rainloop/v/0.0.0/langs/zh-cn.ini +++ b/rainloop/v/0.0.0/langs/zh-cn.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "您没有选择 已删除邮件 文件夹来存储垃圾 如果您希望永久删除邮件,请选择 不使用 选项。" NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "两步验证" +LABEL_ENABLE_TWO_FACTOR = "启用两步验证" +LABEL_TWO_FACTOR_USER = "用户" +LABEL_TWO_FACTOR_STATUS = "状态" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "备份代码" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "测试" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "加载中" LOGIN = "登陆" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "两步验证" -LABEL_ENABLE_TWO_FACTOR = "启用两步验证" -LABEL_TWO_FACTOR_USER = "用户" -LABEL_TWO_FACTOR_STATUS = "状态" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "备份代码" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "测试" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "一般设置" diff --git a/rainloop/v/0.0.0/langs/zh-tw.ini b/rainloop/v/0.0.0/langs/zh-tw.ini index 96765d737..31c4708eb 100644 --- a/rainloop/v/0.0.0/langs/zh-tw.ini +++ b/rainloop/v/0.0.0/langs/zh-tw.ini @@ -377,6 +377,29 @@ NOTIFICATION_TRASH = "您沒有選擇 已刪除郵件 資料夾來存儲垃圾 如果您希望永久刪除郵件,請選擇 不使用 選項。" NOTIFICATION_ARCHIVE = "You haven't selected \"Archive\" system folder achived messages are placed to." +[POPUPS_TWO_FACTOR_CFG] +LEGEND_TWO_FACTOR_AUTH = "兩步驗證" +LABEL_ENABLE_TWO_FACTOR = "啟用兩步驗證" +LABEL_TWO_FACTOR_USER = "用戶" +LABEL_TWO_FACTOR_STATUS = "狀態" +LABEL_TWO_FACTOR_SECRET = "Secret" +LABEL_TWO_FACTOR_BACKUP_CODES = "備份代碼" +BUTTON_CREATE = "Create New Secret" +BUTTON_ACTIVATE = "Activate" +BUTTON_CLEAR = "Clear" +BUTTON_LOGOUT = "Logout" +BUTTON_DONE = "Done" +BUTTON_TEST = "測試" +LINK_TEST = "test" +BUTTON_SHOW_SECRET = "Show Secret" +BUTTON_HIDE_SECRET = "Hide Secret" +TWO_FACTOR_REQUIRE_DESC = "Your account requires 2-Step verification configuration." +TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" +TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" +TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." +TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." +TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." + [TITLES] LOADING = "載入中" LOGIN = "登錄" @@ -441,25 +464,10 @@ LABEL_ADD_SIGNATURE_TO_ALL = "Add your signature to all the outgoing messages" [SETTINGS_SECURITY] LEGEND_SECURITY = "Security" -LEGEND_TWO_FACTOR_AUTH = "兩步驗證" -LABEL_ENABLE_TWO_FACTOR = "啟用兩步驗證" -LABEL_TWO_FACTOR_USER = "用戶" -LABEL_TWO_FACTOR_STATUS = "狀態" -LABEL_TWO_FACTOR_SECRET = "Secret" -LABEL_TWO_FACTOR_BACKUP_CODES = "備份代碼" +LABEL_CONFIGURATE_TWO_FACTOR = "Configurate 2-Step verification" LABEL_AUTOLOGOUT = "Auto Logout" AUTOLOGIN_NEVER_OPTION_NAME = "Never" AUTOLOGIN_MINUTES_OPTION_NAME = "%MINUTES% minute(s)" -BUTTON_CREATE = "Create New Secret" -BUTTON_CLEAR = "Clear" -BUTTON_TEST = "測試" -BUTTON_SHOW_SECRET = "Show Secret" -BUTTON_HIDE_SECRET = "Hide Secret" -TWO_FACTOR_SECRET_CONFIGURED_DESC = "Configured" -TWO_FACTOR_SECRET_NOT_CONFIGURED_DESC = "Not configured" -TWO_FACTOR_SECRET_DESC = "Import this info into your Google Authenticator client (or other TOTP client) using the provided QR code below or by entering the code manually." -TWO_FACTOR_BACKUP_CODES_DESC = "If you can't receive codes via Google Authenticator, you can use backup codes to sign in. After you’ve used a backup code to sign in, it will become inactive." -TWO_FACTOR_SECRET_TEST_BEFORE_DESC = "You can't change this setting before test." [SETTINGS_GENERAL] LEGEND_GENERAL = "一般設置" diff --git a/rainloop/v/0.0.0/static/ckeditor/CUSTOMS b/rainloop/v/0.0.0/static/ckeditor/CUSTOMS index 7ceb2db01..6713c8963 100644 --- a/rainloop/v/0.0.0/static/ckeditor/CUSTOMS +++ b/rainloop/v/0.0.0/static/ckeditor/CUSTOMS @@ -28,9 +28,3 @@ disableContextMenu:function(){return false;this.on("contextmenu", proto:{addTarget:function(a,e){a.on("contextmenu",function(a){ --> proto:{addTarget:function(a,e){a.on("contextmenu",function(a){return false; - ---- - -var a=this.$.nodeName.toLowerCase(); ---> -var a=(this.$?(this.$.nodeName||''):'').toLowerCase(); \ No newline at end of file From 351c12c00226fce04ba7b02b4f2426cdc316c624 Mon Sep 17 00:00:00 2001 From: RainLoop Team Date: Fri, 10 Apr 2015 02:05:49 +0400 Subject: [PATCH 3/6] Welcome page branding option --- dev/App/User.js | 12 + dev/Component/Script.js | 22 +- dev/External/ko.js | 42 +-- dev/Promises/User/Ajax.js | 6 +- dev/Settings/Admin/Branding.js | 34 ++- dev/Storage/Settings.js | 1 + dev/Styles/@Main.less | 1 + dev/Styles/Admin.less | 4 + dev/Styles/WelcomPage.less | 9 + dev/View/Popup/Domain.js | 20 +- dev/View/Popup/WelcomePage.js | 62 ++++ dev/View/User/MailBox/MessageView.js | 2 +- gulpfile.js | 2 +- package.json | 2 +- .../app/libraries/MailSo/Base/HtmlUtils.php | 18 +- .../0.0.0/app/libraries/RainLoop/Actions.php | 56 +++- .../libraries/RainLoop/Config/Application.php | 6 +- .../Views/Admin/AdminSettingsBranding.html | 266 +++++++++++------- .../Views/Common/PopupsWelcomePage.html | 22 ++ .../0.0.0/app/templates/Views/User/Login.html | 5 +- .../templates/Views/User/MailMessageList.html | 2 +- rainloop/v/0.0.0/langs/admin/en.ini | 7 + rainloop/v/0.0.0/langs/admin/ru.ini | 7 + rainloop/v/0.0.0/langs/bg.ini | 3 + rainloop/v/0.0.0/langs/cs.ini | 3 + rainloop/v/0.0.0/langs/de.ini | 5 +- rainloop/v/0.0.0/langs/en-gb.ini | 3 + rainloop/v/0.0.0/langs/en.ini | 3 + rainloop/v/0.0.0/langs/es.ini | 3 + rainloop/v/0.0.0/langs/fr.ini | 3 + rainloop/v/0.0.0/langs/hu.ini | 3 + rainloop/v/0.0.0/langs/is.ini | 3 + rainloop/v/0.0.0/langs/it.ini | 3 + rainloop/v/0.0.0/langs/ja-jp.ini | 3 + rainloop/v/0.0.0/langs/ko-kr.ini | 3 + rainloop/v/0.0.0/langs/lt.ini | 3 + rainloop/v/0.0.0/langs/lv.ini | 3 + rainloop/v/0.0.0/langs/nl.ini | 3 + rainloop/v/0.0.0/langs/no.ini | 3 + rainloop/v/0.0.0/langs/pl.ini | 3 + rainloop/v/0.0.0/langs/pt-br.ini | 3 + rainloop/v/0.0.0/langs/pt-pt.ini | 3 + rainloop/v/0.0.0/langs/ro.ini | 3 + rainloop/v/0.0.0/langs/ru.ini | 3 + rainloop/v/0.0.0/langs/sk.ini | 3 + rainloop/v/0.0.0/langs/sv.ini | 3 + rainloop/v/0.0.0/langs/tr.ini | 3 + rainloop/v/0.0.0/langs/ua.ini | 3 + rainloop/v/0.0.0/langs/zh-cn.ini | 3 + rainloop/v/0.0.0/langs/zh-tw.ini | 3 + 50 files changed, 531 insertions(+), 160 deletions(-) create mode 100644 dev/Styles/WelcomPage.less create mode 100644 dev/View/Popup/WelcomePage.js create mode 100644 rainloop/v/0.0.0/app/templates/Views/Common/PopupsWelcomePage.html diff --git a/dev/App/User.js b/dev/App/User.js index 6cf839026..a67032d2c 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -1219,6 +1219,11 @@ kn.showScreenPopup(require('View/Popup/TwoFactorConfiguration'), [true]); }; + AppUser.prototype.bootstartWelcomePopup = function (sUrl) + { + kn.showScreenPopup(require('View/Popup/WelcomePage'), [sUrl]); + }; + AppUser.prototype.bootstartLoginScreen = function () { Globals.$html.removeClass('rl-user-auth').addClass('rl-user-no-auth'); @@ -1416,6 +1421,13 @@ Plugins.runHook('rl-start-user-screens'); Events.pub('rl.bootstart-user-screens'); + if (Settings.settingsGet('WelcomePageUrl')) + { + _.delay(function () { + self.bootstartWelcomePopup(Settings.settingsGet('WelcomePageUrl')); + }, 1000); + } + if (!!Settings.settingsGet('AccountSignMe') && window.navigator.registerProtocolHandler) { _.delay(function () { diff --git a/dev/Component/Script.js b/dev/Component/Script.js index 3e4ab8c75..9a1b01d33 100644 --- a/dev/Component/Script.js +++ b/dev/Component/Script.js @@ -5,6 +5,7 @@ var _ = require('_'), + $ = require('$'), AbstractComponent = require('Component/Abstract') ; @@ -20,13 +21,26 @@ { AbstractComponent.call(this); - if (oParams.component && oParams.component.templateNodes && oParams.element) + if (oParams.component && oParams.component.templateNodes && oParams.element && + oParams.element[0] && oParams.element[0].outerHTML) { - oParams.element.text(''); - if (oParams.component.templateNodes[0] && oParams.component.templateNodes[0].nodeValue) + var sScript = oParams.element[0].outerHTML; + sScript = sScript + .replace(/<\/b><\/x-script>/i, '') + ; + + if (sScript) { + oParams.element.text(''); oParams.element.replaceWith( - $('').text(oParams.component.templateNodes[0].nodeValue)); + $(sScript).text(oParams.component.templateNodes[0] && + oParams.component.templateNodes[0].nodeValue ? + oParams.component.templateNodes[0].nodeValue : '')); + } + else + { + oParams.element.remove(); } } } diff --git a/dev/External/ko.js b/dev/External/ko.js index 189d7fb98..612f0b1e3 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -57,16 +57,16 @@ 'init': function (oElement, fValueAccessor) { var - $oEl = null, bi18n = true, sValue = '', Translator = null, + $oEl = $(oElement), + bMobile = 'on' === ($oEl.data('tooltip-mobile') || 'off'), Globals = require('Common/Globals') ; - if (!Globals.bMobileDevice) + if (!Globals.bMobileDevice || bMobile) { - $oEl = $(oElement); bi18n = 'on' === ($oEl.data('tooltip-i18n') || 'on'); sValue = bi18n ? ko.unwrap(fValueAccessor()) : fValueAccessor()(); @@ -74,6 +74,7 @@ { oElement.__opentip = new Opentip(oElement, { 'style': 'rainloopTip', + 'showOn': 'mouseover click', 'element': oElement, 'tipJoint': $oEl.data('tooltip-join') || 'bottom' }); @@ -120,12 +121,14 @@ var bi18n = true, sValue = '', + $oEl = $(oElement), + bMobile = 'on' === ($oEl.data('tooltip-mobile') || 'off'), Globals = require('Common/Globals') ; - if (!Globals.bMobileDevice && oElement.__opentip) + if ((!Globals.bMobileDevice || bMobile) && oElement.__opentip) { - bi18n = 'on' === ($(oElement).data('tooltip-i18n') || 'on'); + bi18n = 'on' === ($oEl.data('tooltip-i18n') || 'on'); sValue = bi18n ? ko.unwrap(fValueAccessor()) : fValueAccessor()(); if (sValue) @@ -150,6 +153,8 @@ oElement.__opentip = new Opentip(oElement, { 'style': 'rainloopTestTip', + 'showOn': 'mouseover click', + 'hideOn': 'mouseout click', 'element': oElement, 'tipJoint': $oEl.data('tooltip-join') || 'top' }); @@ -183,21 +188,20 @@ } else { - if ($oEl.is(':visible')) - { - oOpenTips.activate(); - oOpenTips.setContent(sValue); - - _.delay(function () { + _.delay(function () { + if ($oEl.is(':visible')) + { + oOpenTips.activate(); + oOpenTips.setContent(sValue); oOpenTips.show(); - }, 100); - } - else - { - oOpenTips.hide(); - oOpenTips.setContent(''); - oOpenTips.deactivate(); - } + } + else + { + oOpenTips.hide(); + oOpenTips.setContent(''); + oOpenTips.deactivate(); + } + }, 100); } } } diff --git a/dev/Promises/User/Ajax.js b/dev/Promises/User/Ajax.js index 3f566c05e..4051aa901 100644 --- a/dev/Promises/User/Ajax.js +++ b/dev/Promises/User/Ajax.js @@ -89,7 +89,6 @@ }, 500); }; - UserAjaxUserPromises.prototype.folderDelete = function (sFolderFullNameRaw, fTrigger) { return this.postRequest('FolderDelete', fTrigger, { @@ -113,6 +112,11 @@ }); }; + UserAjaxUserPromises.prototype.welcomeClose = function () + { + return this.postRequest('WelcomeClose'); + }; + // UserAjaxUserPromises.prototype.messageList = function (sFolderFullNameRaw, iOffset, iLimit, sSearch, fTrigger) // { // sFolderFullNameRaw = Utils.pString(sFolderFullNameRaw); diff --git a/dev/Settings/Admin/Branding.js b/dev/Settings/Admin/Branding.js index 91c0a4ee1..a5f99570a 100644 --- a/dev/Settings/Admin/Branding.js +++ b/dev/Settings/Admin/Branding.js @@ -7,7 +7,8 @@ _ = require('_'), ko = require('ko'), - Utils = require('Common/Utils') + Utils = require('Common/Utils'), + Translator = require('Common/Translator') ; /** @@ -47,6 +48,21 @@ this.userCss = ko.observable(Settings.settingsGet('UserCss')); this.userCss.trigger = ko.observable(Enums.SaveSettingsStep.Idle); + this.welcomePageUrl = ko.observable(Settings.settingsGet('WelcomePageUrl')); + this.welcomePageUrl.trigger = ko.observable(Enums.SaveSettingsStep.Idle); + + this.welcomePageDisplay = ko.observable(Settings.settingsGet('WelcomePageDisplay')); + this.welcomePageDisplay.trigger = ko.observable(Enums.SaveSettingsStep.Idle); + + this.welcomePageDisplay.options = ko.computed(function () { + Translator.trigger(); + return [ + {'optValue': 'none', 'optText': Translator.i18n('TAB_BRANDING/OPTION_WELCOME_PAGE_DISPLAY_NONE')}, + {'optValue': 'once', 'optText': Translator.i18n('TAB_BRANDING/OPTION_WELCOME_PAGE_DISPLAY_ONCE')}, + {'optValue': 'always', 'optText': Translator.i18n('TAB_BRANDING/OPTION_WELCOME_PAGE_DISPLAY_ALWAYS')} + ]; + }); + this.loginPowered = ko.observable(!!Settings.settingsGet('LoginPowered')); } @@ -69,7 +85,9 @@ f5 = Utils.settingsSaveHelperSimpleFunction(self.loginCss.trigger, self), f6 = Utils.settingsSaveHelperSimpleFunction(self.userLogo.trigger, self), f7 = Utils.settingsSaveHelperSimpleFunction(self.loginBackground.trigger, self), - f8 = Utils.settingsSaveHelperSimpleFunction(self.userCss.trigger, self) + f8 = Utils.settingsSaveHelperSimpleFunction(self.userCss.trigger, self), + f9 = Utils.settingsSaveHelperSimpleFunction(self.welcomePageUrl.trigger, self), + f10 = Utils.settingsSaveHelperSimpleFunction(self.welcomePageDisplay.trigger, self) ; self.title.subscribe(function (sValue) { @@ -120,6 +138,18 @@ }); }); + self.welcomePageUrl.subscribe(function (sValue) { + Remote.saveAdminConfig(f9, { + 'WelcomePageUrl': Utils.trim(sValue) + }); + }); + + self.welcomePageDisplay.subscribe(function (sValue) { + Remote.saveAdminConfig(f10, { + 'WelcomePageDisplay': Utils.trim(sValue) + }); + }); + self.loginPowered.subscribe(function (bValue) { Remote.saveAdminConfig(null, { 'LoginPowered': bValue ? '1' : '0' diff --git a/dev/Storage/Settings.js b/dev/Storage/Settings.js index 3fecebfc2..ef12c2a8f 100644 --- a/dev/Storage/Settings.js +++ b/dev/Storage/Settings.js @@ -16,6 +16,7 @@ { this.oSettings = window['rainloopAppData'] || {}; this.oSettings = Utils.isNormal(this.oSettings) ? this.oSettings : {}; +// window.console.log(this.oSettings); } SettingsStorage.prototype.oSettings = null; diff --git a/dev/Styles/@Main.less b/dev/Styles/@Main.less index e6fe214f2..9e94d2306 100644 --- a/dev/Styles/@Main.less +++ b/dev/Styles/@Main.less @@ -54,6 +54,7 @@ @import "Components.less"; @import "SystemDropDown.less"; @import "Login.less"; +@import "WelcomPage.less"; @import "Ask.less"; @import "Shortcuts.less"; @import "FolderList.less"; diff --git a/dev/Styles/Admin.less b/dev/Styles/Admin.less index d2eb87986..12a30c2b4 100644 --- a/dev/Styles/Admin.less +++ b/dev/Styles/Admin.less @@ -103,5 +103,9 @@ .legend { width: 670px; } + + .nav-tabs { + width: 670px; + } } } diff --git a/dev/Styles/WelcomPage.less b/dev/Styles/WelcomPage.less new file mode 100644 index 000000000..731faab8b --- /dev/null +++ b/dev/Styles/WelcomPage.less @@ -0,0 +1,9 @@ +.popups { + .b-welcom-page-content { + + .modal-header { + background-color: #fff; + } + + } +} diff --git a/dev/View/Popup/Domain.js b/dev/View/Popup/Domain.js index 92b6da99f..b981f7949 100644 --- a/dev/View/Popup/Domain.js +++ b/dev/View/Popup/Domain.js @@ -162,6 +162,7 @@ this.testingDone(false); this.testingImapError(false); + this.testingSieveError(false); this.testingSmtpError(false); this.testing(true); @@ -295,26 +296,29 @@ this.testingDone(true); this.testingImapError(true !== oData.Result.Imap); - this.testingSmtpError(true !== oData.Result.Smtp); this.testingSieveError(true !== oData.Result.Sieve); + this.testingSmtpError(true !== oData.Result.Smtp); if (this.testingImapError() && oData.Result.Imap) { bImap = true; + this.testingImapErrorDesc(''); this.testingImapErrorDesc(oData.Result.Imap); } - if (this.testingSmtpError() && oData.Result.Smtp) - { - this.testingSmtpErrorDesc(oData.Result.Smtp); - } - if (this.testingSieveError() && oData.Result.Sieve) { bSieve = true; + this.testingSieveErrorDesc(''); this.testingSieveErrorDesc(oData.Result.Sieve); } + if (this.testingSmtpError() && oData.Result.Smtp) + { + this.testingSmtpErrorDesc(''); + this.testingSmtpErrorDesc(oData.Result.Smtp); + } + if (this.sieveSettings()) { if (!bSieve && bImap) @@ -333,8 +337,8 @@ else { this.testingImapError(true); - this.testingSmtpError(true); this.testingSieveError(true); + this.testingSmtpError(true); this.sieveSettings(false); } }; @@ -365,8 +369,8 @@ this.testing(false); this.testingDone(false); this.testingImapError(false); - this.testingSmtpError(false); this.testingSieveError(false); + this.testingSmtpError(false); }; DomainPopupView.prototype.onHide = function () diff --git a/dev/View/Popup/WelcomePage.js b/dev/View/Popup/WelcomePage.js new file mode 100644 index 000000000..3dd18a686 --- /dev/null +++ b/dev/View/Popup/WelcomePage.js @@ -0,0 +1,62 @@ + +(function () { + + 'use strict'; + + var + _ = require('_'), + ko = require('ko'), + + Promises = require('Promises/User/Ajax'), + + kn = require('Knoin/Knoin'), + AbstractView = require('Knoin/AbstractView') + ; + + /** + * @constructor + * @extends AbstractView + */ + function WelcomePagePopupView() + { + AbstractView.call(this, 'Popups', 'PopupsWelcomePage'); + + this.welcomePageURL = ko.observable(''); + + this.closeFocused = ko.observable(false); + + kn.constructorEnd(this); + } + + kn.extendAsViewModel(['View/Popup/WelcomePage', 'WelcomePagePopupViewModel'], WelcomePagePopupView); + _.extend(WelcomePagePopupView.prototype, AbstractView.prototype); + + WelcomePagePopupView.prototype.clearPopup = function () + { + this.welcomePageURL(''); + this.closeFocused(false); + }; + + /** + * @param {string} sUrl + */ + WelcomePagePopupView.prototype.onShow = function (sUrl) + { + this.clearPopup(); + + this.welcomePageURL(sUrl); + }; + + WelcomePagePopupView.prototype.onShowWithDelay = function () + { + this.closeFocused(true); + }; + + WelcomePagePopupView.prototype.onHide = function () + { + Promises.welcomeClose(); + }; + + module.exports = WelcomePagePopupView; + +}()); \ No newline at end of file diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 2fffa593d..011e66dfc 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -843,7 +843,7 @@ ; // exit fullscreen, back - key('esc', Enums.KeyState.MessageView, _.bind(this.escShortcuts, this)); + key('esc, backspace', Enums.KeyState.MessageView, _.bind(this.escShortcuts, this)); // fullscreen key('enter', Enums.KeyState.MessageView, function () { diff --git a/gulpfile.js b/gulpfile.js index d60eeb45d..9f4902d65 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -121,7 +121,7 @@ cfg.paths.js = { openpgp: { name: 'openpgp.js', src: [ - 'vendors/openpgp/openpgp-0.10.1.min.js' + 'vendors/openpgp/openpgp-0.7.2.min.js' ] }, encrypt: { diff --git a/package.json b/package.json index bb35f6ad7..26a11b6fc 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "RainLoop", "title": "RainLoop Webmail", "version": "1.8.3", - "release": "295", + "release": "297", "description": "Simple, modern & fast web-based email client", "homepage": "http://rainloop.net", "main": "gulpfile.js", diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php index ab2601e51..24c91605c 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/HtmlUtils.php @@ -232,7 +232,7 @@ class HtmlUtils { if ($oElement) { - if (\preg_match('/http[s]?:\/\//i', $sUrl)) + if (\preg_match('/http[s]?:\/\//i', $sUrl) || '//' === \substr($sUrl, 0, 2)) { $bHasExternals = true; if (!$bDoNotReplaceExternalUrl) @@ -452,7 +452,7 @@ class HtmlUtils foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) { if (\in_array(\strtolower($oElement->tagName), array('svg', 'head', 'link', - 'base', 'meta', 'title', 'style', 'script', 'bgsound', 'keygen', 'source', + 'base', 'meta', 'title', 'style', 'x-script', 'script', 'bgsound', 'keygen', 'source', 'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio')) && isset($oElement->parentNode)) { @$oElement->parentNode->removeChild($oElement); @@ -546,8 +546,8 @@ class HtmlUtils // } foreach (array( - 'id', 'class', 'contenteditable', 'designmode', 'formaction', 'data-bind', 'xmlns', - 'srcset' + 'id', 'class', 'contenteditable', 'designmode', 'formaction', + 'data-bind', 'xmlns', 'srcset' ) as $sAttr) { @$oElement->removeAttribute($sAttr); @@ -566,7 +566,8 @@ class HtmlUtils if ($oElement->hasAttribute('href')) { $sHref = \trim($oElement->getAttribute('href')); - if (!\preg_match('/^(http[s]?|ftp|skype|mailto):/i', $sHref)) + if (!\preg_match('/^(http[s]?|ftp|skype|mailto):/i', $sHref) || + '//' !== \substr($sHref, 0, 2)) { $oElement->setAttribute('data-x-broken-href', $sHref); $oElement->setAttribute('href', 'javascript:false'); @@ -594,7 +595,8 @@ class HtmlUtils } else { - if (\preg_match('/http[s]?:\/\//i', $sSrc)) + if (\preg_match('/^http[s]?:\/\//i', $sSrc) || + '//' === \substr($sSrc, 0, 2)) { if ($bDoNotReplaceExternalUrl) { @@ -615,7 +617,7 @@ class HtmlUtils $bHasExternals = true; } - else if ('data:image/' === \strtolower(\substr(\trim($sSrc), 0, 11))) + else if ('data:image/' === \strtolower(\substr($sSrc, 0, 11))) { $oElement->setAttribute('src', $sSrc); } @@ -745,7 +747,7 @@ class HtmlUtils { $oElement->removeAttribute('data-x-additional-src'); } - + if ($oElement->hasAttribute('data-x-additional-style-url')) { $oElement->removeAttribute('data-x-additional-style-url'); diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php index 3c02a4bf1..db71ce86b 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1286,6 +1286,8 @@ class Actions 'LoginCss' => '', 'UserLogo' => '', 'UserCss' => '', + 'WelcomePageUrl' => '', + 'WelcomePageDisplay' => 'none', 'IncludeCss' => '', 'IncludeBackground' => '', 'Token' => $oConfig->Get('security', 'csrf_protection', false) ? \RainLoop\Utils::GetCsrfToken() : '', @@ -1352,6 +1354,8 @@ class Actions $aResult['LoginPowered'] = !!$oConfig->Get('branding', 'login_powered', true); $aResult['UserLogo'] = $oConfig->Get('branding', 'user_logo', ''); $aResult['UserCss'] = $oConfig->Get('branding', 'user_css', ''); + $aResult['WelcomePageUrl'] = $oConfig->Get('branding', 'welcome_page_url', ''); + $aResult['WelcomePageDisplay'] = \strtolower($oConfig->Get('branding', 'welcome_page_display', 'none')); } $aResult['LoadingDescriptionEsc'] = \htmlspecialchars($aResult['LoadingDescription'], ENT_QUOTES|ENT_IGNORE, 'UTF-8'); @@ -1414,6 +1418,24 @@ class Actions $oSettings = $this->SettingsProvider()->Load($oAccount); $oSettingsLocal = $this->SettingsProvider(true)->Load($oAccount); + + if (!$oAccount->IsAdditionalAccount() && !empty($aResult['WelcomePageUrl']) && + ('once' === $aResult['WelcomePageDisplay'] || 'always' === $aResult['WelcomePageDisplay'])) + { + if ('once' === $aResult['WelcomePageDisplay']) + { + if ($aResult['WelcomePageUrl'] === $oSettings->GetConf('LastWelcomePage', '')) + { + $aResult['WelcomePageUrl'] = ''; + $aResult['WelcomePageDisplay'] = ''; + } + } + } + else + { + $aResult['WelcomePageUrl'] = ''; + $aResult['WelcomePageDisplay'] = ''; + } } else { @@ -1424,6 +1446,9 @@ class Actions $aResult['DevEmail'] = $oConfig->Get('labs', 'dev_email', ''); $aResult['DevPassword'] = $oConfig->Get('labs', 'dev_password', ''); + + $aResult['WelcomePageUrl'] = ''; + $aResult['WelcomePageDisplay'] = ''; } $aResult['AllowGoogleSocial'] = (bool) $oConfig->Get('social', 'google_enable', false); @@ -3247,7 +3272,11 @@ class Actions $this->setConfigFromParams($oConfig, 'Title', 'webmail', 'title', 'string'); $this->setConfigFromParams($oConfig, 'LoadingDescription', 'webmail', 'loading_description', 'string'); - if ($this->HasOneOfActionParams(array('LoginLogo', 'LoginBackground', 'LoginDescription', 'LoginCss', 'LoginPowered', 'UserLogo', 'UserCss')) && $this->PremType()) + if ($this->HasOneOfActionParams(array( + 'LoginLogo', 'LoginBackground', 'LoginDescription', 'LoginCss', 'LoginPowered', + 'UserLogo', 'UserCss', + 'WelcomePageUrl', 'WelcomePageDisplay' + )) && $this->PremType()) { $this->setConfigFromParams($oConfig, 'LoginLogo', 'branding', 'login_logo', 'string'); $this->setConfigFromParams($oConfig, 'LoginBackground', 'branding', 'login_background', 'string'); @@ -3257,6 +3286,9 @@ class Actions $this->setConfigFromParams($oConfig, 'UserLogo', 'branding', 'user_logo', 'string'); $this->setConfigFromParams($oConfig, 'UserCss', 'branding', 'user_css', 'string'); + + $this->setConfigFromParams($oConfig, 'WelcomePageUrl', 'branding', 'welcome_page_url', 'string'); + $this->setConfigFromParams($oConfig, 'WelcomePageDisplay', 'branding', 'welcome_page_display', 'string'); } $this->setConfigFromParams($oConfig, 'TokenProtection', 'security', 'csrf_protection', 'bool'); @@ -4810,6 +4842,25 @@ class Actions return $this->DefaultResponse(__FUNCTION__, true); } + /** + * @return array + */ + public function DoWelcomeClose() + { + $oAccount = $this->getAccountFromToken(); + if ($oAccount && !$oAccount->IsAdditionalAccount()) + { + $oSettings = $this->SettingsProvider()->Load($oAccount); + $oSettings->SetConf('LastWelcomePage', + $this->Config()->Get('branding', 'welcome_page_url', '')); + + return $this->DefaultResponse(__FUNCTION__, + $this->SettingsProvider()->Save($oAccount, $oSettings)); + } + + return $this->FalseResponse(__FUNCTION__); + } + /** * @return array */ @@ -8509,6 +8560,9 @@ class Actions $sHtml = $this->Plugins()->ProcessTemplate($sName, $sHtml); $sHtml = \preg_replace('/\{\{INCLUDE\/([a-zA-Z]+)\/PLACE\}\}/', '', $sHtml); + $sHtml = \preg_replace('/