├── .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 |
--------------------------------------------------------------------------------