diff --git a/dev/Common/Utils.js b/dev/Common/Utils.js index 0bdc1706d..dfa183e55 100644 --- a/dev/Common/Utils.js +++ b/dev/Common/Utils.js @@ -90,6 +90,15 @@ return Utils.isNormal(mValue) ? '' + mValue : ''; }; + /** + * @param {*} mValue + * @return {boolean} + */ + Utils.pBool = function (mValue) + { + return !!mValue; + }; + /** * @param {string} sComponent * @return {string} diff --git a/dev/Helper/Message.js b/dev/Helper/Message.js new file mode 100644 index 000000000..1be2badb3 --- /dev/null +++ b/dev/Helper/Message.js @@ -0,0 +1,123 @@ + +(function () { + + 'use strict'; + + var + Utils = require('Common/Utils'), + + EmailModel = require('Model/Email') + ; + + /** + * @constructor + */ + function MessageHelper() {} + + /** + * @param {Array.} aEmail + * @param {boolean=} bFriendlyView + * @param {boolean=} bWrapWithLink = false + * @return {string} + */ + MessageHelper.prototype.emailArrayToString = function (aEmail, bFriendlyView, bWrapWithLink) + { + var + aResult = [], + iIndex = 0, + iLen = 0 + ; + + if (Utils.isNonEmptyArray(aEmail)) + { + for (iIndex = 0, iLen = aEmail.length; iIndex < iLen; iIndex++) + { + aResult.push(aEmail[iIndex].toLine(bFriendlyView, bWrapWithLink)); + } + } + + return aResult.join(', '); + }; + + /** + * @param {Array.} aEmails + * @return {string} + */ + MessageHelper.prototype.emailArrayToStringClear = function (aEmails) + { + var + aResult = [], + iIndex = 0, + iLen = 0 + ; + + if (Utils.isNonEmptyArray(aEmails)) + { + for (iIndex = 0, iLen = aEmails.length; iIndex < iLen; iIndex++) + { + if (aEmails[iIndex] && aEmails[iIndex].email && '' !== aEmails[iIndex].name) + { + aResult.push(aEmails[iIndex].email); + } + } + } + + return aResult.join(', '); + }; + + /** + * @param {?Array} aJson + * @return {Array.} + */ + MessageHelper.prototype.emailArrayFromJson = function (aJson) + { + var + iIndex = 0, + iLen = 0, + oEmailModel = null, + aResult = [] + ; + + if (Utils.isNonEmptyArray(aJson)) + { + for (iIndex = 0, iLen = aJson.length; iIndex < iLen; iIndex++) + { + oEmailModel = EmailModel.newInstanceFromJson(aJson[iIndex]); + if (oEmailModel) + { + aResult.push(oEmailModel); + } + } + } + + return aResult; + }; + + /** + * @param {Array.} aInputEmails + * @param {Object} oUnic + * @param {Array} aLocalEmails + */ + MessageHelper.prototype.replyHelper = function (aInputEmails, oUnic, aLocalEmails) + { + if (aInputEmails && 0 < aInputEmails.length) + { + var + iIndex = 0, + iLen = aInputEmails.length + ; + + for (; iIndex < iLen; iIndex++) + { + if (Utils.isUnd(oUnic[aInputEmails[iIndex].email])) + { + oUnic[aInputEmails[iIndex].email] = true; + aLocalEmails.push(aInputEmails[iIndex]); + } + } + } + }; + + module.exports = new MessageHelper(); + +}()); \ No newline at end of file diff --git a/dev/Model/Message.js b/dev/Model/Message.js index 818add665..e20ca8ac3 100644 --- a/dev/Model/Message.js +++ b/dev/Model/Message.js @@ -16,9 +16,10 @@ PgpStore = require('Stores/User/Pgp'), - EmailModel = require('Model/Email'), AttachmentModel = require('Model/Attachment'), + MessageHelper = require('Helper/Message'), + AbstractModel = require('Knoin/AbstractModel') ; @@ -148,114 +149,6 @@ return oMessageModel.initByJson(oJsonMessage) ? oMessageModel : null; }; - /** - * @static - * @param {Array} aEmail - * @param {boolean=} bFriendlyView - * @param {boolean=} bWrapWithLink = false - * @return {string} - */ - MessageModel.emailsToLine = function (aEmail, bFriendlyView, bWrapWithLink) - { - var - aResult = [], - iIndex = 0, - iLen = 0 - ; - - if (Utils.isNonEmptyArray(aEmail)) - { - for (iIndex = 0, iLen = aEmail.length; iIndex < iLen; iIndex++) - { - aResult.push(aEmail[iIndex].toLine(bFriendlyView, bWrapWithLink)); - } - } - - return aResult.join(', '); - }; - - /** - * @static - * @param {Array} aEmail - * @return {string} - */ - MessageModel.emailsToLineClear = function (aEmail) - { - var - aResult = [], - iIndex = 0, - iLen = 0 - ; - - if (Utils.isNonEmptyArray(aEmail)) - { - for (iIndex = 0, iLen = aEmail.length; iIndex < iLen; iIndex++) - { - if (aEmail[iIndex] && aEmail[iIndex].email && '' !== aEmail[iIndex].name) - { - aResult.push(aEmail[iIndex].email); - } - } - } - - return aResult.join(', '); - }; - - /** - * @static - * @param {?Array} aJsonEmails - * @return {Array.} - */ - MessageModel.initEmailsFromJson = function (aJsonEmails) - { - var - iIndex = 0, - iLen = 0, - oEmailModel = null, - aResult = [] - ; - - if (Utils.isNonEmptyArray(aJsonEmails)) - { - for (iIndex = 0, iLen = aJsonEmails.length; iIndex < iLen; iIndex++) - { - oEmailModel = EmailModel.newInstanceFromJson(aJsonEmails[iIndex]); - if (oEmailModel) - { - aResult.push(oEmailModel); - } - } - } - - return aResult; - }; - - /** - * @static - * @param {Array.} aMessageEmails - * @param {Object} oLocalUnic - * @param {Array} aLocalEmails - */ - MessageModel.replyHelper = function (aMessageEmails, oLocalUnic, aLocalEmails) - { - if (aMessageEmails && 0 < aMessageEmails.length) - { - var - iIndex = 0, - iLen = aMessageEmails.length - ; - - for (; iIndex < iLen; iIndex++) - { - if (Utils.isUnd(oLocalUnic[aMessageEmails[iIndex].email])) - { - oLocalUnic[aMessageEmails[iIndex].email] = true; - aLocalEmails.push(aMessageEmails[iIndex]); - } - } - } - }; - MessageModel.prototype.clear = function () { this.folderFullNameRaw = ''; @@ -373,12 +266,12 @@ this.size(Utils.pInt(oJsonMessage.Size)); - this.from = MessageModel.initEmailsFromJson(oJsonMessage.From); - this.to = MessageModel.initEmailsFromJson(oJsonMessage.To); - this.cc = MessageModel.initEmailsFromJson(oJsonMessage.Cc); - this.bcc = MessageModel.initEmailsFromJson(oJsonMessage.Bcc); - this.replyTo = MessageModel.initEmailsFromJson(oJsonMessage.ReplyTo); - this.deliveredTo = MessageModel.initEmailsFromJson(oJsonMessage.DeliveredTo); + this.from = MessageHelper.emailArrayFromJson(oJsonMessage.From); + this.to = MessageHelper.emailArrayFromJson(oJsonMessage.To); + this.cc = MessageHelper.emailArrayFromJson(oJsonMessage.Cc); + this.bcc = MessageHelper.emailArrayFromJson(oJsonMessage.Bcc); + this.replyTo = MessageHelper.emailArrayFromJson(oJsonMessage.ReplyTo); + this.deliveredTo = MessageHelper.emailArrayFromJson(oJsonMessage.DeliveredTo); this.subject(oJsonMessage.Subject); if (Utils.isArray(oJsonMessage.SubjectParts)) @@ -396,10 +289,10 @@ this.hasAttachments(!!oJsonMessage.HasAttachments); this.attachmentsMainType(oJsonMessage.AttachmentsMainType); - this.fromEmailString(MessageModel.emailsToLine(this.from, true)); - this.fromClearEmailString(MessageModel.emailsToLineClear(this.from)); - this.toEmailsString(MessageModel.emailsToLine(this.to, true)); - this.toClearEmailsString(MessageModel.emailsToLineClear(this.to)); + this.fromEmailString(MessageHelper.emailArrayToString(this.from, true)); + this.fromClearEmailString(MessageHelper.emailArrayToStringClear(this.from)); + this.toEmailsString(MessageHelper.emailArrayToString(this.to, true)); + this.toClearEmailsString(MessageHelper.emailArrayToStringClear(this.to)); this.threads(Utils.isArray(oJsonMessage.Threads) ? oJsonMessage.Threads : []); @@ -524,7 +417,7 @@ */ MessageModel.prototype.fromToLine = function (bFriendlyView, bWrapWithLink) { - return MessageModel.emailsToLine(this.from, bFriendlyView, bWrapWithLink); + return MessageHelper.emailArrayToString(this.from, bFriendlyView, bWrapWithLink); }; /** @@ -549,7 +442,7 @@ */ MessageModel.prototype.toToLine = function (bFriendlyView, bWrapWithLink) { - return MessageModel.emailsToLine(this.to, bFriendlyView, bWrapWithLink); + return MessageHelper.emailArrayToString(this.to, bFriendlyView, bWrapWithLink); }; /** @@ -559,7 +452,7 @@ */ MessageModel.prototype.ccToLine = function (bFriendlyView, bWrapWithLink) { - return MessageModel.emailsToLine(this.cc, bFriendlyView, bWrapWithLink); + return MessageHelper.emailArrayToString(this.cc, bFriendlyView, bWrapWithLink); }; /** @@ -569,7 +462,7 @@ */ MessageModel.prototype.bccToLine = function (bFriendlyView, bWrapWithLink) { - return MessageModel.emailsToLine(this.bcc, bFriendlyView, bWrapWithLink); + return MessageHelper.emailArrayToString(this.bcc, bFriendlyView, bWrapWithLink); }; /** @@ -579,7 +472,7 @@ */ MessageModel.prototype.replyToToLine = function (bFriendlyView, bWrapWithLink) { - return MessageModel.emailsToLine(this.replyTo, bFriendlyView, bWrapWithLink); + return MessageHelper.emailArrayToString(this.replyTo, bFriendlyView, bWrapWithLink); }; /** @@ -778,10 +671,10 @@ oUnic = Utils.isUnd(oExcludeEmails) ? {} : oExcludeEmails ; - MessageModel.replyHelper(this.replyTo, oUnic, aResult); + MessageHelper.replyHelper(this.replyTo, oUnic, aResult); if (0 === aResult.length) { - MessageModel.replyHelper(this.from, oUnic, aResult); + MessageHelper.replyHelper(this.from, oUnic, aResult); } return aResult; @@ -799,14 +692,14 @@ oUnic = Utils.isUnd(oExcludeEmails) ? {} : oExcludeEmails ; - MessageModel.replyHelper(this.replyTo, oUnic, aToResult); + MessageHelper.replyHelper(this.replyTo, oUnic, aToResult); if (0 === aToResult.length) { - MessageModel.replyHelper(this.from, oUnic, aToResult); + MessageHelper.replyHelper(this.from, oUnic, aToResult); } - MessageModel.replyHelper(this.to, oUnic, aToResult); - MessageModel.replyHelper(this.cc, oUnic, aCcResult); + MessageHelper.replyHelper(this.to, oUnic, aToResult); + MessageHelper.replyHelper(this.cc, oUnic, aCcResult); return [aToResult, aCcResult]; }; diff --git a/dev/Model/MessageDynamic.js b/dev/Model/MessageDynamic.js new file mode 100644 index 000000000..7f9c3403b --- /dev/null +++ b/dev/Model/MessageDynamic.js @@ -0,0 +1,63 @@ + +(function () { + + 'use strict'; + + var + _ = require('_'), + ko = require('ko'), + + Enums = require('Common/Enums'), + Utils = require('Common/Utils'), + + MessageHelper = require('Helper/Message'), + + MessageSimpleModel = require('Model/MessageSimple') + ; + + /** + * @constructor + */ + function MessageDynamicModel() + { + MessageSimpleModel.call(this, 'MessageDynamicModel'); + + 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.hasUnseenSubMessage = ko.observable(false); + this.states.hasFlaggedSubMessage = ko.observable(false); + + this.threads = ko.observableArray([]); + } + + _.extend(MessageDynamicModel.prototype, MessageSimpleModel.prototype); + + MessageDynamicModel.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 = MessageDynamicModel; + +}()); \ No newline at end of file diff --git a/dev/Model/MessageFull.js b/dev/Model/MessageFull.js new file mode 100644 index 000000000..b975b7e1a --- /dev/null +++ b/dev/Model/MessageFull.js @@ -0,0 +1,119 @@ + +(function () { + + 'use strict'; + + var + _ = require('_'), + + Enums = require('Common/Enums'), + Utils = require('Common/Utils'), + +// MessageHelper = require('Helper/Message'), + + MessageSimpleModel = require('Model/MessageSimple') + ; + + /** + * @constructor + */ + function MessageFullModel() + { + MessageSimpleModel.call(this, 'MessageFullModel'); + } + + _.extend(MessageFullModel.prototype, MessageSimpleModel.prototype); + + MessageFullModel.prototype.priority = 0; + MessageFullModel.prototype.hash = ''; + MessageFullModel.prototype.requestHash = ''; + MessageFullModel.prototype.proxy = false; + MessageFullModel.prototype.hasAttachments = false; + MessageFullModel.prototype.attachmentsMainType = ''; + MessageFullModel.prototype.attachmentsClass = ''; + + MessageFullModel.prototype.clear = function () + { + MessageSimpleModel.prototype.clear.call(this); + + this.priority = 0; + this.hash = ''; + this.requestHash = ''; + + this.proxy = false; + + this.hasAttachments = false; + this.attachmentsMainType = ''; + this.attachmentsClass = ''; + }; + + MessageFullModel.prototype.getAttachmentsClass = function () + { + var sClass = ''; + if (this.hasAttachments) + { + sClass = 'icon-attachment'; + switch (this.attachmentsMainType) + { + case 'image': + sClass = 'icon-image'; + break; + case 'archive': + sClass = 'icon-file-zip'; + break; + case 'doc': + sClass = 'icon-file-text'; + break; + case 'certificate': + sClass = 'icon-file-certificate'; + break; + } + } + + return sClass; + }; + + /** + * @param {AjaxJsonMessage} oJson + * @return {boolean} + */ + MessageFullModel.prototype.initByJson = function (oJson) + { + var bResult = false; + + if (oJson && 'Object/Message' === oJson['@Object'] && + MessageSimpleModel.prototype.initByJson.call(this, oJson)) + { + this.priority = Utils.pInt(oJson.Priority); + this.priority = Utils.inArray(this.priority, [Enums.MessagePriority.High, Enums.MessagePriority.Low]) ? + this.priority : Enums.MessagePriority.Normal; + + this.hash = Utils.pString(oJson.Hash); + this.requestHash = Utils.pString(oJson.RequestHash); + + this.proxy = !!oJson.ExternalProxy; + + this.hasAttachments = !!oJson.HasAttachments; + this.attachmentsMainType = Utils.pString(oJson.AttachmentsMainType); + this.attachmentsClass = this.getAttachmentsClass(); + + bResult = true; + } + + return bResult; + }; + + /** + * @static + * @param {AjaxJsonMessage} oJson + * @return {?MessageFullModel} + */ + MessageFullModel.newInstanceFromJson = function (oJson) + { + var oItem = oJson ? new MessageFullModel() : null; + return oItem && oItem.initByJson(oJson) ? oItem : null; + }; + + module.exports = MessageFullModel; + +}()); \ No newline at end of file diff --git a/dev/Model/MessageSimple.js b/dev/Model/MessageSimple.js index b7e9dcfbb..00b582a20 100644 --- a/dev/Model/MessageSimple.js +++ b/dev/Model/MessageSimple.js @@ -8,67 +8,109 @@ Utils = require('Common/Utils'), - MessageModel = require('Model/Message'), + MessageHelper = require('Helper/Message'), AbstractModel = require('Knoin/AbstractModel') ; /** + * @param {string=} sSuperName * @constructor */ - function MessageSimpleModel() + function MessageSimpleModel(sSuperName) { - AbstractModel.call(this, 'MessageSimpleModel'); - - this.clear(); + AbstractModel.call(this, sSuperName || 'MessageSimpleModel'); } _.extend(MessageSimpleModel.prototype, AbstractModel.prototype); - MessageSimpleModel.prototype.selected = false; - MessageSimpleModel.prototype.folderFullNameRaw = ''; + MessageSimpleModel.prototype.folder = ''; MessageSimpleModel.prototype.uid = ''; - MessageSimpleModel.prototype.size = 0; - MessageSimpleModel.prototype.sender = ''; MessageSimpleModel.prototype.subject = ''; - MessageSimpleModel.prototype.dateInUTC = 0; + + MessageSimpleModel.prototype.to = []; + MessageSimpleModel.prototype.from = []; + MessageSimpleModel.prototype.cc = []; + MessageSimpleModel.prototype.bcc = []; + MessageSimpleModel.prototype.replyTo = []; + MessageSimpleModel.prototype.deliveredTo = []; + + MessageSimpleModel.prototype.fromAsString = ''; + MessageSimpleModel.prototype.fromAsStringClear = ''; + MessageSimpleModel.prototype.toAsString = ''; + MessageSimpleModel.prototype.toAsStringClear = ''; + MessageSimpleModel.prototype.senderAsString = ''; + MessageSimpleModel.prototype.senderAsStringClear = ''; + + MessageSimpleModel.prototype.size = 0; + MessageSimpleModel.prototype.timestamp = 0; MessageSimpleModel.prototype.clear = function () { - this.selected = false; - - this.folderFullNameRaw = ''; + this.folder = ''; this.uid = ''; - this.size = 0; - this.sender = ''; this.subject = ''; - this.dateInUTC = 0; + this.to = []; + this.from = []; + this.cc = []; + this.bcc = []; + this.replyTo = []; + this.deliveredTo = []; + + this.fromAsString = ''; + this.fromAsStringClear = ''; + this.toAsString = ''; + this.toAsStringClear = ''; + this.senderAsString = ''; + this.senderAsStringClear = ''; + + this.size = 0; + this.timestamp = 0; }; /** - * @param {AjaxJsonMessage} oJsonMessage + * @param {AjaxJsonMessage} oJson * @return {boolean} */ - MessageSimpleModel.prototype.initByJson = function (oJsonMessage) + MessageSimpleModel.prototype.initByJson = function (oJson) { var bResult = false; - if (oJsonMessage && 'Object/Message' === oJsonMessage['@Object']) + if (oJson && 'Object/Message' === oJson['@Object']) { - this.selected = false; + this.folder = Utils.pString(oJson.Folder); + this.uid = Utils.pString(oJson.Uid); - this.folderFullNameRaw = oJsonMessage.Folder; - this.uid = oJsonMessage.Uid; - this.size = Utils.pInt(oJsonMessage.Size); + this.subject = Utils.pString(oJson.Subject); - this.sender = MessageModel.emailsToLine( - MessageModel.initEmailsFromJson(oJsonMessage.From), true); + this.subjectPrefix = ''; + this.subjectSuffix = this.subject; - this.subject = oJsonMessage.Subject; + if (Utils.isArray(oJson.SubjectParts)) + { + this.subjectPrefix = Utils.pString(oJson.SubjectParts[0]); + this.subjectSuffix = Utils.pString(oJson.SubjectParts[1]); + } - this.dateInUTC = Utils.pInt(oJsonMessage.DateTimeStampInUTC); + this.from = MessageHelper.emailArrayFromJson(oJson.From); + this.to = MessageHelper.emailArrayFromJson(oJson.To); + this.cc = MessageHelper.emailArrayFromJson(oJson.Cc); + this.bcc = MessageHelper.emailArrayFromJson(oJson.Bcc); + this.replyTo = MessageHelper.emailArrayFromJson(oJson.ReplyTo); + this.deliveredTo = MessageHelper.emailArrayFromJson(oJson.DeliveredTo); + + this.size = Utils.pInt(oJson.Size); + this.timestamp = Utils.pInt(oJson.DateTimeStampInUTC); + + this.fromAsString = MessageHelper.emailArrayToString(this.from, true); + this.fromAsStringClear = MessageHelper.emailArrayToStringClear(this.from); + + this.toAsString = MessageHelper.emailArrayToString(this.to, true); + this.toAsStringClear = MessageHelper.emailArrayToStringClear(this.to); + + this.populateSenderEmail(); bResult = true; } @@ -76,15 +118,27 @@ return bResult; }; + MessageSimpleModel.prototype.populateSenderEmail = function (bDraftOrSentFolder) + { + this.senderAsString = this.fromAsString; + this.senderAsStringClear = this.fromAsStringClear; + + if (bDraftOrSentFolder) + { + this.senderAsString = this.toAsString; + this.senderAsStringClear = this.toAsStringClear; + } + }; + /** * @static - * @param {AjaxJsonMessage} oJsonMessage + * @param {AjaxJsonMessage} oJson * @return {?MessageSimpleModel} */ - MessageSimpleModel.newInstanceFromJson = function (oJsonMessage) + MessageSimpleModel.newInstanceFromJson = function (oJson) { - var oMessageModel = new MessageSimpleModel(); - return oMessageModel.initByJson(oJsonMessage) ? oMessageModel : null; + var oItem = oJson ? new MessageSimpleModel() : null; + return oItem && oItem.initByJson(oJson) ? oItem : null; }; module.exports = MessageSimpleModel; diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index 95bb8c688..f6e5e4a0a 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -26,7 +26,8 @@ Remote = require('Remote/User/Ajax'), - MessageModel = require('Model/Message') + MessageModel = require('Model/Message'), + MessageHelper = require('Helper/Message') ; /** @@ -299,7 +300,8 @@ { NotificationStore.displayDesktopNotification( Links.notificationMailIcon(), - MessageModel.emailsToLine(MessageModel.initEmailsFromJson(aNewMessages[iIndex].From), false), + MessageHelper.emailArrayToString( + MessageHelper.emailArrayFromJson(aNewMessages[iIndex].From), false), aNewMessages[iIndex].Subject ); } diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index 15b7fe088..3f039c6bc 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -716,7 +716,7 @@ }) .on('click', '.thread-list .thread-list-message', function () { var oMessage = ko.dataFor(this); - if (oMessage && oMessage.folderFullNameRaw && oMessage.uid) + if (oMessage && oMessage.folder && oMessage.uid) { self.openThreadMessage(oMessage.uid); } diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php index d8b35ccf8..669f24dae 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Base/Utils.php @@ -1245,6 +1245,17 @@ END; \str_replace(array('"', '/', '\\', '*', '?', '<', '>', '|', ':'), ' ', $sValue)); } + /** + * @param string $sValue + * + * @return string + */ + public static function Trim($sValue) + { + return \trim(\preg_replace('/^[\x00-\x1F]+/u', '', + \preg_replace('/[\x00-\x1F]+$/u', '', \trim($sValue)))); + } + /** * @param string $sDir * diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php index 9629f9290..8abaea90a 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Imap/ImapClient.php @@ -194,8 +194,8 @@ class ImapClient extends \MailSo\Net\NetClient \MailSo\Log\Enumerations\Type::ERROR, true); } - $sLogin = \trim($sLogin); - $sLogin = \MailSo\Base\Utils::IdnToAscii($sLogin); + $sLogin = \MailSo\Base\Utils::IdnToAscii(\MailSo\Base\Utils::Trim($sLogin)); + $sPassword = $sPassword; $this->sLogginedUser = $sLogin; @@ -326,7 +326,7 @@ class ImapClient extends \MailSo\Net\NetClient try { - $this->SendRequestWithCheck('AUTHENTICATE', array('XOAUTH2', trim($sXOAuth2Token))); + $this->SendRequestWithCheck('AUTHENTICATE', array('XOAUTH2', \trim($sXOAuth2Token))); } catch (\MailSo\Imap\Exceptions\NegativeResponseException $oException) { diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php index 8dc4a30a8..5e1b8ad68 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/Email.php @@ -58,9 +58,11 @@ class Email throw new \MailSo\Base\Exceptions\InvalidArgumentException(); } - $this->sEmail = \MailSo\Base\Utils::IdnToAscii(\trim($sEmail), true); - $this->sDisplayName = \trim($sDisplayName); - $this->sRemark = \trim($sRemark); + $this->sEmail = \MailSo\Base\Utils::IdnToAscii( + \MailSo\Base\Utils::Trim($sEmail), true); + + $this->sDisplayName = \MailSo\Base\Utils::Trim($sDisplayName); + $this->sRemark = \MailSo\Base\Utils::Trim($sRemark); $this->sDkimStatus = \MailSo\Mime\Enumerations\DkimStatus::NONE; $this->sDkimValue = ''; @@ -88,6 +90,7 @@ class Email */ public static function Parse($sEmailAddress) { + $sEmailAddress = \MailSo\Base\Utils::Trim($sEmailAddress); if (!\MailSo\Base\Validator::NotEmptyString($sEmailAddress, true)) { throw new \MailSo\Base\Exceptions\InvalidArgumentException(); diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/EmailCollection.php b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/EmailCollection.php index fb22161e0..53e5db391 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Mime/EmailCollection.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Mime/EmailCollection.php @@ -26,6 +26,7 @@ class EmailCollection extends \MailSo\Base\Collection { parent::__construct(); + $sEmailAddresses = \MailSo\Base\Utils::Trim($sEmailAddresses); if (0 < \strlen($sEmailAddresses)) { $this->parseEmailAddresses($sEmailAddresses); @@ -213,7 +214,7 @@ class EmailCollection extends \MailSo\Base\Collection $this->Add( \MailSo\Mime\Email::Parse(\substr($sWorkingRecipients, $iEmailStartPos, $iEmailEndPos - $iEmailStartPos)) ); - + $iEmailStartPos = $iCurrentPos + 1; } catch (\MailSo\Base\Exceptions\InvalidArgumentException $oException) diff --git a/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/SmtpClient.php b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/SmtpClient.php index 846f5df1a..cb1334304 100644 --- a/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/SmtpClient.php +++ b/rainloop/v/0.0.0/app/libraries/MailSo/Smtp/SmtpClient.php @@ -186,7 +186,7 @@ class SmtpClient extends \MailSo\Net\NetClient */ public function Login($sLogin, $sPassword) { - $sLogin = \MailSo\Base\Utils::IdnToAscii($sLogin); + $sLogin = \MailSo\Base\Utils::IdnToAscii(\MailSo\Base\Utils::Trim($sLogin)); if ($this->IsAuthSupported('LOGIN')) { @@ -283,7 +283,7 @@ class SmtpClient extends \MailSo\Net\NetClient { try { - $this->sendRequestWithCheck('AUTH', 235, 'XOAUTH2 '.trim($sXOAuth2Token)); + $this->sendRequestWithCheck('AUTH', 235, 'XOAUTH2 '.\trim($sXOAuth2Token)); } catch (\MailSo\Smtp\Exceptions\NegativeResponseException $oException) { @@ -315,7 +315,9 @@ class SmtpClient extends \MailSo\Net\NetClient */ public function MailFrom($sFrom, $sSizeIfSupported = '', $bDsn = false) { - $sFrom = \MailSo\Base\Utils::IdnToAscii($sFrom, true); + $sFrom = \MailSo\Base\Utils::IdnToAscii( + \MailSo\Base\Utils::Trim($sFrom), true); + $sCmd = 'FROM:<'.$sFrom.'>'; $sSizeIfSupported = (string) $sSizeIfSupported; @@ -356,7 +358,9 @@ class SmtpClient extends \MailSo\Net\NetClient \MailSo\Log\Enumerations\Type::ERROR, true); } - $sTo = \MailSo\Base\Utils::IdnToAscii($sTo, true); + $sTo = \MailSo\Base\Utils::IdnToAscii( + \MailSo\Base\Utils::Trim($sTo), true); + $sCmd = 'TO:<'.$sTo.'>'; if ($bDsn && $this->IsSupported('DSN')) @@ -495,6 +499,9 @@ class SmtpClient extends \MailSo\Net\NetClient */ public function Vrfy($sUser) { + $sUser = \MailSo\Base\Utils::IdnToAscii( + \MailSo\Base\Utils::Trim($sUser)); + $this->sendRequestWithCheck('VRFY', array(250, 251, 252), $sUser); return $this; 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 0fdde9fa4..b1b668539 100644 --- a/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php +++ b/rainloop/v/0.0.0/app/libraries/RainLoop/Actions.php @@ -385,12 +385,6 @@ class Actions } } -// $sSubQuerty = \trim(\trim($this->Http()->GetQuery('s', '')), ' /'); -// $sSubSubQuerty = \trim(\trim($this->Http()->GetQuery('ss', '')), ' /'); -// -// $sQuery .= 0 < \strlen($sSubQuerty) ? '/'.$sSubQuerty : ''; -// $sQuery .= 0 < \strlen($sSubSubQuerty) ? '/'.$sSubSubQuerty : ''; - if ('' === $this->GetSpecAuthToken()) { $aPaths = \explode('/', $sQuery); @@ -1632,7 +1626,7 @@ class Actions $aResult['UserBackgroundHash'] = (string) $oSettings->GetConf('UserBackgroundHash', $aResult['UserBackgroundHash']); // if (!empty($aResult['UserBackgroundName']) && !empty($aResult['UserBackgroundHash'])) // { -// $aResult['IncludeBackground'] = './?/Raw/&s=/{{USER}}/UserBackground/&ss=/'. +// $aResult['IncludeBackground'] = './?/Raw/&q[]=/{{USER}}/UserBackground/&q[]=/'. // $aResult['UserBackgroundHash'].'/'; // } } @@ -1834,7 +1828,8 @@ class Actions { $this->Plugins()->RunHook('filter.login-credentials.step-1', array(&$sEmail, &$sPassword)); - $sEmail = \MailSo\Base\Utils::StrToLowerIfAscii($sEmail); + $sEmail = \MailSo\Base\Utils::StrToLowerIfAscii( + \MailSo\Base\Utils::Trim($sEmail)); if (false === \strpos($sEmail, '@')) { @@ -2069,7 +2064,7 @@ class Actions */ public function DoLogin() { - $sEmail = \trim($this->GetActionParam('Email', '')); + $sEmail = \MailSo\Base\Utils::Trim($this->GetActionParam('Email', '')); $sPassword = $this->GetActionParam('Password', ''); $sLanguage = $this->GetActionParam('Language', ''); $bSignMe = '1' === (string) $this->GetActionParam('SignMe', '0'); @@ -7707,8 +7702,8 @@ class Actions \array_shift($aParams); $sLast = \array_pop($aParams); - $sUrl = $this->Http()->GetFullUrl().'?/Raw/&s=/'.implode('/', $aParams).'/&ss=/'.$sLast; - $sFullUrl = 'https://docs.google.com/viewer?embedded=true&url='.urlencode($sUrl); + $sUrl = $this->Http()->GetFullUrl().'?/Raw/&q[]=/'.\implode('/', $aParams).'/&q[]=/'.$sLast; + $sFullUrl = 'https://docs.google.com/viewer?embedded=true&url='.\urlencode($sUrl); @\header('Content-Type: text/html; charset=utf-8'); echo ''. @@ -8725,7 +8720,7 @@ class Actions */ public function GetActionParam($sKey, $mDefault = null) { - return is_array($this->aCurrentActionParams) && isset($this->aCurrentActionParams[$sKey]) ? + return \is_array($this->aCurrentActionParams) && isset($this->aCurrentActionParams[$sKey]) ? $this->aCurrentActionParams[$sKey] : $mDefault; } diff --git a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html index d9dc16f55..a0710e325 100644 --- a/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html +++ b/rainloop/v/0.0.0/app/templates/Views/User/MailMessageView.html @@ -215,9 +215,9 @@