├── .gitignore ├── LICENSE ├── README.md ├── script ├── Readme.md ├── config │ ├── compatibility.json │ ├── readme_central.json │ ├── readme_esr102.json │ ├── readme_esr115.json │ ├── readme_esr68.json │ ├── readme_esr78.json │ ├── readme_esr91.json │ └── revisions.json ├── package-lock.json ├── package.json └── update_policy_templates.js └── templates ├── central ├── README.md ├── mac │ ├── README.md │ └── org.mozilla.thunderbird.plist └── windows │ ├── de-DE │ ├── mozilla.adml │ └── thunderbird.adml │ ├── en-US │ ├── mozilla.adml │ └── thunderbird.adml │ ├── es-ES │ ├── mozilla.adml │ └── thunderbird.adml │ ├── fr-FR │ ├── mozilla.adml │ └── thunderbird.adml │ ├── it-IT │ ├── mozilla.adml │ └── thunderbird.adml │ ├── mozilla.admx │ ├── ru-RU │ ├── mozilla.adml │ └── thunderbird.adml │ ├── thunderbird.admx │ ├── zh-CN │ ├── mozilla.adml │ └── thunderbird.adml │ └── zh-TW │ ├── mozilla.adml │ └── thunderbird.adml ├── esr102 ├── README.md ├── mac │ ├── README.md │ └── org.mozilla.thunderbird.plist └── windows │ ├── de-DE │ └── thunderbird.adml │ ├── en-US │ └── thunderbird.adml │ ├── es-ES │ └── thunderbird.adml │ ├── fr-FR │ └── thunderbird.adml │ ├── it-IT │ └── thunderbird.adml │ ├── mozilla.admx │ ├── ru-RU │ └── thunderbird.adml │ ├── thunderbird.admx │ ├── zh-CN │ └── thunderbird.adml │ └── zh-TW │ └── thunderbird.adml ├── esr115 ├── README.md ├── mac │ ├── README.md │ └── org.mozilla.thunderbird.plist └── windows │ ├── de-DE │ └── thunderbird.adml │ ├── en-US │ └── thunderbird.adml │ ├── es-ES │ └── thunderbird.adml │ ├── fr-FR │ └── thunderbird.adml │ ├── it-IT │ └── thunderbird.adml │ ├── mozilla.admx │ ├── ru-RU │ └── thunderbird.adml │ ├── thunderbird.admx │ ├── zh-CN │ └── thunderbird.adml │ └── zh-TW │ └── thunderbird.adml ├── esr68 ├── README.md ├── mac │ ├── README.md │ └── org.mozilla.thunderbird.plist └── windows │ ├── de-DE │ ├── mozilla.adml │ └── thunderbird.adml │ ├── en-US │ ├── mozilla.adml │ └── thunderbird.adml │ ├── es-ES │ ├── mozilla.adml │ └── thunderbird.adml │ ├── fr-FR │ ├── mozilla.adml │ └── thunderbird.adml │ ├── it-IT │ ├── mozilla.adml │ └── thunderbird.adml │ ├── mozilla.admx │ ├── thunderbird.admx │ └── zh-TW │ ├── mozilla.adml │ └── thunderbird.adml ├── esr78 ├── README.md ├── mac │ ├── README.md │ └── org.mozilla.thunderbird.plist └── windows │ ├── de-DE │ ├── mozilla.adml │ └── thunderbird.adml │ ├── en-US │ ├── mozilla.adml │ └── thunderbird.adml │ ├── es-ES │ ├── mozilla.adml │ └── thunderbird.adml │ ├── fr-FR │ ├── mozilla.adml │ └── thunderbird.adml │ ├── it-IT │ ├── mozilla.adml │ └── thunderbird.adml │ ├── mozilla.admx │ ├── ru-RU │ ├── mozilla.adml │ └── thunderbird.adml │ ├── thunderbird.admx │ ├── zh-CN │ ├── mozilla.adml │ └── thunderbird.adml │ └── zh-TW │ ├── mozilla.adml │ └── thunderbird.adml └── esr91 ├── README.md ├── mac ├── README.md └── org.mozilla.thunderbird.plist └── windows ├── de-DE ├── mozilla.adml └── thunderbird.adml ├── en-US ├── mozilla.adml └── thunderbird.adml ├── es-ES ├── mozilla.adml └── thunderbird.adml ├── fr-FR ├── mozilla.adml └── thunderbird.adml ├── it-IT ├── mozilla.adml └── thunderbird.adml ├── mozilla.admx ├── ru-RU ├── mozilla.adml └── thunderbird.adml ├── thunderbird.admx ├── zh-CN ├── mozilla.adml └── thunderbird.adml └── zh-TW ├── mozilla.adml └── thunderbird.adml /.gitignore: -------------------------------------------------------------------------------- 1 | data 2 | node_modules -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Enterprise policy descriptions and templates for Thunderbird 2 | 3 | While the templates for the most recent version of Thunderbird will probably also work with older releases of Thunderbird, they may contain new policies which are not supported in older releases. We suggest to use the templates which correspond to the highest version of Thunderbird you are actually deploying. 4 | 5 | * [Thunderbird (active development)](templates/central) 6 | * [Thunderbird 115 (and older)](templates/esr115) (v5.9) 7 | * [Thunderbird 102 (and older)](templates/esr102) (v4.12) 8 | * [Thunderbird 91 (and older)](templates/esr91) (v3.1) 9 | * [Thunderbird 78 (and older)](templates/esr78) (v2.12) 10 | * [Thunderbird 68](templates/esr68) (v1.17) 11 | 12 |
13 | 14 | ## List of supported policies 15 | 16 | The following table states for each policy, when Thunderbird started to support it, or when it has been deprecated. It also includes all policies currently supported by Firefox, which are not supported by Thunderbird. 17 | 18 | 19 | | Policy/Property Name | supported since | deprecated after | 20 | |:--- | ---:| ---:| 21 | | `3rdparty` | 78.0 | | 22 | | `3rdparty_Extensions` | 78.0 | | 23 | | `3rdparty_Extensions_[name]` | 78.0 | | 24 | | *`AllowFileSelectionDialogs`* | | | 25 | | *`AllowedDomainsForApps`* | | | 26 | | `AppAutoUpdate` | 75.0 | | 27 | | `AppUpdatePin` | 104.0 | | 28 | | `AppUpdateURL` | 68.0 | | 29 | | `Authentication` | 78.0 | | 30 | | `Authentication_AllowNonFQDN` | 78.0 | | 31 | | `Authentication_AllowNonFQDN_NTLM` | 78.0 | | 32 | | `Authentication_AllowNonFQDN_SPNEGO` | 78.0 | | 33 | | `Authentication_AllowProxies` | 78.0 | | 34 | | `Authentication_AllowProxies_NTLM` | 78.0 | | 35 | | `Authentication_AllowProxies_SPNEGO` | 78.0 | | 36 | | `Authentication_Delegated` | 78.0 | | 37 | | `Authentication_Locked` | 78.0 | | 38 | | `Authentication_NTLM` | 78.0 | | 39 | | `Authentication_PrivateBrowsing` | 78.0 | | 40 | | `Authentication_SPNEGO` | 78.0 | | 41 | | *`AutoLaunchProtocolsFromOrigins`* | | | 42 | | *`AutofillAddressEnabled`* | | | 43 | | *`AutofillCreditCardEnabled`* | | | 44 | | `BackgroundAppUpdate` | 91.0 | | 45 | | `BlockAboutAddons` | 68.0 | | 46 | | `BlockAboutConfig` | 68.0 | | 47 | | `BlockAboutProfiles` | 68.0 | | 48 | | `BlockAboutSupport` | 68.0 | | 49 | | *`Bookmarks`* | | | 50 | | `CaptivePortal` | 78.0 | | 51 | | `Certificates` | 68.0 | | 52 | | `Certificates_ImportEnterpriseRoots` | 68.0 | | 53 | | `Certificates_Install` | 68.0 | | 54 | | *`Containers`* | | | 55 | | *`ContentAnalysis`* | | | 56 | | `Cookies` | 78.0 | | 57 | | `Cookies_AcceptThirdParty` | 78.0 | | 58 | | `Cookies_Allow` | 78.0 | | 59 | | *`Cookies_AllowSession`* | | | 60 | | *`Cookies_Behavior`* | | | 61 | | *`Cookies_BehaviorPrivateBrowsing`* | | | 62 | | `Cookies_Block` | 78.0 | | 63 | | `Cookies_Default` | 78.0 | | 64 | | `Cookies_ExpireAtSessionEnd` | 78.0 | | 65 | | `Cookies_Locked` | 78.0 | | 66 | | *`Cookies_RejectTracker`* | | | 67 | | `DNSOverHTTPS` | 91.0 | | 68 | | `DNSOverHTTPS_Enabled` | 91.0 | | 69 | | `DNSOverHTTPS_ExcludedDomains` | 91.0 | | 70 | | *`DNSOverHTTPS_Fallback`* | | | 71 | | `DNSOverHTTPS_Locked` | 91.0 | | 72 | | `DNSOverHTTPS_ProviderURL` | 91.0 | | 73 | | `DefaultDownloadDirectory` | 78.0 | | 74 | | *`DisableAccounts`* | | | 75 | | `DisableAppUpdate` | 68.0 | | 76 | | `DisableBuiltinPDFViewer` | 91.0 | | 77 | | *`DisableDefaultBrowserAgent`* | | | 78 | | `DisableDeveloperTools` | 68.0 | | 79 | | *`DisableEncryptedClientHello`* | | | 80 | | *`DisableFeedbackCommands`* | | | 81 | | *`DisableFirefoxAccounts`* | | | 82 | | *`DisableFirefoxScreenshots`* | | | 83 | | *`DisableFirefoxStudies`* | | | 84 | | *`DisableForgetButton`* | | | 85 | | *`DisableFormHistory`* | | | 86 | | `DisableMasterPasswordCreation` | 68.0 | | 87 | | `DisablePasswordReveal` | 78.0 | | 88 | | *`DisablePocket`* | | | 89 | | *`DisablePrivateBrowsing`* | | | 90 | | *`DisableProfileImport`* | | | 91 | | *`DisableProfileRefresh`* | | | 92 | | `DisableSafeMode` | 78.0 | | 93 | | `DisableSecurityBypass` | 68.0 | | 94 | | `DisableSecurityBypass_InvalidCertificate` | 68.0 | | 95 | | `DisableSecurityBypass_SafeBrowsing` | 68.0 | | 96 | | *`DisableSetDesktopBackground`* | | | 97 | | `DisableSystemAddonUpdate` | 77.0 | | 98 | | `DisableTelemetry` | 78.0 | | 99 | | *`DisableThirdPartyModuleBlocking`* | | | 100 | | `DisabledCiphers` | 76.0 | | 101 | | *`DisabledCiphers_TLS_AES_128_GCM_SHA256`* | | | 102 | | *`DisabledCiphers_TLS_AES_256_GCM_SHA384`* | | | 103 | | *`DisabledCiphers_TLS_CHACHA20_POLY1305_SHA256`* | | | 104 | | `DisabledCiphers_TLS_DHE_RSA_WITH_AES_128_CBC_SHA` | 76.0 | | 105 | | `DisabledCiphers_TLS_DHE_RSA_WITH_AES_256_CBC_SHA` | 76.0 | | 106 | | `DisabledCiphers_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA` | 102.0 | | 107 | | `DisabledCiphers_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256` | 76.0 | | 108 | | `DisabledCiphers_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA` | 102.0 | | 109 | | `DisabledCiphers_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384` | 102.0 | | 110 | | `DisabledCiphers_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256` | 102.0 | | 111 | | `DisabledCiphers_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA` | 76.0 | | 112 | | `DisabledCiphers_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256` | 76.0 | | 113 | | `DisabledCiphers_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA` | 76.0 | | 114 | | `DisabledCiphers_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384` | 102.0 | | 115 | | `DisabledCiphers_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256` | 102.0 | | 116 | | `DisabledCiphers_TLS_RSA_WITH_3DES_EDE_CBC_SHA` | 76.0 | | 117 | | `DisabledCiphers_TLS_RSA_WITH_AES_128_CBC_SHA` | 76.0 | | 118 | | `DisabledCiphers_TLS_RSA_WITH_AES_128_GCM_SHA256` | 91.0 | | 119 | | `DisabledCiphers_TLS_RSA_WITH_AES_256_CBC_SHA` | 76.0 | | 120 | | `DisabledCiphers_TLS_RSA_WITH_AES_256_GCM_SHA384` | 91.0 | | 121 | | *`DisplayBookmarksToolbar`* | | | 122 | | *`DisplayMenuBar`* | | | 123 | | *`DontCheckDefaultBrowser`* | | | 124 | | `DownloadDirectory` | 78.0 | | 125 | | *`EnableTrackingProtection`* | | | 126 | | *`EncryptedMediaExtensions`* | | | 127 | | *`ExemptDomainFileTypePairsFromFileTypeDownloadWarnings`* | | | 128 | | `ExtensionSettings` | 68.0 | | 129 | | `ExtensionSettings_*` | 78.10.3, 89.0 | | 130 | | `ExtensionSettings_*_allowed_types` | 78.10.3, 89.0 | | 131 | | `ExtensionSettings_*_blocked_install_message` | 78.10.3, 89.0 | | 132 | | `ExtensionSettings_*_install_sources` | 78.10.3, 89.0 | | 133 | | `ExtensionSettings_*_installation_mode` | 78.10.3, 89.0 | | 134 | | `ExtensionSettings_*_restricted_domains` | 78.10.3, 89.0 | | 135 | | *`ExtensionSettings_*_temporarily_allow_weak_signatures`* | | | 136 | | `ExtensionSettings_[name]` | 68.0 | | 137 | | `ExtensionSettings_[name]_blocked_install_message` | 68.0 | | 138 | | *`ExtensionSettings_[name]_default_area`* | | | 139 | | `ExtensionSettings_[name]_install_url` | 78.10.3, 89.0 | | 140 | | `ExtensionSettings_[name]_installation_mode` | 78.10.3, 89.0 | | 141 | | `ExtensionSettings_[name]_private_browsing` | 136.0 | | 142 | | *`ExtensionSettings_[name]_temporarily_allow_weak_signatures`* | | | 143 | | `ExtensionSettings_[name]_updates_disabled` | 91.0 | | 144 | | `ExtensionUpdate` | 68.0 | | 145 | | `Extensions` | 68.0 | | 146 | | `Extensions_Install` | 68.0 | | 147 | | `Extensions_Locked` | 68.0 | | 148 | | `Extensions_Uninstall` | 68.0 | | 149 | | *`FirefoxHome`* | | | 150 | | *`FirefoxSuggest`* | | | 151 | | *`GoToIntranetSiteForSingleWordEntryInAddressBar`* | | | 152 | | `Handlers` | 91.0 | | 153 | | `Handlers_(mimeTypes\|extensions\|schemes)` | 91.0 | | 154 | | `Handlers_(mimeTypes\|extensions\|schemes)_[name]` | 91.0 | | 155 | | `Handlers_(mimeTypes\|extensions\|schemes)_[name]_action` | 91.0 | | 156 | | `Handlers_(mimeTypes\|extensions\|schemes)_[name]_ask` | 91.0 | | 157 | | `Handlers_(mimeTypes\|extensions\|schemes)_[name]_handlers` | 91.0 | | 158 | | `HardwareAcceleration` | 78.0 | | 159 | | *`Homepage`* | | | 160 | | *`HttpAllowlist`* | | | 161 | | *`HttpsOnlyMode`* | | | 162 | | `InAppNotification` | 139.0 | | 163 | | `InAppNotification_Disabled` | 139.0 | | 164 | | `InAppNotification_DonationEnabled` | 139.0 | | 165 | | `InAppNotification_MessageEnabled` | 139.0 | | 166 | | `InAppNotification_SurveyEnabled` | 139.0 | | 167 | | `InstallAddonsPermission` | 68.0 | | 168 | | `InstallAddonsPermission_Allow` | 68.0 | | 169 | | `InstallAddonsPermission_Default` | 68.0 | | 170 | | *`LegacyProfiles`* | | | 171 | | *`LegacySameSiteCookieBehaviorEnabled`* | | | 172 | | *`LegacySameSiteCookieBehaviorEnabledForDomainList`* | | | 173 | | *`LocalFileLinks`* | | | 174 | | *`ManagedBookmarks`* | | | 175 | | `ManualAppUpdateOnly` | 91.0 | | 176 | | *`MicrosoftEntraSSO`* | | | 177 | | `NetworkPrediction` | 91.0 | | 178 | | *`NewTabPage`* | | | 179 | | *`NoDefaultBookmarks`* | | | 180 | | `OfferToSaveLogins` | 91.0 | | 181 | | `OfferToSaveLoginsDefault` | 91.0 | | 182 | | *`OverrideFirstRunPage`* | | | 183 | | *`OverridePostUpdatePage`* | | | 184 | | `PDFjs` | 91.0 | | 185 | | `PDFjs_EnablePermissions` | 91.0 | | 186 | | `PDFjs_Enabled` | 91.0 | | 187 | | `PasswordManagerEnabled` | 78.0 | | 188 | | *`PasswordManagerExceptions`* | | | 189 | | *`Permissions`* | | | 190 | | *`PictureInPicture`* | | | 191 | | *`PopupBlocking`* | | | 192 | | *`PostQuantumKeyAgreementEnabled`* | | | 193 | | `Preferences` | 68.0 | | 194 | | `Preferences_[name]` | 91.0 | | 195 | | `Preferences_[name]_Status` | 91.0 | | 196 | | *`Preferences_[name]_Type`* | | | 197 | | `Preferences_[name]_Value` | 91.0 | | 198 | | `Preferences_accessibility.force_disabled` | 78.0 | 89.0 | 199 | | `Preferences_browser.cache.disk.enable` | 78.0 | 89.0 | 200 | | `Preferences_browser.cache.disk.parent_directory` | 68.0 | 89.0 | 201 | | `Preferences_browser.fixup.dns_first_for_single_words` | 68.0 | 77.0 | 202 | | `Preferences_browser.safebrowsing.malware.enabled` | 78.0 | 89.0 | 203 | | `Preferences_browser.safebrowsing.phishing.enabled` | 78.0 | 89.0 | 204 | | `Preferences_browser.search.update` | 78.0 | 89.0 | 205 | | `Preferences_browser.urlbar.suggest.bookmark` | 68.0 | 77.0 | 206 | | `Preferences_browser.urlbar.suggest.history` | 68.0 | 77.0 | 207 | | `Preferences_browser.urlbar.suggest.openpage` | 68.0 | 77.0 | 208 | | `Preferences_datareporting.policy.dataSubmissionPolicyBypassNotification` | 78.0 | 89.0 | 209 | | `Preferences_dom.allow_scripts_to_close_windows` | 78.0 | 89.0 | 210 | | `Preferences_dom.disable_window_flip` | 78.0 | 89.0 | 211 | | `Preferences_dom.disable_window_move_resize` | 78.0 | 89.0 | 212 | | `Preferences_dom.event.contextmenu.enabled` | 78.0 | 89.0 | 213 | | `Preferences_dom.keyboardevent.keypress.hack.dispatch_non_printable_keys.addl` | 78.0 | 89.0 | 214 | | `Preferences_dom.keyboardevent.keypress.hack.use_legacy_keycode_and_charcode.addl` | 78.0 | 89.0 | 215 | | `Preferences_extensions.blocklist.enabled` | 78.0 | 89.0 | 216 | | `Preferences_geo.enabled` | 78.0 | 89.0 | 217 | | `Preferences_intl.accept_languages` | 78.0 | 89.0 | 218 | | `Preferences_network.IDN_show_punycode` | 68.0 | 89.0 | 219 | | `Preferences_network.dns.disableIPv6` | 78.0 | 89.0 | 220 | | `Preferences_places.history.enabled` | 78.0 | 89.0 | 221 | | `Preferences_print.save_print_settings` | 78.0 | 89.0 | 222 | | `Preferences_security.default_personal_cert` | 78.0 | 89.0 | 223 | | `Preferences_security.mixed_content.block_active_content` | 78.0 | 89.0 | 224 | | `Preferences_security.osclientcerts.autoload` | 78.0 | 89.0 | 225 | | `Preferences_security.ssl.errorReporting.enabled` | 78.0 | 89.0 | 226 | | `Preferences_security.tls.hello_downgrade_check` | 78.0 | 89.0 | 227 | | `Preferences_widget.content.gtk-theme-override` | 78.0 | 89.0 | 228 | | `PrimaryPassword` | 91.0 | | 229 | | *`PrintingEnabled`* | | | 230 | | *`PrivateBrowsingModeAvailability`* | | | 231 | | `PromptForDownloadLocation` | 78.0 | | 232 | | `Proxy` | 68.0 | | 233 | | `Proxy_AutoConfigURL` | 68.0 | | 234 | | `Proxy_AutoLogin` | 68.0 | | 235 | | `Proxy_FTPProxy` | 68.0 | | 236 | | `Proxy_HTTPProxy` | 68.0 | | 237 | | `Proxy_Locked` | 68.0 | | 238 | | `Proxy_Mode` | 68.0 | | 239 | | `Proxy_Passthrough` | 68.0 | | 240 | | `Proxy_SOCKSProxy` | 68.0 | | 241 | | `Proxy_SOCKSVersion` | 68.0 | | 242 | | `Proxy_SSLProxy` | 68.0 | | 243 | | `Proxy_UseHTTPProxyForAllProtocols` | 68.0 | | 244 | | `Proxy_UseProxyForDNS` | 68.0 | | 245 | | `RequestedLocales` | 68.0 | | 246 | | `SSLVersionMax` | 68.0 | | 247 | | `SSLVersionMin` | 68.0 | | 248 | | *`SanitizeOnShutdown`* | | | 249 | | *`SearchBar`* | | | 250 | | `SearchEngines` | 108.0 | | 251 | | `SearchEngines_Add` | 108.0 | | 252 | | `SearchEngines_Default` | 108.0 | | 253 | | `SearchEngines_DefaultPrivate` | 108.0 | | 254 | | `SearchEngines_PreventInstalls` | 108.0 | | 255 | | `SearchEngines_Remove` | 108.0 | | 256 | | *`SearchSuggestEnabled`* | | | 257 | | *`SecurityDevices`* | | | 258 | | *`ShowHomeButton`* | | | 259 | | *`StartDownloadsInTempDirectory`* | | | 260 | | *`SupportMenu`* | | | 261 | | *`TranslateEnabled`* | | | 262 | | *`UseSystemPrintDialog`* | | | 263 | | *`UserMessaging`* | | | 264 | | *`WebsiteFilter`* | | | 265 | | *`WindowsSSO`* | | | 266 | 267 | 268 | -------------------------------------------------------------------------------- /script/Readme.md: -------------------------------------------------------------------------------- 1 | update_policy_templates.js 2 | ========================== 3 | 4 | This script runs on the source trees `esr68`,`esr78`,`esr91`,`esr102`,`esr115` and `central`, and is doing the following for each: 5 | 6 | * Check for new revisions of the `policies-schema.json` file in `mozilla-${tree}` and report newly added policies, which Thunderbird might want to port. 7 | * Parse the `policies-schema.json` file in `comm-${tree}` to see what policies are supported by Thunderbird. 8 | * Build the README.md file for Thunderbird by parsing the corresponding mozilla template and removing whatever is not supported: 9 | - The upstream README.md file is parsed into `readme_${tree}.json` into an `upstream` property per policy, exposing all differences from the last time the script was run. 10 | - The `readme_${tree}.json` file also offers so set an `override` property per policy, to change the wording for Thunderbird. Setting the `override` property to `skip` will not add the policy to Thunderbird's documentation. 11 | - One can manually add entries (policies) to `readme_${tree}.json`, which do not exist upstream. 12 | 13 | * Check if all supported policies are actually mentioned in the generated readme. 14 | * Adds a detailed compatibility table to each policy section. 15 | * Clone the `firefox.admx` files as `thunderbird.admx` and remove whatever is not supported by Thunderbird. 16 | * Update the compatibility information in the `supportedOn` field of the ADMX files. 17 | * Create a list of unsupported firefox policies. 18 | * Adjust mac templates. 19 | 20 | This script is not yet doing the following: 21 | * generate the `thunderbird.admx` file directly from `policies-schema.json` (which means we cannot add our own policies yet) 22 | 23 | Running the script to check for new policies 24 | ============================================ 25 | 26 | Execute the script as follows: 27 | 28 | ``` 29 | npm install 30 | node update_policy_templates.js 31 | ``` 32 | 33 | The final output may include the following sections: 34 | 35 | ``` 36 | Mozilla has released a new policy revision for mozilla-central! 37 | Do those changes need to be ported to Thunderbird? 38 | - Mozilla added the following policies: [ 39 | 'DisabledCiphers_TLS_CHACHA20_POLY1305_SHA256', Not supported by central 40 | 'DisabledCiphers_TLS_AES_128_GCM_SHA256', Not supported by central 41 | 'DisabledCiphers_TLS_AES_256_GCM_SHA384', Not supported by central 42 | 'DisableEncryptedClientHello', Not supported by central 43 | 'ExtensionSettings_^.*$_private_browsing', 44 | 'HttpAllowlist', Not supported by central 45 | 'HttpsOnlyMode', Not supported by central 46 | 'MicrosoftEntraSSO', Not supported by central 47 | 'PostQuantumKeyAgreementEnabled', Not supported by central 48 | 'PrivateBrowsingModeAvailability', Not supported by central 49 | 'UserMessaging_SkipTermsOfUse', Not supported by central 50 | 'UserMessaging_FirefoxLabs', Not supported by central 51 | ] 52 | - Mozilla removed the following policies: [ 53 | 'ContentAnalysis_DefaultAllow' 54 | ] 55 | 56 | - Mozilla changed properties of the following policies: [ 57 | 'ContentAnalysis', 58 | 'DisabledCiphers', 59 | 'ExtensionSettings', 60 | 'UserMessaging' 61 | ] 62 | 63 | - currently acknowledged policy revision (b501a3a06e1c572ec1d9e7366828dae0f77c6aa2 / 126.0a1): 64 | /mnt/c/Users/John/Documents/GitHub/policy-templates-tb/script/data/schema/mozilla-central-b501a3a06e1c572ec1d9e7366828dae0f77c6aa2.json 65 | 66 | - latest available policy revision (fe6e070cd6b63ecd1f8ab30f12f6274e64210d66 / 138.0a1): 67 | /mnt/c/Users/John/Documents/GitHub/policy-templates-tb/script/data/schema/mozilla-central-fe6e070cd6b63ecd1f8ab30f12f6274e64210d66.json 68 | 69 | - hg change log for mozilla-central: 70 | https://hg-edge.mozilla.org/mozilla-central/log/tip/browser/components/enterprisepolicies/schemas/policies-schema.json 71 | 72 | Create bugs on Bugzilla for all policies which should be ported to Thunderbird and then check-in the updated ./revisions.json file to acknowledge the reported changes. Once the reported changes are acknowledged, they will not be reported again. 73 | 74 | Updating https://github.com/mozilla/policy-templates/ (master) 75 | --> WARNING: Supported policy not present in readme: InAppNotification 76 | ``` 77 | 78 | From this status report one can extract: 79 | * which policies where added by Firefox and are not yet supported by Thunderbird 80 | * which policies were removed 81 | * which policies were modified and may need to be updated for Thunderbird (including added or removed sub-policies) 82 | * which policies are supported by Thunderbird but not yet documented 83 | -------------------------------------------------------------------------------- /script/config/revisions.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "tree": "esr68", 4 | "mozillaReferencePolicyRevision": "1b0a29b456b432d1c8bef09c233b84205ec9e13c" 5 | }, 6 | { 7 | "tree": "esr78", 8 | "mozillaReferencePolicyRevision": "a8c4670b6ef144a0f3b6851c2a9d4bbd44fc032a" 9 | }, 10 | { 11 | "tree": "esr91", 12 | "mozillaReferencePolicyRevision": "9137f00be7b39e1174c62796fb64626bbf37a1d0" 13 | }, 14 | { 15 | "tree": "esr102", 16 | "mozillaReferencePolicyRevision": "656d54876405369eba969d43385aaca5511315a8" 17 | }, 18 | { 19 | "tree": "esr115", 20 | "mozillaReferencePolicyRevision": "3fc8d7913eb0fa7e3b39dc1fc3c88b936ecab3bb" 21 | }, 22 | { 23 | "tree": "central", 24 | "mozillaReferencePolicyRevision": "fe6e070cd6b63ecd1f8ab30f12f6274e64210d66" 25 | } 26 | ] -------------------------------------------------------------------------------- /script/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "bent": "^7.3.12", 4 | "cheerio": "^1.0.0-rc.10", 5 | "comment-json": "^4.1.1", 6 | "fs-extra": "^10.0.0", 7 | "isomorphic-git": "^1.10.1", 8 | "plist": "^3.0.4", 9 | "xml-js": "^1.6.11" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /script/update_policy_templates.js: -------------------------------------------------------------------------------- 1 | /** 2 | * See https://bugzilla.mozilla.org/show_bug.cgi?id=1732258 3 | */ 4 | 5 | // Debug logging (0 - errors and basic logs only, 1 - verbose debug) 6 | const DEBUG_LEVEL = 0; 7 | const DEBUG_SKIP_GITHUB_PULL = false; 8 | 9 | const build_dir = "../templates"; 10 | const state_dir = "./data/gitstate"; 11 | const schema_dir = "./data/schema"; 12 | const mozilla_template_dir = "./data/mozilla-policy-templates"; 13 | 14 | const main_readme = "../README.md"; 15 | const readme_json_path = "./config/readme_#tree#.json"; 16 | const compatibility_json_path = `./config/compatibility.json`; 17 | const revisions_json_write_path = "./config/revisions.json"; 18 | const revisions_json_read_path = `${state_dir}/script/config/revisions.json`; 19 | const HG_URL = `https://hg-edge.mozilla.org`; 20 | 21 | // Replacement for deprecated request. 22 | const bent = require('bent'); 23 | const bentGetTEXT = bent('GET', 'string', 200); 24 | 25 | const cheerio = require('cheerio'); 26 | const git = require("isomorphic-git"); 27 | const http = require('isomorphic-git/http/node'); 28 | const util = require('util'); 29 | const fs = require('fs-extra'); 30 | const path = require("path"); 31 | const plist = require('plist'); 32 | const convert = require('xml-js'); 33 | 34 | const { 35 | parse, 36 | stringify, 37 | assign 38 | } = require('comment-json'); 39 | 40 | var gCompatibilityData = {}; 41 | var gMainTemplateEntries = []; 42 | 43 | const gMainTemplate = `## Enterprise policy descriptions and templates for Thunderbird 44 | 45 | While the templates for the most recent version of Thunderbird will probably also work with older releases of Thunderbird, they may contain new policies which are not supported in older releases. We suggest to use the templates which correspond to the highest version of Thunderbird you are actually deploying. 46 | 47 | __list__ 48 | 49 |
50 | 51 | ## List of supported policies 52 | 53 | The following table states for each policy, when Thunderbird started to support it, or when it has been deprecated. It also includes all policies currently supported by Firefox, which are not supported by Thunderbird. 54 | 55 | __compatibility__ 56 | 57 | ` 58 | 59 | const gTreeTemplate = `## Enterprise policy descriptions and templates for __name__ 60 | 61 | __desc__ 62 | 63 |
64 | 65 | | Policy Name | Description 66 | |:--- |:--- | 67 | __list_of_policies__ 68 | 69 |
70 | 71 | __details__ 72 | 73 | `; 74 | 75 | function debug(...args) { 76 | if (DEBUG_LEVEL > 0) { 77 | console.debug(...args); 78 | } 79 | } 80 | 81 | function dump(data) { 82 | console.log(util.inspect(data, false, null)); 83 | } 84 | 85 | /** 86 | * bent based request variant with hard timeout on client side. 87 | * 88 | * @param {string} url - url to GET 89 | * @returns - text content 90 | */ 91 | async function request(url) { 92 | debug(" -> ", url); 93 | // Retry on error, using a hard timeout enforced from the client side. 94 | let rv; 95 | for (let i = 0; (!rv && i < 5); i++) { 96 | if (i > 0) { 97 | console.error("Retry", i); 98 | } 99 | // Rate limit the first request already, otherwise hg.mozilla.org will block us. 100 | await new Promise(resolve => setTimeout(resolve, 2500)); 101 | 102 | let killTimer; 103 | let killSwitch = new Promise((resolve, reject) => { killTimer = setTimeout(reject, 15000, "HardTimeout"); }) 104 | rv = await Promise 105 | .race([bentGetTEXT(url), killSwitch]) 106 | .catch(err => { 107 | console.error('Error in request', err); 108 | return null; 109 | }); 110 | 111 | // node will continue to "wait" after the script finished, if we do not 112 | // clear the timeouts. 113 | clearTimeout(killTimer); 114 | } 115 | return rv; 116 | } 117 | 118 | /** 119 | * Escape illegal chars from markdown code. 120 | * 121 | * @param {string} str - markdown code string 122 | * @returns - escaped string 123 | */ 124 | function escape_code_markdown(str) { 125 | let chars = [ 126 | "\\|", 127 | ]; 128 | for (let char of chars) { 129 | str = str.replace(new RegExp(char, 'g'), char); 130 | } 131 | return str; 132 | } 133 | 134 | /** 135 | * Compare version numbers, taken from https://jsfiddle.net/vanowm/p7uvtbor/. 136 | */ 137 | function compareVersion(a, b) { 138 | function prep(t) { 139 | return ("" + t) 140 | // Treat non-numerical characters as lower version. 141 | // Replacing them with a negative number based on charcode of first character. 142 | .replace(/[^0-9\.]+/g, function (c) { return "." + ((c = c.replace(/[\W_]+/, "")) ? c.toLowerCase().charCodeAt(0) - 65536 : "") + "." }) 143 | // Remove trailing "." and "0" if followed by non-numerical characters (1.0.0b). 144 | .replace(/(?:\.0+)*(\.-[0-9]+)(\.[0-9]+)?\.*$/g, "$1$2") 145 | .split('.'); 146 | } 147 | a = prep(a); 148 | b = prep(b); 149 | for (let i = 0; i < Math.max(a.length, b.length); i++) { 150 | // Convert to integer the most efficient way. 151 | a[i] = ~~a[i]; 152 | b[i] = ~~b[i]; 153 | if (a[i] > b[i]) 154 | return 1; 155 | else if (a[i] < b[i]) 156 | return -1; 157 | } 158 | return 0; 159 | } 160 | 161 | /** 162 | * Rebrand from Firefox to Thunderbird. 163 | * 164 | * @param {*} lines - string or array of strings which need to be rebranded 165 | * @returns - rebranded string (input array is joined by \n) 166 | */ 167 | function rebrand(lines) { 168 | if (!Array.isArray(lines)) 169 | lines = [lines.toString()]; 170 | 171 | const replacements = [ 172 | { 173 | reg: /\bFirefox\b/g, 174 | val: "Thunderbird", 175 | }, 176 | { 177 | reg: /\bfirefox\b/g, 178 | val: "thunderbird", 179 | }, 180 | { 181 | reg: /([\W_])FF(\d\d)/g, 182 | val: "\$1TB\$2", 183 | }, 184 | { 185 | reg: /\bAMO\b/g, 186 | val: "ATN", 187 | }, 188 | { 189 | reg: /addons.mozilla.org/g, 190 | val: "addons.thunderbird.net", 191 | }, 192 | { // Undo a wrong replace. 193 | reg: "https://support.mozilla.org/kb/setting-certificate-authorities-thunderbird", 194 | val: "https://support.mozilla.org/kb/setting-certificate-authorities-firefox" 195 | }, 196 | { // Undo a wrong replace. 197 | reg: "https://support.mozilla.org/en-US/kb/dom-events-changes-introduced-thunderbird-66", 198 | val: "https://support.mozilla.org/en-US/kb/dom-events-changes-introduced-firefox-66" 199 | } 200 | ] 201 | 202 | for (let i = 0; i < lines.length; i++) { 203 | for (let r of replacements) { 204 | lines[i] = lines[i].replace(r.reg, r.val); 205 | } 206 | } 207 | 208 | return lines.join("\n"); 209 | } 210 | 211 | // ----------------------------------------------------------------------------- 212 | 213 | /** 214 | * Clone or pull a github repository. 215 | * 216 | * @param {string} url - url to the repository 217 | * @param {string} ref - branch/tag to checkout, "master" or "v3.0" 218 | * @param {string} dir - directory to store templates in 219 | */ 220 | async function pullGitRepository(url, ref, dir) { 221 | if (DEBUG_SKIP_GITHUB_PULL) 222 | return; 223 | 224 | if (!fs.existsSync(dir)) { 225 | console.log(`Cloning ${url} (${ref})`); 226 | fs.ensureDirSync(dir); 227 | await git.clone({ 228 | // Use name of the script as the name of the pulling "author". 229 | author: { name: "update_policy_template.js" }, 230 | fs, 231 | http, 232 | dir, 233 | url, 234 | ref, 235 | singleBranch: true, 236 | depth: 10, 237 | force: true 238 | }); 239 | } else { 240 | console.log(`Updating ${url} (${ref})`); 241 | await git.pull({ 242 | // Use name of the script as the name of the pulling "author". 243 | author: { name: "update_policy_template.js" }, 244 | fs, 245 | http, 246 | dir, 247 | ref, 248 | singleBranch: true, 249 | force: true 250 | }); 251 | } 252 | } 253 | 254 | /** 255 | * Parse the README files of a given mozilla policy template. 256 | * 257 | * @param {string} tree - "central" or "esr91" 258 | * @return - parsed data from readme.json, updated with upstream changes 259 | */ 260 | async function parseMozillaPolicyTemplate(tree) { 261 | let readme_file_name = readme_json_path.replace("#tree#", tree); 262 | let readmeData = fs.existsSync(readme_file_name) 263 | ? parse(fs.readFileSync(readme_file_name).toString()) 264 | : {}; 265 | 266 | if (!readmeData) readmeData = {}; 267 | if (!readmeData.headers) readmeData.headers = {}; 268 | if (!readmeData.policies) readmeData.policies = {}; 269 | 270 | let ref = readmeData.mozillaReferenceTemplates; 271 | let dir = `${mozilla_template_dir}/${ref}`; 272 | await pullGitRepository("https://github.com/mozilla/policy-templates/", ref, dir); 273 | 274 | // Later revisions moved the file. 275 | let paths = [`${dir}/docs/index.md`, `${dir}/README.md`]; 276 | 277 | // This parsing highly depends on the structure of the README and needs to be 278 | // adjusted when its layout is changing. In the intro section we have lines like 279 | // | **[`3rdparty`](#3rdparty)** | 280 | // Detailed descriptions are below level 3 headings (###) with potential subsections. 281 | 282 | // Split on ### heading to get chunks of policy descriptions. 283 | let file; 284 | for (let path of paths) { 285 | try { 286 | file = fs.readFileSync(path, 'utf8').toString(); 287 | break; 288 | } catch { 289 | } 290 | } 291 | if (!file) { 292 | throw new Error(`Did not find mozilla policy template for ${tree}, ${rev}`) 293 | } 294 | let data = file.split("\n### "); 295 | 296 | // Shift out the header and process it. 297 | for (let h of data.shift().split("\n").filter(e => e.startsWith("| **[`"))) { 298 | let name = h 299 | .match(/\*\*\[(.*?)\]/)[1] // extract name from the markdown link 300 | .replace(/`/g, "") // unable to fix the regex to exclude those 301 | .replace(" -> ", "_"); // flat hierarchy 302 | 303 | if (!readmeData.headers[name]) { 304 | readmeData.headers[name] = { upstream: h }; 305 | } else if (!readmeData.headers[name].upstream || readmeData.headers[name].upstream != h) { 306 | readmeData.headers[name].upstream = h; 307 | } 308 | } 309 | 310 | // Process policies. 311 | for (let p of data) { 312 | let lines = p.split("\n"); 313 | let name = lines[0]; 314 | lines[0] = `## ${name}`; 315 | 316 | name = name.replace(" | ", "_"); // flat hierarchy 317 | if (!readmeData.policies[name]) { 318 | readmeData.policies[name] = { upstream: lines }; 319 | } else if (!readmeData.policies[name].upstream || stringify(readmeData.policies[name].upstream) != stringify(lines)) { 320 | readmeData.policies[name].upstream = lines; 321 | } 322 | } 323 | 324 | // Process MacOS readme. 325 | let mac = fs.readFileSync(`${dir}/mac/README.md`, 'utf8').toString().split("\n"); 326 | 327 | if (!readmeData.macReadme) { 328 | readmeData.macReadme = { upstream: mac }; 329 | } else if (!readmeData.macReadme.upstream || stringify(readmeData.macReadme.upstream) != stringify(mac)) { 330 | readmeData.macReadme.upstream = mac; 331 | } 332 | 333 | fs.writeFileSync(readme_file_name, stringify(readmeData, null, 2)); 334 | return readmeData; 335 | } 336 | 337 | function getPolicySchemaFilename(branch, tree, ref) { 338 | return `${schema_dir}/${branch}-${tree}-${ref}.json`; 339 | } 340 | 341 | /** 342 | * Download a specific policies-schema.json file. 343 | * 344 | * @param {string} branch - "mozilla" or "comm" 345 | * @param {string} tree - "central" or "esr91" 346 | * @param {string} revision 347 | * 348 | * @returns - a file json object 349 | */ 350 | async function downloadPolicySchemaFile(branch, tree, revision) { 351 | let path = tree == "central" ? `${branch}-${tree}` : `releases/${branch}-${tree}` 352 | let folder = branch == "mozilla" ? "browser" : "mail" 353 | let url = `${HG_URL}/${path}/raw-file/${revision}/${folder}/components/enterprisepolicies/schemas/policies-schema.json` 354 | 355 | console.log(`Downloading ${url}`); 356 | let file = parse(await request(url)); 357 | let version = (await request(`${HG_URL}/${path}/raw-file/${revision}/${folder}/config/version.txt`)).trim(); 358 | file.version = version; 359 | file.revision = revision; 360 | fs.writeFileSync(getPolicySchemaFilename(branch, tree, revision), stringify(file, null, 2)); 361 | return file; 362 | } 363 | 364 | /** 365 | * Download missing revisions of the policies-schema.json for the given tree. 366 | * 367 | * @param {string} tree - "central" or "esr91" 368 | * @param {string} mozillaReferencePolicyRevision - the hg revision of the last 369 | * known mozilla version of their policies.json 370 | * 371 | * @returns - a data object for comm and mozilla 372 | */ 373 | async function downloadPolicySchemaFiles(tree, mozillaReferencePolicyRevision) { 374 | let data = { 375 | comm: { 376 | hgLogUrl: "", 377 | revisions: [] 378 | }, 379 | mozilla: { 380 | hgLogUrl: "", 381 | revisions: [] 382 | }, 383 | }; 384 | 385 | console.log(`Processing ${tree}`); 386 | fs.ensureDirSync(schema_dir); 387 | 388 | for (let branch of ["mozilla", "comm"]) { 389 | let folder = branch == "mozilla" ? "browser" : "mail" 390 | let path = tree == "central" ? `${branch}-${tree}` : `releases/${branch}-${tree}` 391 | 392 | console.log(`Checking policies-schema.json revisions for ${path}`); 393 | data[branch].hgLogUrl = `${HG_URL}/${path}/log/tip/${folder}/components/enterprisepolicies/schemas/policies-schema.json`; 394 | let hgLog = await request(data[branch].hgLogUrl); 395 | const $ = cheerio.load(hgLog); 396 | 397 | // Get the revision identifier from the table cell (TODO: switch to github tree instead of parsing html). 398 | let revisions = [...$("body > table > tbody > tr > td:nth-child(2)")].map(element => element.children[0].data.trim()); 399 | 400 | // For mozilla, we just need the newest and the reference revision. 401 | // For comm, we need all revisions to be able to extract compatibility information. 402 | let neededRevisions = branch == "mozilla" 403 | ? [revisions[0], mozillaReferencePolicyRevision] 404 | : revisions.slice(0, 30) 405 | 406 | 407 | for (let revision of neededRevisions) { 408 | let filename = getPolicySchemaFilename(branch, tree, revision); 409 | let file; 410 | if (!fs.existsSync(filename)) { 411 | file = await downloadPolicySchemaFile(branch, tree, revision); 412 | } else { 413 | file = parse(fs.readFileSync(filename).toString()); 414 | 415 | } 416 | data[branch].revisions.push(file); 417 | } 418 | } 419 | return data; 420 | } 421 | 422 | /** 423 | * Extract flat policy names from a schema file. 424 | * 425 | * @param {object} data - Object returned by downloadPolicySchemaFiles 426 | */ 427 | function extractFlatPolicyNamesFromPolicySchema(data) { 428 | let properties = []; 429 | for (let key of ["properties", "patternProperties"]) { 430 | if (data[key]) { 431 | for (let [name, entry] of Object.entries(data[key])) { 432 | properties.push(name) 433 | let subs = extractFlatPolicyNamesFromPolicySchema(entry); 434 | if (subs.length > 0) properties.push(...subs.map(e => `${name}_${e}`)) 435 | } 436 | } 437 | } 438 | return properties; 439 | } 440 | 441 | 442 | /** 443 | * Extract compatibility information. 444 | */ 445 | function extractCompatibilityInformation(data, tree) { 446 | let absolute_max = 0; 447 | for (let revision of data.comm.revisions) { 448 | let policies = extractFlatPolicyNamesFromPolicySchema(revision); 449 | if (compareVersion(revision.version, absolute_max) > 0) { 450 | absolute_max = revision.version; 451 | } 452 | 453 | for (let raw_policy of policies) { 454 | let policy = raw_policy.trim().replace(/'/g, ""); 455 | if (!gCompatibilityData[policy]) { 456 | gCompatibilityData[policy] = {}; 457 | } 458 | if (!gCompatibilityData[policy][tree]) { 459 | gCompatibilityData[policy][tree] = {}; 460 | } 461 | let min = gCompatibilityData[policy][tree].min || 10000; 462 | let max = gCompatibilityData[policy][tree].max || 0; 463 | 464 | if (compareVersion(revision.version, min) < 0) 465 | gCompatibilityData[policy][tree].min = revision.version; 466 | if (compareVersion(revision.version, max) > 0) 467 | gCompatibilityData[policy][tree].max = revision.version; 468 | } 469 | } 470 | for (let policy of Object.keys(gCompatibilityData)) { 471 | if (gCompatibilityData[policy][tree].max == absolute_max) 472 | delete gCompatibilityData[policy][tree].max; 473 | } 474 | 475 | if (tree == "central") { 476 | let policies = extractFlatPolicyNamesFromPolicySchema(data.mozilla.revisions[0]); 477 | for (let raw_policy of policies) { 478 | let policy = raw_policy.trim().replace(/'/g, ""); 479 | if (!gCompatibilityData[policy]) { 480 | gCompatibilityData[policy] = { 481 | unsupported: true 482 | }; 483 | } 484 | } 485 | } 486 | } 487 | 488 | /** 489 | * Check for changes in the policy schema files between two revisions. 490 | * 491 | * @param {object} data - Object returned by downloadPolicySchemaFiles 492 | */ 493 | function checkPolicySchemaChanges(file1, file2) { 494 | if (!file1?.properties || !file2?.properties) 495 | return; 496 | 497 | let keys1 = extractFlatPolicyNamesFromPolicySchema(file1); 498 | let keys2 = extractFlatPolicyNamesFromPolicySchema(file2); 499 | 500 | let added = keys2.filter(e => !keys1.includes(e)); 501 | let removed = keys1.filter(e => !keys2.includes(e)); 502 | 503 | let changed = keys2.filter(e => keys1.includes(e) && JSON.stringify(file2.properties[e]) != JSON.stringify(file1.properties[e])); 504 | 505 | return { added, removed, changed } 506 | } 507 | 508 | // ----------------------------------------------------------------------------- 509 | 510 | function getCompatibilityInformation(distinct, tree, policy) { 511 | // Get all entries found in gCompatibilityData which are related to policy. 512 | let entries = policy 513 | ? Object.keys(gCompatibilityData).filter(k => k == policy || k.startsWith(policy + "_")) 514 | : Object.keys(gCompatibilityData) 515 | 516 | // Group filtered entries by identical compat data. 517 | let compatInfo = []; 518 | for (let entry of entries) { 519 | // Skip unsupported policy properties, if the root policy itself is not supported as well. 520 | let root = entry.split("_").shift(); 521 | if (root != entry && gCompatibilityData[entry].unsupported && gCompatibilityData[root].unsupported) continue; 522 | 523 | // Generate the compatibility information. Primary information is the one from this tree, 524 | // but if it was backported to one version prior (92.0a1 -> 91.0) only list the backported one. 525 | let first = ""; 526 | let last = ""; 527 | let firstLong = ""; 528 | let lastLong = ""; 529 | if (gCompatibilityData[entry][tree]) { 530 | if (gCompatibilityData[entry][tree].min) { 531 | let added = gCompatibilityData[entry][tree].min.replace(".0a1", ".0"); 532 | let added_parts = added.split("."); 533 | let backported = Object.keys(gCompatibilityData[entry]) 534 | .filter(e => e != tree) 535 | .filter(e => gCompatibilityData[entry][e].min != gCompatibilityData[entry][tree].min) 536 | .map(e => gCompatibilityData[entry][e].min) 537 | .pop(); 538 | 539 | if (backported 540 | && added_parts.length == 2 541 | && added_parts[1] == "0" 542 | && `${parseInt(added_parts[0], 10) - 1}.0` == backported 543 | ) { 544 | firstLong = `Thunderbird ${backported}`; 545 | first = `${backported}`; 546 | } else if (backported) { 547 | firstLong = `Thunderbird ${added}
(Thunderbird ${backported})`; 548 | first = `${backported}, ${added}`; 549 | } else { 550 | firstLong = `Thunderbird ${added}`; 551 | first = `${added}`; 552 | } 553 | } 554 | last = (gCompatibilityData[entry][tree].max || "").replace(".0a1", ".0"); 555 | lastLong = `Thunderbird ${last}`; 556 | } 557 | 558 | let key = `${first} - ${last}`; 559 | let distinctEntry = compatInfo.find(e => e.key == key); 560 | if (!distinct || !distinctEntry) { 561 | compatInfo.push({ 562 | key, 563 | first, 564 | last, 565 | firstLong, 566 | lastLong, 567 | policies: [entry], 568 | }) 569 | } else { 570 | distinctEntry.policies.push(entry); 571 | } 572 | } 573 | return compatInfo; 574 | } 575 | 576 | /** 577 | * Generate the compatibility table. 578 | * 579 | * @param {*} compatInfo - data structure returned by getCompatibilityInformation 580 | * @returns - generated compatibility table 581 | */ 582 | function buildCompatibilityTable(compatInfo) { 583 | let details = []; 584 | 585 | const humanReadableEntry = entry => { 586 | return "`" + escape_code_markdown(entry 587 | .replace("^.*$", "[name]") 588 | .replace("^(", "(") 589 | .replace(")$", ")")) + "`"; 590 | } 591 | 592 | details.push("", "| Policy/Property Name | supported since | deprecated after |", "|:--- | ---:| ---:|"); 593 | for (let entry of compatInfo) { 594 | let format = entry.first ? "" : "*"; 595 | details.push(`| ${format}${entry.policies.map(humanReadableEntry).join("
")}${format} | ${entry.first} | ${entry.last} |`); 596 | } 597 | details.push(""); 598 | return details; 599 | } 600 | 601 | /** 602 | * Build the Windows ADMX/ADML files. 603 | */ 604 | async function buildAdmxFiles(tree, template, thunderbirdPolicies, output_dir) { 605 | function getNameFromKey(key) { 606 | const key_prefix = "Software\\Policies\\Mozilla\\Thunderbird\\"; 607 | const key_prefix_length = key_prefix.length; 608 | if (key && key.length > key_prefix_length) { 609 | return key.substring(key_prefix_length).split("\\").join("_"); 610 | } 611 | } 612 | function getThunderbirdPolicy(policy, element) { 613 | let parts = []; 614 | let name = getNameFromKey(policy?.attributes?.key); 615 | if (name) { 616 | parts.push(name); 617 | } 618 | 619 | if (policy?.attributes?.valueName) { 620 | parts.push(policy.attributes.valueName); 621 | } 622 | 623 | if (element) { 624 | if (element?.attributes?.key) parts = [getNameFromKey(element.attributes.key)]; 625 | else if (element?.attributes?.valueName) parts.push(element.attributes.valueName); 626 | } 627 | let flat_policy_name = parts.join("_"); 628 | if (thunderbirdPolicies.includes(flat_policy_name)) { 629 | return flat_policy_name; 630 | } 631 | return false; 632 | } 633 | 634 | // Read ADMX files - https://www.npmjs.com/package/xml-js 635 | let admx_file = fs.readFileSync(`${mozilla_template_dir}/${template.mozillaReferenceTemplates}/windows/firefox.admx`); 636 | let admx_obj = convert.xml2js( 637 | rebrand(admx_file).replace(/">">/g, '">'), // issue https://github.com/mozilla/policy-templates/issues/801 638 | { compact: false } 639 | ); 640 | 641 | let admxPolicies = admx_obj 642 | .elements.find(e => e.name == "policyDefinitions") 643 | .elements.find(e => e.name == "policies") 644 | .elements; 645 | let distinctCompatInfo = getCompatibilityInformation(/* distinct */ true, tree); 646 | let used_supported_on = {}; 647 | 648 | for (let policy of admxPolicies) { 649 | // Identify unsupported policies (remember, we work with flattened policy_property names here). 650 | // A single ADMX policy entry can include multiple elements, we need to check those individually. 651 | let compatInfo = []; 652 | 653 | let flat_policy_name = getThunderbirdPolicy(policy); 654 | if (!flat_policy_name) { 655 | policy.unsupported = true 656 | } 657 | 658 | if (policy.elements && policy.elements.find(e => e.name == "elements") && Array.isArray(policy.elements.find(e => e.name == "elements").elements)) { 659 | // The elements member is a structure from the xml parser, we need the elements object of 660 | // the elements obj with name elements here. 661 | let elements = policy.elements.find(e => e.name == "elements").elements.filter(e => !!getThunderbirdPolicy(policy, e)); 662 | if (elements.length == 0) { 663 | delete policy.elements.find(e => e.name == "elements").elements; 664 | policy.unsupported = true; 665 | } else { 666 | delete policy.unsupported; 667 | compatInfo.push(...elements.map(e => distinctCompatInfo.findIndex(i => i.policies.includes(getThunderbirdPolicy(policy, e))))); 668 | } 669 | } else { 670 | compatInfo.push(distinctCompatInfo.findIndex(e => e.policies.includes(flat_policy_name))); 671 | } 672 | 673 | // Adjust supportedOn. 674 | // A single policy entry can contain multiple policy elements which potentially could have a different compat setting. 675 | // Todo: Check wether all members of policy.compatInfo are identical. 676 | let compatInfoIndex = compatInfo.length > 0 677 | ? compatInfo[0] 678 | : -1 679 | 680 | if (compatInfoIndex != -1) { 681 | let name = `SUPPORTED_ID_${compatInfoIndex}`; 682 | policy.elements.find(e => e.name == "supportedOn").attributes.ref = name; 683 | 684 | if (!used_supported_on[name]) { 685 | used_supported_on[name] = { 686 | admx: { 687 | type: 'element', 688 | name: 'definition', 689 | attributes: { name, displayName: `$(string.${name})` }, 690 | }, 691 | adml: { 692 | type: 'element', 693 | name: 'string', 694 | attributes: { id: name }, 695 | elements: [{ type: 'text', text: `${distinctCompatInfo[compatInfoIndex].firstLong} - ${distinctCompatInfo[compatInfoIndex].last ? distinctCompatInfo[compatInfoIndex].lastLong : "*"}` }] 696 | }, 697 | } 698 | } 699 | } 700 | } 701 | 702 | // Update policies. 703 | admx_obj 704 | .elements.find(e => e.name == "policyDefinitions") 705 | .elements.find(e => e.name == "policies") 706 | .elements = admxPolicies.filter(p => !p.unsupported); 707 | 708 | // Update supportedOn definitions. 709 | admx_obj 710 | .elements.find(e => e.name == "policyDefinitions") 711 | .elements.find(e => e.name == "supportedOn") 712 | .elements.find(e => e.name == "definitions") 713 | .elements = Object.keys(used_supported_on).sort().map(e => used_supported_on[e].admx); 714 | 715 | // Rebuild thunderbird.admx file. 716 | let admx_xml = convert.js2xml(admx_obj, { compact: false, spaces: 2 }); 717 | fs.ensureDirSync(`${output_dir}/windows`); 718 | fs.writeFileSync(`${output_dir}/windows/thunderbird.admx`, admx_xml); 719 | 720 | // Copy mozilla.admx file. 721 | file = fs.readFileSync(`${mozilla_template_dir}/${template.mozillaReferenceTemplates}/windows/mozilla.admx`); 722 | fs.writeFileSync(`${output_dir}/windows/mozilla.admx`, file); 723 | 724 | 725 | 726 | // Handle translation files. 727 | let folders = fs.readdirSync(`${mozilla_template_dir}/${template.mozillaReferenceTemplates}/windows`, { withFileTypes: true }) 728 | .filter(dirent => dirent.isDirectory()) 729 | .map(dirent => dirent.name); 730 | for (let folder of folders) { 731 | let adml_file = fs.readFileSync(`${mozilla_template_dir}/${template.mozillaReferenceTemplates}/windows/${folder}/firefox.adml`); 732 | let adml_obj = convert.xml2js(rebrand(adml_file), { compact: false }); 733 | 734 | let strings = adml_obj 735 | .elements.find(e => e.name == "policyDefinitionResources") 736 | .elements.find(e => e.name == "resources") 737 | .elements.find(e => e.name == "stringTable") 738 | .elements.filter(e => !e.attributes || !e.attributes.id.startsWith("SUPPORTED_TB")); 739 | 740 | strings.unshift(...Object.keys(used_supported_on).sort().map(e => used_supported_on[e].adml)); 741 | 742 | adml_obj 743 | .elements.find(e => e.name == "policyDefinitionResources") 744 | .elements.find(e => e.name == "resources") 745 | .elements.find(e => e.name == "stringTable") 746 | .elements = strings; 747 | 748 | let adml_xml = convert.js2xml(adml_obj, { compact: false, spaces: 2 }); 749 | fs.ensureDirSync(`${output_dir}/windows/${folder}`); 750 | fs.writeFileSync(`${output_dir}/windows/${folder}/thunderbird.adml`, adml_xml); 751 | } 752 | } 753 | 754 | /** 755 | * Build the MasOS PLIST files. 756 | */ 757 | async function buildPlistFiles(template, thunderbirdPolicies, output_dir) { 758 | // Read PLIST files - https://www.npmjs.com/package/plist. 759 | let plist_file = fs.readFileSync(`${mozilla_template_dir}/${template.mozillaReferenceTemplates}/mac/org.mozilla.firefox.plist`).toString(); 760 | 761 | // See https://github.com/mozilla/policy-templates/pull/1088 762 | plist_file = plist_file.replaceAll("&rt;",">"); 763 | 764 | let plist_obj = plist.parse(plist_file); 765 | 766 | function isObject(v) { 767 | return typeof v === 'object' && !Array.isArray(v) && v !== null; 768 | } 769 | function removeUnsupportedEntries(plist, base_name = "") { 770 | for (let key of Object.keys(plist)) { 771 | let policy_name = base_name 772 | ? `${base_name}_${key}` 773 | : key; 774 | 775 | if (!isObject(plist[key])) { 776 | // This is a final entry, check if this is a supported policy. 777 | if (!thunderbirdPolicies.includes(policy_name) && policy_name != "EnterprisePoliciesEnabled") { 778 | delete plist[key]; 779 | } 780 | } else { 781 | removeUnsupportedEntries(plist[key], policy_name); 782 | if (Object.keys(plist[key]).length == 0) { 783 | delete plist[key]; 784 | } 785 | } 786 | } 787 | } 788 | 789 | removeUnsupportedEntries(plist_obj); 790 | let plist_tb = plist.build(plist_obj); 791 | fs.ensureDirSync(`${output_dir}/mac`); 792 | fs.writeFileSync(`${output_dir}/mac/org.mozilla.thunderbird.plist`, rebrand(plist_tb)); 793 | fs.writeFileSync(`${output_dir}/mac/README.md`, rebrand(template.macReadme.override || template.macReadme.upstream)); 794 | } 795 | 796 | /** 797 | * Build the README file. 798 | */ 799 | async function buildReadme(tree, template, thunderbirdPolicies, output_dir) { 800 | let header = []; 801 | let details = []; 802 | let printed_main_policies = []; 803 | let skipped_main_policies = []; 804 | // Loop over all policies found in the thunderbird policy schema file and rebuild the readme. 805 | for (let policy of thunderbirdPolicies) { 806 | // Get the policy header from the template (or its override). 807 | if (template.headers[policy]) { 808 | let content = template.headers[policy].override || template.headers[policy].upstream; 809 | if (content && content != "skip") { 810 | header.push(content); 811 | } 812 | printed_main_policies.push(policy.split("_").shift()); 813 | } else { 814 | // Keep track of policies which are not mentioned directly in the readme. 815 | let skipped = policy.split("_").shift(); 816 | if (!skipped_main_policies.includes(skipped)) skipped_main_policies.push(skipped); 817 | } 818 | 819 | // Get the policy details from the template (or its override). 820 | if (template.policies[policy]) { 821 | let content = template.policies[policy].override || template.policies[policy].upstream; 822 | if (content && content != "skip") { 823 | details.push(...content.filter(e => !e.includes("**Compatibility:**"))); 824 | details.push("#### Compatibility"); 825 | let distinctCompatInfo = getCompatibilityInformation(/* distinct */ true, tree, policy); 826 | details.push(...buildCompatibilityTable(distinctCompatInfo)); 827 | details.push("
", ""); 828 | } 829 | } 830 | } 831 | 832 | for (let skipped of skipped_main_policies) { 833 | if (!printed_main_policies.includes(skipped)) { 834 | console.log(` --> WARNING: Supported policy not present in readme: \x1b[31m '${skipped}'\x1b[0m`); 835 | } 836 | } 837 | 838 | let md = gTreeTemplate 839 | .replace("__name__", template.name) 840 | .replace("__desc__", template.desc.join("\n")) 841 | .replace("__list_of_policies__", rebrand(header)) 842 | .replace("__details__", rebrand(details)); 843 | 844 | fs.ensureDirSync(output_dir); 845 | fs.writeFileSync(`${output_dir}/README.md`, md); 846 | console.log(); 847 | } 848 | 849 | /** 850 | * Generate the Thunderbird templates. 851 | * 852 | * @param {*} settings 853 | * settings.tree - "central" or "esr91" 854 | * settings.mozillaReferencePolicyRevision - the hg revision of the last known 855 | * mozilla version of their policies.json 856 | */ 857 | async function buildThunderbirdTemplates(settings) { 858 | // Download schema from https://hg.mozilla.org/ 859 | let data = await downloadPolicySchemaFiles( 860 | settings.tree, 861 | settings.mozillaReferencePolicyRevision, 862 | ); 863 | if (!data) { 864 | return; 865 | } 866 | 867 | let output_dir = `${build_dir}/${settings.tree}`; 868 | let mozillaReferencePolicyFile = data.mozilla.revisions.find(r => r.revision == settings.mozillaReferencePolicyRevision); 869 | if (!mozillaReferencePolicyFile) { 870 | console.error(`Unknown policy revision ${settings.mozillaReferencePolicyRevision} set for mozilla-${settings.tree}.\nCheck ${data.mozilla.hgLogUrl}`); 871 | return; 872 | } 873 | 874 | // Find supported policies. 875 | extractCompatibilityInformation(data, settings.tree); 876 | let supportedPolicies = 877 | getCompatibilityInformation( 878 | /* distinct */ true, settings.tree 879 | ).filter(e => e.first != ""); 880 | 881 | // Get changes in the schema files and log them. 882 | if (mozillaReferencePolicyFile.revision != data.mozilla.revisions[0].revision) { 883 | settings.mozillaReferencePolicyRevision = data.mozilla.revisions[0].revision; 884 | let m_m_changes = checkPolicySchemaChanges(mozillaReferencePolicyFile, data.mozilla.revisions[0]); 885 | if (m_m_changes) { 886 | console.log(); 887 | console.log(` Mozilla has released a new policy revision for mozilla-${settings.tree}!`); 888 | console.log(` Do those changes need to be ported to Thunderbird?`); 889 | if (m_m_changes.added.length > 0) { 890 | console.log(` - Mozilla added the following policies: [`); 891 | // Indicate if the current tree supports any of the added policies. 892 | // This can happen, if the revision config file has not yet been 893 | // committed, and an older revision was used to detect changes in 894 | // the policy files. 895 | for (let added of m_m_changes.added) { 896 | let isSupported = supportedPolicies.find(e => e.policies.includes(added)); 897 | if (isSupported) { 898 | console.log(`\x1b[32m '${added}'\x1b[0m`) 899 | } else { 900 | console.log(`\x1b[31m '${added}'\x1b[0m, \x1b[31m Not supported by ${settings.tree} \x1b[0m`) 901 | } 902 | } 903 | console.log(` ]\n`); 904 | } 905 | if (m_m_changes.removed.length > 0) { 906 | console.log(` - Mozilla removed the following policies: [`); 907 | m_m_changes.removed.forEach(e => console.log(`\x1b[33m '${e}'\x1b[0m`)); 908 | console.log(` ]\n`); 909 | } 910 | if (m_m_changes.changed.length > 0) { 911 | console.log(` - Mozilla changed properties of the following policies: [`); 912 | m_m_changes.changed.forEach(e => console.log(`\x1b[33m '${e}'\x1b[0m`)); 913 | console.log(` ]\n`); 914 | } 915 | 916 | console.log(); 917 | console.log(` - currently acknowledged policy revision (${mozillaReferencePolicyFile.revision} / ${mozillaReferencePolicyFile.version}): \n\t${path.resolve(getPolicySchemaFilename("mozilla", settings.tree, mozillaReferencePolicyFile.revision))}\n`); 918 | console.log(` - latest available policy revision (${data.mozilla.revisions[0].revision} / ${data.mozilla.revisions[0].version}): \n\t${path.resolve(getPolicySchemaFilename("mozilla", settings.tree, data.mozilla.revisions[0].revision))}\n`); 919 | console.log(` - hg change log for mozilla-${settings.tree}: \n\t${data.mozilla.hgLogUrl}\n`); 920 | console.log(`Create bugs on Bugzilla for all policies which should be ported to Thunderbird and then check-in the updated ${revisions_json_write_path} file to acknowledge the reported changes.`); 921 | console.log(`Once the reported changes are acknowledged, they will not be reported again.`); 922 | console.log(); 923 | } 924 | } 925 | 926 | let template = await parseMozillaPolicyTemplate(settings.tree); 927 | let thunderbirdPolicies = Object.keys(gCompatibilityData) 928 | .filter(p => !gCompatibilityData[p].unsupported) 929 | .sort(function (a, b) { 930 | return a.toLowerCase().localeCompare(b.toLowerCase()); 931 | }); 932 | 933 | await buildReadme(settings.tree, template, thunderbirdPolicies, output_dir); 934 | await buildAdmxFiles(settings.tree, template, thunderbirdPolicies, output_dir); 935 | await buildPlistFiles(template, thunderbirdPolicies, output_dir); 936 | 937 | if (settings.tree == "central") { 938 | gMainTemplateEntries.unshift(` * [${template.name}](templates/${settings.tree})`); 939 | } else { 940 | gMainTemplateEntries.unshift(` * [${template.name}](templates/${settings.tree}) (${template.mozillaReferenceTemplates}) `); 941 | } 942 | } 943 | 944 | async function main() { 945 | // Checkout the current state of the repo, to identify new changes. 946 | await pullGitRepository("https://github.com/thunderbird/policy-templates", "master", state_dir); 947 | 948 | // Load revision data, to see if any new revisions have been added to the tree. 949 | let revisionData = []; 950 | let readRevisionData = fs.existsSync(revisions_json_read_path) 951 | ? parse(fs.readFileSync(revisions_json_read_path).toString()) 952 | : []; 953 | // A starter set, if the revision config file is missing or incomplete. 954 | let defaultRevisionData = [ 955 | { 956 | tree: "esr68", 957 | mozillaReferencePolicyRevision: "1b0a29b456b432d1c8bef09c233b84205ec9e13c", 958 | }, 959 | { 960 | tree: "esr78", 961 | mozillaReferencePolicyRevision: "a8c4670b6ef144a0f3b6851c2a9d4bbd44fc032a", 962 | }, 963 | { 964 | tree: "esr91", 965 | mozillaReferencePolicyRevision: "02bf5ca05376f55029da3645bdc6c8806e306e80", 966 | 967 | }, 968 | { 969 | tree: "esr102", 970 | mozillaReferencePolicyRevision: "02bf5ca05376f55029da3645bdc6c8806e306e80", 971 | }, 972 | { 973 | tree: "esr115", 974 | mozillaReferencePolicyRevision: "02bf5ca05376f55029da3645bdc6c8806e306e80", 975 | }, 976 | { 977 | tree: "central", 978 | mozillaReferencePolicyRevision: "02bf5ca05376f55029da3645bdc6c8806e306e80", 979 | } 980 | ]; 981 | 982 | for (let defaultRevision of defaultRevisionData) { 983 | let readRevision = readRevisionData.find(r => r.tree == defaultRevision.tree); 984 | let revision = readRevision || defaultRevision; 985 | revisionData.push(revision); 986 | await buildThunderbirdTemplates(revision); 987 | } 988 | 989 | // Update files. 990 | fs.writeFileSync(compatibility_json_path, stringify(gCompatibilityData, null, 2)); 991 | fs.writeFileSync(revisions_json_write_path, stringify(revisionData, null, 2)); 992 | 993 | let compatInfo = getCompatibilityInformation(/* distinct */ false, "central"); 994 | compatInfo.sort((a, b) => { 995 | let aa = a.policies.join("
"); 996 | let bb = b.policies.join("
"); 997 | if (aa < bb) return -1; 998 | if (aa > bb) return 1; 999 | return 0; 1000 | }); 1001 | 1002 | fs.writeFileSync(main_readme, gMainTemplate 1003 | .replace("__list__", gMainTemplateEntries.join("\n")) 1004 | .replace("__compatibility__", buildCompatibilityTable(compatInfo).join("\n")) 1005 | ); 1006 | } 1007 | 1008 | main(); 1009 | -------------------------------------------------------------------------------- /templates/central/mac/README.md: -------------------------------------------------------------------------------- 1 | **IMPORTANT**: These files are in active development along with the policies in Thunderbird. To get the policy information that corresponds to a specific release, go to https://github.com/thunderbird/policy-templates. 2 | 3 | Starting with Thunderbird 68, Thunderbird supports configuration files on macOS. 4 | 5 | An example plist file with all options is available here: 6 | 7 | [org.mozilla.thunderbird.plist](org.mozilla.thunderbird.plist) 8 | 9 | If you want to set specific options from the command line, we also provide flattened shortcuts to any item that is nested in the plist file. 10 | 11 | For example, this policy: 12 | ```json 13 | { 14 | "policies": { 15 | "Proxy": { 16 | "HTTPProxy": "proxy.example.com:80/" 17 | } 18 | } 19 | } 20 | ``` 21 | which would be set in the plist file like this: 22 | ```xml 23 | Proxy 24 | 25 | HTTPProxy 26 | proxy.example.com:80 27 | 28 | ``` 29 | Correctly writing the nested value with the `defaults` command can be hard, so you can flatten the keys by separating them with `__`, like this: 30 | ```bash 31 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird Proxy__HTTPProxy -string "proxy.example.com:80" 32 | ``` 33 | Before any command line policies will work, you need to enable policies like this: 34 | ```bash 35 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird EnterprisePoliciesEnabled -bool TRUE 36 | ``` 37 | -------------------------------------------------------------------------------- /templates/central/mac/org.mozilla.thunderbird.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EnterprisePoliciesEnabled 6 | 7 | AppAutoUpdate 8 | 9 | AppUpdatePin 10 | 106. 11 | AppUpdateURL 12 | https://www.example.com/update.xml 13 | Authentication 14 | 15 | SPNEGO 16 | 17 | mydomain.com 18 | https://myotherdomain.com 19 | 20 | Delegated 21 | 22 | mydomain.com 23 | https://myotherdomain.com 24 | 25 | NTLM 26 | 27 | mydomain.com 28 | https://myotherdomain.com 29 | 30 | AllowNonFQDN 31 | 32 | SPNEGO 33 | 34 | NTLM 35 | 36 | 37 | AllowProxies 38 | 39 | SPNEGO 40 | 41 | NTLM 42 | 43 | 44 | PrivateBrowsing 45 | 46 | Locked 47 | 48 | 49 | BlockAboutAddons 50 | 51 | BlockAboutConfig 52 | 53 | BlockAboutProfiles 54 | 55 | BlockAboutSupport 56 | 57 | CaptivePortal 58 | 59 | Certificates 60 | 61 | ImportEnterpriseRoots 62 | 63 | Install 64 | 65 | cert1.der 66 | cert2.pem 67 | 68 | 69 | Cookies 70 | 71 | Allow 72 | 73 | https://www.example.org/ 74 | 75 | Block 76 | 77 | https://www.example.edu/ 78 | 79 | Locked 80 | 81 | 82 | DefaultDownloadDirectory 83 | ${home}/Downloads 84 | DownloadDirectory 85 | ${home}/Downloads 86 | DNSOverHTTPS 87 | 88 | Enabled 89 | 90 | ProviderURL 91 | URL_TO_ALTERNATE_PROVIDER 92 | Locked 93 | 94 | ExcludedDomains 95 | 96 | example.com 97 | 98 | 99 | DisableAppUpdate 100 | 101 | DisableBuiltinPDFViewer 102 | 103 | DisabledCiphers 104 | 105 | TLS_DHE_RSA_WITH_AES_128_CBC_SHA 106 | 107 | TLS_DHE_RSA_WITH_AES_256_CBC_SHA 108 | 109 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 110 | 111 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 112 | 113 | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 114 | 115 | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 116 | 117 | TLS_RSA_WITH_AES_128_CBC_SHA 118 | 119 | TLS_RSA_WITH_AES_256_CBC_SHA 120 | 121 | TLS_RSA_WITH_3DES_EDE_CBC_SHA 122 | 123 | TLS_RSA_WITH_AES_128_GCM_SHA256 124 | 125 | TLS_RSA_WITH_AES_256_GCM_SHA384 126 | 127 | 128 | DisableDeveloperTools 129 | 130 | DisableMasterPasswordCreation 131 | 132 | DisablePasswordReveal 133 | 134 | DisableSafeMode 135 | 136 | DisableSecurityBypass 137 | 138 | InvalidCertificate 139 | 140 | SafeBrowsing 141 | 142 | 143 | DisableSystemAddonUpdate 144 | 145 | DisableTelemetry 146 | 147 | Extensions 148 | 149 | Install 150 | 151 | https://addons.thunderbird.net/thunderbird/downloads/file/1053714/ghostery_privacy_ad_blocker-8.2.4-an+fx.xpi 152 | 153 | Uninstall 154 | 155 | Locked 156 | 157 | thunderbird@ghostery.com 158 | 159 | 160 | ExtensionSettings 161 | 162 | * 163 | 164 | blocked_install_message 165 | Custom error message. 166 | install_sources 167 | 168 | https://addons.thunderbird.net/ 169 | 170 | installation_mode 171 | blocked 172 | 173 | 174 | ExtensionUpdate 175 | 176 | HardwareAcceleration 177 | 178 | InstallAddonsPermission 179 | 180 | Allow 181 | 182 | https://example.org 183 | https://example.edu 184 | 185 | Default 186 | 187 | 188 | PrimaryPassword 189 | 190 | NetworkPrediction 191 | 192 | OfferToSaveLogins 193 | 194 | OfferToSaveLoginsDefault 195 | 196 | PasswordManagerEnabled 197 | 198 | PDFjs 199 | 200 | Enabled 201 | 202 | EnablePermissions 203 | 204 | 205 | Proxy 206 | 207 | Mode 208 | manual 209 | HTTPProxy 210 | proxy.example.com:80 211 | UseHTTPProxyForAllProtocols 212 | 213 | SSLProxy 214 | proxy.example.com:80 215 | FTPProxy 216 | proxy.example.com:80 217 | SOCKSProxy 218 | proxy.example.com:80 219 | Passthrough 220 | <local> 221 | AutoConfigURL 222 | URL_TO_AUTOCONFIG 223 | AutoLogin 224 | 225 | UseProxyForDNS 226 | 227 | Locked 228 | 229 | 230 | RequestedLocales 231 | 232 | de 233 | en-US 234 | 235 | SSLVersionMin 236 | tls1.2 237 | SSLVersionMax 238 | tls1.3 239 | 240 | -------------------------------------------------------------------------------- /templates/central/windows/de-DE/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/central/windows/en-US/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/central/windows/es-ES/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/central/windows/fr-FR/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/central/windows/it-IT/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/central/windows/mozilla.admx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/central/windows/ru-RU/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/central/windows/zh-CN/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/central/windows/zh-TW/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr102/mac/README.md: -------------------------------------------------------------------------------- 1 | Starting with Thunderbird 68, Thunderbird supports configuration files on macOS. 2 | 3 | An example plist file with all options is available here: 4 | 5 | [org.mozilla.thunderbird.plist](org.mozilla.thunderbird.plist) 6 | 7 | If you want to set specific options from the command line, we also provide flattened shortcuts to any item that is nested in the plist file. 8 | 9 | For example, this policy: 10 | ```json 11 | { 12 | "policies": { 13 | "Proxy": { 14 | "HTTPProxy": "proxy.example.com:80/" 15 | } 16 | } 17 | } 18 | ``` 19 | which would be set in the plist file like this: 20 | ```xml 21 | Proxy 22 | 23 | HTTPProxy 24 | proxy.example.com:80 25 | 26 | ``` 27 | Correctly writing the nested value with the `defaults` command can be hard, so you can flatten the keys by separating them with `__`, like this: 28 | ```bash 29 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird Proxy__HTTPProxy -string "proxy.example.com:80" 30 | ``` 31 | Before any command line policies will work, you need to enable policies like this: 32 | ```bash 33 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird EnterprisePoliciesEnabled -bool TRUE 34 | ``` 35 | -------------------------------------------------------------------------------- /templates/esr102/mac/org.mozilla.thunderbird.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EnterprisePoliciesEnabled 6 | 7 | AppAutoUpdate 8 | 9 | AppUpdateURL 10 | https://www.example.com/update.xml 11 | Authentication 12 | 13 | SPNEGO 14 | 15 | mydomain.com 16 | https://myotherdomain.com 17 | 18 | Delegated 19 | 20 | mydomain.com 21 | https://myotherdomain.com 22 | 23 | NTLM 24 | 25 | mydomain.com 26 | https://myotherdomain.com 27 | 28 | AllowNonFQDN 29 | 30 | SPNEGO 31 | 32 | NTLM 33 | 34 | 35 | AllowProxies 36 | 37 | SPNEGO 38 | 39 | NTLM 40 | 41 | 42 | PrivateBrowsing 43 | 44 | Locked 45 | 46 | 47 | BlockAboutAddons 48 | 49 | BlockAboutConfig 50 | 51 | BlockAboutProfiles 52 | 53 | BlockAboutSupport 54 | 55 | CaptivePortal 56 | 57 | Certificates 58 | 59 | ImportEnterpriseRoots 60 | 61 | Install 62 | 63 | cert1.der 64 | cert2.pem 65 | 66 | 67 | Cookies 68 | 69 | Allow 70 | 71 | https://www.example.org/ 72 | 73 | Block 74 | 75 | https://www.example.edu/ 76 | 77 | Locked 78 | 79 | 80 | DefaultDownloadDirectory 81 | ${home}/Downloads 82 | DownloadDirectory 83 | ${home}/Downloads 84 | DNSOverHTTPS 85 | 86 | Enabled 87 | 88 | ProviderURL 89 | URL_TO_ALTERNATE_PROVIDER 90 | Locked 91 | 92 | ExcludedDomains 93 | 94 | example.com 95 | 96 | 97 | DisableAppUpdate 98 | 99 | DisableBuiltinPDFViewer 100 | 101 | DisabledCiphers 102 | 103 | TLS_DHE_RSA_WITH_AES_128_CBC_SHA 104 | 105 | TLS_DHE_RSA_WITH_AES_256_CBC_SHA 106 | 107 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 108 | 109 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 110 | 111 | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 112 | 113 | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 114 | 115 | TLS_RSA_WITH_AES_128_CBC_SHA 116 | 117 | TLS_RSA_WITH_AES_256_CBC_SHA 118 | 119 | TLS_RSA_WITH_3DES_EDE_CBC_SHA 120 | 121 | TLS_RSA_WITH_AES_128_GCM_SHA256 122 | 123 | TLS_RSA_WITH_AES_256_GCM_SHA384 124 | 125 | 126 | DisableDeveloperTools 127 | 128 | DisableMasterPasswordCreation 129 | 130 | DisablePasswordReveal 131 | 132 | DisableSafeMode 133 | 134 | DisableSecurityBypass 135 | 136 | InvalidCertificate 137 | 138 | SafeBrowsing 139 | 140 | 141 | DisableSystemAddonUpdate 142 | 143 | DisableTelemetry 144 | 145 | Extensions 146 | 147 | Install 148 | 149 | https://addons.thunderbird.net/thunderbird/downloads/file/1053714/ghostery_privacy_ad_blocker-8.2.4-an+fx.xpi 150 | 151 | Uninstall 152 | 153 | Locked 154 | 155 | thunderbird@ghostery.com 156 | 157 | 158 | ExtensionSettings 159 | 160 | * 161 | 162 | blocked_install_message 163 | Custom error message. 164 | install_sources 165 | 166 | https://addons.thunderbird.net/ 167 | 168 | installation_mode 169 | blocked 170 | 171 | 172 | ExtensionUpdate 173 | 174 | HardwareAcceleration 175 | 176 | InstallAddonsPermission 177 | 178 | Allow 179 | 180 | https://example.org 181 | https://example.edu 182 | 183 | Default 184 | 185 | 186 | PrimaryPassword 187 | 188 | NetworkPrediction 189 | 190 | OfferToSaveLogins 191 | 192 | OfferToSaveLoginsDefault 193 | 194 | PasswordManagerEnabled 195 | 196 | PDFjs 197 | 198 | Enabled 199 | 200 | EnablePermissions 201 | 202 | 203 | Proxy 204 | 205 | Mode 206 | manual 207 | HTTPProxy 208 | proxy.example.com:80 209 | Locked 210 | 211 | 212 | RequestedLocales 213 | 214 | de 215 | en-US 216 | 217 | SSLVersionMin 218 | tls1.2 219 | SSLVersionMax 220 | tls1.3 221 | 222 | -------------------------------------------------------------------------------- /templates/esr102/windows/mozilla.admx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr115/mac/README.md: -------------------------------------------------------------------------------- 1 | Starting with Thunderbird 68, Thunderbird supports configuration files on macOS. 2 | 3 | An example plist file with all options is available here: 4 | 5 | [org.mozilla.thunderbird.plist](org.mozilla.thunderbird.plist) 6 | 7 | If you want to set specific options from the command line, we also provide flattened shortcuts to any item that is nested in the plist file. 8 | 9 | For example, this policy: 10 | ```json 11 | { 12 | "policies": { 13 | "Proxy": { 14 | "HTTPProxy": "proxy.example.com:80/" 15 | } 16 | } 17 | } 18 | ``` 19 | which would be set in the plist file like this: 20 | ```xml 21 | Proxy 22 | 23 | HTTPProxy 24 | proxy.example.com:80 25 | 26 | ``` 27 | Correctly writing the nested value with the `defaults` command can be hard, so you can flatten the keys by separating them with `__`, like this: 28 | ```bash 29 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird Proxy__HTTPProxy -string "proxy.example.com:80" 30 | ``` 31 | Before any command line policies will work, you need to enable policies like this: 32 | ```bash 33 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird EnterprisePoliciesEnabled -bool TRUE 34 | ``` 35 | -------------------------------------------------------------------------------- /templates/esr115/mac/org.mozilla.thunderbird.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EnterprisePoliciesEnabled 6 | 7 | AppAutoUpdate 8 | 9 | AppUpdatePin 10 | 106. 11 | AppUpdateURL 12 | https://www.example.com/update.xml 13 | Authentication 14 | 15 | SPNEGO 16 | 17 | mydomain.com 18 | https://myotherdomain.com 19 | 20 | Delegated 21 | 22 | mydomain.com 23 | https://myotherdomain.com 24 | 25 | NTLM 26 | 27 | mydomain.com 28 | https://myotherdomain.com 29 | 30 | AllowNonFQDN 31 | 32 | SPNEGO 33 | 34 | NTLM 35 | 36 | 37 | AllowProxies 38 | 39 | SPNEGO 40 | 41 | NTLM 42 | 43 | 44 | PrivateBrowsing 45 | 46 | Locked 47 | 48 | 49 | BlockAboutAddons 50 | 51 | BlockAboutConfig 52 | 53 | BlockAboutProfiles 54 | 55 | BlockAboutSupport 56 | 57 | CaptivePortal 58 | 59 | Certificates 60 | 61 | ImportEnterpriseRoots 62 | 63 | Install 64 | 65 | cert1.der 66 | cert2.pem 67 | 68 | 69 | Cookies 70 | 71 | Allow 72 | 73 | https://www.example.org/ 74 | 75 | Block 76 | 77 | https://www.example.edu/ 78 | 79 | Locked 80 | 81 | 82 | DefaultDownloadDirectory 83 | ${home}/Downloads 84 | DownloadDirectory 85 | ${home}/Downloads 86 | DNSOverHTTPS 87 | 88 | Enabled 89 | 90 | ProviderURL 91 | URL_TO_ALTERNATE_PROVIDER 92 | Locked 93 | 94 | ExcludedDomains 95 | 96 | example.com 97 | 98 | 99 | DisableAppUpdate 100 | 101 | DisableBuiltinPDFViewer 102 | 103 | DisabledCiphers 104 | 105 | TLS_DHE_RSA_WITH_AES_128_CBC_SHA 106 | 107 | TLS_DHE_RSA_WITH_AES_256_CBC_SHA 108 | 109 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 110 | 111 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 112 | 113 | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 114 | 115 | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 116 | 117 | TLS_RSA_WITH_AES_128_CBC_SHA 118 | 119 | TLS_RSA_WITH_AES_256_CBC_SHA 120 | 121 | TLS_RSA_WITH_3DES_EDE_CBC_SHA 122 | 123 | TLS_RSA_WITH_AES_128_GCM_SHA256 124 | 125 | TLS_RSA_WITH_AES_256_GCM_SHA384 126 | 127 | 128 | DisableDeveloperTools 129 | 130 | DisableMasterPasswordCreation 131 | 132 | DisablePasswordReveal 133 | 134 | DisableSafeMode 135 | 136 | DisableSecurityBypass 137 | 138 | InvalidCertificate 139 | 140 | SafeBrowsing 141 | 142 | 143 | DisableSystemAddonUpdate 144 | 145 | DisableTelemetry 146 | 147 | Extensions 148 | 149 | Install 150 | 151 | https://addons.thunderbird.net/thunderbird/downloads/file/1053714/ghostery_privacy_ad_blocker-8.2.4-an+fx.xpi 152 | 153 | Uninstall 154 | 155 | Locked 156 | 157 | thunderbird@ghostery.com 158 | 159 | 160 | ExtensionSettings 161 | 162 | * 163 | 164 | blocked_install_message 165 | Custom error message. 166 | install_sources 167 | 168 | https://addons.thunderbird.net/ 169 | 170 | installation_mode 171 | blocked 172 | 173 | 174 | ExtensionUpdate 175 | 176 | HardwareAcceleration 177 | 178 | InstallAddonsPermission 179 | 180 | Allow 181 | 182 | https://example.org 183 | https://example.edu 184 | 185 | Default 186 | 187 | 188 | PrimaryPassword 189 | 190 | NetworkPrediction 191 | 192 | OfferToSaveLogins 193 | 194 | OfferToSaveLoginsDefault 195 | 196 | PasswordManagerEnabled 197 | 198 | PDFjs 199 | 200 | Enabled 201 | 202 | EnablePermissions 203 | 204 | 205 | Proxy 206 | 207 | Mode 208 | manual 209 | HTTPProxy 210 | proxy.example.com:80 211 | UseHTTPProxyForAllProtocols 212 | 213 | SSLProxy 214 | proxy.example.com:80 215 | FTPProxy 216 | proxy.example.com:80 217 | SOCKSProxy 218 | proxy.example.com:80 219 | Passthrough 220 | <local> 221 | AutoConfigURL 222 | URL_TO_AUTOCONFIG 223 | AutoLogin 224 | 225 | UseProxyForDNS 226 | 227 | Locked 228 | 229 | 230 | RequestedLocales 231 | 232 | de 233 | en-US 234 | 235 | SSLVersionMin 236 | tls1.2 237 | SSLVersionMax 238 | tls1.3 239 | 240 | -------------------------------------------------------------------------------- /templates/esr115/windows/mozilla.admx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr68/README.md: -------------------------------------------------------------------------------- 1 | ## Enterprise policy descriptions and templates for Thunderbird 68 2 | 3 | Policies can be specified using the [Group Policy templates on Windows](windows), [Intune on Windows](https://support.mozilla.org/kb/managing-firefox-intune), [configuration profiles on macOS](mac), or by creating a file called `policies.json`. 4 | 5 | On Windows, create a directory called `distribution` where the EXE is located and place the file there. On Mac, the file goes into `Thunderbird.app/Contents/Resources/distribution`. On Linux, the file goes into `thunderbird/distribution`, where `thunderbird` is the installation directory for Thunderbird, which varies by distribution. 6 | 7 |
8 | 9 | | Policy Name | Description 10 | |:--- |:--- | 11 | | **[`AppUpdateURL`](#appupdateurl)** | Change the URL for application update. 12 | | **[`BlockAboutAddons`](#blockaboutaddons)** | Block access to the Add-ons Manager (about:addons). 13 | | **[`BlockAboutConfig`](#blockaboutconfig)** | Block access to about:config. 14 | | **[`BlockAboutProfiles`](#blockaboutprofiles)** | Block access to About Profiles (about:profiles). 15 | | **[`BlockAboutSupport`](#blockaboutsupport)** | Block access to Troubleshooting Information (about:support). 16 | | **[`Certificates -> ImportEnterpriseRoots`](#certificates--importenterpriseroots)** | Trust certificates that have been added to the operating system certificate store by a user or administrator. 17 | | **[`Certificates -> Install`](#certificates--install)** | Install certificates into the Thunderbird certificate store. 18 | | **[`DisableAppUpdate`](#disableappupdate)** | Turn off application updates. 19 | | **[`DisableDeveloperTools`](#disabledevelopertools)** | Remove access to all developer tools. 20 | | **[`DisableMasterPasswordCreation`](#disablemasterpasswordcreation)** | Remove the master password functionality. 21 | | **[`DisableSecurityBypass`](#disablesecuritybypass)** | Prevent the user from bypassing security in certain cases. 22 | | **[`Extensions`](#extensions)** | Control the installation, uninstallation and locking of extensions. 23 | | **[`ExtensionSettings`](#extensionsettings)** | Manage all aspects of extensions. 24 | | **[`ExtensionUpdate`](#extensionupdate)** | Control extension updates. 25 | | **[`InstallAddonsPermission`](#installaddonspermission)** | Configure the default extension install policy as well as origins for extension installs are allowed. 26 | | **[`Preferences`](#preferences)** | Set and lock some preferences. 27 | | **[`Proxy`](#proxy)** | Configure proxy settings. 28 | | **[`RequestedLocales`](#requestedlocales)** | Set the the list of requested locales for the application in order of preference. 29 | | **[`SSLVersionMax`](#sslversionmax)** | Set and lock the maximum version of TLS. 30 | | **[`SSLVersionMin`](#sslversionmin)** | Set and lock the minimum version of TLS. 31 | 32 |
33 | 34 | ## AppUpdateURL 35 | 36 | Change the URL for application update. 37 | 38 | **CCK2 Equivalent:** N/A\ 39 | **Preferences Affected:** `app.update.url` 40 | 41 | #### Windows (GPO) 42 | ``` 43 | Software\Policies\Mozilla\Thunderbird\AppUpdateURL = "https://yoursite.com" 44 | ``` 45 | #### Windows (Intune) 46 | OMA-URI: 47 | ``` 48 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/AppUpdateURL 49 | ``` 50 | Value (string): 51 | ``` 52 | 53 | 54 | ``` 55 | #### macOS 56 | ``` 57 | 58 | AppUpdateURL 59 | https://yoursite.com 60 | 61 | ``` 62 | #### policies.json 63 | ``` 64 | { 65 | "policies": { 66 | "AppUpdateURL": "https://yoursite.com" 67 | } 68 | } 69 | ``` 70 | #### Compatibility 71 | 72 | | Policy/Property Name | supported since | deprecated after | 73 | |:--- | ---:| ---:| 74 | | `AppUpdateURL` | 68.0 | | 75 | 76 |
77 | 78 | ## BlockAboutAddons 79 | 80 | Block access to the Add-ons Manager (about:addons). 81 | 82 | **CCK2 Equivalent:** `disableAddonsManager`\ 83 | **Preferences Affected:** N/A 84 | 85 | #### Windows (GPO) 86 | ``` 87 | Software\Policies\Mozilla\Thunderbird\BlockAboutAddons = 0x1 | 0x0 88 | ``` 89 | #### Windows (Intune) 90 | OMA-URI: 91 | ``` 92 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/BlockAboutAddons 93 | ``` 94 | Value (string): 95 | ``` 96 | or 97 | ``` 98 | #### macOS 99 | ``` 100 | 101 | BlockAboutAddons 102 | | 103 | 104 | ``` 105 | #### policies.json 106 | ``` 107 | { 108 | "policies": { 109 | "BlockAboutAddons": true | false 110 | } 111 | } 112 | ``` 113 | #### Compatibility 114 | 115 | | Policy/Property Name | supported since | deprecated after | 116 | |:--- | ---:| ---:| 117 | | `BlockAboutAddons` | 68.0 | | 118 | 119 |
120 | 121 | ## BlockAboutConfig 122 | 123 | Block access to about:config. 124 | 125 | **CCK2 Equivalent:** `disableAboutConfig`\ 126 | **Preferences Affected:** N/A 127 | 128 | #### Windows (GPO) 129 | ``` 130 | Software\Policies\Mozilla\Thunderbird\BlockAboutConfig = 0x1 | 0x0 131 | ``` 132 | #### Windows (Intune) 133 | OMA-URI: 134 | ``` 135 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/BlockAboutConfig 136 | ``` 137 | Value (string): 138 | ``` 139 | or 140 | ``` 141 | #### macOS 142 | ``` 143 | 144 | BlockAboutConfig 145 | | 146 | 147 | ``` 148 | #### policies.json 149 | ``` 150 | { 151 | "policies": { 152 | "BlockAboutConfig": true | false 153 | } 154 | } 155 | ``` 156 | #### Compatibility 157 | 158 | | Policy/Property Name | supported since | deprecated after | 159 | |:--- | ---:| ---:| 160 | | `BlockAboutConfig` | 68.0 | | 161 | 162 |
163 | 164 | ## BlockAboutProfiles 165 | 166 | Block access to About Profiles (about:profiles). 167 | 168 | **CCK2 Equivalent:** `disableAboutProfiles`\ 169 | **Preferences Affected:** N/A 170 | 171 | #### Windows (GPO) 172 | ``` 173 | Software\Policies\Mozilla\Thunderbird\BlockAboutProfiles = 0x1 | 0x0 174 | ``` 175 | #### Windows (Intune) 176 | OMA-URI: 177 | ``` 178 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/BlockAboutProfiles 179 | ``` 180 | Value (string): 181 | ``` 182 | or 183 | ``` 184 | #### macOS 185 | ``` 186 | 187 | BlockAboutProfiles 188 | | 189 | 190 | ``` 191 | #### policies.json 192 | ``` 193 | { 194 | "policies": { 195 | "BlockAboutProfiles": true | false 196 | } 197 | } 198 | ``` 199 | #### Compatibility 200 | 201 | | Policy/Property Name | supported since | deprecated after | 202 | |:--- | ---:| ---:| 203 | | `BlockAboutProfiles` | 68.0 | | 204 | 205 |
206 | 207 | ## BlockAboutSupport 208 | 209 | Block access to Troubleshooting Information (about:support). 210 | 211 | **CCK2 Equivalent:** `disableAboutSupport`\ 212 | **Preferences Affected:** N/A 213 | 214 | #### Windows (GPO) 215 | ``` 216 | Software\Policies\Mozilla\Thunderbird\BlockAboutSupport = 0x1 | 0x0 217 | ``` 218 | #### Windows (Intune) 219 | OMA-URI: 220 | ``` 221 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/BlockAboutSupport 222 | ``` 223 | Value (string): 224 | ``` 225 | or 226 | ``` 227 | #### macOS 228 | ``` 229 | 230 | BlockAboutSupport 231 | | 232 | 233 | ``` 234 | #### policies.json 235 | ``` 236 | { 237 | "policies": { 238 | "BlockAboutSupport": true | false 239 | } 240 | } 241 | ``` 242 | #### Compatibility 243 | 244 | | Policy/Property Name | supported since | deprecated after | 245 | |:--- | ---:| ---:| 246 | | `BlockAboutSupport` | 68.0 | | 247 | 248 |
249 | 250 | ## Certificates | ImportEnterpriseRoots 251 | 252 | Trust certificates that have been added to the operating system certificate store by a user or administrator. 253 | 254 | See https://support.mozilla.org/kb/setting-certificate-authorities-firefox for more detail. 255 | 256 | **CCK2 Equivalent:** N/A\ 257 | **Preferences Affected:** `security.enterprise_roots.enabled` 258 | 259 | #### Windows (GPO) 260 | ``` 261 | Software\Policies\Mozilla\Thunderbird\Certificates\ImportEnterpriseRoots = 0x1 | 0x0 262 | ``` 263 | #### Windows (Intune) 264 | OMA-URI: 265 | ``` 266 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird~Certificates/Certificates_ImportEnterpriseRoots 267 | ``` 268 | Value (string): 269 | ``` 270 | or 271 | ``` 272 | #### macOS 273 | ``` 274 | 275 | Certificates 276 | 277 | ImportEnterpriseRoots 278 | | 279 | 280 | 281 | ``` 282 | #### policies.json 283 | ``` 284 | { 285 | "policies": { 286 | "Certificates": { 287 | "ImportEnterpriseRoots": true | false 288 | } 289 | } 290 | } 291 | ``` 292 | #### Compatibility 293 | 294 | | Policy/Property Name | supported since | deprecated after | 295 | |:--- | ---:| ---:| 296 | | `Certificates_ImportEnterpriseRoots` | 68.0 | | 297 | 298 |
299 | 300 | ## Certificates | Install 301 | 302 | Install certificates into the Thunderbird certificate store. If only a filename is specified, Thunderbird searches for the file in the following locations: 303 | 304 | - Windows 305 | - %USERPROFILE%\AppData\Local\Mozilla\Certificates 306 | - %USERPROFILE%\AppData\Roaming\Mozilla\Certificates 307 | - macOS 308 | - /Library/Application Support/Mozilla/Certificates 309 | - ~/Library/Application Support/Mozilla/Certificates 310 | - Linux 311 | - /usr/lib/mozilla/certificates 312 | - /usr/lib64/mozilla/certificates 313 | - ~/.mozilla/certificates 314 | 315 | Starting with Thunderbird 65, Thunderbird 60.5 ESR, a fully qualified path can be used, including UNC paths. You should use the native path style for your operating system. We do not support using %USERPROFILE% or other environment variables on Windows. 316 | 317 | If you are specifying the path in the policies.json file on Windows, you need to escape your backslashes (`\\`) which means that for UNC paths, you need to escape both (`\\\\`). If you use group policy, you only need one backslash. 318 | 319 | Certificates are installed using the trust string `CT,CT,`. 320 | 321 | Binary (DER) and ASCII (PEM) certificates are both supported. 322 | 323 | **CCK2 Equivalent:** `certs.ca`\ 324 | **Preferences Affected:** N/A 325 | 326 | #### Windows (GPO) 327 | ``` 328 | Software\Policies\Mozilla\Thunderbird\Certificates\Install\1 = "cert1.der" 329 | Software\Policies\Mozilla\Thunderbird\Certificates\Install\2 = "C:\Users\username\cert2.pem" 330 | ``` 331 | #### Windows (Intune) 332 | OMA-URI: 333 | ``` 334 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird~Certificates/Certificates_Install 335 | ``` 336 | Value (string): 337 | ``` 338 | 339 | 340 | ``` 341 | #### macOS 342 | ``` 343 | 344 | Certificates 345 | 346 | Install 347 | 348 | cert1.der 349 | /Users/username/cert2.pem 350 | 351 | 352 | 353 | ``` 354 | #### policies.json 355 | ``` 356 | { 357 | "policies": { 358 | "Certificates": { 359 | "Install": ["cert1.der", "/home/username/cert2.pem"] 360 | } 361 | } 362 | } 363 | ``` 364 | #### Compatibility 365 | 366 | | Policy/Property Name | supported since | deprecated after | 367 | |:--- | ---:| ---:| 368 | | `Certificates_Install` | 68.0 | | 369 | 370 |
371 | 372 | ## DisableAppUpdate 373 | Turn off application updates. 374 | 375 | **CCK2 Equivalent:** `disableFirefoxUpdates`\ 376 | **Preferences Affected:** N/A 377 | 378 | #### Windows (GPO) 379 | ``` 380 | Software\Policies\Mozilla\Thunderbird\DisableAppUpdate = 0x1 | 0x0 381 | ``` 382 | #### Windows (Intune) 383 | OMA-URI: 384 | ``` 385 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/DisableAppUpdate 386 | ``` 387 | Value (string): 388 | ``` 389 | or 390 | ``` 391 | #### macOS 392 | ``` 393 | 394 | DisableAppUpdate 395 | | 396 | 397 | ``` 398 | #### policies.json 399 | ``` 400 | { 401 | "policies": { 402 | "DisableAppUpdate": true | false 403 | } 404 | } 405 | ``` 406 | #### Compatibility 407 | 408 | | Policy/Property Name | supported since | deprecated after | 409 | |:--- | ---:| ---:| 410 | | `DisableAppUpdate` | 68.0 | | 411 | 412 |
413 | 414 | ## DisableDeveloperTools 415 | Remove access to all developer tools. 416 | 417 | **CCK2 Equivalent:** `removeDeveloperTools`\ 418 | **Preferences Affected:** `devtools.policy.disabled` 419 | 420 | #### Windows (GPO) 421 | ``` 422 | Software\Policies\Mozilla\Thunderbird\DisableDeveloperTools = 0x1 | 0x0` 423 | ``` 424 | #### Windows (Intune) 425 | OMA-URI: 426 | ``` 427 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/DisableDeveloperTools 428 | ``` 429 | Value (string): 430 | ``` 431 | or 432 | ``` 433 | #### macOS 434 | ``` 435 | 436 | DisableDeveloperTools 437 | | 438 | 439 | ``` 440 | #### policies.json 441 | ``` 442 | { 443 | "policies": { 444 | "DisableDeveloperTools": true | false 445 | } 446 | } 447 | ``` 448 | #### Compatibility 449 | 450 | | Policy/Property Name | supported since | deprecated after | 451 | |:--- | ---:| ---:| 452 | | `DisableDeveloperTools` | 68.0 | | 453 | 454 |
455 | 456 | ## DisableMasterPasswordCreation 457 | Remove the master password functionality. 458 | 459 | **CCK2 Equivalent:** `noMasterPassword`\ 460 | **Preferences Affected:** N/A 461 | 462 | #### Windows (GPO) 463 | ``` 464 | Software\Policies\Mozilla\Thunderbird\DisableMasterPasswordCreation = 0x1 | 0x0 465 | ``` 466 | #### Windows (Intune) 467 | OMA-URI: 468 | ``` 469 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/DisableMasterPasswordCreation 470 | ``` 471 | Value (string): 472 | ``` 473 | or 474 | ``` 475 | #### macOS 476 | ``` 477 | 478 | DisableMasterPasswordCreation 479 | | 480 | 481 | ``` 482 | #### policies.json 483 | ``` 484 | { 485 | "policies": { 486 | "DisableMasterPasswordCreation": true | false 487 | } 488 | } 489 | ``` 490 | #### Compatibility 491 | 492 | | Policy/Property Name | supported since | deprecated after | 493 | |:--- | ---:| ---:| 494 | | `DisableMasterPasswordCreation` | 68.0 | | 495 | 496 |
497 | 498 | ## DisableSecurityBypass 499 | Prevent the user from bypassing security in certain cases. 500 | 501 | `InvalidCertificate` prevents adding an exception when an invalid certificate is shown. 502 | 503 | `SafeBrowsing` prevents selecting "ignore the risk" and visiting a harmful site anyway. 504 | 505 | **CCK2 Equivalent:** N/A\ 506 | **Preferences Affected:** `security.certerror.hideAddException`,`browser.safebrowsing.allowOverride` 507 | 508 | #### Windows (GPO) 509 | ``` 510 | Software\Policies\Mozilla\Thunderbird\DisableSecurityBypass\InvalidCertificate = 0x1 | 0x0 511 | Software\Policies\Mozilla\Thunderbird\DisableSecurityBypass\SafeBrowsing = 0x1 | 0x0 512 | ``` 513 | #### Windows (Intune) 514 | OMA-URI: 515 | ``` 516 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/P_DisableSecurityBypass_InvalidCertificate 517 | ``` 518 | Value (string): 519 | ``` 520 | or 521 | ``` 522 | OMA-URI: 523 | ``` 524 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/P_DisableSecurityBypass_SafeBrowsing 525 | ``` 526 | Value (string): 527 | ``` 528 | or 529 | ``` 530 | 531 | #### macOS 532 | ``` 533 | 534 | DisableSecurityBypass 535 | 536 | InvalidCertificate 537 | | 538 | 539 | | 540 | 541 | 542 | ``` 543 | #### policies.json 544 | ``` 545 | { 546 | "policies": { 547 | "DisableSecurityBypass": { 548 | "InvalidCertificate": true | false, 549 | "SafeBrowsing": true | false 550 | } 551 | } 552 | } 553 | ``` 554 | #### Compatibility 555 | 556 | | Policy/Property Name | supported since | deprecated after | 557 | |:--- | ---:| ---:| 558 | | `DisableSecurityBypass`
`DisableSecurityBypass_InvalidCertificate`
`DisableSecurityBypass_SafeBrowsing` | 68.0 | | 559 | 560 |
561 | 562 | ## Extensions 563 | Control the installation, uninstallation and locking of extensions. 564 | 565 | `Install` is a list of URLs or native paths for extensions to be installed. 566 | 567 | `Uninstall` is a list of extension IDs that should be uninstalled if found. 568 | 569 | `Locked` is a list of extension IDs that the user cannot disable or uninstall. 570 | 571 | **CCK2 Equivalent:** `addons`\ 572 | **Preferences Affected:** N/A 573 | 574 | #### Windows (GPO) 575 | ``` 576 | Software\Policies\Mozilla\Thunderbird\Extensions\Install\1 = "https://addons.thunderbird.net/thunderbird/downloads/somefile.xpi" 577 | Software\Policies\Mozilla\Thunderbird\Extensions\Install\2 = "//path/to/xpi" 578 | Software\Policies\Mozilla\Thunderbird\Extensions\Uninstall\1 = "bad_addon_id@mozilla.org" 579 | Software\Policies\Mozilla\Thunderbird\Extensions\Locked\1 = "addon_id@mozilla.org" 580 | ``` 581 | #### macOS 582 | ``` 583 | 584 | Extensions 585 | 586 | Install 587 | 588 | https://addons.thunderbird.net/thunderbird/downloads/somefile.xpi 589 | //path/to/xpi 590 | 591 | Uninstall 592 | 593 | bad_addon_id@mozilla.org 594 | 595 | Locked 596 | 597 | addon_id@mozilla.org 598 | 599 | 600 | 601 | ``` 602 | #### policies.json 603 | ``` 604 | { 605 | "policies": { 606 | "Extensions": { 607 | "Install": ["https://addons.thunderbird.net/thunderbird/downloads/somefile.xpi", "//path/to/xpi"], 608 | "Uninstall": ["bad_addon_id@mozilla.org"], 609 | "Locked": ["addon_id@mozilla.org"] 610 | } 611 | } 612 | } 613 | ``` 614 | #### Compatibility 615 | 616 | | Policy/Property Name | supported since | deprecated after | 617 | |:--- | ---:| ---:| 618 | | `Extensions`
`Extensions_Install`
`Extensions_Uninstall`
`Extensions_Locked` | 68.0 | | 619 | 620 |
621 | 622 | ## ExtensionSettings 623 | This policy is hardly implemented in Thunderbird 68. Only the blocked install message for a given extension can be set. 624 | 625 | | Name | Description | 626 | | --- | --- | 627 | | `blocked_install_message` | This maps to a string specifying the error message to display to users if they're blocked from installing an extension. This setting allows you to append text to the generic error message displayed when the extension is blocked. This could be be used to direct users to your help desk, explain why a particular extension is blocked, or something else. 628 | 629 | **CCK2 Equivalent:** N/A\ 630 | **Preferences Affected:** N/A 631 | 632 | #### Windows (GPO) 633 | ``` 634 | Software\Policies\Mozilla\Thunderbird\ExtensionSettings (REG_MULTI_SZ) = 635 | { 636 | "uBlock0@raymondhill.net": { 637 | "blocked_install_message": "Custom error message.", 638 | } 639 | } 640 | ``` 641 | #### Windows (Intune) 642 | OMA-URI: 643 | ``` 644 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird~Extensions/ExtensionSettings 645 | ``` 646 | Value (string): 647 | ``` 648 | 649 | 653 | ``` 654 | #### macOS 655 | ``` 656 | 657 | ExtensionSettings 658 | 659 | uBlock0@raymondhill.net 660 | 661 | blocked_install_message 662 | Custom error message. 663 | 664 | 665 | 666 | ``` 667 | #### policies.json 668 | ``` 669 | { 670 | "policies": { 671 | "ExtensionSettings": { 672 | "uBlock0@raymondhill.net": { 673 | "blocked_install_message": "Custom error message.", 674 | } 675 | } 676 | } 677 | } 678 | ``` 679 | #### Compatibility 680 | 681 | | Policy/Property Name | supported since | deprecated after | 682 | |:--- | ---:| ---:| 683 | | `ExtensionSettings`
`ExtensionSettings_[name]`
`ExtensionSettings_[name]_blocked_install_message` | 68.0 | | 684 | 685 |
686 | 687 | ## ExtensionUpdate 688 | Control extension updates. 689 | 690 | **CCK2 Equivalent:** N/A\ 691 | **Preferences Affected:** `extensions.update.enabled` 692 | 693 | #### Windows (GPO) 694 | ``` 695 | Software\Policies\Mozilla\Thunderbird\ExtensionUpdate = 0x1 | 0x0 696 | ``` 697 | #### Windows (Intune) 698 | OMA-URI: 699 | ``` 700 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/ExtensionUpdate 701 | ``` 702 | Value (string): 703 | ``` 704 | or 705 | ``` 706 | #### macOS 707 | ``` 708 | 709 | ExtensionUpdate 710 | | 711 | 712 | ``` 713 | #### policies.json 714 | ``` 715 | { 716 | "policies": { 717 | "ExtensionUpdate": true | false 718 | } 719 | } 720 | ``` 721 | #### Compatibility 722 | 723 | | Policy/Property Name | supported since | deprecated after | 724 | |:--- | ---:| ---:| 725 | | `ExtensionUpdate` | 68.0 | | 726 | 727 |
728 | 729 | ## InstallAddonsPermission 730 | Configure the default extension install policy as well as origins for extension installs are allowed. This policy does not override turning off all extension installs. 731 | 732 | `Allow` is a list of origins where extension installs are allowed. 733 | 734 | `Default` determines whether or not extension installs are allowed by default. 735 | 736 | **CCK2 Equivalent:** `permissions.install`\ 737 | **Preferences Affected:** `xpinstall.enabled` 738 | 739 | #### Windows (GPO) 740 | ``` 741 | Software\Policies\Mozilla\Thunderbird\InstallAddonsPermission\Allow\1 = "https://example.org" 742 | Software\Policies\Mozilla\Thunderbird\InstallAddonsPermission\Allow\2 = "https://example.edu" 743 | Software\Policies\Mozilla\Thunderbird\InstallAddonsPermission\Default = 0x1 | 0x0 744 | ``` 745 | #### Windows (Intune) 746 | OMA-URI: 747 | ``` 748 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird~Addons/InstallAddonsPermission_Allow 749 | ``` 750 | Value (string): 751 | ``` 752 | 753 | 754 | ``` 755 | OMA-URI: 756 | ``` 757 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird~Addons/InstallAddonsPermission_Default 758 | ``` 759 | Value (string): 760 | ``` 761 | 762 | ``` 763 | #### macOS 764 | ``` 765 | 766 | InstallAddonsPermission 767 | 768 | Allow 769 | 770 | http://example.org 771 | http://example.edu 772 | 773 | Default 774 | | 775 | 776 | 777 | ``` 778 | #### policies.json 779 | ``` 780 | { 781 | "policies": { 782 | "InstallAddonsPermission": { 783 | "Allow": ["http://example.org/", 784 | "http://example.edu/"], 785 | "Default": true | false 786 | } 787 | } 788 | } 789 | ``` 790 | #### Compatibility 791 | 792 | | Policy/Property Name | supported since | deprecated after | 793 | |:--- | ---:| ---:| 794 | | `InstallAddonsPermission`
`InstallAddonsPermission_Allow`
`InstallAddonsPermission_Default` | 68.0 | | 795 | 796 |
797 | 798 | ## Preferences 799 | Set and lock certain preferences. 800 | 801 | **CCK2 Equivalent:** `preferences`\ 802 | **Preferences Affected:** See below 803 | 804 | | Preference | Type | Default 805 | | --- | --- | --- 806 | | ~browser.cache.disk.parent_directory~ | string | Profile temporary directory 807 | |     ~If set, changes the location of the disk cache.~ This policy doesn't work. It's being worked on. 808 | | browser.fixup.dns_first_for_single_words | boolean | false 809 | |     If true, single words are sent to DNS, not directly to search. 810 | | browser.urlbar.suggest.bookmark | boolean | true 811 | |     If false, bookmarks aren't suggested when typing in the URL bar. 812 | | browser.urlbar.suggest.history | boolean | true 813 | |     If false, history isn't suggested when typing in the URL bar. 814 | | browser.urlbar.suggest.openpage | boolean | true 815 | |     If false, open tabs aren't suggested when typing in the URL bar. 816 | | network.IDN_show_punycode | boolean | false 817 | |     If true, display the punycode version of internationalized domain names. 818 | #### Windows (GPO) 819 | ``` 820 | Software\Policies\Mozilla\Thunderbird\Preferences\boolean_preference_name = 0x1 | 0x0 821 | Software\Policies\Mozilla\Thunderbird\Preferences\string_preference_name = "string_value" 822 | ``` 823 | #### Windows (Intune) 824 | OMA-URI: (periods are replaced by underscores) 825 | ``` 826 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird~Preferences/boolean_preference_name 827 | ``` 828 | Value (string): 829 | ``` 830 | or 831 | ``` 832 | #### macOS 833 | ``` 834 | 835 | Preferences 836 | 837 | boolean_preference_name 838 | | 839 | string_preference_name 840 | string_value 841 | 842 | 843 | ``` 844 | #### policies.json 845 | ``` 846 | { 847 | "policies": { 848 | "Preferences": { 849 | "boolean_preference_name": true | false, 850 | "string_preference_name": "string_value" 851 | } 852 | } 853 | } 854 | ``` 855 | #### Compatibility 856 | 857 | | Policy/Property Name | supported since | deprecated after | 858 | |:--- | ---:| ---:| 859 | | `Preferences`
`Preferences_network.IDN_show_punycode`
`Preferences_browser.fixup.dns_first_for_single_words`
`Preferences_browser.cache.disk.parent_directory`
`Preferences_browser.urlbar.suggest.openpage`
`Preferences_browser.urlbar.suggest.history`
`Preferences_browser.urlbar.suggest.bookmark` | 68.0 | | 860 | 861 |
862 | 863 | ## Proxy 864 | Configure proxy settings. These settings correspond to the connection settings in Thunderbird preferences. 865 | To specify ports, append them to the hostnames with a colon (:). 866 | 867 | `Mode` is the proxy method being used. 868 | 869 | `Locked` is whether or not proxy settings can be changed. 870 | 871 | `HTTPProxy` is the HTTP proxy server. 872 | 873 | `UseHTTPProxyForAllProtocols` is whether or not the HTTP proxy should be used for all other proxies. 874 | 875 | `SSLProxy` is the SSL proxy server. 876 | 877 | `FTPProxy` is the FTP proxy server. 878 | 879 | `SOCKSProxy` is the SOCKS proxy server 880 | 881 | `SOCKSVersion` is the SOCKS version (4 or 5) 882 | 883 | `Passthrough` is list of hostnames or IP addresses that will not be proxied. Use `` to bypass proxying for all hostnames which do not contain periods. 884 | 885 | `AutoConfigURL` is a URL for proxy configuration (only used if Mode is autoConfig). 886 | 887 | `AutoLogin` means do not prompt for authentication if password is saved. 888 | 889 | `UseProxyForDNS` to use proxy DNS when using SOCKS v5. 890 | 891 | **CCK2 Equivalent:** `networkProxy*`\ 892 | **Preferences Affected:** `network.proxy.type`,`network.proxy.autoconfig_url`,`network.proxy.socks_remote_dns`,`signon.autologin.proxy`,`network.proxy.socks_version`,`network.proxy.no_proxies_on`,`network.proxy.share_proxy_settings`,`network.proxy.http`,`network.proxy.http_port`,`network.proxy.ftp`,`network.proxy.ftp_port`,`network.proxy.ssl`,`network.proxy.ssl_port`,`network.proxy.socks`,`network.proxy.socks_port` 893 | 894 | #### Windows (GPO) 895 | ``` 896 | Software\Policies\Mozilla\Thunderbird\Proxy\Mode = "none", "system", "manual", "autoDetect", "autoConfig" 897 | Software\Policies\Mozilla\Thunderbird\Proxy\Locked = 0x1 | 0x0 898 | Software\Policies\Mozilla\Thunderbird\=Proxy\HTTPProxy = https://httpproxy.example.com 899 | Software\Policies\Mozilla\Thunderbird\Proxy\UseHTTPProxyForAllProtocols = 0x1 | 0x0 900 | Software\Policies\Mozilla\Thunderbird\Proxy\SSLProxy = https://sslproxy.example.com 901 | Software\Policies\Mozilla\Thunderbird\Proxy\FTPProxy = https://ftpproxy.example.com 902 | Software\Policies\Mozilla\Thunderbird\Proxy\SOCKSProxy = https://socksproxy.example.com 903 | Software\Policies\Mozilla\Thunderbird\Proxy\SOCKSVersion = 0x4 | 0x5 904 | Software\Policies\Mozilla\Thunderbird\Proxy\Passthrough = 905 | Software\Policies\Mozilla\Thunderbird\Proxy\AutoConfigURL = URL_TO_AUTOCONFIG 906 | Software\Policies\Mozilla\Thunderbird\Proxy\AutoLogin = 0x1 | 0x0 907 | Software\Policies\Mozilla\Thunderbird\Proxy\UseProxyForDNS = 0x1 | 0x0 908 | ``` 909 | #### Windows (Intune) 910 | OMA-URI: 911 | ``` 912 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/Proxy 913 | ``` 914 | Value (string): 915 | ``` 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | ``` 930 | #### macOS 931 | ``` 932 | 933 | Proxy 934 | 935 | Mode 936 | none | system | manual | autoDetect | autoConfig 937 | Locked 938 | | 939 | HTTPProxy 940 | https://httpproxy.example.com 941 | UseHTTPProxyForAllProtocols 942 | | 943 | SSLProxy 944 | https://sslproxy.example.com 945 | FTPProxy 946 | https://ftpproxy.example.com 947 | SOCKSProxy 948 | https://socksproxy.example.com 949 | SOCKSVersion 950 | 4 | 5 951 | Passthrough 952 | <local>> 953 | AutoConfigURL 954 | URL_TO_AUTOCONFIG 955 | AutoLogin 956 | | 957 | UseProxyForDNS 958 | | 959 | 960 | 961 | ``` 962 | #### policies.json 963 | ``` 964 | { 965 | "policies": { 966 | "Proxy": { 967 | "Mode": "none", "system", "manual", "autoDetect", "autoConfig", 968 | "Locked": true | false, 969 | "HTTPProxy": "hostname", 970 | "UseHTTPProxyForAllProtocols": true | false, 971 | "SSLProxy": "hostname", 972 | "FTPProxy": "hostname", 973 | "SOCKSProxy": "hostname", 974 | "SOCKSVersion": 4 | 5 975 | "Passthrough": "", 976 | "AutoConfigURL": "URL_TO_AUTOCONFIG", 977 | "AutoLogin": true | false, 978 | "UseProxyForDNS": true | false 979 | } 980 | } 981 | } 982 | ``` 983 | #### Compatibility 984 | 985 | | Policy/Property Name | supported since | deprecated after | 986 | |:--- | ---:| ---:| 987 | | `Proxy`
`Proxy_Mode`
`Proxy_Locked`
`Proxy_AutoConfigURL`
`Proxy_FTPProxy`
`Proxy_HTTPProxy`
`Proxy_SSLProxy`
`Proxy_SOCKSProxy`
`Proxy_SOCKSVersion`
`Proxy_UseHTTPProxyForAllProtocols`
`Proxy_Passthrough`
`Proxy_UseProxyForDNS`
`Proxy_AutoLogin` | 68.0 | | 988 | 989 |
990 | 991 | ## RequestedLocales 992 | Set the the list of requested locales for the application in order of preference. It will cause the corresponding language pack to become active. 993 | 994 | Note: For Thunderbird 68, this can now be a string so that you can specify an empty value. 995 | 996 | **CCK2 Equivalent:** N/A\ 997 | **Preferences Affected:** N/A 998 | #### Windows (GPO) 999 | ``` 1000 | Software\Policies\Mozilla\Thunderbird\RequestedLocales\1 = "de" 1001 | Software\Policies\Mozilla\Thunderbird\RequestedLocales\2 = "en-US" 1002 | 1003 | or 1004 | 1005 | Software\Policies\Mozilla\Thunderbird\RequestedLocales = "de,en-US" 1006 | ``` 1007 | #### Windows (Intune) 1008 | OMA-URI: 1009 | ``` 1010 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/RequestedLocalesString 1011 | ``` 1012 | Value (string): 1013 | ``` 1014 | 1015 | 1016 | ``` 1017 | #### macOS 1018 | ``` 1019 | 1020 | RequestedLocales 1021 | 1022 | de 1023 | en-US 1024 | 1025 | 1026 | 1027 | or 1028 | 1029 | 1030 | RequestedLocales 1031 | de,en-US 1032 | 1033 | 1034 | ``` 1035 | #### policies.json 1036 | ``` 1037 | { 1038 | "policies": { 1039 | "RequestedLocales": ["de", "en-US"] 1040 | } 1041 | } 1042 | 1043 | or 1044 | 1045 | { 1046 | "policies": { 1047 | "RequestedLocales": "de,en-US" 1048 | } 1049 | } 1050 | ``` 1051 | 1052 | 1053 | #### Compatibility 1054 | 1055 | | Policy/Property Name | supported since | deprecated after | 1056 | |:--- | ---:| ---:| 1057 | | `RequestedLocales` | 68.0 | | 1058 | 1059 |
1060 | 1061 | ## SSLVersionMax 1062 | 1063 | Set and lock the maximum version of TLS. 1064 | 1065 | **CCK2 Equivalent:** N/A\ 1066 | **Preferences Affected:** `security.tls.version.max` 1067 | 1068 | #### Windows (GPO) 1069 | ``` 1070 | Software\Policies\Mozilla\Thunderbird\SSLVersionMax = "tls1" | "tls1.1" | "tls1.2" | "tls1.3" 1071 | ``` 1072 | #### Windows (Intune) 1073 | OMA-URI: 1074 | ``` 1075 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/SSLVersionMax 1076 | ``` 1077 | Value (string): 1078 | ``` 1079 | 1080 | 1081 | ``` 1082 | #### macOS 1083 | ``` 1084 | 1085 | SSLVersionMax 1086 | tls1 | tls1.1 | tls1.2 | tls1.3 1087 | 1088 | ``` 1089 | 1090 | #### policies.json 1091 | ``` 1092 | { 1093 | "policies": { 1094 | "SSLVersionMax": "tls1" | "tls1.1" | "tls1.2" | "tls1.3" 1095 | } 1096 | } 1097 | ``` 1098 | #### Compatibility 1099 | 1100 | | Policy/Property Name | supported since | deprecated after | 1101 | |:--- | ---:| ---:| 1102 | | `SSLVersionMax` | 68.0 | | 1103 | 1104 |
1105 | 1106 | ## SSLVersionMin 1107 | 1108 | Set and lock the minimum version of TLS. 1109 | 1110 | **CCK2 Equivalent:** N/A\ 1111 | **Preferences Affected:** `security.tls.version.min` 1112 | 1113 | #### Windows (GPO) 1114 | ``` 1115 | Software\Policies\Mozilla\Thunderbird\SSLVersionMin = "tls1" | "tls1.1" | "tls1.2" | "tls1.3" 1116 | ``` 1117 | #### Windows (Intune) 1118 | OMA-URI: 1119 | ``` 1120 | ./Device/Vendor/MSFT/Policy/Config/Thunderbird~Policy~thunderbird/SSLVersionMin 1121 | ``` 1122 | Value (string): 1123 | ``` 1124 | 1125 | 1126 | ``` 1127 | #### macOS 1128 | ``` 1129 | 1130 | SSLVersionMin 1131 | tls1 | tls1.1 | tls1.2 | tls1.3 1132 | 1133 | ``` 1134 | 1135 | #### policies.json 1136 | ``` 1137 | { 1138 | "policies": { 1139 | "SSLVersionMin": "tls1" | "tls1.1" | "tls1.2" | "tls1.3" 1140 | } 1141 | } 1142 | ``` 1143 | #### Compatibility 1144 | 1145 | | Policy/Property Name | supported since | deprecated after | 1146 | |:--- | ---:| ---:| 1147 | | `SSLVersionMin` | 68.0 | | 1148 | 1149 |
1150 | 1151 | 1152 | -------------------------------------------------------------------------------- /templates/esr68/mac/README.md: -------------------------------------------------------------------------------- 1 | Starting with Thunderbird 68, Thunderbird supports configuration files on macOS. 2 | 3 | An example plist file with all options is available here: 4 | 5 | [org.mozilla.thunderbird.plist](org.mozilla.thunderbird.plist) 6 | 7 | If you want to set specific options from the command line, we also provide flattened shortcuts to any item that is nested in the plist file. 8 | 9 | For example, this policy: 10 | ```json 11 | { 12 | "policies": { 13 | "Proxy": { 14 | "HTTPProxy": "proxy.example.com:80/" 15 | } 16 | } 17 | } 18 | ``` 19 | which would be set in the plist file like this: 20 | ```xml 21 | Proxy 22 | 23 | HTTPProxy 24 | proxy.example.com:80 25 | 26 | ``` 27 | Correctly writing the nested value with the `defaults` command can be hard, so you can flatten the keys by separating them with `__`, like this: 28 | ```bash 29 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird Proxy__HTTPProxy -string "proxy.example.com:80" 30 | ``` 31 | Before any command line policies will work, you need to enable policies like this: 32 | ```bash 33 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird EnterprisePoliciesEnabled -bool TRUE 34 | ``` 35 | -------------------------------------------------------------------------------- /templates/esr68/mac/org.mozilla.thunderbird.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EnterprisePoliciesEnabled 6 | 7 | AppUpdateURL 8 | https://www.example.com/update.xml 9 | BlockAboutAddons 10 | 11 | BlockAboutConfig 12 | 13 | BlockAboutProfiles 14 | 15 | BlockAboutSupport 16 | 17 | Certificates 18 | 19 | ImportEnterpriseRoots 20 | 21 | Install 22 | 23 | cert1.der 24 | cert2.pem 25 | 26 | 27 | DisableAppUpdate 28 | 29 | DisableDeveloperTools 30 | 31 | DisableMasterPasswordCreation 32 | 33 | DisableSecurityBypass 34 | 35 | InvalidCertificate 36 | 37 | SafeBrowsing 38 | 39 | 40 | Extensions 41 | 42 | Install 43 | 44 | https://addons.thunderbird.net/thunderbird/downloads/file/1053714/ghostery_privacy_ad_blocker-8.2.4-an+fx.xpi 45 | 46 | Uninstall 47 | 48 | Locked 49 | 50 | thunderbird@ghostery.com 51 | 52 | 53 | ExtensionUpdate 54 | 55 | InstallAddonsPermission 56 | 57 | Allow 58 | 59 | https://example.org 60 | https://example.edu 61 | 62 | Default 63 | 64 | 65 | Proxy 66 | 67 | Mode 68 | manual 69 | HTTPProxy 70 | proxy.example.com:80 71 | Locked 72 | 73 | 74 | RequestedLocales 75 | 76 | de 77 | en-US 78 | 79 | SSLVersionMin 80 | tls1.2 81 | SSLVersionMax 82 | tls1.3 83 | 84 | -------------------------------------------------------------------------------- /templates/esr68/windows/de-DE/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr68/windows/en-US/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr68/windows/es-ES/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr68/windows/fr-FR/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr68/windows/it-IT/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr68/windows/mozilla.admx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr68/windows/thunderbird.admx: -------------------------------------------------------------------------------- 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 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 259 | 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | none 269 | 270 | 271 | 272 | 273 | system 274 | 275 | 276 | 277 | 278 | manual 279 | 280 | 281 | 282 | 283 | autoDetect 284 | 285 | 286 | 287 | 288 | autoConfig 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | 309 | 310 | 311 | 312 | 313 | 314 | 315 | 316 | 317 | 318 | 319 | 320 | 321 | 322 | 323 | 324 | 325 | 326 | 327 | 328 | 329 | 330 | 331 | 332 | 333 | 334 | 335 | 336 | 337 | 338 | 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | tls1 365 | 366 | 367 | 368 | 369 | tls1.1 370 | 371 | 372 | 373 | 374 | tls1.2 375 | 376 | 377 | 378 | 379 | tls1.3 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | tls1 393 | 394 | 395 | 396 | 397 | tls1.1 398 | 399 | 400 | 401 | 402 | tls1.2 403 | 404 | 405 | 406 | 407 | tls1.3 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | -------------------------------------------------------------------------------- /templates/esr68/windows/zh-TW/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr78/mac/README.md: -------------------------------------------------------------------------------- 1 | Starting with Thunderbird 68, Thunderbird supports configuration files on macOS. 2 | 3 | An example plist file with all options is available here: 4 | 5 | [org.mozilla.thunderbird.plist](org.mozilla.thunderbird.plist) 6 | 7 | If you want to set specific options from the command line, we also provide flattened shortcuts to any item that is nested in the plist file. 8 | 9 | For example, this policy: 10 | ```json 11 | { 12 | "policies": { 13 | "Proxy": { 14 | "HTTPProxy": "proxy.example.com:80/" 15 | } 16 | } 17 | } 18 | ``` 19 | which would be set in the plist file like this: 20 | ```xml 21 | Proxy 22 | 23 | HTTPProxy 24 | proxy.example.com:80 25 | 26 | ``` 27 | Correctly writing the nested value with the `defaults` command can be hard, so you can flatten the keys by separating them with `__`, like this: 28 | ```bash 29 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird Proxy__HTTPProxy -string "proxy.example.com:80" 30 | ``` 31 | Before any command line policies will work, you need to enable policies like this: 32 | ```bash 33 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird EnterprisePoliciesEnabled -bool TRUE 34 | ``` 35 | -------------------------------------------------------------------------------- /templates/esr78/mac/org.mozilla.thunderbird.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EnterprisePoliciesEnabled 6 | 7 | AppAutoUpdate 8 | 9 | AppUpdateURL 10 | https://www.example.com/update.xml 11 | Authentication 12 | 13 | SPNEGO 14 | 15 | mydomain.com 16 | https://myotherdomain.com 17 | 18 | Delegated 19 | 20 | mydomain.com 21 | https://myotherdomain.com 22 | 23 | NTLM 24 | 25 | mydomain.com 26 | https://myotherdomain.com 27 | 28 | AllowNonFQDN 29 | 30 | SPNEGO 31 | 32 | NTLM 33 | 34 | 35 | AllowProxies 36 | 37 | SPNEGO 38 | 39 | NTLM 40 | 41 | 42 | PrivateBrowsing 43 | 44 | Locked 45 | 46 | 47 | BlockAboutAddons 48 | 49 | BlockAboutConfig 50 | 51 | BlockAboutProfiles 52 | 53 | BlockAboutSupport 54 | 55 | CaptivePortal 56 | 57 | Certificates 58 | 59 | ImportEnterpriseRoots 60 | 61 | Install 62 | 63 | cert1.der 64 | cert2.pem 65 | 66 | 67 | Cookies 68 | 69 | Allow 70 | 71 | https://www.example.org/ 72 | 73 | Block 74 | 75 | https://www.example.edu/ 76 | 77 | Default 78 | 79 | AcceptThirdParty 80 | never 81 | ExpireAtSessionEnd 82 | 83 | Locked 84 | 85 | 86 | DefaultDownloadDirectory 87 | ${home}/Downloads 88 | DownloadDirectory 89 | ${home}/Downloads 90 | DisableAppUpdate 91 | 92 | DisabledCiphers 93 | 94 | TLS_DHE_RSA_WITH_AES_128_CBC_SHA 95 | 96 | TLS_DHE_RSA_WITH_AES_256_CBC_SHA 97 | 98 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 99 | 100 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 101 | 102 | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 103 | 104 | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 105 | 106 | TLS_RSA_WITH_AES_128_CBC_SHA 107 | 108 | TLS_RSA_WITH_AES_256_CBC_SHA 109 | 110 | TLS_RSA_WITH_3DES_EDE_CBC_SHA 111 | 112 | 113 | DisableDeveloperTools 114 | 115 | DisableMasterPasswordCreation 116 | 117 | DisablePasswordReveal 118 | 119 | DisableSafeMode 120 | 121 | DisableSecurityBypass 122 | 123 | InvalidCertificate 124 | 125 | SafeBrowsing 126 | 127 | 128 | DisableSystemAddonUpdate 129 | 130 | DisableTelemetry 131 | 132 | Extensions 133 | 134 | Install 135 | 136 | https://addons.thunderbird.net/thunderbird/downloads/file/1053714/ghostery_privacy_ad_blocker-8.2.4-an+fx.xpi 137 | 138 | Uninstall 139 | 140 | Locked 141 | 142 | thunderbird@ghostery.com 143 | 144 | 145 | ExtensionSettings 146 | 147 | * 148 | 149 | blocked_install_message 150 | Custom error message. 151 | install_sources 152 | 153 | https://addons.thunderbird.net/ 154 | 155 | installation_mode 156 | blocked 157 | 158 | 159 | ExtensionUpdate 160 | 161 | HardwareAcceleration 162 | 163 | InstallAddonsPermission 164 | 165 | Allow 166 | 167 | https://example.org 168 | https://example.edu 169 | 170 | Default 171 | 172 | 173 | PasswordManagerEnabled 174 | 175 | Proxy 176 | 177 | Mode 178 | manual 179 | HTTPProxy 180 | proxy.example.com:80 181 | Locked 182 | 183 | 184 | RequestedLocales 185 | 186 | de 187 | en-US 188 | 189 | SSLVersionMin 190 | tls1.2 191 | SSLVersionMax 192 | tls1.3 193 | 194 | -------------------------------------------------------------------------------- /templates/esr78/windows/de-DE/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr78/windows/en-US/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr78/windows/es-ES/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr78/windows/fr-FR/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr78/windows/it-IT/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr78/windows/mozilla.admx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr78/windows/ru-RU/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr78/windows/zh-CN/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr78/windows/zh-TW/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr91/mac/README.md: -------------------------------------------------------------------------------- 1 | Starting with Thunderbird 68, Thunderbird supports configuration files on macOS. 2 | 3 | An example plist file with all options is available here: 4 | 5 | [org.mozilla.thunderbird.plist](org.mozilla.thunderbird.plist) 6 | 7 | If you want to set specific options from the command line, we also provide flattened shortcuts to any item that is nested in the plist file. 8 | 9 | For example, this policy: 10 | ```json 11 | { 12 | "policies": { 13 | "Proxy": { 14 | "HTTPProxy": "proxy.example.com:80/" 15 | } 16 | } 17 | } 18 | ``` 19 | which would be set in the plist file like this: 20 | ```xml 21 | Proxy 22 | 23 | HTTPProxy 24 | proxy.example.com:80 25 | 26 | ``` 27 | Correctly writing the nested value with the `defaults` command can be hard, so you can flatten the keys by separating them with `__`, like this: 28 | ```bash 29 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird Proxy__HTTPProxy -string "proxy.example.com:80" 30 | ``` 31 | Before any command line policies will work, you need to enable policies like this: 32 | ```bash 33 | sudo defaults write /Library/Preferences/org.mozilla.thunderbird EnterprisePoliciesEnabled -bool TRUE 34 | ``` 35 | -------------------------------------------------------------------------------- /templates/esr91/mac/org.mozilla.thunderbird.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | EnterprisePoliciesEnabled 6 | 7 | AppAutoUpdate 8 | 9 | AppUpdateURL 10 | https://www.example.com/update.xml 11 | Authentication 12 | 13 | SPNEGO 14 | 15 | mydomain.com 16 | https://myotherdomain.com 17 | 18 | Delegated 19 | 20 | mydomain.com 21 | https://myotherdomain.com 22 | 23 | NTLM 24 | 25 | mydomain.com 26 | https://myotherdomain.com 27 | 28 | AllowNonFQDN 29 | 30 | SPNEGO 31 | 32 | NTLM 33 | 34 | 35 | AllowProxies 36 | 37 | SPNEGO 38 | 39 | NTLM 40 | 41 | 42 | PrivateBrowsing 43 | 44 | Locked 45 | 46 | 47 | BlockAboutAddons 48 | 49 | BlockAboutConfig 50 | 51 | BlockAboutProfiles 52 | 53 | BlockAboutSupport 54 | 55 | CaptivePortal 56 | 57 | Certificates 58 | 59 | ImportEnterpriseRoots 60 | 61 | Install 62 | 63 | cert1.der 64 | cert2.pem 65 | 66 | 67 | Cookies 68 | 69 | Allow 70 | 71 | https://www.example.org/ 72 | 73 | Block 74 | 75 | https://www.example.edu/ 76 | 77 | Default 78 | 79 | AcceptThirdParty 80 | never 81 | ExpireAtSessionEnd 82 | 83 | Locked 84 | 85 | 86 | DefaultDownloadDirectory 87 | ${home}/Downloads 88 | DownloadDirectory 89 | ${home}/Downloads 90 | DNSOverHTTPS 91 | 92 | Enabled 93 | 94 | ProviderURL 95 | URL_TO_ALTERNATE_PROVIDER 96 | Locked 97 | 98 | ExcludedDomains 99 | 100 | example.com 101 | 102 | 103 | DisableAppUpdate 104 | 105 | DisableBuiltinPDFViewer 106 | 107 | DisabledCiphers 108 | 109 | TLS_DHE_RSA_WITH_AES_128_CBC_SHA 110 | 111 | TLS_DHE_RSA_WITH_AES_256_CBC_SHA 112 | 113 | TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 114 | 115 | TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 116 | 117 | TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 118 | 119 | TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 120 | 121 | TLS_RSA_WITH_AES_128_CBC_SHA 122 | 123 | TLS_RSA_WITH_AES_256_CBC_SHA 124 | 125 | TLS_RSA_WITH_3DES_EDE_CBC_SHA 126 | 127 | TLS_RSA_WITH_AES_128_GCM_SHA256 128 | 129 | TLS_RSA_WITH_AES_256_GCM_SHA384 130 | 131 | 132 | DisableDeveloperTools 133 | 134 | DisableMasterPasswordCreation 135 | 136 | DisablePasswordReveal 137 | 138 | DisableSafeMode 139 | 140 | DisableSecurityBypass 141 | 142 | InvalidCertificate 143 | 144 | SafeBrowsing 145 | 146 | 147 | DisableSystemAddonUpdate 148 | 149 | DisableTelemetry 150 | 151 | Extensions 152 | 153 | Install 154 | 155 | https://addons.thunderbird.net/thunderbird/downloads/file/1053714/ghostery_privacy_ad_blocker-8.2.4-an+fx.xpi 156 | 157 | Uninstall 158 | 159 | Locked 160 | 161 | thunderbird@ghostery.com 162 | 163 | 164 | ExtensionSettings 165 | 166 | * 167 | 168 | blocked_install_message 169 | Custom error message. 170 | install_sources 171 | 172 | https://addons.thunderbird.net/ 173 | 174 | installation_mode 175 | blocked 176 | 177 | 178 | ExtensionUpdate 179 | 180 | HardwareAcceleration 181 | 182 | InstallAddonsPermission 183 | 184 | Allow 185 | 186 | https://example.org 187 | https://example.edu 188 | 189 | Default 190 | 191 | 192 | PrimaryPassword 193 | 194 | NetworkPrediction 195 | 196 | OfferToSaveLogins 197 | 198 | OfferToSaveLoginsDefault 199 | 200 | PasswordManagerEnabled 201 | 202 | PDFjs 203 | 204 | Enabled 205 | 206 | EnablePermissions 207 | 208 | 209 | Proxy 210 | 211 | Mode 212 | manual 213 | HTTPProxy 214 | proxy.example.com:80 215 | Locked 216 | 217 | 218 | RequestedLocales 219 | 220 | de 221 | en-US 222 | 223 | SSLVersionMin 224 | tls1.2 225 | SSLVersionMax 226 | tls1.3 227 | 228 | -------------------------------------------------------------------------------- /templates/esr91/windows/de-DE/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr91/windows/en-US/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr91/windows/es-ES/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr91/windows/fr-FR/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr91/windows/it-IT/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr91/windows/mozilla.admx: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr91/windows/ru-RU/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr91/windows/zh-CN/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /templates/esr91/windows/zh-TW/mozilla.adml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Mozilla 8 | 9 | 10 | 11 | --------------------------------------------------------------------------------