security/manager/pki/resources/content/certManager.js

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

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 }

mercurial