├── README.md
├── bin
├── Imap-ACL-Extension-0.2.8.xpi
├── build.sh
└── incrementVersion.sh
└── src
├── chrome.manifest
├── chrome
├── content
│ ├── about.xul
│ ├── aclOverview.js
│ ├── aclOverview.xul
│ ├── aclUtils.js
│ ├── acls.js
│ ├── acls.xul
│ ├── changeAcl.js
│ ├── changeAcl.xul
│ ├── debug.js
│ ├── options.xul
│ ├── overlay.js
│ └── overlay.xul
├── locale
│ ├── de-DE
│ │ ├── about.dtd
│ │ ├── acls.dtd
│ │ ├── acls.properties
│ │ ├── changeAcl.dtd
│ │ ├── changeAcl.properties
│ │ ├── options.dtd
│ │ ├── overlay.dtd
│ │ └── overlay.properties
│ ├── en-US
│ │ ├── about.dtd
│ │ ├── acls.dtd
│ │ ├── acls.properties
│ │ ├── changeAcl.dtd
│ │ ├── changeAcl.properties
│ │ ├── options.dtd
│ │ ├── overlay.dtd
│ │ └── overlay.properties
│ ├── fr-FR
│ │ ├── about.dtd
│ │ ├── acls.dtd
│ │ ├── acls.properties
│ │ ├── changeAcl.dtd
│ │ ├── changeAcl.properties
│ │ ├── options.dtd
│ │ ├── overlay.dtd
│ │ └── overlay.properties
│ └── pt-BR
│ │ ├── about.dtd
│ │ ├── acls.dtd
│ │ ├── acls.properties
│ │ ├── changeAcl.dtd
│ │ ├── changeAcl.properties
│ │ ├── options.dtd
│ │ ├── overlay.dtd
│ │ └── overlay.properties
└── skin
│ ├── overlay.css
│ ├── toolbar-button_16_t.png
│ ├── toolbar-button_16_t_list.png
│ ├── toolbar-button_24_t.png
│ └── toolbar-button_24_t_list.png
├── defaults
└── preferences
│ └── prefs.js
└── install.rdf
/README.md:
--------------------------------------------------------------------------------
1 | # imap-acl
2 | Imap Acl Addon for Thunderbird
3 |
4 | Official install URL:
5 | https://addons.mozilla.org/en-US/thunderbird/addon/imap-acl-extension/
6 |
--------------------------------------------------------------------------------
/bin/Imap-ACL-Extension-0.2.8.xpi:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasTor/imap-acl/abee56583a8433d9c8b6d2ea42bfad76890edecc/bin/Imap-ACL-Extension-0.2.8.xpi
--------------------------------------------------------------------------------
/bin/build.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | if [ -f Imap-ACL-Extension-0.2.8.xpi ]; then
3 | rm Imap-ACL-Extension-0.2.8.xpi
4 | fi
5 | cd ../src
6 | mv chrome/content/debug.js debug.js
7 | zip -r ../bin/Imap-ACL-Extension-0.2.8.xpi chrome/ chrome.manifest defaults/ install.rdf
8 | mv debug.js chrome/content/debug.js
9 |
--------------------------------------------------------------------------------
/bin/incrementVersion.sh:
--------------------------------------------------------------------------------
1 | #/bin/bash
2 | OLD_VERSION=0.2.7
3 | NEW_VERSION=0.2.8
4 | git mv Imap-ACL-Extension-$OLD_VERSION.xpi Imap-ACL-Extension-$NEW_VERSION.xpi
5 | sed -i "s/$OLD_VERSION/$NEW_VERSION/" ../src/chrome/content/about.xul
6 | sed -i "s/$OLD_VERSION/$NEW_VERSION/" ../src/chrome/content/overlay.js
7 | sed -i "s/$OLD_VERSION/$NEW_VERSION/" ../src/install.rdf
8 | sed -i "s/$OLD_VERSION/$NEW_VERSION/" ./build.sh
9 |
--------------------------------------------------------------------------------
/src/chrome.manifest:
--------------------------------------------------------------------------------
1 | content imapaclext chrome/content/
2 |
3 | overlay chrome://messenger/content/mailWindowOverlay.xul chrome://imapaclext/content/overlay.xul
4 |
5 | skin imapaclext classic chrome/skin/
6 | style chrome://global/content/customizeToolbar.xul chrome://imapaclext/skin/overlay.css
7 |
8 | locale imapaclext en-US chrome/locale/en-US/
9 | locale imapaclext de-DE chrome/locale/de-DE/
10 | locale imapaclext fr-FR chrome/locale/fr-FR/
11 | locale imapaclext pt-BR chrome/locale/pt-BR/
12 |
--------------------------------------------------------------------------------
/src/chrome/content/about.xul:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
19 |
--------------------------------------------------------------------------------
/src/chrome/content/aclOverview.js:
--------------------------------------------------------------------------------
1 | if ("undefined" == typeof(ImapAclExt)) {
2 | var ImapAclExt = {};
3 | };
4 | if ("undefined" == typeof(ImapAclExt.AclOverview)) {
5 | ImapAclExt.AclOverview = {
6 | Cc : Components.classes,
7 | Cu : Components.utils,
8 | Ci : Components.interfaces,
9 | _pref : null,
10 | _stringBundle : null,
11 | _folderList : null,
12 | _doc : null,
13 | _folderCounter : 0,
14 | _returnCounter : 0,
15 |
16 | init : function() {
17 | this.Cu.import("resource:///modules/iteratorUtils.jsm");
18 | this._stringBundle = document.getElementById("acloverview-bundle");
19 | this._pref = this.Cc['@mozilla.org/preferences-service;1']
20 | .getService(this.Ci.nsIPrefBranch);
21 | this._folderList = document.getElementById("folder_list");
22 | this._doc = document;
23 |
24 | this.buildList();
25 | },
26 |
27 | buildList : function() {
28 | document.getElementById("status_label").value = this._stringBundle.getString("loading") + " 0/0";
29 | document.getElementById("folderProgress").value = 0;
30 | document.getElementById("folderProgress").hidden = false;
31 |
32 | var gAccountManager = Components.classes["@mozilla.org/messenger/account-manager;1"].getService(Components.interfaces.nsIMsgAccountManager);
33 | var folders = new Array();
34 |
35 | for (let account of fixIterator(gAccountManager.accounts, this.Ci.nsIMsgAccount)) {
36 | var incomingServer = account.incomingServer.QueryInterface(Components.interfaces.nsIMsgIncomingServer);
37 | var root = incomingServer.rootFolder.QueryInterface(Components.interfaces.nsIMsgFolder);
38 | if (incomingServer.type == "imap" && root.hasSubFolders) {
39 |
40 | var rootFolder = root.QueryInterface(Components.interfaces.nsIMsgImapMailFolder);
41 |
42 | if (rootFolder.canOpenFolder && incomingServer.realUsername.length > 0 && incomingServer.password.length > 0) {
43 | var folderForAcc = new Array();
44 |
45 | // SG, 07.10.2015 - TB24 changed from nsISupportsArray to nsIMutableArray, and fix typo ListDescendants
46 | // https://developer.mozilla.org/en-US/docs/Mozilla/Thunderbird/Releases/24
47 | //let allFolders = this.Cc["@mozilla.org/supports-array;1"].createInstance(this.Ci.nsISupportsArray);
48 | let allFolders = this.Cc["@mozilla.org/array;1"].createInstance(this.Ci.nsIMutableArray);
49 | rootFolder.ListDescendants(allFolders);
50 | //window.alert(allFolders.length);
51 | //window.alert(allFolders.Count());
52 |
53 | for (let folder of fixIterator(allFolders, this.Ci.nsIMsgFolder)) {
54 | var imapF = folder.QueryInterface(Components.interfaces.nsIMsgImapMailFolder);
55 |
56 | if (imapF.canOpenFolder) {
57 | //if (imapF.getPermissionsForUser(imapF.server.realUsername).indexOf("a") != -1) {
58 | folderForAcc.push(imapF);
59 | //}
60 | } else {
61 | //window.dump(imapF.URI + " // " + imapF.canOpenFolder + "\n");
62 | }
63 | }
64 | folders.push(folderForAcc);
65 | } else {
66 | var r = new Array();
67 | r.push(root.name);
68 | this.buildAclListCB(this, r, this._stringBundle.getString("noConnect"));
69 | }
70 | } else {
71 | var r = new Array();
72 | r.push(root.name);
73 | this.buildAclListCB(this, r, this._stringBundle.getString("noImap"));
74 | }
75 | }
76 |
77 | this._folderCounter = folders.length;
78 | this._returnCounter = 0;
79 |
80 | for (var i = 0; i < folders.length; ++i) {
81 | var foldersArray = folders[i];
82 | foldersArray.sort(this.folderSort);
83 |
84 | ImapAclExt.Utils.check(foldersArray, this.buildAclListCB, this);
85 | }
86 |
87 | document.getElementById("status_label").value = this._stringBundle.getString("loading") + this._returnCounter + " /" + this._folderCounter;
88 | },
89 |
90 | folderSort : function (a, b) {
91 | if (a.server.rootFolder.name == b.server.rootFolder.name)
92 | return a.onlineName > b.onlineName;
93 | else
94 | return a.server.rootFolder.name > b.server.rootFolder.name
95 | },
96 |
97 | buildAclListCB : function(cbSender, rights, imapFolder) {
98 | //++cbSender._returnCounter;
99 | //cbSender._doc.getElementById("folderProgress").value = cbSender._returnCounter/cbSender._folderCounter*100;
100 |
101 | //window.dump(cbSender._returnCounter + "\n");
102 | //window.dump("buildAclListCB: " + imapFolder.server.rootFolder.name + "/" + imapFolder.onlineName + "\n");
103 | if (rights == "") {
104 | //window.dump("buildAclListCB: empty rights");
105 | } else if (rights == undefined) {
106 | cbSender._doc.getElementById("status_label").value = cbSender._stringBundle.getString("loadingFailed");
107 | } else {
108 | for (var i=0; i0;--i) {
165 | //window.dump("found: " + items[i].value + "\n");
166 | if (("Cname" in items[i]) && items[i].Cname == "aclRightsListItemName") {
167 | // window.dump("removed" + items[i].value + "\n");
168 | items[i].parentNode.removeChild(items[i]); //items[i].hidden = true;
169 | }
170 | }
171 | this._folderCounter = 0;
172 | this._returnCounter = 0;
173 | this.buildList();
174 | //document.getElementById("status_label").value = this._stringBundle.getString("loadingDone");
175 | },
176 |
177 | click : function(event) {
178 | // we only care about button 0 (left click) double click events
179 | if (event.button != 0 || event.detail != 2 || event.originalTarget.localName != "listitem")
180 | return;
181 | this.change();
182 | },
183 |
184 | change : function() {
185 | if (this._folderList.selectedIndex == -1) {
186 | window.alert(this._stringBundle.getString("noEntry"));
187 | return "true";
188 | } else if (this._folderList.selectedItem.imapFolder == null) {
189 | return "true";
190 | }
191 |
192 |
193 |
194 | var aclstring = new Object();
195 | var username = new Object();
196 |
197 | if (this._pref.getBoolPref("extensions.ImapAclExt.advMode")) {
198 | window.openDialog("chrome://imapaclext/content/changeAcl.xul", "changeAcl",
199 | "modal=yes,dialog=yes,centerscreen=yes,resizable=no,height=430,width=300",
200 | this._folderList.selectedItem.aclValue, aclstring, username, this._folderList.selectedItem.imapFolder);
201 | } else {
202 | window.openDialog("chrome://imapaclext/content/changeAcl.xul", "changeAcl",
203 | "modal=yes,dialog=yes,centerscreen=yes,resizable=no,height=180,width=300",
204 | this._folderList.selectedItem.aclValue, aclstring, username, this._folderList.selectedItem.imapFolder);
205 | }
206 |
207 | if (!("value" in aclstring) || aclstring.value != "Cancel") {
208 | this.refresh();
209 | }
210 |
211 | //useless, but avoids warning:
212 | return true;
213 | },
214 |
215 | cnew : function() {
216 | var aclstring = new Object();
217 | var username = new Object();
218 |
219 | if (this._pref.getBoolPref("extensions.ImapAclExt.advMode")) {
220 | window.openDialog("chrome://imapaclext/content/changeAcl.xul", "changeAcl",
221 | "modal=yes,dialog=yes,centerscreen=yes,resizable=yes,height=430,width=300",
222 | -1, aclstring, username, window.arguments[0]);
223 | } else {
224 | window.openDialog("chrome://imapaclext/content/changeAcl.xul", "changeAcl",
225 | "modal=yes,dialog=yes,centerscreen=yes,resizable=yes,height=180,width=300",
226 | -1, aclstring, username, window.arguments[0]);
227 | }
228 |
229 | if (aclstring.value != "Cancel") {
230 | this.refresh();
231 | }
232 | },
233 |
234 | del : function() {
235 |
236 |
237 | if (this._folderList.selectedIndex == -1) {
238 | window.alert(this._stringBundle.getString("noEntry"));
239 | return "true";
240 | } else if (this._folderList.selectedItem.imapFolder == null) {
241 | return "true";
242 | }
243 |
244 | document.getElementById("status_label").value = this._stringBundle.getString("loading");
245 |
246 | var q = this._stringBundle.getString("delRights") + ": " +
247 | this._folderList.selectedItem.aclValue.username + " on " + "\n" + this._folderList.selectedItem.imapFolder.onlineName + "?";
248 |
249 | var check = confirm(q);
250 | if (check == true) {
251 | ImapAclExt.Utils.delAcl(this._folderList.selectedItem.imapFolder, this._folderList.selectedItem.aclValue.username,
252 | document.getElementById("recursion").checked, this.delCB, this);
253 | } else {
254 | document.getElementById("status_label").value = this._stringBundle.getString("loadingDone");
255 | }
256 |
257 | //useless, but avoids warning:
258 | return true;
259 | },
260 | delCB : function (cbSender, result) {
261 | if (result != "success") {
262 | if (result == "noAclRight") {
263 | alert(this._stringBundle.getString("noAclRight"));
264 | } else {
265 | alert(result);
266 | }
267 | }
268 | cbSender.refresh();
269 | if ("_stringBundle" in this) {
270 | cbSender._doc.getElementById("status_label").value = this._stringBundle.getString("loadingDone");
271 | }
272 | },
273 | cancel : function () {
274 | if (this._returnCounter != this._folderCounter) {
275 | //window.dump("cancel aborted");
276 | //return false;
277 | }
278 | },
279 | accept : function() {
280 | if (this._returnCounter != this._folderCounter) {
281 | //window.dump("accept aborted");
282 | //return false;
283 | }
284 | }
285 | };
286 | };
287 |
--------------------------------------------------------------------------------
/src/chrome/content/aclOverview.xul:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
46 |
--------------------------------------------------------------------------------
/src/chrome/content/aclUtils.js:
--------------------------------------------------------------------------------
1 | if ("undefined" == typeof(ImapAclExt)) {
2 | var ImapAclExt = {};
3 | };
4 | if ("undefined" == typeof(ImapAclExt.Utils)) {
5 | Components.utils.import("resource:///modules/iteratorUtils.jsm");
6 | ImapAclExt.Utils = {
7 | TIMEOUT : 5,
8 | //more than ms, faar less than s
9 | COMMANDTIMEOUT : 100,
10 | Cc : Components.classes,
11 | Ci : Components.interfaces,
12 | Cu : Components.utils,
13 |
14 | getSubFoldersAsArray : function (imapFolder, folders) {
15 | // SG, 07.10.2015 - TB24 changed from nsISupportsArray to nsIMutableArray, and fix typo ListDescendants
16 | // https://developer.mozilla.org/en-US/docs/Mozilla/Thunderbird/Releases/24
17 | //let allFolders = this.Cc["@mozilla.org/supports-array;1"].createInstance(this.Ci.nsISupportsArray);
18 | let allFolders = this.Cc["@mozilla.org/array;1"].createInstance(this.Ci.nsIMutableArray);
19 | imapFolder.ListDescendants(allFolders);
20 |
21 | for (let folder of fixIterator(allFolders, this.Ci.nsIMsgFolder)) {
22 | var imapF = folder.QueryInterface(Components.interfaces.nsIMsgImapMailFolder);
23 |
24 | if (imapF.canOpenFolder) {
25 | folders.push(imapF.onlineName);
26 | }
27 | }
28 | /*
29 | var subFolders = imapFolder.subFolders;
30 | var numSubFolders = imapFolder.numSubFolders;
31 |
32 | while (subFolders.hasMoreElements()) {
33 | var currentFolder = null;
34 | try {
35 | currentFolder = subFolders.getNext().QueryInterface(Components.interfaces.nsIMsgImapMailFolder);
36 | folders.push(currentFolder.onlineName);
37 |
38 | if (currentFolder.hasSubFolders) {
39 | this.getSubFoldersAsArray(currentFolder, folders);
40 | }
41 | } catch (ex) {
42 | window.dump(ex);
43 | }
44 | }
45 | */
46 | },
47 |
48 | setAcl : function (imapFolder, user, acl, rec, callback, cbSender) {
49 | var result;
50 | var folders = new Array();
51 | if (rec && imapFolder.hasSubFolders) {
52 | this.getSubFoldersAsArray(imapFolder, folders);
53 | var command = "SETACL \"" + imapFolder.onlineName + "\" \"" + user + "\" \"" + acl + "\"";
54 | var otherCommands = new Array();
55 | for (var i = 0; i < folders.length; ++i) {
56 | otherCommands.push("SETACL \"" + folders[i] + "\" \"" + user + "\" \"" + acl + "\"");
57 | }
58 |
59 | this.sendToServer(imapFolder.server, command, true, otherCommands, this.isChanged, this, callback, cbSender, imapFolder);
60 | } else {
61 | this.sendToServer(imapFolder.server, "SETACL \"" +
62 | imapFolder.onlineName + "\" \"" + user + "\" \"" + acl + "\"", true, null, this.isChanged, this, callback, cbSender, imapFolder);
63 | }
64 | return result;
65 | },
66 |
67 | check : function (imapFolder, callback, cbSender) {
68 |
69 | if (imapFolder instanceof Array && imapFolder.length > 0) {
70 | // SG, 07.10.2015 - working, but why not using otherCommands?
71 | var commands = new Array();
72 | for (var i = 0; i < imapFolder.length; ++i) {
73 | commands.push("cmd00" + i + " GETACL \"" + imapFolder[i].onlineName + "\"");
74 | }
75 |
76 | this.sendToServer(imapFolder[0].server, commands,
77 | false, null, this.isMultiChecked, this, callback, cbSender, imapFolder);
78 | } else {
79 | this.sendToServer(imapFolder.server, "GETACL \"" + imapFolder.onlineName + "\"",
80 | false, null, this.isChecked, this, callback, cbSender, imapFolder);
81 | }
82 | },
83 |
84 | delAcl : function (imapFolder, user, rec, callback, cbSender) {
85 | var result;
86 | var folders = new Array();
87 | if (rec && imapFolder.hasSubFolders) {
88 | this.getSubFoldersAsArray(imapFolder, folders);
89 | var command = "DELETEACL \"" + imapFolder.onlineName + "\" \"" + user + "\"";
90 | var otherCommands = new Array();
91 | for (var i = 0; i < folders.length; ++i) {
92 | otherCommands.push("DELETEACL \"" + folders[i] + "\" \"" + user + "\"");
93 | }
94 |
95 | this.sendToServer(imapFolder.server, command, true, otherCommands, this.isChanged, this, callback, cbSender, imapFolder);
96 | } else {
97 | this.sendToServer(imapFolder.server, "DELETEACL \"" +
98 | imapFolder.onlineName + "\" \"" + user + "\"", true, null, this.isChanged, this, callback, cbSender, imapFolder);
99 | }
100 | },
101 | isChanged : function (cbSender, result, cb, cbS, imapFolder) {
102 | result = result.toLowerCase();
103 | if (result != null && result.indexOf("ok") != -1 && (result.indexOf("setacl") != -1 ||
104 | result.indexOf("deleteacl") != -1 ||
105 | result.indexOf("completed") != -1 ||
106 | result.indexOf("updated") != -1)) {
107 | result = "success";
108 | }
109 |
110 | cb(cbS, result, imapFolder);
111 | },
112 | isMultiChecked : function (cbSender, result, cb, cbS, imapFolder) {
113 | //window.dump(result);
114 | //window.dump(result.length);
115 | var cmd = 0;
116 | imapFolder.reverse();
117 | ++cbS._returnCounter;
118 | for (var i = 0; i < result.length; ++i) {
119 | //window.dump(i + " // " + result[i]);
120 | if (result[i].indexOf("cmd00") !=-1) {
121 |
122 | if (result[i].search("cmd00([0-9]+) OK") != -1) {
123 | cbSender.parseCheck(cbSender, result[i], cb, cbS, imapFolder.pop());
124 | } else {
125 | cb(cbS, "", imapFolder.pop());
126 | }
127 | ++cmd;
128 | }
129 | }
130 | },
131 | isChecked : function (cbSender, result, cb, cbS, imapFolder) {
132 | //window.dump("isChecked "+ imapFolder.onlineName + "\n");
133 |
134 | if (!result instanceof Array || !result.length > 0) {
135 | window.alert("Unknown Imap Error!\n" + result);
136 | }
137 |
138 | var aclRes = "";
139 |
140 | if (result.length > 3 && result[3].toLowerCase().indexOf("acl") >=0
141 | && result[3].toLowerCase().indexOf(imapFolder.onlineName.toLowerCase()) >= 0) {
142 | aclRes = result[3];
143 | } else if (result.length > 2 && result[2].toLowerCase().indexOf("acl") >=0
144 | && result[2].toLowerCase().indexOf(imapFolder.onlineName.toLowerCase()) >= 0) {
145 | aclRes = result[2];
146 | }
147 |
148 | //window.dump("isChecked "+ imapFolder.onlineName + "\\\\" + cbSender.checkedCounter + "//" + aclRes.indexOf("\n") + result+"\n");
149 |
150 | cbSender.parseCheck(cbSender, aclRes, cb, cbS, imapFolder);
151 | },
152 | splitargs : function (input, separator, keepQuotes) {
153 | // source: https://github.com/elgs/splitargs
154 | separator = separator || /\s/g;
155 | var singleQuoteOpen = false;
156 | var doubleQuoteOpen = false;
157 | var tokenBuffer = [];
158 | var ret = [];
159 |
160 | var arr = input.split('');
161 | for (var i = 0; i < arr.length; ++i) {
162 | var element = arr[i];
163 | var matches = element.match(separator);
164 | if (element === "'" && !doubleQuoteOpen) {
165 | if (keepQuotes === true) {
166 | tokenBuffer.push(element);
167 | }
168 | singleQuoteOpen = !singleQuoteOpen;
169 | continue;
170 | } else if (element === '"' && !singleQuoteOpen) {
171 | if (keepQuotes === true) {
172 | tokenBuffer.push(element);
173 | }
174 | doubleQuoteOpen = !doubleQuoteOpen;
175 | continue;
176 | }
177 |
178 | if (!singleQuoteOpen && !doubleQuoteOpen && matches) {
179 | if (tokenBuffer && tokenBuffer.length > 0) {
180 | ret.push(tokenBuffer.join(''));
181 | tokenBuffer = [];
182 | } else {
183 | ret.push('');
184 | }
185 | } else {
186 | tokenBuffer.push(element);
187 | }
188 | }
189 | if (tokenBuffer && tokenBuffer.length > 0) {
190 | ret.push(tokenBuffer.join(''));
191 | } else {
192 | ret.push('');
193 | }
194 | return ret;
195 | },
196 | parseCheck : function (cbSender, aclRes, cb, cbS, imapFolder) {
197 | //dump("parseCheck(aclRes = "+aclRes+")\n");
198 | if (aclRes == "" || aclRes.indexOf(" OK ") < 0) {
199 | //window.dump("isChecked "+ imapFolder.onlineName + "\\\\" + cbSender.checkedCounter + "//" + aclRes.indexOf("\n") + result+"\n");
200 | cb(cbS, "", imapFolder);
201 | }
202 |
203 | // SG, 07.10.2015 - not only process first, but all lines
204 | // * ACL
205 | var rights = new Array();
206 | var aclLine = aclRes.split("\n");
207 |
208 | for (var a=0;a currACL) {
214 | // SG, 07.10.2015 - TODO: find correct owner
215 | // (but ACL may return complete mail address when realUsername misses domain)
216 | if (acls[currACL-1] != "owner" && acls[currACL-1] != imapFolder.server.realUsername) {
217 | rights.push({username: acls[currACL-1], permissions: acls[currACL]});
218 | }
219 | currACL += 2;
220 | }
221 | }
222 | }
223 | //dump("parseCheck found "+rights.length+" ACLs for "+imapFolder.onlineName+"\n");
224 |
225 | cb(cbS, rights, imapFolder);
226 | },
227 |
228 | sendToServer : function (server, command, isACLCommand, otherCommands, callback, cbSender, cb, cbS, imapFolder)
229 | {
230 | var result = null;
231 | var index = 0;
232 | var initialized = false;
233 | var protocolData = new Array();
234 | var result;
235 | var prefs = Components.classes['@mozilla.org/preferences-service;1'].getService(this.Ci.nsIPrefBranch);
236 | try {
237 | var secType = null;
238 | var secLength = 0;
239 | var starttlsMode = false;
240 | var startedtlsMode = false;
241 |
242 | if (server.socketType == 3) {
243 | secType = ['ssl'];
244 | secLength = 1;
245 | } else if (server.socketType == 2) {
246 | secType = ['starttls'];
247 | secLength = 1;
248 | starttlsMode = true;
249 | }
250 |
251 | var transportService = this.Cc["@mozilla.org/network/socket-transport-service;1"]
252 | .getService(this.Ci.nsISocketTransportService);
253 |
254 | var transport = transportService.createTransport(secType, secLength,
255 | server.realHostName, server.port, null);
256 |
257 | //transport.setTimeout(this.Ci.nsISocketTransport.TIMEOUT_CONNECT, this.TIMEOUT);
258 | //transport.setTimeout(this.Ci.nsISocketTransport.TIMEOUT_READ_WRITE, this.TIMEOUT);
259 |
260 | var outstream = transport.openOutputStream(0,0,0);
261 | var stream = transport.openInputStream(0,0,0);
262 | var instream = this.Cc["@mozilla.org/scriptableinputstream;1"]
263 | .createInstance(this.Ci.nsIScriptableInputStream);
264 |
265 | instream.init(stream);
266 |
267 | if (starttlsMode) {
268 | protocolData.push("a001 STARTTLS" + "\r\n");
269 | }
270 |
271 | protocolData.push("a002 LOGIN " + server.realUsername + " " + server.password + "\r\n");
272 | if (command instanceof Array) {
273 | for (var i = 0; i < command.length; ++i) {
274 | protocolData.push(command[i] + "\r\n");
275 | }
276 | } else {
277 | protocolData.push("a003 " + command + "\r\n");
278 | }
279 | if (otherCommands != undefined && otherCommands instanceof Array) {
280 | for (var i = 0; i < otherCommands.length; ++i) {
281 | protocolData.push("b00" + i + " " + otherCommands[i] + "\r\n");
282 | }
283 | }
284 | protocolData.push("c004 LOGOUT" + "\r\n");
285 |
286 | var dataListener =
287 | {
288 | callback : null,
289 | cbSender : null,
290 | cb : null,
291 | cbS : null,
292 | imapFolder : null,
293 | data : new Array(),
294 | onStartRequest: function(request, context)
295 | {
296 | initialized = true;
297 | //window.dump("onStartRequest :: " + imapFolder.URI + "\n");
298 | },
299 | onStopRequest: function(request, context, status)
300 | {
301 |
302 | instream.close();
303 | outstream.close();
304 | //window.alert(ImapAclExt.Debug.var_dump(this.data));
305 | if (this.data != null && this.data.length > 2) {
306 | var response = null;
307 | if (isACLCommand) {
308 | if (this.data[2].indexOf("a003") == 0) {
309 | response = this.data[2].toLowerCase();
310 | } else if (this.data[3].indexOf("a003") == 0) {
311 | response = this.data[3].toLowerCase();
312 | }
313 | //window.alert(ImapAclExt.Debug.var_dump(response));
314 | if (response != null && response.indexOf("ok") != -1 &&
315 | (response.indexOf("setacl") != -1 ||
316 | response.indexOf("deleteacl") != -1 ||
317 | response.indexOf("completed") != -1 ||
318 | response.indexOf("updated") != -1)) {
319 | this.data = "success";
320 | } else if (response != null && response.indexOf("no") != -1) {
321 | this.data = "noAclRight";
322 | }
323 | }
324 | }
325 |
326 | if (this.callback != null && typeof(this.callback) === "function") {
327 | callback(this.cbSender, this.data, this.cb, this.cbS, this.imapFolder);
328 | }
329 | },
330 | onDataAvailable: function(request, context, inputStream, offset, count)
331 | {
332 | let inputData = instream.read(count);
333 |
334 | if (starttlsMode && inputData.indexOf("a001") == 0 && inputData.indexOf("OK") != -1) {
335 | transport.securityInfo.StartTLS();
336 | startedtlsMode = true;
337 | }
338 | this.data.push(inputData);
339 |
340 | if (index < protocolData.length && index > 0 && starttlsMode && !startedtlsMode) {
341 | window.alert("Could not establish TLS Connection");
342 | index = protocolData.length-1;
343 | }
344 |
345 | if (index < protocolData.length) {
346 | let outputData = protocolData[index++];
347 | outstream.write(outputData, outputData.length);
348 | }
349 | }
350 | };
351 |
352 | var pump = this.Cc["@mozilla.org/network/input-stream-pump;1"]
353 | .createInstance(this.Ci.nsIInputStreamPump);
354 |
355 | pump.init(stream, 0, 0, true);
356 | let thread = this.Cc["@mozilla.org/thread-manager;1"].getService().currentThread;
357 |
358 | var countdown = 0;
359 | while(starttlsMode && transport.securityInfo == null && countdown++ < this.COMMANDTIMEOUT) {
360 | thread.processNextEvent(true);
361 | window.dump("CONNECT waiting: " + countdown + "\n");
362 | }
363 |
364 | if (starttlsMode) {
365 | transport.securityInfo.QueryInterface(this.Ci.nsISSLSocketControl);
366 | //var secure = transport.securityInfo.QueryInterface(this.Ci.nsISSLSocketControl);
367 | //window.alert(ImapAclExt.Debug.var_dump(secure));
368 | }
369 |
370 |
371 | dataListener.callback = callback;
372 | dataListener.cbSender = cbSender;
373 | dataListener.cb = cb;
374 | dataListener.cbS = cbS;
375 | dataListener.imapFolder = imapFolder;
376 |
377 | pump.asyncRead(dataListener, this);
378 | }
379 | catch (ex) {
380 | result = ex;
381 | window.dump(ex);
382 | }
383 | return result;
384 | }
385 | };
386 | };
387 |
--------------------------------------------------------------------------------
/src/chrome/content/acls.js:
--------------------------------------------------------------------------------
1 | if ("undefined" == typeof(ImapAclExt)) {
2 | var ImapAclExt = {};
3 | };
4 | if ("undefined" == typeof(ImapAclExt.Aclist)) {
5 | ImapAclExt.Aclist = {
6 | Cc : Components.classes,
7 | Ci : Components.interfaces,
8 | _pref : null,
9 | _stringBundle : null,
10 | _userList : null,
11 | _rights : null,
12 | _doc : null,
13 |
14 | init : function() {
15 | this._stringBundle = document.getElementById("acls-bundle");
16 | this._pref = this.Cc['@mozilla.org/preferences-service;1']
17 | .getService(this.Ci.nsIPrefBranch);
18 | this._userList = document.getElementById("user_list");
19 | this._doc = document;
20 | this.buildList();
21 | },
22 |
23 | buildList : function() {
24 | document.getElementById("status_label").value = this._stringBundle.getString("loading");
25 |
26 | var imapFolder = window.arguments[0];
27 |
28 | if (imapFolder.onlineName.indexOf("\"") >= 0) {
29 | window.alert(this._stringBundle.getString("canthandleFolder"));
30 | document.getElementById("user_list_dialog").cancelDialog();
31 | }
32 |
33 | var folderDisplayName = imapFolder.server.rootFolder.name + ": " + imapFolder.onlineName;
34 | if (imapFolder.onlineName.length > 30) {
35 | folderDisplayName = imapFolder.server.rootFolder.name + ": " + imapFolder.onlineName.substr(0,30) + "...";
36 | }
37 | document.getElementById("foldername_label").value = folderDisplayName;
38 |
39 | ImapAclExt.Utils.check(imapFolder, this.buildAclListCB, this);
40 | },
41 |
42 | buildAclListCB : function(cbSender, rights) {
43 | cbSender._rights = rights;
44 |
45 | if (cbSender._rights == undefined) {
46 | cbSender._doc.getElementById("status_label").value = cbSender._stringBundle.getString("loadingFailed");
47 | } else {
48 | for (var i=0; i0;--i) {
83 | //window.dump("found: " + items[i].value + "\n");
84 | if (("Cname" in items[i]) && items[i].Cname == "aclRightsListItemName") {
85 | // window.dump("removed" + items[i].value + "\n");
86 | items[i].parentNode.removeChild(items[i]); //items[i].hidden = true;
87 | }
88 | }
89 | this.buildList();
90 | document.getElementById("status_label").value = this._stringBundle.getString("loadingDone");
91 | },
92 |
93 | click : function(event) {
94 | // we only care about button 0 (left click) double click events
95 | if (event.button != 0 || event.detail != 2 || event.originalTarget.localName != "listitem")
96 | return;
97 | this.change();
98 | },
99 |
100 | change : function() {
101 | var selected = this._userList.selectedIndex;
102 |
103 | if (selected == -1) {
104 | window.alert(this._stringBundle.getString("noEntry"));
105 | return;// "true";
106 | }
107 |
108 | var aclstring = new Object();
109 | var username = new Object();
110 |
111 | if (this._pref.getBoolPref("extensions.ImapAclExt.advMode")) {
112 | window.openDialog("chrome://imapaclext/content/changeAcl.xul", "changeAcl",
113 | "modal=yes,dialog=yes,centerscreen=yes,resizable=no,height=430,width=300",
114 | this._rights[selected], aclstring, username, window.arguments[0]);
115 | } else {
116 | window.openDialog("chrome://imapaclext/content/changeAcl.xul", "changeAcl",
117 | "modal=yes,dialog=yes,centerscreen=yes,resizable=no,height=180,width=300",
118 | this._rights[selected], aclstring, username, window.arguments[0]);
119 | }
120 |
121 | if (!("value" in aclstring) || aclstring.value != "Cancel") {
122 | this.refresh();
123 | }
124 |
125 | //useless, but avoids warning:
126 | //return true;
127 | },
128 |
129 | cnew : function() {
130 | var aclstring = new Object();
131 | var username = new Object();
132 |
133 | if (this._pref.getBoolPref("extensions.ImapAclExt.advMode")) {
134 | window.openDialog("chrome://imapaclext/content/changeAcl.xul", "changeAcl",
135 | "modal=yes,dialog=yes,centerscreen=yes,resizable=yes,height=430,width=300",
136 | -1, aclstring, username, window.arguments[0]);
137 | } else {
138 | window.openDialog("chrome://imapaclext/content/changeAcl.xul", "changeAcl",
139 | "modal=yes,dialog=yes,centerscreen=yes,resizable=yes,height=180,width=300",
140 | -1, aclstring, username, window.arguments[0]);
141 | }
142 |
143 | if (!("value" in aclstring) || aclstring.value != "Cancel") {
144 | this.refresh();
145 | }
146 | },
147 |
148 | del : function() {
149 | document.getElementById("status_label").value = this._stringBundle.getString("loading");
150 | var selected = this._userList.selectedIndex;
151 |
152 | if (selected == -1) {
153 | window.alert(this._stringBundle.getString("noEntry"));
154 | return "true";
155 | }
156 |
157 | var q = this._stringBundle.getString("delRights") + ": " +
158 | this._rights[selected].username + "?";
159 |
160 | var check = confirm(q);
161 | if (check == true) {
162 | ImapAclExt.Utils.delAcl(window.arguments[0], this._rights[selected].username,
163 | document.getElementById("recursion").checked, this.delCB, this);
164 | } else {
165 | document.getElementById("status_label").value = this._stringBundle.getString("loadingDone");
166 | }
167 |
168 | //useless, but avoids warning:
169 | return true;
170 | },
171 | delCB : function (cbSender, result) {
172 | if (result != "success") {
173 | if (result == "noAclRight") {
174 | alert(this._stringBundle.getString("noAclRight"));
175 | } else {
176 | alert(result);
177 | }
178 | }
179 | cbSender.refresh();
180 | cbSender._doc.getElementById("status_label").value = cbSender._stringBundle.getString("loadingDone");
181 | },
182 | cancel : function () {
183 | window.arguments[1].value = "Cancel";
184 | },
185 | onOverviewButtonCommand : function(aEvent) {
186 | window.openDialog("chrome://imapaclext/content/aclOverview.xul", "aclOverview", "modal=yes,dialog=yes,centerscreen=yes,resizable=yes");
187 | }
188 | };
189 | };
190 |
--------------------------------------------------------------------------------
/src/chrome/content/acls.xul:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
44 |
--------------------------------------------------------------------------------
/src/chrome/content/changeAcl.js:
--------------------------------------------------------------------------------
1 | if ("undefined" == typeof(ImapAclExt)) {
2 | var ImapAclExt = {};
3 | };
4 | if ("undefined" == typeof(ImapAclExt.ChangeAcl)) {
5 | ImapAclExt.ChangeAcl = {
6 | Cc : Components.classes,
7 | Ci : Components.interfaces,
8 | _pref : null,
9 | _stringBundle : null,
10 | _doc : null,
11 | _forceClose : false,
12 |
13 | init : function() {
14 | this._stringBundle = document.getElementById("changeAcl-bundle");
15 | this._pref = this.Cc['@mozilla.org/preferences-service;1']
16 | .getService(this.Ci.nsIPrefBranch);
17 | this._doc = document;
18 |
19 | this.toggleMode(this._pref.getBoolPref("extensions.ImapAclExt.advMode"));
20 |
21 | var usernameBox = document.getElementById("username_box");
22 | var selected = window.arguments[0];
23 |
24 | if (selected==-1)
25 | {
26 | document.title=this._stringBundle.getString("newUser");
27 | }
28 | else
29 | {
30 | document.title=this._stringBundle.getString("setRightsFor") + ": " + selected.username;
31 | usernameBox.value = selected.username;
32 | usernameBox.setAttribute("readonly", true);
33 | //usernameBox.disabled = "true";
34 |
35 | var uacl = selected.permissions;
36 |
37 | if(this._pref.getBoolPref("extensions.ImapAclExt.advMode")) {
38 | //Parse ACL-string
39 | var atom=uacl.indexOf("l");
40 | var check = document.getElementById("lacl");
41 | if (atom!=-1) {
42 | check.checked="true";
43 | }
44 |
45 | atom=uacl.indexOf("r");
46 | check = document.getElementById("racl");
47 | if (atom!=-1) {
48 | check.checked="true";
49 | }
50 |
51 | atom=uacl.indexOf("s");
52 | check = document.getElementById("sacl");
53 | if (atom!=-1) {
54 | check.checked="true";
55 | }
56 |
57 | atom=uacl.indexOf("w");
58 | check = document.getElementById("wacl");
59 | if (atom!=-1) {
60 | check.checked="true";
61 | }
62 |
63 | atom=uacl.indexOf("i");
64 | check = document.getElementById("iacl");
65 | if (atom!=-1) {
66 | check.checked="true";
67 | }
68 |
69 | atom=uacl.indexOf("p");
70 | check = document.getElementById("pacl");
71 | if (atom!=-1) {
72 | check.checked="true";
73 | }
74 |
75 | atom=uacl.indexOf("c");
76 | check = document.getElementById("cacl");
77 | if (atom!=-1) {
78 | check.checked="true";
79 | document.getElementById("kacl").checked = true;
80 | document.getElementById("xacl").checked = true;
81 | }
82 |
83 | atom=uacl.indexOf("d");
84 | check = document.getElementById("dacl");
85 | if (atom!=-1) {
86 | check.checked="true";
87 | document.getElementById("tacl").checked = true;
88 | document.getElementById("eacl").checked = true;
89 | }
90 |
91 | atom=uacl.indexOf("a");
92 | check = document.getElementById("aacl");
93 | if (atom!=-1) {
94 | check.checked="true";
95 | }
96 | } else {
97 | if (uacl.indexOf("l")!=-1 && uacl.indexOf("r")!=-1 &&
98 | uacl.indexOf("s")!=-1) {
99 | document.getElementById("readAcl").checked="true";
100 | }
101 |
102 | if (uacl.indexOf("l")!=-1 && uacl.indexOf("r")!=-1 &&
103 | uacl.indexOf("s")!=-1 && uacl.indexOf("w")!=-1 &&
104 | uacl.indexOf("i")!=-1) {
105 |
106 | document.getElementById("insertAcl").checked="true";
107 |
108 | }
109 |
110 | if (uacl.indexOf("l")!=-1 && uacl.indexOf("r")!=-1 &&
111 | uacl.indexOf("s")!=-1 && uacl.indexOf("w")!=-1 &&
112 | uacl.indexOf("i")!=-1 && uacl.indexOf("d")!=-1) {
113 |
114 | document.getElementById("deleteAacl").checked="true";
115 |
116 | }
117 | }
118 | }
119 | },
120 |
121 | change : function() {
122 | if (this._forceClose) {
123 | return true;
124 | }
125 |
126 | var usernameBox = document.getElementById("username_box");
127 | var username = usernameBox.value
128 | if (username == "" || username == null) {
129 | alert(this._stringBundle.getString("noUser"));
130 | return false;
131 | }
132 |
133 | var aclstring = "";
134 |
135 | if(this._pref.getBoolPref("extensions.ImapAclExt.advMode")) {
136 | var check = document.getElementById("lacl");
137 | if (check.checked == true) {
138 | aclstring+="l";
139 | }
140 |
141 | check = document.getElementById("racl");
142 | if (check.checked == true) {
143 | aclstring+="r";
144 | }
145 |
146 | check = document.getElementById("sacl");
147 | if (check.checked == true) {
148 | aclstring+="s";
149 | }
150 |
151 | check = document.getElementById("wacl");
152 | if (check.checked == true) {
153 | aclstring+="w";
154 | }
155 |
156 | check = document.getElementById("iacl");
157 | if (check.checked == true) {
158 | aclstring+="i";
159 | }
160 |
161 | check = document.getElementById("pacl");
162 | if (check.checked == true) {
163 | aclstring+="p";
164 | }
165 |
166 | check = document.getElementById("kacl");
167 | if (check.checked == true) {
168 | aclstring+="k";
169 | }
170 | check = document.getElementById("xacl");
171 | if (check.checked == true) {
172 | aclstring+="x";
173 | }
174 | check = document.getElementById("tacl");
175 | if (check.checked == true) {
176 | aclstring+="t";
177 | }
178 | check = document.getElementById("eacl");
179 | if (check.checked == true) {
180 | aclstring+="e";
181 | }
182 |
183 | check = document.getElementById("aacl");
184 | if (check.checked == true) {
185 | aclstring+="a";
186 | }
187 |
188 | check = document.getElementById("cacl");
189 | if (check.checked == true) {
190 | aclstring+="c";
191 | }
192 |
193 | check = document.getElementById("dacl");
194 | if (check.checked == true) {
195 | aclstring+="d";
196 | }
197 | } else {
198 | if (document.getElementById("deleteAacl").checked == true) {
199 | aclstring = "lrswid";
200 | }
201 | else if (document.getElementById("insertAcl").checked == true) {
202 | aclstring = "lrswi";
203 | }
204 | else if (document.getElementById("readAcl").checked == true) {
205 | aclstring = "lrs";
206 | }
207 | }
208 |
209 | if (aclstring == "") {
210 | alert(this._stringBundle.getString("noAcl"));
211 | return false;
212 | }
213 |
214 | var imapFolder = window.arguments[3];
215 | if (imapFolder.server.realUsername == username) {
216 | alert(this._stringBundle.getString("noSelfAcl"));
217 | //hello EVIL BUG!
218 | return false;
219 | }
220 |
221 | ImapAclExt.Utils.setAcl(imapFolder, username, aclstring,
222 | document.getElementById("recursion").checked, this.isChanged, this);
223 |
224 | return false;
225 | },
226 | isChanged : function (cbSender, result) {
227 |
228 | if (result != "success") {
229 | if (result == "noAclRight") {
230 | alert(this._stringBundle.getString("noAclRight"));
231 | } else {
232 | alert(result);
233 | }
234 |
235 | } else {
236 | cbSender._forceClose = true;
237 | cbSender._doc.getElementById("acl_dialog").acceptDialog();
238 | }
239 | },
240 | toggleDependency : function(checkBox){
241 | var id = checkBox.id;
242 | if (id == "kacl" && checkBox.checked == false) {
243 | document.getElementById("cacl").checked = false;
244 | } else if (id == "xacl" && checkBox.checked == false) {
245 | document.getElementById("cacl").checked = false;
246 | }
247 |
248 | if ((id == "kacl" || id == "xacl") &&
249 | document.getElementById("kacl").checked == true &&
250 | document.getElementById("xacl").checked == true) {
251 |
252 | document.getElementById("cacl").checked = true;
253 | } else if ((id == "tacl" || id == "eacl") &&
254 | document.getElementById("tacl").checked == true &&
255 | document.getElementById("eacl").checked == true) {
256 |
257 | document.getElementById("dacl").checked = true;
258 | }
259 |
260 | if (id == "tacl" && checkBox.checked == false) {
261 | document.getElementById("dacl").checked = false;
262 | } else if (id == "eacl" && checkBox.checked == false) {
263 | document.getElementById("dacl").checked = false;
264 | }
265 |
266 | if (id == "cacl" && checkBox.checked == false) {
267 | document.getElementById("kacl").checked = false;
268 | document.getElementById("xacl").checked = false;
269 | } else if (id == "cacl" && checkBox.checked == true) {
270 | document.getElementById("kacl").checked = true;
271 | document.getElementById("xacl").checked = true;
272 | }
273 |
274 | if (id == "dacl" && checkBox.checked == false) {
275 | document.getElementById("tacl").checked = false;
276 | document.getElementById("eacl").checked = false;
277 | } else if (id == "dacl" && checkBox.checked == true) {
278 | document.getElementById("tacl").checked = true;
279 | document.getElementById("eacl").checked = true;
280 | }
281 | },
282 |
283 | cancel : function(){
284 | window.arguments[1].value = "Cancel";
285 | return true;
286 | },
287 |
288 | toggleMode : function (advMode) {
289 | if (advMode) {
290 | document.getElementById("readAcl").hidden = true;
291 | document.getElementById("insertAcl").hidden = true;
292 | document.getElementById("deleteAacl").hidden = true;
293 | } else {
294 | document.getElementById("lacl").hidden = true;
295 | document.getElementById("racl").hidden = true;
296 | document.getElementById("sacl").hidden = true;
297 | document.getElementById("wacl").hidden = true;
298 | document.getElementById("iacl").hidden = true;
299 | document.getElementById("pacl").hidden = true;
300 | document.getElementById("kacl").hidden = true;
301 | document.getElementById("xacl").hidden = true;
302 | document.getElementById("tacl").hidden = true;
303 | document.getElementById("eacl").hidden = true;
304 | document.getElementById("aacl").hidden = true;
305 | document.getElementById("cacl").hidden = true;
306 | document.getElementById("dacl").hidden = true;
307 |
308 | }
309 | }
310 | };
311 | };
312 |
--------------------------------------------------------------------------------
/src/chrome/content/changeAcl.xul:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
51 |
--------------------------------------------------------------------------------
/src/chrome/content/debug.js:
--------------------------------------------------------------------------------
1 | if ("undefined" == typeof(ImapAclExt)) {
2 | var ImapAclExt = {};
3 | };
4 | if ("undefined" == typeof(ImapAclExt.Debug)) {
5 | ImapAclExt.Debug = {
6 | var_dump : function (x, max, sep, l) {
7 | l = l || 0;
8 | max = max || 10;
9 | sep = sep || ' ';
10 |
11 | if (l > max) {
12 | return "[WARNING: Too much recursion]\n";
13 | }
14 |
15 | var
16 | i,
17 | r = '',
18 | t = typeof x,
19 | tab = '';
20 |
21 | if (x === null) {
22 | r += "(null)\n";
23 | } else if (t == 'object') {
24 |
25 | l++;
26 |
27 | for (i = 0; i < l; i++) {
28 | tab += sep;
29 | }
30 |
31 | if (x && x.length) {
32 | t = 'array';
33 | }
34 |
35 | r += '(' + t + ") :\n";
36 |
37 | for (i in x) {
38 | try {
39 | r += tab + '[' + i + '] : ' + this.var_dump(x[i], max, sep, (l + 1));
40 | } catch(e) {
41 | return "[ERROR: " + e + "]\n";
42 | }
43 | }
44 |
45 | } else {
46 | if (t == 'string') {
47 | if (x == '') {
48 | x = '(empty)';
49 | }
50 | }
51 | r += '(' + t + ') ' + x + "\n";
52 | }
53 |
54 | return r;
55 |
56 | }
57 | };
58 | };
59 |
--------------------------------------------------------------------------------
/src/chrome/content/options.xul:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/chrome/content/overlay.js:
--------------------------------------------------------------------------------
1 | if ("undefined" == typeof(ImapAclExt)) {
2 | var ImapAclExt = {
3 | Cc : Components.classes,
4 | Ci : Components.interfaces,
5 | IAE_VERSION : "0.2.8",
6 | _stringBundle : null,
7 | _pref : null,
8 |
9 | /**
10 | * Initializes this object.
11 | */
12 | init : function() {
13 | this._stringBundle = document.getElementById("ImapAclExt-string-bundle");
14 | this._pref = this.Cc['@mozilla.org/preferences-service;1']
15 | .getService(this.Ci.nsIPrefBranch);
16 |
17 | this.startup();
18 | },
19 | onMenuItemCommand : function(aEvent) {
20 | this.showAclWindow(aEvent,null);
21 | },
22 | onToolbarButtonCommand : function(aEvent,folder) {
23 | this.showAclWindow(aEvent,folder);
24 | },
25 | onToolbarOverviewButtonCommand : function(aEvent) {
26 | window.openDialog("chrome://imapaclext/content/aclOverview.xul", "aclOverview", "modal=yes,dialog=yes,centerscreen=yes,resizable=yes");
27 | },
28 | showAclWindow : function(aEvent,folder) {
29 | var imapFolder = this.getCurrendFolder(folder);
30 |
31 | if (imapFolder != null) {
32 | if (imapFolder.getPermissionsForUser(imapFolder.server.realUsername).indexOf("a") != -1) {
33 | var raction = new Object();
34 | var ruser = new Object();
35 | var rrights = new Object();
36 |
37 | window.openDialog("chrome://imapaclext/content/acls.xul", "acls",
38 | "modal=yes,dialog=yes,centerscreen=yes,resizable=yes",
39 | imapFolder, raction, ruser, rrights);
40 |
41 |
42 | } else {
43 | window.alert(this._stringBundle.getString("noAclRight"));
44 | }
45 | }
46 | },
47 | getCurrendFolder : function(imapFolder) {
48 | if (imapFolder == null) {
49 | if (typeof(gFolderDisplay) != "undefined" && typeof(gFolderDisplay.displayedFolder) != "undefined"
50 | && gFolderDisplay.displayedFolder != null) {
51 | imapFolder = gFolderDisplay.displayedFolder.QueryInterface(
52 | this.Ci.nsIMsgImapMailFolder);
53 | if (!imapFolder.verifiedAsOnlineFolder) {
54 | window.alert(this._stringBundle.getString("noFolderSelected"));
55 | //window.alert("FOLDER OFFLINE");
56 | imapFolder = null;
57 | }
58 | }
59 | else {
60 | window.alert(this._stringBundle.getString("noFolderSelected"));
61 | imapFolder = null;
62 | }
63 | } else {
64 | imapFolder = imapFolder.QueryInterface(this.Ci.nsIMsgImapMailFolder);
65 | if (!imapFolder.verifiedAsOnlineFolder) {
66 | window.alert(this._stringBundle.getString("noFolderSelected"));
67 | //window.alert("FOLDER OFFLINE");
68 | imapFolder = null;
69 | }
70 | }
71 | var type = imapFolder.server.type;
72 |
73 | if (type != "imap") {
74 | window.alert(this._stringBundle.getString("Folder")+": " + imapFolder.onlineName +
75 | this._stringBundle.getString("noImapFolder"));
76 |
77 | imapFolder = null;
78 | }
79 |
80 | if (imapFolder.serverDoesntSupportACL) {
81 | window.alert(this._stringBundle.getString("noAclSupport"));
82 |
83 | imapFolder = null;
84 | }
85 | return imapFolder;
86 | },
87 | startup : function() {
88 | var addButton = false;
89 | try {
90 | var num = this._pref.getCharPref('extensions.ImapAclExt.version');
91 | if(num!=this.IAE_VERSION) {
92 | this._pref.setCharPref('extensions.ImapAclExt.version', this.IAE_VERSION);
93 | addButton = true;
94 | }
95 | }
96 | catch(e) {
97 | this._pref.setCharPref('extensions.ImapAclExt.version', this.IAE_VERSION);
98 | addButton = true;
99 | }
100 |
101 | if(addButton) {
102 | var toolbox = document.getElementById("mail-toolbox");
103 | var toolboxDocument = toolbox.ownerDocument;
104 |
105 | var iaeButtonIsPresent = false;
106 | for (var i = 0; i < toolbox.childNodes.length; ++i) {
107 | var toolbar = toolbox.childNodes[i];
108 | if (toolbar.localName == "toolbar" &&
109 | toolbar.getAttribute("customizable")=="true") {
110 | if(toolbar.currentSet.indexOf("button-iae")>-1)
111 | iaeButtonIsPresent = true;
112 | }
113 | }
114 |
115 | if(!iaeButtonIsPresent) {
116 | for (var i = 0; i < toolbox.childNodes.length; ++i) {
117 | toolbar = toolbox.childNodes[i];
118 | if (toolbar.localName == "toolbar" && toolbar.getAttribute("customizable")=="true" && toolbar.id=="mail-bar") {
119 |
120 | var newSet = "";
121 | var child = toolbar.firstChild;
122 | while(child) {
123 | if( !iaeButtonIsPresent && !child.nextSibling ) {
124 | newSet += "button-iae,";
125 | iaeButtonIsPresent = true;
126 | }
127 |
128 | newSet += child.id+",";
129 | child = child.nextSibling;
130 | }
131 |
132 | newSet = newSet.substring(0, newSet.length-1);
133 | toolbar.currentSet = newSet;
134 |
135 | toolbar.setAttribute("currentset", newSet);
136 | toolboxDocument.persist(toolbar.id, "currentset");
137 | MailToolboxCustomizeDone(true);
138 | break;
139 | }
140 | }
141 | }
142 | }
143 | }
144 | };
145 |
146 | /**
147 | * Constructor.
148 | */
149 | (function() {
150 | this.init();
151 | }).apply(ImapAclExt);
152 | };
153 |
154 | if ("undefined" == typeof(ImapAclExt.SharingButtonObserver)) {
155 | ImapAclExt.SharingButtonObserver = {
156 | myObs : null,
157 | callAddSharingButton : { notify: function(timer) { ImapAclExt.SharingButtonObserver.addSharingButton(); } },
158 | timer : null,
159 | addSharingButton : function () {
160 | var winEnum = ImapAclExt.Cc["@mozilla.org/appshell/window-mediator;1"]
161 | .getService(ImapAclExt.Ci.nsIWindowMediator).getXULWindowEnumerator(null);
162 | var win = null;
163 | while(winEnum.hasMoreElements()) {
164 | try {
165 | win = winEnum.getNext().QueryInterface(ImapAclExt.Ci.nsIXULWindow)
166 | .docShell.QueryInterface(ImapAclExt.Ci.nsIInterfaceRequestor)
167 | .getInterface(ImapAclExt.Ci.nsIDOMWindow);
168 |
169 | if(win.location == 'chrome://messenger/content/folderProps.xul') {
170 | var iaeshbutton = win.document.createElement('button');
171 | iaeshbutton.height = "25px";
172 | iaeshbutton.width = "150px";
173 | iaeshbutton.setAttribute("label", ImapAclExt._stringBundle.getString("setAcl"));
174 | win.ImapAclExtref = ImapAclExt;
175 | iaeshbutton.onclick = function(){ImapAclExt.onToolbarButtonCommand('onSharing',win.gMsgFolder)};
176 | //iaeshbutton.addEventListener("onclick", function(){alert("button");ImapAclExt.onToolbarButtonCommand('onSharing')});
177 | win.document.getElementById("imap.FolderPrivileges").parentNode
178 | .appendChild(iaeshbutton);
179 | //win.dump(iaeshbutton.label);
180 |
181 | break;
182 | }
183 | } catch(e){ alert(e); }
184 | }
185 | },
186 | observe: function(subject, topic, data) {
187 | var imapFolder = null;
188 |
189 | if (typeof(gFolderDisplay) != "undefined" && gFolderDisplay.displayedFolder != null) {
190 | imapFolder = gFolderDisplay.displayedFolder.QueryInterface(
191 | ImapAclExt.Ci.nsIMsgImapMailFolder);
192 | }
193 |
194 | if (imapFolder != null && imapFolder.server.type == "imap" &&
195 | !imapFolder.serverDoesntSupportACL) {
196 |
197 | this.timer.initWithCallback(this.callAddSharingButton, 1000,
198 | ImapAclExt.Ci.nsITimer.TYPE_ONE_SHOT);
199 | }
200 | },
201 | init : function() {
202 | this.timer = ImapAclExt.Cc["@mozilla.org/timer;1"].createInstance(ImapAclExt.Ci.nsITimer),
203 | this.myObs = ImapAclExt.Cc["@mozilla.org/observer-service;1"].
204 | getService(ImapAclExt.Ci.nsIObserverService);
205 | this.myObs.addObserver(this, "charsetmenu-selected", false);
206 | },
207 | unregister: function() {
208 | myObs.removeObserver(this, "charsetmenu-selected");
209 | }
210 | }
211 | };
212 |
213 | window.addEventListener("load", function() { ImapAclExt.init(); ImapAclExt.SharingButtonObserver.init(); }, true);
214 |
--------------------------------------------------------------------------------
/src/chrome/content/overlay.xul:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
9 |
10 |
11 |
12 |
20 |
21 |
31 |
32 |
33 |
34 |
35 |
41 |
42 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
--------------------------------------------------------------------------------
/src/chrome/locale/de-DE/about.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/chrome/locale/de-DE/acls.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/chrome/locale/de-DE/acls.properties:
--------------------------------------------------------------------------------
1 | noEntry=Kein Eintrag ausgewählt
2 | delRights=Rechte für Benutzer löschen
3 | noAclRight=Sie haben keine Berechtigung die Rechte für diesen Benutzer zu ändern!
4 | setRightsFor=Rechte setzen für
5 | canthandleFolder=Dieser Ordner enthält Sonderzeichen.\nSetzen von ACLs nicht möglich.
6 | loading=Lade…
7 | loadingDone=ACLs erfolgreich geladen
8 | loadingFailed=Laden der ACLs fehlgeschlagen!
9 | noImap=Kein Imap Account
10 | noConnect=Verbindung fehlgeschlagen
11 |
--------------------------------------------------------------------------------
/src/chrome/locale/de-DE/changeAcl.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/src/chrome/locale/de-DE/changeAcl.properties:
--------------------------------------------------------------------------------
1 | newUser=Neuer User
2 | setRightsFor=Rechte setzen für Benutzer
3 | noAcl=Keine Rechte ausgewählt
4 | noUser=Kein Benutzer ausgewählt
5 | noSelfAcl=Sie können sich nicht selbst modifizieren.
6 | noAclRight=Sie haben keine Berechtigung die Rechte für diesen Benutzer zu ändern!
7 |
--------------------------------------------------------------------------------
/src/chrome/locale/de-DE/options.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/chrome/locale/de-DE/overlay.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/chrome/locale/de-DE/overlay.properties:
--------------------------------------------------------------------------------
1 | noFolderSelected=Es wurde kein Ordner ausgewählt!
2 | Folder=Ordner
3 | noImapFolder= ist kein IMAP Ordner!
4 | noAclSupport=Server unterstützt keine ACLs!
5 | noAclRight=Sie haben keine Berechtigung die Rechte für diesen Ordner zu ändern!
6 | setAcl=Rechte setzen
7 | extensions.imap-acl@sirphreak.com.description=Imap ACL Addon
8 |
--------------------------------------------------------------------------------
/src/chrome/locale/en-US/about.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/chrome/locale/en-US/acls.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/chrome/locale/en-US/acls.properties:
--------------------------------------------------------------------------------
1 | noEntry=No entry selected
2 | delRights=Delete rights for user
3 | noAclRight=You have no permission to modify this user.
4 | setRightsFor=Set rights for
5 | canthandleFolder=This folder contains special characters\nCan't Handle this folder.
6 | loading=Loading…
7 | loadingDone=Successfully loaded ACLs
8 | loadingFailed=Loading of ACLs failed!
9 | noImap=No Imap Account
10 | noConnect=Can't connect
11 |
--------------------------------------------------------------------------------
/src/chrome/locale/en-US/changeAcl.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/chrome/locale/en-US/changeAcl.properties:
--------------------------------------------------------------------------------
1 | newUser=New User
2 | setRightsFor=Set rights for user
3 | noAcl=No ACL specified
4 | noUser=No username
5 | noSelfAcl=You can't change yourself.
6 | noAclRight=You have no permission to modify this user.
7 |
--------------------------------------------------------------------------------
/src/chrome/locale/en-US/options.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/chrome/locale/en-US/overlay.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/chrome/locale/en-US/overlay.properties:
--------------------------------------------------------------------------------
1 | noFolderSelected=No folder is selected!
2 | Folder=Folder
3 | noImapFolder= is not an imap folder!"
4 | noAclSupport=Server does not support ACLs!
5 | noAclRight=You have no permission to modify this Folder.
6 | setAcl=Set Permissions
7 | extensions.imap-acl@sirphreak.com.description=Imap ACL Extension
8 |
--------------------------------------------------------------------------------
/src/chrome/locale/fr-FR/about.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/chrome/locale/fr-FR/acls.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/chrome/locale/fr-FR/acls.properties:
--------------------------------------------------------------------------------
1 | noEntry=Aucune entrée sélectionnée
2 | delRights=Supprimer les droits pour l'utilisateur
3 | noAclRight=Vous n'avez pas les droits pour modifier ce utilisateur.
4 | setRightsFor=Set rights for
5 | canthandleFolder=This folder contains special characters\nCan't Handle this folder.
6 | loading=Loading…
7 | loadingDone=Successfully loaded ACLs
8 | loadingFailed=Loading of ACLs failed!
9 | noImap=No Imap Account
10 | noConnect=Can't connect
11 |
--------------------------------------------------------------------------------
/src/chrome/locale/fr-FR/changeAcl.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/chrome/locale/fr-FR/changeAcl.properties:
--------------------------------------------------------------------------------
1 | newUser=Nouvel utilisateur
2 | setRightsFor=Positionner les droits pour l'utilisateur
3 | noAcl=Aucune ACL spécifiée
4 | noUser=Aucun nom d'utilisateur
5 | noSelfAcl=Vous ne pouvez pas effectuer cette modification vous même.
6 | noAclRight=Vous n'avez pas les droits pour modifier ce utilisateur.
7 |
--------------------------------------------------------------------------------
/src/chrome/locale/fr-FR/options.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/chrome/locale/fr-FR/overlay.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/chrome/locale/fr-FR/overlay.properties:
--------------------------------------------------------------------------------
1 | noFolderSelected=Aucun dossier n'est sélectionné !
2 | Folder=Dossier
3 | noImapFolder= n'est pas un dossier IMAP !
4 | noAclSupport=Le serveur ne supporte pas les ACLs !
5 | noAclRight=Vous n'avez pas les droits pour modifier ce dossier.
6 | setAcl=Positionner les autorisations
7 | extensions.imap-acl@sirphreak.com.description=Imap ACL Extension
8 |
--------------------------------------------------------------------------------
/src/chrome/locale/pt-BR/about.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/src/chrome/locale/pt-BR/acls.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/src/chrome/locale/pt-BR/acls.properties:
--------------------------------------------------------------------------------
1 | noEntry=Sem entradas selecionadas
2 | delRights=Excluindo atributos para o usuário
3 | noAclRight=Voce não tem permissão para modificar este usuário.
4 | setRightsFor=Set rights for
5 | canthandleFolder=This folder contains special characters\nCan't Handle this folder.
6 | loading=Loading…
7 | loadingDone=Successfully loaded ACLs
8 | loadingFailed=Loading of ACLs failed!
9 | noImap=No Imap Account
10 | noConnect=Can't connect
11 |
--------------------------------------------------------------------------------
/src/chrome/locale/pt-BR/changeAcl.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
--------------------------------------------------------------------------------
/src/chrome/locale/pt-BR/changeAcl.properties:
--------------------------------------------------------------------------------
1 | newUser=Novo usuário
2 | setRightsFor=Definir atributos para o usuário
3 | noAcl=ACL não especificada
4 | noUser=Sem usuário
5 | noSelfAcl=Você não pode mudar a si mesmo.
6 | noAclRight=Você não tem permissão para modificar este usuário.
7 |
--------------------------------------------------------------------------------
/src/chrome/locale/pt-BR/options.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/chrome/locale/pt-BR/overlay.dtd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/src/chrome/locale/pt-BR/overlay.properties:
--------------------------------------------------------------------------------
1 | noFolderSelected=A pasta não está selecionada!
2 | Folder=Pasta
3 | noImapFolder= não é uma pasta!"
4 | noAclSupport=O servidor não suporta ACLs!
5 | noAclRight=Você não tem permissão para modificar esta pasta.
6 | setAcl=Definir permissões
7 | extensions.imap-acl@sirphreak.com.description=Extensão Imap ACL
8 |
--------------------------------------------------------------------------------
/src/chrome/skin/overlay.css:
--------------------------------------------------------------------------------
1 | @import url(chrome://global/skin/);
2 |
3 | #button-iae {
4 | list-style-image: url('chrome://imapaclext/skin/toolbar-button_24_t.png');
5 | -moz-image-region: rect(0px 24px 24px 0px);
6 | }
7 |
8 | #button-iae:hover {
9 | -moz-image-region: rect(24px 24px 48px 0px);
10 | }
11 |
12 | #button-iae[disabled='true'] {
13 | -moz-image-region: rect(48px 24px 72px 0px);
14 | }
15 |
16 | toolbar[iconsize='small'] #button-iae {
17 | list-style-image: url('chrome://imapaclext/skin/toolbar-button_16_t.png');
18 | -moz-image-region: rect(0px 16px 16px 0px);
19 | }
20 | toolbar[iconsize='small'] #button-iae:hover {
21 | -moz-image-region: rect(16px 16px 32px 0px);
22 | }
23 | toolbar[iconsize='small'] #button-iae[disabled='true'] {
24 | -moz-image-region: rect(32px 16px 48px 0px);
25 | }
26 |
27 | #button-iae-list {
28 | list-style-image: url('chrome://imapaclext/skin/toolbar-button_24_t_list.png');
29 | -moz-image-region: rect(0px 24px 24px 0px);
30 | }
31 |
32 | #button-iae-list:hover {
33 | -moz-image-region: rect(24px 24px 48px 0px);
34 | }
35 |
36 | #button-iae-list[disabled='true'] {
37 | -moz-image-region: rect(48px 24px 72px 0px);
38 | }
39 |
40 | toolbar[iconsize='small'] #button-iae-list {
41 | list-style-image: url('chrome://imapaclext/skin/toolbar-button_16_t_list.png');
42 | -moz-image-region: rect(0px 16px 16px 0px);
43 | }
44 | toolbar[iconsize='small'] #button-iae-list:hover {
45 | -moz-image-region: rect(16px 16px 32px 0px);
46 | }
47 | toolbar[iconsize='small'] #button-iae-list[disabled='true'] {
48 | -moz-image-region: rect(32px 16px 48px 0px);
49 | }
--------------------------------------------------------------------------------
/src/chrome/skin/toolbar-button_16_t.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasTor/imap-acl/abee56583a8433d9c8b6d2ea42bfad76890edecc/src/chrome/skin/toolbar-button_16_t.png
--------------------------------------------------------------------------------
/src/chrome/skin/toolbar-button_16_t_list.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasTor/imap-acl/abee56583a8433d9c8b6d2ea42bfad76890edecc/src/chrome/skin/toolbar-button_16_t_list.png
--------------------------------------------------------------------------------
/src/chrome/skin/toolbar-button_24_t.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasTor/imap-acl/abee56583a8433d9c8b6d2ea42bfad76890edecc/src/chrome/skin/toolbar-button_24_t.png
--------------------------------------------------------------------------------
/src/chrome/skin/toolbar-button_24_t_list.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dasTor/imap-acl/abee56583a8433d9c8b6d2ea42bfad76890edecc/src/chrome/skin/toolbar-button_24_t_list.png
--------------------------------------------------------------------------------
/src/defaults/preferences/prefs.js:
--------------------------------------------------------------------------------
1 | pref("extensions.ImapAclExt.sslWarn", false);
2 | pref("extensions.ImapAclExt.advMode", false);
3 | //N//pref("extensions.ImapAclExt.compatMode", false);
4 | pref("extensions.ImapAclExt.version", "0.0.0");
5 | // https://developer.mozilla.org/en/Localizing_extension_descriptions
6 | pref("extensions.imap-acl@sirphreak.com.description", "chrome://imapaclext/locale/overlay.properties");
7 |
--------------------------------------------------------------------------------
/src/install.rdf:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | imap-acl@sirphreak.com
5 | 2
6 | false
7 | Imap-ACL-Extension
8 | 0.2.8
9 | Daniel Stoye
10 |
11 | Extension to manage ACLs on Imap Servers
12 | chrome://imapaclext/content/about.xul
13 | chrome://imapaclext/content/options.xul
14 |
15 |
16 | {3550f703-e582-4d05-9a08-453d09bdfdc6}
17 | 57.0
18 | 60.*
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------