!import
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
1 //@line 39 "/home/visbrero/mnt/roisin/rev_control/hg/mozilla/mail/extensions/smime/content/am-smime.js"
2
3 const nsIX509CertDB = Components.interfaces.nsIX509CertDB;
4 const nsX509CertDBContractID = "@mozilla.org/security/x509certdb;1";
5 const nsIX509Cert = Components.interfaces.nsIX509Cert;
6
7 const email_recipient_cert_usage = 5;
8 const email_signing_cert_usage = 4;
9
10 var gIdentity;
11 var gPref = null;
12 var gEncryptionCertName = null;
13 var gHiddenEncryptionPolicy = null;
14 var gEncryptionChoices = null;
15 var gSignCertName = null;
16 var gSignMessages = null;
17 var gEncryptAlways = null;
18 var gNeverEncrypt = null;
19 var gBundle = null;
20 var gBrandBundle;
21 var gSmimePrefbranch;
22 var gEncryptionChoicesLocked;
23 var gSigningChoicesLocked;
24 const kEncryptionCertPref = "identity.encryption_cert_name";
25 const kSigningCertPref = "identity.signing_cert_name";
26
onInit
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
27 function onInit()
28 {
29 // initialize all of our elements based on the current identity values....
30 gEncryptionCertName = document.getElementById(kEncryptionCertPref);
31 gHiddenEncryptionPolicy = document.getElementById("identity.encryptionpolicy");
32 gEncryptionChoices = document.getElementById("encryptionChoices");
33 gSignCertName = document.getElementById(kSigningCertPref);
34 gSignMessages = document.getElementById("identity.sign_mail");
35 gEncryptAlways = document.getElementById("encrypt_mail_always");
36 gNeverEncrypt = document.getElementById("encrypt_mail_never");
37 gBundle = document.getElementById("bundle_smime");
38 gBrandBundle = document.getElementById("bundle_brand");
39
40 gEncryptionChoicesLocked = false;
41 gSigningChoicesLocked = false;
42
43 gEncryptionCertName.value = gIdentity.getUnicharAttribute("encryption_cert_name");
44
45 gEncryptionChoices.value = gIdentity.getIntAttribute("encryptionpolicy");
46
47 if (!gEncryptionCertName.value)
48 {
49 gEncryptAlways.setAttribute("disabled", true);
50 gNeverEncrypt.setAttribute("disabled", true);
51 }
52 else {
53 enableEncryptionControls(true);
54 }
55
56 gSignCertName.value = gIdentity.getUnicharAttribute("signing_cert_name");
57 gSignMessages.checked = gIdentity.getBoolAttribute("sign_mail");
58 if (!gSignCertName.value)
59 {
60 gSignMessages.setAttribute("disabled", true);
61 }
62 else {
63 enableSigningControls(true);
64 }
65
66 // Always start with enabling signing and encryption cert select buttons.
67 // This will keep the visibility of buttons in a sane state as user
68 // jumps from security panel of one account to another.
69 enableCertSelectButtons();
70
71 // Disable all locked elements on the panel
72 onLockPreference();
73 }
74
onPreInit
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
75 function onPreInit(account, accountValues)
76 {
77 gIdentity = account.defaultIdentity;
78 }
79
onSave
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
80 function onSave()
81 {
82 // find out which radio for the encryption radio group is selected and set that on our hidden encryptionChoice pref....
83 var newValue = gEncryptionChoices.value;
84 gHiddenEncryptionPolicy.setAttribute('value', newValue);
85 gIdentity.setIntAttribute("encryptionpolicy", newValue);
86 gIdentity.setUnicharAttribute("encryption_cert_name", gEncryptionCertName.value);
87
88 gIdentity.setBoolAttribute("sign_mail", gSignMessages.checked);
89 gIdentity.setUnicharAttribute("signing_cert_name", gSignCertName.value);
90 }
91
onLockPreference
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
92 function onLockPreference()
93 {
94 var initPrefString = "mail.identity";
95 var finalPrefString;
96
97 var prefService = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService);
98
99 var allPrefElements = [
100 { prefstring:"signingCertSelectButton", id:"signingCertSelectButton"},
101 { prefstring:"encryptionCertSelectButton", id:"encryptionCertSelectButton"},
102 { prefstring:"sign_mail", id:"identity.sign_mail"},
103 { prefstring:"encryptionpolicy", id:"encryptionChoices"}
104 ];
105
106 finalPrefString = initPrefString + "." + gIdentity.key + ".";
107 gSmimePrefbranch = prefService.getBranch(finalPrefString);
108
109 disableIfLocked( allPrefElements );
110 }
111
112
113 // Does the work of disabling an element given the array which contains xul id/prefstring pairs.
114 // Also saves the id/locked state in an array so that other areas of the code can avoid
115 // stomping on the disabled state indiscriminately.
disableIfLocked
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
116 function disableIfLocked( prefstrArray )
117 {
118 var i;
119 for (i=0; i<prefstrArray.length; i++) {
120 var id = prefstrArray[i].id;
121 var element = document.getElementById(id);
122 if (gSmimePrefbranch.prefIsLocked(prefstrArray[i].prefstring)) {
123 // If encryption choices radio group is locked, make sure the individual
124 // choices in the group are locked. Set a global (gEncryptionChoicesLocked)
125 // indicating the status so that locking can be maintained further.
126 if (id == "encryptionChoices") {
127 document.getElementById("encrypt_mail_never").setAttribute("disabled", "true");
128 document.getElementById("encrypt_mail_always").setAttribute("disabled", "true");
129 gEncryptionChoicesLocked = true;
130 }
131 // If option to sign mail is locked (with true/false set in config file), disable
132 // the corresponding checkbox and set a global (gSigningChoicesLocked) in order to
133 // honor the locking as user changes other elements on the panel.
134 if (id == "identity.sign_mail") {
135 document.getElementById("identity.sign_mail").setAttribute("disabled", "true");
136 gSigningChoicesLocked = true;
137 }
138 else {
139 element.setAttribute("disabled", "true");
140 if (id == "signingCertSelectButton") {
141 document.getElementById("signingCertClearButton").setAttribute("disabled", "true");
142 }
143 else if (id == "encryptionCertSelectButton") {
144 document.getElementById("encryptionCertClearButton").setAttribute("disabled", "true");
145 }
146 }
147 }
148 }
149 }
150
getPromptService
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
151 function getPromptService()
152 {
153 var ifps = Components.interfaces.nsIPromptService;
154 var promptService = Components.classes["@mozilla.org/embedcomp/prompt-service;1"].getService();
155 if (promptService) {
156 promptService = promptService.QueryInterface(ifps);
157 }
158 return promptService;
159 }
160
alertUser
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
161 function alertUser(message)
162 {
163 var ps = getPromptService();
164 if (ps) {
165 ps.alert(
166 window,
167 gBrandBundle.getString("brandShortName"),
168 message);
169 }
170 }
171
askUser
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
172 function askUser(message)
173 {
174 var ps = getPromptService();
175 if (!ps)
176 return false;
177
178 return ps.confirm(
179 window,
180 gBrandBundle.getString("brandShortName"),
181 message);
182 }
183
checkOtherCert
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
184 function checkOtherCert(nickname, pref, usage, msgNeedCertWantSame, msgWantSame, msgNeedCertWantToSelect, enabler)
185 {
186 var otherCertInfo = document.getElementById(pref);
187 if (!otherCertInfo)
188 return;
189
190 if (otherCertInfo.value == nickname)
191 // all is fine, same cert is now selected for both purposes
192 return;
193
194 var certdb = Components.classes[nsX509CertDBContractID].getService(nsIX509CertDB);
195 if (!certdb)
196 return;
197
198 if (email_recipient_cert_usage == usage) {
199 matchingOtherCert = certdb.findEmailEncryptionCert(nickname);
200 }
201 else if (email_signing_cert_usage == usage) {
202 matchingOtherCert = certdb.findEmailSigningCert(nickname);
203 }
204 else
205 return;
206
207 var userWantsSameCert = false;
208
209 if (!otherCertInfo.value.length) {
210 if (matchingOtherCert) {
211 userWantsSameCert = askUser(gBundle.getString(msgNeedCertWantSame));
212 }
213 else {
214 if (askUser(gBundle.getString(msgNeedCertWantToSelect))) {
215 smimeSelectCert(pref);
216 }
217 }
218 }
219 else {
220 if (matchingOtherCert) {
221 userWantsSameCert = askUser(gBundle.getString(msgWantSame));
222 }
223 }
224
225 if (userWantsSameCert) {
226 otherCertInfo.value = nickname;
227 enabler(true);
228 }
229 }
230
smimeSelectCert
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
231 function smimeSelectCert(smime_cert)
232 {
233 var certInfo = document.getElementById(smime_cert);
234 if (!certInfo)
235 return;
236
237 var picker = Components.classes["@mozilla.org/user_cert_picker;1"]
238 .createInstance(Components.interfaces.nsIUserCertPicker);
239 var canceled = new Object;
240 var x509cert = 0;
241 var certUsage;
242 var selectEncryptionCert;
243
244 if (smime_cert == kEncryptionCertPref) {
245 selectEncryptionCert = true;
246 certUsage = email_recipient_cert_usage;
247 } else if (smime_cert == kSigningCertPref) {
248 selectEncryptionCert = false;
249 certUsage = email_signing_cert_usage;
250 }
251
252 try {
253 x509cert = picker.pickByUsage(window,
254 certInfo.value,
255 certUsage, // this is from enum SECCertUsage
256 false, false, canceled);
257 } catch(e) {
258 canceled.value = false;
259 x509cert = null;
260 }
261
262 if (!canceled.value) {
263 if (!x509cert) {
264 var errorString;
265 if (selectEncryptionCert) {
266 errorString = "NoEncryptionCert";
267 }
268 else {
269 errorString = "NoSigningCert";
270 }
271 alertUser(gBundle.getString(errorString));
272 }
273 else {
274 certInfo.removeAttribute("disabled");
275 certInfo.value = x509cert.nickname;
276
277 if (selectEncryptionCert) {
278 enableEncryptionControls(true);
279
280 checkOtherCert(certInfo.value,
281 kSigningCertPref, email_signing_cert_usage,
282 "signing_needCertWantSame",
283 "signing_wantSame",
284 "signing_needCertWantToSelect",
285 enableSigningControls);
286 } else {
287 enableSigningControls(true);
288
289 checkOtherCert(certInfo.value,
290 kEncryptionCertPref, email_recipient_cert_usage,
291 "encryption_needCertWantSame",
292 "encryption_wantSame",
293 "encryption_needCertWantToSelect",
294 enableEncryptionControls);
295 }
296 }
297 }
298
299 enableCertSelectButtons();
300 }
301
enableEncryptionControls
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
302 function enableEncryptionControls(do_enable)
303 {
304 if (gEncryptionChoicesLocked)
305 return;
306
307 if (do_enable) {
308 gEncryptAlways.removeAttribute("disabled");
309 gNeverEncrypt.removeAttribute("disabled");
310 }
311 else {
312 gEncryptAlways.setAttribute("disabled", "true");
313 gNeverEncrypt.setAttribute("disabled", "true");
314 gEncryptionChoices.value = 0;
315 }
316 }
317
enableSigningControls
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
318 function enableSigningControls(do_enable)
319 {
320 if (gSigningChoicesLocked)
321 return;
322
323 if (do_enable) {
324 gSignMessages.removeAttribute("disabled");
325 }
326 else {
327 gSignMessages.setAttribute("disabled", "true");
328 gSignMessages.checked = false;
329 }
330 }
331
enableCertSelectButtons
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
332 function enableCertSelectButtons()
333 {
334 document.getElementById("signingCertSelectButton").removeAttribute("disabled");
335
336 if (document.getElementById('identity.signing_cert_name').value.length)
337 document.getElementById("signingCertClearButton").removeAttribute("disabled");
338 else
339 document.getElementById("signingCertClearButton").setAttribute("disabled", "true");
340
341 document.getElementById("encryptionCertSelectButton").removeAttribute("disabled");
342
343 if (document.getElementById('identity.encryption_cert_name').value.length)
344 document.getElementById("encryptionCertClearButton").removeAttribute("disabled");
345 else
346 document.getElementById("encryptionCertClearButton").setAttribute("disabled", "true");
347 }
348
smimeClearCert
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
349 function smimeClearCert(smime_cert)
350 {
351 var certInfo = document.getElementById(smime_cert);
352 if (!certInfo)
353 return;
354
355 certInfo.setAttribute("disabled", "true");
356 certInfo.value = "";
357
358 if (smime_cert == kEncryptionCertPref) {
359 enableEncryptionControls(false);
360 } else if (smime_cert == kSigningCertPref) {
361 enableSigningControls(false);
362 }
363
364 enableCertSelectButtons();
365 }
366
openCertManager
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
367 function openCertManager()
368 {
369 //check for an existing certManager window and focus it; it's not application modal
370 const kWindowMediatorContractID = "@mozilla.org/appshell/window-mediator;1";
371 const kWindowMediatorIID = Components.interfaces.nsIWindowMediator;
372 const kWindowMediator = Components.classes[kWindowMediatorContractID].getService(kWindowMediatorIID);
373 var lastCertManager = kWindowMediator.getMostRecentWindow("mozilla:certmanager");
374 if (lastCertManager)
375 lastCertManager.focus();
376 else
377 window.open('chrome://pippki/content/certManager.xul', "",
378 'chrome,centerscreen,resizable=yes,dialog=no');
379 }
380
openDeviceManager
(0 calls, 0 incl. v-uS, 0 excl. v-uS)
381 function openDeviceManager()
382 {
383 //check for an existing deviceManger window and focus it; it's not application modal
384 const kWindowMediatorContractID = "@mozilla.org/appshell/window-mediator;1";
385 const kWindowMediatorIID = Components.interfaces.nsIWindowMediator;
386 const kWindowMediator = Components.classes[kWindowMediatorContractID].getService(kWindowMediatorIID);
387 var lastCertManager = kWindowMediator.getMostRecentWindow("mozilla:devicemanager");
388 if (lastCertManager)
389 lastCertManager.focus();
390 else {
391 window.open('chrome://pippki/content/device_manager.xul', "devmgr",
392 'chrome,centerscreen,resizable=yes,dialog=no');
393 }
394 }