summaryrefslogtreecommitdiffstats
path: root/comm/mailnews/imap/src/ImapUtils.jsm
blob: 468d0c98a558ab5e506dda90fbfeb33dbca964ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
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;
  },
};