Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 const nsIFilePicker = Components.interfaces.nsIFilePicker;
6 const nsFilePicker = "@mozilla.org/filepicker;1";
7 const nsIX509CertDB = Components.interfaces.nsIX509CertDB;
8 const nsX509CertDB = "@mozilla.org/security/x509certdb;1";
9 const nsIX509Cert = Components.interfaces.nsIX509Cert;
10 const nsICertTree = Components.interfaces.nsICertTree;
11 const nsCertTree = "@mozilla.org/security/nsCertTree;1";
12 const nsIDialogParamBlock = Components.interfaces.nsIDialogParamBlock;
13 const nsDialogParamBlock = "@mozilla.org/embedcomp/dialogparam;1";
14 const nsIPKIParamBlock = Components.interfaces.nsIPKIParamBlock;
15 const nsPKIParamBlock = "@mozilla.org/security/pkiparamblock;1";
16 const nsINSSCertCache = Components.interfaces.nsINSSCertCache;
17 const nsNSSCertCache = "@mozilla.org/security/nsscertcache;1";
19 var key;
21 var selected_certs = [];
22 var selected_tree_items = [];
23 var selected_index = [];
24 var certdb;
26 var caTreeView;
27 var serverTreeView;
28 var emailTreeView;
29 var userTreeView;
30 var orphanTreeView;
32 function LoadCerts()
33 {
34 window.crypto.enableSmartCardEvents = true;
35 document.addEventListener("smartcard-insert", onSmartCardChange, false);
36 document.addEventListener("smartcard-remove", onSmartCardChange, false);
38 certdb = Components.classes[nsX509CertDB].getService(nsIX509CertDB);
39 var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
41 certcache.cacheAllCerts();
43 caTreeView = Components.classes[nsCertTree]
44 .createInstance(nsICertTree);
45 caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
46 document.getElementById('ca-tree')
47 .treeBoxObject.view = caTreeView;
49 serverTreeView = Components.classes[nsCertTree]
50 .createInstance(nsICertTree);
51 serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
52 document.getElementById('server-tree')
53 .treeBoxObject.view = serverTreeView;
55 emailTreeView = Components.classes[nsCertTree]
56 .createInstance(nsICertTree);
57 emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
58 document.getElementById('email-tree')
59 .treeBoxObject.view = emailTreeView;
61 userTreeView = Components.classes[nsCertTree]
62 .createInstance(nsICertTree);
63 userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
64 document.getElementById('user-tree')
65 .treeBoxObject.view = userTreeView;
67 orphanTreeView = Components.classes[nsCertTree]
68 .createInstance(nsICertTree);
69 orphanTreeView.loadCertsFromCache(certcache, nsIX509Cert.UNKNOWN_CERT);
70 document.getElementById('orphan-tree')
71 .treeBoxObject.view = orphanTreeView;
73 enableBackupAllButton();
74 }
76 function enableBackupAllButton()
77 {
78 var rowCnt = userTreeView.rowCount;
79 var backupAllButton=document.getElementById('mine_backupAllButton');
80 backupAllButton.disabled = (rowCnt < 1);
81 }
83 function getSelectedCerts()
84 {
85 var ca_tab = document.getElementById("ca_tab");
86 var mine_tab = document.getElementById("mine_tab");
87 var others_tab = document.getElementById("others_tab");
88 var websites_tab = document.getElementById("websites_tab");
89 var orphan_tab = document.getElementById("orphan_tab");
90 var items = null;
91 if (ca_tab.selected) {
92 items = caTreeView.selection;
93 } else if (mine_tab.selected) {
94 items = userTreeView.selection;
95 } else if (others_tab.selected) {
96 items = emailTreeView.selection;
97 } else if (websites_tab.selected) {
98 items = serverTreeView.selection;
99 } else if (orphan_tab.selected) {
100 items = orphanTreeView.selection;
101 }
102 selected_certs = [];
103 var cert = null;
104 var nr = 0;
105 if (items != null) nr = items.getRangeCount();
106 if (nr > 0) {
107 for (var i=0; i<nr; i++) {
108 var o1 = {};
109 var o2 = {};
110 items.getRangeAt(i, o1, o2);
111 var min = o1.value;
112 var max = o2.value;
113 for (var j=min; j<=max; j++) {
114 if (ca_tab.selected) {
115 cert = caTreeView.getCert(j);
116 } else if (mine_tab.selected) {
117 cert = userTreeView.getCert(j);
118 } else if (others_tab.selected) {
119 cert = emailTreeView.getCert(j);
120 } else if (websites_tab.selected) {
121 cert = serverTreeView.getCert(j);
122 } else if (orphan_tab.selected) {
123 cert = orphanTreeView.getCert(j);
124 }
125 if (cert) {
126 var sc = selected_certs.length;
127 selected_certs[sc] = cert;
128 selected_index[sc] = j;
129 }
130 }
131 }
132 }
133 }
135 function getSelectedTreeItems()
136 {
137 var ca_tab = document.getElementById("ca_tab");
138 var mine_tab = document.getElementById("mine_tab");
139 var others_tab = document.getElementById("others_tab");
140 var websites_tab = document.getElementById("websites_tab");
141 var orphan_tab = document.getElementById("orphan_tab");
142 var items = null;
143 if (ca_tab.selected) {
144 items = caTreeView.selection;
145 } else if (mine_tab.selected) {
146 items = userTreeView.selection;
147 } else if (others_tab.selected) {
148 items = emailTreeView.selection;
149 } else if (websites_tab.selected) {
150 items = serverTreeView.selection;
151 } else if (orphan_tab.selected) {
152 items = orphanTreeView.selection;
153 }
154 selected_certs = [];
155 selected_tree_items = [];
156 selected_index = [];
157 var tree_item = null;
158 var nr = 0;
159 if (items != null) nr = items.getRangeCount();
160 if (nr > 0) {
161 for (var i=0; i<nr; i++) {
162 var o1 = {};
163 var o2 = {};
164 items.getRangeAt(i, o1, o2);
165 var min = o1.value;
166 var max = o2.value;
167 for (var j=min; j<=max; j++) {
168 if (ca_tab.selected) {
169 tree_item = caTreeView.getTreeItem(j);
170 } else if (mine_tab.selected) {
171 tree_item = userTreeView.getTreeItem(j);
172 } else if (others_tab.selected) {
173 tree_item = emailTreeView.getTreeItem(j);
174 } else if (websites_tab.selected) {
175 tree_item = serverTreeView.getTreeItem(j);
176 } else if (orphan_tab.selected) {
177 tree_item = orphanTreeView.getTreeItem(j);
178 }
179 if (tree_item) {
180 var sc = selected_tree_items.length;
181 selected_tree_items[sc] = tree_item;
182 selected_index[sc] = j;
183 }
184 }
185 }
186 }
187 }
189 function ca_enableButtons()
190 {
191 var items = caTreeView.selection;
192 var nr = items.getRangeCount();
193 var toggle="false";
194 if (nr == 0) {
195 toggle="true";
196 }
197 var edit_toggle=toggle;
198 /*
199 var edit_toggle="true";
200 if (nr > 0) {
201 for (var i=0; i<nr; i++) {
202 var o1 = {};
203 var o2 = {};
204 items.getRangeAt(i, o1, o2);
205 var min = o1.value;
206 var max = o2.value;
207 var stop = false;
208 for (var j=min; j<=max; j++) {
209 var tokenName = items.tree.view.getCellText(j, "tokencol");
210 if (tokenName == "Builtin Object Token") { stop = true; } break;
211 }
212 if (stop) break;
213 }
214 if (i == nr) {
215 edit_toggle="false";
216 }
217 }
218 */
219 var enableViewButton=document.getElementById('ca_viewButton');
220 enableViewButton.setAttribute("disabled",toggle);
221 var enableEditButton=document.getElementById('ca_editButton');
222 enableEditButton.setAttribute("disabled",edit_toggle);
223 var enableExportButton=document.getElementById('ca_exportButton');
224 enableExportButton.setAttribute("disabled",toggle);
225 var enableDeleteButton=document.getElementById('ca_deleteButton');
226 enableDeleteButton.setAttribute("disabled",toggle);
227 }
229 function mine_enableButtons()
230 {
231 var items = userTreeView.selection;
232 var toggle="false";
233 if (items.getRangeCount() == 0) {
234 toggle="true";
235 }
236 var enableViewButton=document.getElementById('mine_viewButton');
237 enableViewButton.setAttribute("disabled",toggle);
238 var enableBackupButton=document.getElementById('mine_backupButton');
239 enableBackupButton.setAttribute("disabled",toggle);
240 var enableDeleteButton=document.getElementById('mine_deleteButton');
241 enableDeleteButton.setAttribute("disabled",toggle);
242 }
244 function websites_enableButtons()
245 {
246 var items = serverTreeView.selection;
247 var count_ranges = items.getRangeCount();
249 var enable_delete = false;
250 var enable_view = false;
252 if (count_ranges > 0) {
253 enable_delete = true;
254 }
256 if (count_ranges == 1) {
257 var o1 = {};
258 var o2 = {};
259 items.getRangeAt(0, o1, o2); // the first range
260 if (o1.value == o2.value) {
261 // only a single item is selected
262 try {
263 var ti = serverTreeView.getTreeItem(o1.value);
264 if (ti) {
265 if (ti.cert) {
266 enable_view = true;
267 }
268 }
269 }
270 catch (e) {
271 }
272 }
273 }
275 var enableViewButton=document.getElementById('websites_viewButton');
276 enableViewButton.setAttribute("disabled", !enable_view);
277 var enableExportButton=document.getElementById('websites_exportButton');
278 enableExportButton.setAttribute("disabled", !enable_view);
279 var enableDeleteButton=document.getElementById('websites_deleteButton');
280 enableDeleteButton.setAttribute("disabled", !enable_delete);
281 }
283 function email_enableButtons()
284 {
285 var items = emailTreeView.selection;
286 var toggle="false";
287 if (items.getRangeCount() == 0) {
288 toggle="true";
289 }
290 var enableViewButton=document.getElementById('email_viewButton');
291 enableViewButton.setAttribute("disabled",toggle);
292 var enableEditButton=document.getElementById('email_editButton');
293 enableEditButton.setAttribute("disabled",toggle);
294 var enableExportButton=document.getElementById('email_exportButton');
295 enableExportButton.setAttribute("disabled",toggle);
296 var enableDeleteButton=document.getElementById('email_deleteButton');
297 enableDeleteButton.setAttribute("disabled",toggle);
298 }
300 function orphan_enableButtons()
301 {
302 var items = orphanTreeView.selection;
303 var toggle="false";
304 if (items.getRangeCount() == 0) {
305 toggle="true";
306 }
307 var enableViewButton=document.getElementById('orphan_viewButton');
308 enableViewButton.setAttribute("disabled",toggle);
309 var enableExportButton=document.getElementById('orphan_exportButton');
310 enableExportButton.setAttribute("disabled",toggle);
311 var enableDeleteButton=document.getElementById('orphan_deleteButton');
312 enableDeleteButton.setAttribute("disabled",toggle);
313 }
315 function backupCerts()
316 {
317 getSelectedCerts();
318 var numcerts = selected_certs.length;
319 if (!numcerts)
320 return;
321 var bundle = document.getElementById("pippki_bundle");
322 var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
323 fp.init(window,
324 bundle.getString("chooseP12BackupFileDialog"),
325 nsIFilePicker.modeSave);
326 fp.appendFilter(bundle.getString("file_browse_PKCS12_spec"),
327 "*.p12");
328 fp.appendFilters(nsIFilePicker.filterAll);
329 var rv = fp.show();
330 if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
331 certdb.exportPKCS12File(null, fp.file,
332 selected_certs.length, selected_certs);
333 }
334 }
336 function backupAllCerts()
337 {
338 // Select all rows, then call doBackup()
339 var items = userTreeView.selection.selectAll();
340 backupCerts();
341 }
343 function editCerts()
344 {
345 getSelectedCerts();
346 var numcerts = selected_certs.length;
347 if (!numcerts)
348 return;
349 for (var t=0; t<numcerts; t++) {
350 var cert = selected_certs[t];
351 var certkey = cert.dbKey;
352 if (document.getElementById("ca_tab").selected) {
353 window.openDialog('chrome://pippki/content/editcacert.xul', certkey,
354 'chrome,centerscreen,modal');
355 } else if (document.getElementById("others_tab").selected) {
356 window.openDialog('chrome://pippki/content/editemailcert.xul', certkey,
357 'chrome,centerscreen,modal');
358 }
359 }
360 }
362 function restoreCerts()
363 {
364 var bundle = document.getElementById("pippki_bundle");
365 var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
366 fp.init(window,
367 bundle.getString("chooseP12RestoreFileDialog2"),
368 nsIFilePicker.modeOpen);
369 fp.appendFilter(bundle.getString("file_browse_PKCS12_spec"),
370 "*.p12; *.pfx");
371 fp.appendFilters(nsIFilePicker.filterAll);
372 if (fp.show() == nsIFilePicker.returnOK) {
373 certdb.importPKCS12File(null, fp.file);
375 var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
376 certcache.cacheAllCerts();
377 userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
378 userTreeView.selection.clearSelection();
379 caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
380 caTreeView.selection.clearSelection();
381 enableBackupAllButton();
382 }
383 }
385 function exportCerts()
386 {
387 getSelectedCerts();
388 var numcerts = selected_certs.length;
389 if (!numcerts)
390 return;
392 for (var t=0; t<numcerts; t++) {
393 exportToFile(window, selected_certs[t]);
394 }
395 }
397 function deleteCerts()
398 {
399 getSelectedTreeItems();
400 var numcerts = selected_tree_items.length;
401 if (!numcerts)
402 return;
404 var params = Components.classes[nsDialogParamBlock].createInstance(nsIDialogParamBlock);
406 var selTab = document.getElementById('certMgrTabbox').selectedItem;
407 var selTabID = selTab.getAttribute('id');
408 var t;
410 params.SetNumberStrings(numcerts+1);
412 if (selTabID == 'mine_tab')
413 {
414 params.SetString(0, selTabID);
415 }
416 else if (selTabID == "websites_tab")
417 {
418 params.SetString(0, selTabID);
419 }
420 else if (selTabID == "ca_tab")
421 {
422 params.SetString(0, selTabID);
423 }
424 else if (selTabID == "others_tab")
425 {
426 params.SetString(0, selTabID);
427 }
428 else if (selTabID == "orphan_tab")
429 {
430 params.SetString(0, selTabID);
431 }
432 else
433 {
434 return;
435 }
437 params.SetInt(0,numcerts);
438 for (t=0; t<numcerts; t++)
439 {
440 var tree_item = selected_tree_items[t];
441 var c = tree_item.cert;
442 if (!c) {
443 params.SetString(t+1, tree_item.hostPort);
444 }
445 else {
446 params.SetString(t+1, c.commonName);
447 }
449 }
451 window.openDialog('chrome://pippki/content/deletecert.xul', "",
452 'chrome,centerscreen,modal', params);
454 if (params.GetInt(1) == 1) {
455 // user closed dialog with OK
456 var treeView = null;
457 var loadParam = null;
459 selTab = document.getElementById('certMgrTabbox').selectedItem;
460 selTabID = selTab.getAttribute('id');
461 if (selTabID == 'mine_tab') {
462 treeView = userTreeView;
463 } else if (selTabID == "others_tab") {
464 treeView = emailTreeView;
465 } else if (selTabID == "websites_tab") {
466 treeView = serverTreeView;
467 } else if (selTabID == "ca_tab") {
468 treeView = caTreeView;
469 } else if (selTabID == "orphan_tab") {
470 treeView = orphanTreeView;
471 }
473 for (t=numcerts-1; t>=0; t--)
474 {
475 treeView.deleteEntryObject(selected_index[t]);
476 }
478 selected_tree_items = [];
479 selected_index = [];
480 treeView.selection.clearSelection();
481 if (selTabID == 'mine_tab') {
482 enableBackupAllButton();
483 }
484 }
485 }
487 function viewCerts()
488 {
489 getSelectedCerts();
490 var numcerts = selected_certs.length;
491 if (!numcerts)
492 return;
494 for (var t=0; t<numcerts; t++) {
495 viewCertHelper(window, selected_certs[t]);
496 }
497 }
499 function addCACerts()
500 {
501 var bundle = document.getElementById("pippki_bundle");
502 var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
503 fp.init(window,
504 bundle.getString("importCACertsPrompt"),
505 nsIFilePicker.modeOpen);
506 fp.appendFilter(bundle.getString("file_browse_Certificate_spec"),
507 "*.crt; *.cert; *.cer; *.pem; *.der");
508 fp.appendFilters(nsIFilePicker.filterAll);
509 if (fp.show() == nsIFilePicker.returnOK) {
510 certdb.importCertsFromFile(null, fp.file, nsIX509Cert.CA_CERT);
511 caTreeView.loadCerts(nsIX509Cert.CA_CERT);
512 caTreeView.selection.clearSelection();
513 }
514 }
516 function onSmartCardChange()
517 {
518 var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
519 // We've change the state of the smart cards inserted or removed
520 // that means the available certs may have changed. Update the display
521 certcache.cacheAllCerts();
522 userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
523 userTreeView.selection.clearSelection();
524 caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
525 caTreeView.selection.clearSelection();
526 serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
527 serverTreeView.selection.clearSelection();
528 emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
529 emailTreeView.selection.clearSelection();
530 orphanTreeView.loadCertsFromCache(certcache, nsIX509Cert.UNKNOWN_CERT);
531 orphanTreeView.selection.clearSelection();
532 }
534 function addEmailCert()
535 {
536 var bundle = document.getElementById("pippki_bundle");
537 var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
538 fp.init(window,
539 bundle.getString("importEmailCertPrompt"),
540 nsIFilePicker.modeOpen);
541 fp.appendFilter(bundle.getString("file_browse_Certificate_spec"),
542 "*.crt; *.cert; *.cer; *.pem; *.der");
543 fp.appendFilters(nsIFilePicker.filterAll);
544 if (fp.show() == nsIFilePicker.returnOK) {
545 certdb.importCertsFromFile(null, fp.file, nsIX509Cert.EMAIL_CERT);
546 var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
547 certcache.cacheAllCerts();
548 emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
549 emailTreeView.selection.clearSelection();
550 caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
551 caTreeView.selection.clearSelection();
552 }
553 }
555 function addWebSiteCert()
556 {
557 var bundle = document.getElementById("pippki_bundle");
558 var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
559 fp.init(window,
560 bundle.getString("importServerCertPrompt"),
561 nsIFilePicker.modeOpen);
562 fp.appendFilter(bundle.getString("file_browse_Certificate_spec"),
563 "*.crt; *.cert; *.cer; *.pem; *.der");
564 fp.appendFilters(nsIFilePicker.filterAll);
565 if (fp.show() == nsIFilePicker.returnOK) {
566 certdb.importCertsFromFile(null, fp.file, nsIX509Cert.SERVER_CERT);
568 var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
569 certcache.cacheAllCerts();
570 serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
571 serverTreeView.selection.clearSelection();
572 caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
573 caTreeView.selection.clearSelection();
574 }
575 }
577 function addException()
578 {
579 window.openDialog('chrome://pippki/content/exceptionDialog.xul', "",
580 'chrome,centerscreen,modal');
581 var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
582 certcache.cacheAllCerts();
583 serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
584 serverTreeView.selection.clearSelection();
585 orphanTreeView.loadCertsFromCache(certcache, nsIX509Cert.UNKNOWN_CERT);
586 orphanTreeView.selection.clearSelection();
587 }