summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/imap/src/ImapUtils.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mailnews/imap/src/ImapUtils.jsm')
-rw-r--r--comm/mailnews/imap/src/ImapUtils.jsm197
1 files changed, 197 insertions, 0 deletions
diff --git a/comm/mailnews/imap/src/ImapUtils.jsm b/comm/mailnews/imap/src/ImapUtils.jsm
new file mode 100644
index 0000000000..468d0c98a5
--- /dev/null
+++ b/comm/mailnews/imap/src/ImapUtils.jsm
@@ -0,0 +1,197 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const EXPORTED_SYMBOLS = ["ImapCapFlags", "ImapUtils"];
+
+/**
+ * The purpose here is not to convert all capabilities to flag number, but to
+ * interact with nsImapMailFolder through nsIImapIncomingServer.getCapability
+ * interface.
+ *
+ * @see nsImapCore.h
+ */
+var ImapCapFlags = {
+ Undefined: 0x00000000,
+ Defined: 0x00000001,
+ AuthLogin: 0x00000002, // AUTH LOGIN
+ XSender: 0x00000008,
+ IMAP4: 0x00000010, // RFC1734
+ IMAP4rev1: 0x00000020, // RFC2060
+ NoHierarchyRename: 0x00000080, // no hierarchy rename
+ ACL: 0x00000100, // ACL extension
+ Namespace: 0x00000200, // IMAP4 Namespace Extension
+ ID: 0x00000400, // client user agent id extension
+ XServerInfo: 0x00000800, // XSERVERINFO extension for admin urls
+ AuthPlain: 0x00001000, // new form of auth plain base64 login
+ Uidplus: 0x00002000, // RFC 2359 UIDPLUS extension
+ LiteralPlus: 0x00004000, // RFC 2088 LITERAL+ extension
+ AOLImap: 0x00008000, // aol imap extensions
+ Language: 0x00010000, // language extensions
+ CRAM: 0x00020000, // CRAM auth extension
+ Quota: 0x00040000, // RFC 2087 quota extension
+ Idle: 0x00080000, // RFC 2177 idle extension
+ AuthNTLM: 0x00100000, // AUTH NTLM extension
+ AuthMSN: 0x00200000, // AUTH MSN extension
+ StartTLS: 0x00400000, // STARTTLS support
+ AuthNone: 0x00800000, // needs no login
+ AuthGssApi: 0x01000000, // GSSAPI AUTH
+ CondStore: 0x02000000, // RFC 3551 CondStore extension
+ Enable: 0x04000000, // RFC 5161 ENABLE extension
+ XList: 0x08000000, // XLIST extension
+ CompressDeflate: 0x10000000, // RFC 4978 COMPRESS extension
+ AuthExternal: 0x20000000, // RFC 2222 SASL AUTH EXTERNAL
+ Move: 0x40000000, // Proposed MOVE RFC
+ HighestModSeq: 0x80000000, // Subset of RFC 3551
+ ListExtended: 0x100000000, // RFC 5258
+ SpecialUse: 0x200000000, // RFC 6154: Sent, Draft etc. folders
+ Gmail: 0x400000000, // X-GM-EXT-1 capability extension for gmail
+ XOAuth2: 0x800000000, // AUTH XOAUTH2 extension
+ ClientID: 0x1000000000, // ClientID capability
+ UTF8Accept: 0x2000000000, // RFC 6855: UTF8:ACCEPT
+
+ /**
+ * Convert an array of capability string to an internal flag number, for example,
+ * ["QUOTA", "X-GM-EXT-1"] will become 0x400040000.
+ *
+ * @param {string[]} arr - An array of flag string.
+ * @returns {number} An internal flag number.
+ */
+ stringsToFlags(arr) {
+ let flags = 0;
+ for (let str of arr) {
+ switch (str) {
+ case "QUOTA":
+ flags |= this.Quota;
+ break;
+ case "X-GM-EXT-1":
+ flags |= this.Gmail;
+ break;
+ default:
+ break;
+ }
+ }
+ return flags;
+ },
+};
+
+/**
+ * Collection of helper functions for IMAP.
+ */
+var ImapUtils = {
+ NS_MSG_ERROR_IMAP_COMMAND_FAILED: 0x80550021,
+
+ /** @see nsImapCore.h */
+ FLAG_NONE: 0x0000,
+ /** mailbox flags */
+ FLAG_MARKED: 0x01,
+ FLAG_UNMARKED: 0x02,
+ FLAG_NO_INFERIORS: 0x04,
+ FLAG_NO_SELECT: 0x08,
+ FLAG_IMAP_TRASH: 0x10,
+ FLAG_JUST_EXPUNGED: 0x20,
+ FLAG_PERSONAL_MAILBOX: 0x40,
+ FLAG_PUBLIC_MAILBOX: 0x80,
+ FLAG_OTHER_USERS_MAILBOX: 0x100,
+ FLAG_NAMESPACE: 0x200,
+ FLAG_NEWLY_CREATED_FOLDER: 0x400,
+ FLAG_IMAP_DRAFTS: 0x800,
+ FLAG_IMAP_SPAM: 0x1000,
+ FLAG_IMAP_SENT: 0x2000,
+ FLAG_IMAP_INBOX: 0x4000,
+ FLAG_IMAP_ALL_MAIL: 0x8000,
+ FLAG_IMAP_XLIST_TRASH: 0x10000,
+ FLAG_NON_EXISTENT: 0x20000,
+ FLAG_SUBSCRIBED: 0x40000,
+ FLAG_REMOTE: 0x80000,
+ FLAG_HAS_CHILDREN: 0x100000,
+ FLAG_HAS_NO_CHILDREN: 0x200000,
+ FLAG_IMAP_ARCHIVE: 0x400000,
+
+ /** message flags */
+ FLAG_SEEN: 0x0001,
+ FLAG_ANSWERED: 0x0002,
+ FLAG_FLAGGED: 0x0004,
+ FLAG_DELETED: 0x0008,
+ FLAG_DRAFT: 0x0010,
+ FLAG_FORWARDED: 0x0040,
+ FLAG_MDN_SENT: 0x0080,
+ FLAG_CUSTOM_KEYWORD: 0x0100,
+ FLAG_LABEL: 0x0e00,
+ FLAG_SUPPORT_FORWARDED_FLAG: 0x4000,
+ FLAG_SUPPORT_USER_FLAG: 0x8000,
+
+ logger: console.createInstance({
+ prefix: "mailnews.imap",
+ maxLogLevel: "Warn",
+ maxLogLevelPref: "mailnews.imap.loglevel",
+ }),
+
+ /**
+ * Convert internal flag number to flag string, for example,
+ * 0x3 will become "\\Seen \\Answered".
+ *
+ * @param {number} flags - Internal flag number.
+ * @param {number} supportedFlags - Server supported flags.
+ * @returns {string} Flags string that can be sent to the server.
+ */
+ flagsToString(flags, supportedFlags) {
+ let arr = [];
+ let strFlags = [
+ ["\\Seen", this.FLAG_SEEN],
+ ["\\Answered", this.FLAG_ANSWERED],
+ ["\\Flagged", this.FLAG_FLAGGED],
+ ["\\Deleted", this.FLAG_DELETED],
+ ["\\Draft", this.FLAG_DRAFT],
+ ["$Forwarded", this.FLAG_FORWARDED],
+ ["$MDNSent", this.FLAG_MDN_SENT],
+ ];
+ for (let [str, flag] of strFlags) {
+ if (flags & flag && supportedFlags & flag) {
+ arr.push(str);
+ }
+ }
+ return arr.join(" ");
+ },
+
+ /**
+ * Convert a flag string to an internal flag number, for example,
+ * "\\Seen" will become 0x1.
+ *
+ * @param {string} str - A single flag string.
+ * @returns {number} An internal flag number.
+ */
+ stringToFlag(str) {
+ return (
+ {
+ "\\SEEN": this.FLAG_SEEN,
+ "\\ANSWERED": this.FLAG_ANSWERED,
+ "\\FLAGGED": this.FLAG_FLAGGED,
+ "\\DELETED": this.FLAG_DELETED,
+ "\\DRAFT": this.FLAG_DRAFT,
+ "\\*":
+ this.FLAG_LABEL |
+ this.FLAG_MDN_SENT |
+ this.FLAG_FORWARDED |
+ this.FLAG_SUPPORT_USER_FLAG,
+ $MDNSENT: this.FLAG_MDN_SENT,
+ $FORWARDED: this.FLAG_FORWARDED,
+ }[str.toUpperCase()] || this.FLAG_NONE
+ );
+ },
+
+ /**
+ * Convert an array of flag string to an internal flag number, for example,
+ * ["\\Seen", "\\Answered"] will become 0x3.
+ *
+ * @param {string[]} arr - An array of flag string.
+ * @returns {number} An internal flag number.
+ */
+ stringsToFlags(arr) {
+ let flags = 0;
+ for (let str of arr) {
+ flags |= this.stringToFlag(str);
+ }
+ return flags;
+ },
+};