├── 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 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 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 | 11 | 12 |