diff --git a/.gitignore b/.gitignore index a0aa7bc75..06fd278b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /.idea +/api.php /error.log /nbproject /npm-debug.log diff --git a/dev/Common/HtmlEditor.js b/dev/Common/HtmlEditor.js index ef72b5096..9b0fefa30 100644 --- a/dev/Common/HtmlEditor.js +++ b/dev/Common/HtmlEditor.js @@ -103,7 +103,7 @@ */ HtmlEditor.prototype.clearSignatureSigns = function (sText) { - return sText.replace(/(\u200C||<\/x-signature>)/g, ''); + return sText.replace(/(\u200C|\u0002)/g, ''); }; /** diff --git a/dev/Common/Utils.js b/dev/Common/Utils.js index 958814207..7acdd5797 100644 --- a/dev/Common/Utils.js +++ b/dev/Common/Utils.js @@ -861,7 +861,7 @@ ; sText = sHtml - .replace(/([\s\S]*)<\/x-signature>/gm, '\u200C$1\u200C') + .replace(/\u0002([\s\S]*)\u0002/gm, '\u200C$1\u200C') .replace(/]*>([\s\S\r\n]*)<\/pre>/gmi, convertPre) .replace(/[\s]+/gm, ' ') .replace(/((?:href|data)\s?=\s?)("[^"]+?"|'[^']+?')/gmi, fixAttibuteValue) @@ -1014,7 +1014,7 @@ .replace(/>/g, '>').replace(/') .replace(/[\s]*~~~\/blockquote~~~/g, '') - .replace(/\u200C([\s\S]*)\u200C/g, '$1') + .replace(/\u200C([\s\S]*)\u200C/g, '\u0002$1\u0002') .replace(/\n/g, '
') ; diff --git a/dev/External/ko.js b/dev/External/ko.js index e8fab34f1..0c83c3d8b 100644 --- a/dev/External/ko.js +++ b/dev/External/ko.js @@ -275,8 +275,7 @@ ko.bindingHandlers.csstext = { 'init': function (oElement, fValueAccessor) { - var Utils = require('Common/Utils'); - if (oElement && oElement.styleSheet && !Utils.isUnd(oElement.styleSheet.cssText)) + if (oElement && oElement.styleSheet && undefined !== oElement.styleSheet.cssText) { oElement.styleSheet.cssText = ko.unwrap(fValueAccessor()); } @@ -286,8 +285,7 @@ } }, 'update': function (oElement, fValueAccessor) { - var Utils = require('Common/Utils'); - if (oElement && oElement.styleSheet && !Utils.isUnd(oElement.styleSheet.cssText)) + if (oElement && oElement.styleSheet && undefined !== oElement.styleSheet.cssText) { oElement.styleSheet.cssText = ko.unwrap(fValueAccessor()); } diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index b9e2331bb..1c5de6b8a 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -225,16 +225,16 @@ { var iCount = 0, - oMessagesBodiesDom = null, + oMessagesDom = null, iEnd = Globals.iMessageBodyCacheCount - Consts.Values.MessageBodyCacheLimit ; if (0 < iEnd) { - oMessagesBodiesDom = this.messagesBodiesDom(); - if (oMessagesBodiesDom) + oMessagesDom = this.messagesBodiesDom(); + if (oMessagesDom) { - oMessagesBodiesDom.find('.rl-cache-class').each(function () { + oMessagesDom.find('.rl-cache-class').each(function () { var oItem = $(this); if (iEnd > oItem.data('rl-cache-count')) { @@ -246,7 +246,7 @@ if (0 < iCount) { _.delay(function () { - oMessagesBodiesDom.find('.rl-cache-purge').remove(); + oMessagesDom.find('.rl-cache-purge').remove(); }, 300); } } @@ -301,10 +301,10 @@ MessageUserStore.prototype.hideMessageBodies = function () { - var oMessagesBodiesDom = this.messagesBodiesDom(); - if (oMessagesBodiesDom) + var oMessagesDom = this.messagesBodiesDom(); + if (oMessagesDom) { - oMessagesBodiesDom.find('.b-text-part').hide(); + oMessagesDom.find('.b-text-part').hide(); } }; @@ -508,7 +508,7 @@ sResultHtml = '', bPgpSigned = false, bPgpEncrypted = false, - oMessagesBodiesDom = this.messagesBodiesDom(), + oMessagesDom = this.messagesBodiesDom(), oSelectedMessage = this.selectorMessageSelected(), oMessage = this.message(), aThreads = [] @@ -546,11 +546,12 @@ oMessage.initFlagsByJson(oData.Result); } - oMessagesBodiesDom = oMessagesBodiesDom && oMessagesBodiesDom[0] ? oMessagesBodiesDom : null; - if (oMessagesBodiesDom) + oMessagesDom = oMessagesDom && oMessagesDom[0] ? oMessagesDom : null; + if (oMessagesDom) { sId = 'rl-mgs-' + oMessage.hash.replace(/[^a-zA-Z0-9]/g, ''); - oTextBody = oMessagesBodiesDom.find('#' + sId); + oTextBody = oMessagesDom.find('#' + sId); + if (!oTextBody || !oTextBody[0]) { bHasExternals = !!oData.Result.HasExternals; @@ -622,7 +623,7 @@ oMessage.body = oBody; if (oMessage.body) { - oMessagesBodiesDom.append(oMessage.body); + oMessagesDom.append(oMessage.body); } oMessage.storeDataInDom(); diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 567a3f42d..184f011aa 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -1098,25 +1098,25 @@ oText.find('.rlBlockquoteSwitcher').off('.rlBlockquoteSwitcher').remove(); oText.find('[data-html-editor-font-wrapper]').removeAttr('data-html-editor-font-wrapper'); - (function () { - - var oTmp = null, iLimit = 0; - - while (true) - { - iLimit++; - - oTmp = oText.children(); - if (10 > iLimit && oTmp.is('div') && 1 === oTmp.length) - { - oTmp.children().unwrap(); - continue; - } - - break; - } - - }()); +// (function () { +// +// var oTmp = null, iLimit = 0; +// +// while (true) +// { +// iLimit++; +// +// oTmp = oText.children(); +// if (10 > iLimit && oTmp.is('div') && 1 === oTmp.length) +// { +// oTmp.children().unwrap(); +// continue; +// } +// +// break; +// } +// +// }()); sText = oText.html(); } diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 2151d24cd..01bc1f54c 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -24,6 +24,8 @@ Cache = require('Common/Cache'), + EmailModel = require('Model/Email'), + SocialStore = require('Stores/Social'), AppStore = require('Stores/User/App'), SettingsStore = require('Stores/User/Settings'), @@ -531,6 +533,32 @@ } }; + /** + * @todo + * @param {string} sEmail + */ + MessageViewMailBoxUserView.prototype.displayMailToPopup = function (sMailToUrl) + { + sMailToUrl = sMailToUrl.replace(/\?.+$/, ''); + + var + sResult = '', + aTo = [], + fParseEmailLine = function (sLine) { + return sLine ? _.compact(_.map([window.decodeURIComponent(sLine)], function (sItem) { + var oEmailModel = new EmailModel(); + oEmailModel.mailsoParse(sItem); + return '' !== oEmailModel.email ? oEmailModel : null; + })) : null; + } + ; + + aTo = fParseEmailLine(sMailToUrl); + sResult = aTo && aTo[0] ? aTo[0].email : ''; + + window.console.log(sResult); + }; + MessageViewMailBoxUserView.prototype.onBuild = function (oDom) { var @@ -666,6 +694,21 @@ // setup maito protocol return !(!!oEvent && 3 !== oEvent['which'] && Utils.mailToHelper($(this).attr('href'), require('View/Popup/Compose'))); }) +// .on('mouseover', 'a', _.debounce(function (oEvent) { +// +// if (oEvent) +// { +// var sMailToUrl = $(this).attr('href'); +// if (sMailToUrl && 'mailto:' === sMailToUrl.toString().substr(0, 7).toLowerCase()) +// { +// sMailToUrl = sMailToUrl.toString().substr(7); +// self.displayMailToPopup(sMailToUrl); +// } +// } +// +// return true; +// +// }, 1000)) .on('click', '.attachmentsPlace .attachmentIconParent', function (oEvent) { if (oEvent && oEvent.stopPropagation) { diff --git a/package.json b/package.json index b1a604be9..c178dcc67 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "RainLoop", "title": "RainLoop Webmail", "version": "1.9.0", - "release": "325", + "release": "327", "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 243019693..7adb7fd1f 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 @@ -86,16 +86,23 @@ class HtmlUtils /** * @param string $sHtml + * @param bool $bClearStyleAndHead = true * * @return string */ - public static function ClearTags($sHtml) + public static function ClearTags($sHtml, $bClearStyleAndHead = true) { $aRemoveTags = array( - 'head', 'link', 'base', 'meta', 'title', 'style', 'script', 'bgsound', 'keygen', 'source', + 'link', 'base', 'meta', 'title', 'script', 'bgsound', 'keygen', 'source', 'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio' ); + if ($bClearStyleAndHead) + { + $aRemoveTags[] = 'head'; + $aRemoveTags[] = 'style'; + } + $aToRemove = array( '/]*>/msi', '/<\?xml [^>]*\?>/msi' @@ -150,6 +157,227 @@ class HtmlUtils return \preg_replace($aToReplace, 'оn\\1', $sHtml); } +// public static function ClearStyleUrlValueParserHelper($oUrlValue, $oRule, $oRuleSet, +// $oElem = null, +// &$bHasExternals = false, &$aFoundCIDs = array(), +// $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), +// $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null +// ) +// { +// if ($oUrlValue instanceof \Sabberworm\CSS\Value\URL) +// { +// $oNewRule = new \Sabberworm\CSS\Rule\Rule('x-rl-orig-'.$oRule->getRule()); +// $oNewRule->setValue((string) $oRule->getValue()); +// $oNewRule->setIsImportant($oRule->getIsImportant()); +// +// $oRuleSet->addRule($oNewRule); +// +// $oUrl = $oUrlValue->getURL(); +// $sUrl = $oUrl ? $oUrl->getString() : ''; +// +// if ('cid:' === \strtolower(\substr($sUrl, 0, 4))) +// { +// $aFoundCIDs[] = \substr($sUrl, 4); +// +// $oRule->setRule('x-rl-mod-'.$oRule->getRule()); +// +// if ($oElem) +// { +// $oElem->setAttribute('data-x-style-mod', '1'); +// } +// } +// else +// { +// if (\preg_match('/http[s]?:\/\//i', $sUrl) || '//' === \substr($sUrl, 0, 2)) +// { +// $oRule->setRule('x-rl-mod-'.$oRule->getRule()); +// +// if (\in_array($sUrl, $aContentLocationUrls)) +// { +// $aFoundedContentLocationUrls[] = $sUrl; +// } +// else +// { +// $bHasExternals = true; +// if (!$bDoNotReplaceExternalUrl) +// { +// if ($fAdditionalExternalFilter) +// { +// $sAdditionalResult = \call_user_func($fAdditionalExternalFilter, $sUrl); +// if (0 < \strlen($sAdditionalResult) && $oUrl) +// { +// $oUrl->setString($sAdditionalResult); +// } +// } +// } +// } +// +// if ($oElem) +// { +// $oElem->setAttribute('data-x-style-mod', '1'); +// } +// } +// else if ('data:image/' !== \strtolower(\substr(\trim($sUrl), 0, 11))) +// { +// $oRuleSet->removeRule($oRule); +// } +// } +// } +// else if ($oRule instanceof \Sabberworm\CSS\Rule\Rule) +// { +// if ('x-rl-' !== \substr($oRule->getRule(), 0, 5)) +// { +// $oValue = $oRule->getValue(); +// if ($oValue instanceof \Sabberworm\CSS\Value\URL) +// { +// \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper($oValue, $oRule, $oRuleSet, $oElem, +// $bHasExternals, $aFoundCIDs, +// $aContentLocationUrls, $aFoundedContentLocationUrls, +// $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter); +// } +// else if ($oValue instanceof \Sabberworm\CSS\Value\RuleValueList) +// { +// $aComps = $oValue->getListComponents(); +// foreach ($aComps as $oValue) +// { +// if ($oValue instanceof \Sabberworm\CSS\Value\URL) +// { +// \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper($oValue, $oRule, $oRuleSet, $oElem, +// $bHasExternals, $aFoundCIDs, +// $aContentLocationUrls, $aFoundedContentLocationUrls, +// $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter); +// } +// } +// } +// } +// } +// } +// +// public static function ClearStyleSmart($sStyle, $oElement = null, +// &$bHasExternals = false, &$aFoundCIDs = array(), +// $aContentLocationUrls = array(), &$aFoundedContentLocationUrls = array(), +// $bDoNotReplaceExternalUrl = false, $fAdditionalExternalFilter = null, +// $sSelectorPrefix = '') +// { +// $mResult = false; +// $oCss = null; +// +// if (!\class_exists('\\Sabberworm\\CSS\\Parser')) +// { +// return $mResult; +// } +// +// $sStyle = \trim($sStyle); +// if (empty($sStyle)) +// { +// return ''; +// } +// +// $sStyle = \trim(\preg_replace('/[\r\n\t\s]+/', ' ', $sStyle)); +// +// try +// { +// $oSettings = \Sabberworm\CSS\Settings::create(); +// $oSettings->beStrict(); +// $oSettings->withMultibyteSupport(false); +// +// $oCssParser = new \Sabberworm\CSS\Parser($sStyle, $oSettings); +// $oCss = $oCssParser->parse(); +// } +// catch (\Exception $oEception) +// { +// unset($oEception); +// $mResult = false; +// } +// +// if ($oCss) +// { +// foreach ($oCss->getAllDeclarationBlocks() as $oBlock) +// { +// foreach($oBlock->getSelectors() as $oSelector) +// { +// $sS = ' '.\trim($oSelector->getSelector()).' '; +// $sS = \preg_replace('/ body([\.# ])/i', ' [data-x-div-type="body"]$1', $sS); +// $sS = \preg_replace('/ html([\.# ])/i', ' [data-x-div-type="html"]$1', $sS); +// +// if (0 < \strlen($sSelectorPrefix)) +// { +// $sS = \trim($sSelectorPrefix.' '.\trim($sS)); +// } +// +// $oSelector->setSelector(\trim($sS)); +// } +// } +// +// $aRulesToRemove = array( +// 'pointer-events', 'content', 'behavior', 'cursor', +// ); +// +// foreach($oCss->getAllRuleSets() as $oRuleSet) +// { +// foreach ($aRulesToRemove as $sRuleToRemove) +// { +// $oRuleSet->removeRule($sRuleToRemove); +// } +// +// // position: fixed -> position: fixed -> absolute +// $aRules = $oRuleSet->getRules('position'); +// if (\is_array($aRules)) +// { +// foreach ($aRules as $oRule) +// { +// $mValue = $oRule->getValue(); +// if (\is_string($mValue) && 'fixed' === \trim(\strtolower($mValue))) +// { +// $oRule->setValue('absolute'); +// } +// } +// } +// } +// +// foreach($oCss->getAllDeclarationBlocks() as $oRuleSet) +// { +// if ($oRuleSet instanceof \Sabberworm\CSS\RuleSet\RuleSet) +// { +// if ($oRuleSet instanceof \Sabberworm\CSS\RuleSet\DeclarationBlock) +// { +// $oRuleSet->expandBackgroundShorthand(); +// $oRuleSet->expandListStyleShorthand(); +// } +// +// $aRules = $oRuleSet->getRules(); +// if (\is_array($aRules) && 0 < \count($aRules)) +// { +// foreach ($aRules as $oRule) +// { +// if ($oRule instanceof \Sabberworm\CSS\Rule\Rule) +// { +// \MailSo\Base\HtmlUtils::ClearStyleUrlValueParserHelper(null, $oRule, $oRuleSet, +// $oElement, +// $bHasExternals, $aFoundCIDs, +// $aContentLocationUrls, $aFoundedContentLocationUrls, +// $bDoNotReplaceExternalUrl, $fAdditionalExternalFilter +// ); +// } +// } +// } +// } +// } +// +// try +// { +// $mResult = $oCss->render(\Sabberworm\CSS\OutputFormat::createCompact()); +// } +// catch (\Exception $oEception) +// { +// unset($oEception); +// $mResult = false; +// } +// } +// +// return $mResult; +// } + /** * * @param string $sStyle @@ -208,7 +436,7 @@ class HtmlUtils { // skip } - else if (\in_array($sName, array('background-image', 'background', 'list-style-image', 'content')) + else if (\in_array($sName, array('background-image', 'background', 'list-style', 'list-style-image', 'content')) && \preg_match('/url[\s]?\(([^)]+)\)/im', $sValue, $aMatch) && !empty($aMatch[1])) { $sFullUrl = \trim($aMatch[0], '"\' '); @@ -417,6 +645,8 @@ class HtmlUtils $bDoNotReplaceExternalUrl = false, $bFindLinksInHtml = false, $fAdditionalExternalFilter = null) { $sResult = ''; +// $aBodyStyles = array(); + $sHtml = null === $sHtml ? '' : (string) $sHtml; $sHtml = \trim($sHtml); if (0 === \strlen($sHtml)) @@ -431,7 +661,7 @@ class HtmlUtils $bHasExternals = false; - $sHtml = \MailSo\Base\HtmlUtils::ClearTags($sHtml); + $sHtml = \MailSo\Base\HtmlUtils::ClearTags($sHtml, false); $sHtml = \MailSo\Base\HtmlUtils::ClearOn($sHtml); $sHtmlAttrs = $sBodyAttrs = ''; @@ -451,11 +681,28 @@ class HtmlUtils $aNodes = $oDom->getElementsByTagName('*'); foreach ($aNodes as /* @var $oElement \DOMElement */ $oElement) { - if (\in_array(\strtolower($oElement->tagName), array('svg', 'head', 'link', - 'base', 'meta', 'title', 'style', 'x-script', 'script', 'bgsound', 'keygen', 'source', - 'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio')) && isset($oElement->parentNode)) + if ($oElement) { - @$oElement->parentNode->removeChild($oElement); + $sTagNameLower = \strtolower($oElement->tagName); + + if (\in_array($sTagNameLower, array('svg', 'head', 'link', + 'base', 'meta', 'title', 'style', 'x-script', 'script', 'bgsound', 'keygen', 'source', + 'object', 'embed', 'applet', 'mocha', 'iframe', 'frame', 'frameset', 'video', 'audio'))) + { +// if ('style' === $sTagNameLower) +// { +// $sV = (string) $oElement->textContent; +// if (!empty($sV)) +// { +// $aBodyStyles[] = $sV; +// } +// } + + if (isset($oElement->parentNode)) + { + @$oElement->parentNode->removeChild($oElement); + } + } } } @@ -546,7 +793,8 @@ class HtmlUtils // } foreach (array( - 'id', 'class', 'contenteditable', 'designmode', 'formaction', + 'id', 'class', + 'contenteditable', 'designmode', 'formaction', 'data-bind', 'xmlns', 'srcset' ) as $sAttr) { 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 f1cfad108..1f6bad09c 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -1682,7 +1682,8 @@ class Actions $aResult['UserBackgroundHash'] = ''; if (!$bAdmin && $oSettings instanceof \RainLoop\Settings && - $oSettingsLocal instanceof \RainLoop\Settings) + $oSettingsLocal instanceof \RainLoop\Settings && + $oAccount) { if ($oConfig->Get('webmail', 'allow_languages_on_settings', true)) { @@ -9277,7 +9278,8 @@ class Actions $mResult['Html'] = 0 === \strlen($sHtml) ? '' : \MailSo\Base\HtmlUtils::ClearHtml( $sHtml, $bHasExternals, $mFoundedCIDs, $aContentLocationUrls, $mFoundedContentLocationUrls, false, false, - $fAdditionalExternalFilter); + $fAdditionalExternalFilter + ); $mResult['ExternalProxy'] = null !== $fAdditionalExternalFilter; diff --git a/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php index 029415ff5..81b0be6bc 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Utils.php @@ -13,6 +13,25 @@ class Utils { } + /** + * @param string $sFileName + * @param string $sSignature + * + * @return bool + */ + static public function PgpVerifyFile($sFileName, $sSignature) + { + $sKeyFile = APP_VERSION_ROOT_PATH.'app/resources/RainLoop.asc'; + if (\file_exists($sKeyFile) && \file_exists($sFileName) && !empty($sSignature)) + { + $sKeyFile = @\file_get_contents($sKeyFile); + return !empty($sKeyFile); // TODO + } + + return false; + } + + /** * @param string $sString * @param string $sKey diff --git a/rainloop/v/0.0.0/app/resources/RainLoop.asc b/rainloop/v/0.0.0/app/resources/RainLoop.asc new file mode 100644 index 000000000..9c171afa2 --- /dev/null +++ b/rainloop/v/0.0.0/app/resources/RainLoop.asc @@ -0,0 +1,18 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +mQENBFVN/RoBCAD4NYpb/iMtDARKdTnvV/9ycoTOWdAJoGAasuLprVqyI8bB0z6X +ztJTqswgQcMzEwba5hQ9vuJ/Ylfww6mPvWJs/nmTUKxs2LlBldoSg25UDm7hyt59 +hi9zvOTwmeDNjGf5DXMib4Uuk5pH/jsmprRDZx25xA8qD2pDo0LOv5hexTwl5teA +Zh8EAAzyiNsXbX+kab9IFwSArsvYK0YJln+tPHvT29X5B5YVt9gkwY+CWA3QV/ZG +d71KEp+zReHICSjSy9G646JHDoG8CQ4Nytaih5oboqjU+Hkt8GeGlRlaPm3AIXqc +3q76Og/KD1Itx7MKrfXUvCau/4HowSiO9neJABEBAAG0H1JhaW5Mb29wIDxzdXBw +b3J0QHJhaW5sb29wLm5ldD6JATkEEwEIACMFAlVN/RoCGw8HCwkIBwMCAQYVCAIJ +CgsEFgIDAQIeAQIXgAAKCRDtfEnZh9pFkTxVCAD0S4RMXVKsbjLm22zXE01yHWQM +25QBRb5Z8p4ER3GcRNiKRWsNRTMRpiTdPgCyfj+tgIooMbBravDJwTkoztfWOb/P +l3oazxhY/ivvLalk5kVY7lflWyYYn9tfGwVJYIZCKuZ67VZwtTcf6dBhbc4DizVw +LuJAY6VNwycSHe8nrESabWzYRnw5c5ex/dmk8a1rsFXcDJBUB9MdZR7pxpniS9qB +JByxjP6hHo5vo1y6mPDiN1wWBd+objA7ZJaXd0jnsXRHlBAk74/O5cWvmVeExYjx +aERJEMQdBoAZNG1uTnQwjNdHfVoWDpqDSUr4QPfRv8M2pwvP4V1i6qji1r5T +=dVNE +-----END PGP PUBLIC KEY BLOCK----- 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 89a19ccd0..ae8e57632 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 @@ -42,14 +42,14 @@
-

+

Basic


- + Premium   () diff --git a/rainloop/v/0.0.0/app/templates/Views/User/Login.html b/rainloop/v/0.0.0/app/templates/Views/User/Login.html index 3cad58205..16e4234f0 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/Login.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/Login.html @@ -72,7 +72,7 @@

-
+
-
+
diff --git a/rainloop/v/0.0.0/langs/admin/de.ini b/rainloop/v/0.0.0/langs/admin/de.ini index 694662848..42365bbe8 100644 --- a/rainloop/v/0.0.0/langs/admin/de.ini +++ b/rainloop/v/0.0.0/langs/admin/de.ini @@ -151,14 +151,12 @@ ALERT_CANNOT_ACCESS_REPOSITORY = "Auf das Plugin-Repository kann derzeit nicht z LABEL_YOUR_DOMAIN = "Ihre Domain" LABEL_VERSION = "Version" LABEL_CHECKING = "Überprüfe" -TYPE_BASIC = "Basis" TYPE_BASIC_HINT = "Diese Domain ist nicht für die kommerzielle Nutzung (mit zusätzlichen Funktionen) lizenziert." TYPE_BASIC_HINT_2 = "Diese Domain kann nicht lizenziert werden." HTML_ALERT_TOP_1 = "RainLoop Webmail steht unter folgender Lizenz:" HTML_ALERT_TOP_2 = "Sie dürfen es für persönliche Projekte nutzen." HTML_ALERT_TOP_3 = "Kommerzielle Nutzung (mit zusätzlichen Funktionen) von RainLoop Webmail erfordert eine Subscription." -TYPE_PREMIUM = "Premium" TYPE_PREMIUM_LIFETIME = "Lebenszeit" TYPE_PREMIUM_HINT = "Diese Domain ist nicht für die kommerzielle Nutzung (mit zusätzlichen Funktionen) lizenziert." LABEL_SUB_EXPIRES = "Ablauf der Subscription:" diff --git a/rainloop/v/0.0.0/langs/admin/en.ini b/rainloop/v/0.0.0/langs/admin/en.ini index 99aebd1f7..e2e298062 100644 --- a/rainloop/v/0.0.0/langs/admin/en.ini +++ b/rainloop/v/0.0.0/langs/admin/en.ini @@ -152,14 +152,12 @@ ALERT_CANNOT_ACCESS_REPOSITORY = "Cannot access the repository at the moment." LABEL_YOUR_DOMAIN = "Your domain" LABEL_VERSION = "Version" LABEL_CHECKING = "Checking" -TYPE_BASIC = "Basic" TYPE_BASIC_HINT = "This domain isn't licensed for commercial use (with additional features)." TYPE_BASIC_HINT_2 = "This domain can't be licensed." HTML_ALERT_TOP_1 = "RainLoop Webmail is licensed under" HTML_ALERT_TOP_2 = "You are free to use it for your personal projects." HTML_ALERT_TOP_3 = "Commercial use (with additional features) of RainLoop Webmail requires getting a subscription." -TYPE_PREMIUM = "Premium" TYPE_PREMIUM_LIFETIME = "Lifetime" TYPE_PREMIUM_HINT = "This domain isn't licensed for commercial use (with additional features)." LABEL_SUB_EXPIRES = "Subscription expires:" diff --git a/rainloop/v/0.0.0/langs/admin/pt-br.ini b/rainloop/v/0.0.0/langs/admin/pt-br.ini index 1a47abdb4..4c0d778a1 100644 --- a/rainloop/v/0.0.0/langs/admin/pt-br.ini +++ b/rainloop/v/0.0.0/langs/admin/pt-br.ini @@ -152,14 +152,12 @@ ALERT_CANNOT_ACCESS_REPOSITORY = "Não foi possível acessar o repositório no m LABEL_YOUR_DOMAIN = "Seu domínio" LABEL_VERSION = "Versão" LABEL_CHECKING = "Checando" -TYPE_BASIC = "Básico" TYPE_BASIC_HINT = "Esse domínio não está licenciado para uso comercial (com recursos adicionais)." TYPE_BASIC_HINT_2 = "Esse domínio não pode ser licenciado." HTML_ALERT_TOP_1 = "RainLoop Webmail é licenciado sob" HTML_ALERT_TOP_2 = "Você é livre para usá-lo em seus projetos pessoais." HTML_ALERT_TOP_3 = "Uso comercial (com recursos adicionais) do RainLoop Webmail requer uma assinatura." -TYPE_PREMIUM = "Premium" TYPE_PREMIUM_LIFETIME = "Lifetime" TYPE_PREMIUM_HINT = "Esse domínio está licenciado para uso comercial (com recursos adicionais)." LABEL_SUB_EXPIRES = "A assinatura expira em:" diff --git a/rainloop/v/0.0.0/langs/admin/ru.ini b/rainloop/v/0.0.0/langs/admin/ru.ini index 6b19fee55..f810df564 100644 --- a/rainloop/v/0.0.0/langs/admin/ru.ini +++ b/rainloop/v/0.0.0/langs/admin/ru.ini @@ -151,14 +151,12 @@ ALERT_CANNOT_ACCESS_REPOSITORY = "Не удается получить дост LABEL_YOUR_DOMAIN = "Ваш домен" LABEL_VERSION = "Версия" LABEL_CHECKING = "Проверка" -TYPE_BASIC = "Базовая" TYPE_BASIC_HINT = "Этот домен не имеет лицензию для коммерческого использования (с дополнительными функциями)." TYPE_BASIC_HINT_2 = "Этот домен не может быть лицензирован." HTML_ALERT_TOP_1 = "Код RainLoop Webmail лицензирован под" HTML_ALERT_TOP_2 = "Вы можете свободно использовать его в своих личных проектах." HTML_ALERT_TOP_3 = "Коммерческое использование (с дополнительными функциями) RainLoop Webmail требует получение лицензии." -TYPE_PREMIUM = "Премиум" TYPE_PREMIUM_LIFETIME = "бесконечная" TYPE_PREMIUM_HINT = "Этот домен не имеет лицензию для коммерческого использования (с дополнительными функциями)." LABEL_SUB_EXPIRES = "Подписка истекает:" diff --git a/rainloop/v/0.0.0/static/ckeditor/plugins/signature/plugin.js b/rainloop/v/0.0.0/static/ckeditor/plugins/signature/plugin.js index 20cdbbbfb..4a2669004 100644 --- a/rainloop/v/0.0.0/static/ckeditor/plugins/signature/plugin.js +++ b/rainloop/v/0.0.0/static/ckeditor/plugins/signature/plugin.js @@ -4,12 +4,12 @@ rl_signature_replacer = function (editor, sText, sSignature, bHtml, bInsertBefor if (!bHtml) { sText = sText - .replace(/\u200C([\s\S]*)\u200C/g, '$1') + .replace(/\u200C([\s\S]*)\u200C/g, '\u0002$1\u0002') .replace(/\u200C/g, '') ; } - sText = sText.replace(/[\s\S]*<\/x-signature>/gm, ''); + sText = sText.replace(/\u0002([\s\S]*)\u0002/gm, ''); var bEmptyText = '' === $.trim(sText), @@ -23,19 +23,18 @@ rl_signature_replacer = function (editor, sText, sSignature, bHtml, bInsertBefor if (bInsertBefore) { - sText = '' + sSignature + (bEmptyText ? '' : sNewLine) + '' + sText; + sText = "\u0002" + sSignature + (bEmptyText ? '' : sNewLine) + "\u0002" + sText; } else { - sText = sText + '' + (bEmptyText ? '' : sNewLine) + sSignature + ''; + sText = sText + "\u0002" + (bEmptyText ? '' : sNewLine) + sSignature + "\u0002"; } if (!bHtml) { sText = sText - .replace(/([\s\S]*)<\/x-signature>/gm, '\u200C$1\u200C') - .replace(//gm, '') - .replace(/<\/x-signature>/gm, '') + .replace(/\u0002([\s\S]*)\u0002/g, '\u200C$1\u200C') + .replace(/\u0002/g, '') ; } diff --git a/vendors/ckeditor-plugins/signature/plugin.js b/vendors/ckeditor-plugins/signature/plugin.js index 20cdbbbfb..4a2669004 100644 --- a/vendors/ckeditor-plugins/signature/plugin.js +++ b/vendors/ckeditor-plugins/signature/plugin.js @@ -4,12 +4,12 @@ rl_signature_replacer = function (editor, sText, sSignature, bHtml, bInsertBefor if (!bHtml) { sText = sText - .replace(/\u200C([\s\S]*)\u200C/g, '$1') + .replace(/\u200C([\s\S]*)\u200C/g, '\u0002$1\u0002') .replace(/\u200C/g, '') ; } - sText = sText.replace(/[\s\S]*<\/x-signature>/gm, ''); + sText = sText.replace(/\u0002([\s\S]*)\u0002/gm, ''); var bEmptyText = '' === $.trim(sText), @@ -23,19 +23,18 @@ rl_signature_replacer = function (editor, sText, sSignature, bHtml, bInsertBefor if (bInsertBefore) { - sText = '' + sSignature + (bEmptyText ? '' : sNewLine) + '' + sText; + sText = "\u0002" + sSignature + (bEmptyText ? '' : sNewLine) + "\u0002" + sText; } else { - sText = sText + '' + (bEmptyText ? '' : sNewLine) + sSignature + ''; + sText = sText + "\u0002" + (bEmptyText ? '' : sNewLine) + sSignature + "\u0002"; } if (!bHtml) { sText = sText - .replace(/([\s\S]*)<\/x-signature>/gm, '\u200C$1\u200C') - .replace(//gm, '') - .replace(/<\/x-signature>/gm, '') + .replace(/\u0002([\s\S]*)\u0002/g, '\u200C$1\u200C') + .replace(/\u0002/g, '') ; }