home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / lib / xulrunner-1.9.0.14 / chrome / pippki.jar / content / pippki / certManager.js < prev    next >
Encoding:
Text File  |  2007-12-01  |  21.1 KB  |  636 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is mozilla.org code.
  15.  *
  16.  * The Initial Developer of the Original Code is
  17.  * Netscape Communications Corporation.
  18.  * Portions created by the Initial Developer are Copyright (C) 2001
  19.  * the Initial Developer. All Rights Reserved.
  20.  *
  21.  * Contributor(s):
  22.  *   Bob Lord <lord@netscape.com>
  23.  *   Ian McGreer <mcgreer@netscape.com>
  24.  *   Kai Engert <kengert@redhat.com>
  25.  *
  26.  * Alternatively, the contents of this file may be used under the terms of
  27.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  28.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  29.  * in which case the provisions of the GPL or the LGPL are applicable instead
  30.  * of those above. If you wish to allow use of your version of this file only
  31.  * under the terms of either the GPL or the LGPL, and not to allow others to
  32.  * use your version of this file under the terms of the MPL, indicate your
  33.  * decision by deleting the provisions above and replace them with the notice
  34.  * and other provisions required by the GPL or the LGPL. If you do not delete
  35.  * the provisions above, a recipient may use your version of this file under
  36.  * the terms of any one of the MPL, the GPL or the LGPL.
  37.  *
  38.  * ***** END LICENSE BLOCK ***** */
  39.  
  40. const nsIFilePicker = Components.interfaces.nsIFilePicker;
  41. const nsFilePicker = "@mozilla.org/filepicker;1";
  42. const nsIX509CertDB = Components.interfaces.nsIX509CertDB;
  43. const nsX509CertDB = "@mozilla.org/security/x509certdb;1";
  44. const nsIX509Cert = Components.interfaces.nsIX509Cert;
  45. const nsICertTree = Components.interfaces.nsICertTree;
  46. const nsCertTree = "@mozilla.org/security/nsCertTree;1";
  47. const nsIDialogParamBlock = Components.interfaces.nsIDialogParamBlock;
  48. const nsDialogParamBlock = "@mozilla.org/embedcomp/dialogparam;1";
  49. const nsIPKIParamBlock    = Components.interfaces.nsIPKIParamBlock;
  50. const nsPKIParamBlock    = "@mozilla.org/security/pkiparamblock;1";
  51. const nsINSSCertCache = Components.interfaces.nsINSSCertCache;
  52. const nsNSSCertCache = "@mozilla.org/security/nsscertcache;1";
  53.  
  54. var key;
  55.  
  56. var selected_certs = [];
  57. var selected_tree_items = [];
  58. var selected_index = [];
  59. var certdb;
  60.  
  61. var caTreeView;
  62. var serverTreeView;
  63. var emailTreeView;
  64. var userTreeView;
  65. var orphanTreeView;
  66.  
  67. function LoadCerts()
  68. {
  69.   window.crypto.enableSmartCardEvents = true;
  70.   document.addEventListener("smartcard-insert", onSmartCardChange, false);
  71.   document.addEventListener("smartcard-remove", onSmartCardChange, false);
  72.  
  73.   certdb = Components.classes[nsX509CertDB].getService(nsIX509CertDB);
  74.   var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
  75.   
  76.   certcache.cacheAllCerts();
  77.  
  78.   caTreeView = Components.classes[nsCertTree]
  79.                     .createInstance(nsICertTree);
  80.   caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
  81.   document.getElementById('ca-tree')
  82.    .treeBoxObject.view = caTreeView;
  83.  
  84.   serverTreeView = Components.classes[nsCertTree]
  85.                         .createInstance(nsICertTree);
  86.   serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
  87.   document.getElementById('server-tree')
  88.    .treeBoxObject.view = serverTreeView;
  89.  
  90.   emailTreeView = Components.classes[nsCertTree]
  91.                        .createInstance(nsICertTree);
  92.   emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
  93.   document.getElementById('email-tree')
  94.    .treeBoxObject.view = emailTreeView; 
  95.  
  96.   userTreeView = Components.classes[nsCertTree]
  97.                       .createInstance(nsICertTree);
  98.   userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
  99.   document.getElementById('user-tree')
  100.    .treeBoxObject.view = userTreeView;
  101.  
  102.   orphanTreeView = Components.classes[nsCertTree]
  103.                       .createInstance(nsICertTree);
  104.   orphanTreeView.loadCertsFromCache(certcache, nsIX509Cert.UNKNOWN_CERT);
  105.   document.getElementById('orphan-tree')
  106.    .treeBoxObject.view = orphanTreeView;
  107.  
  108.   var rowCnt = userTreeView.rowCount;
  109.   var enableBackupAllButton=document.getElementById('mine_backupAllButton');
  110.   if(rowCnt < 1) {
  111.     enableBackupAllButton.setAttribute("disabled",true);
  112.   } else  {
  113.     enableBackupAllButton.setAttribute("enabled",true);
  114.   }
  115. }
  116.  
  117. function getSelectedCerts()
  118. {
  119.   var ca_tab = document.getElementById("ca_tab");
  120.   var mine_tab = document.getElementById("mine_tab");
  121.   var others_tab = document.getElementById("others_tab");
  122.   var websites_tab = document.getElementById("websites_tab");
  123.   var orphan_tab = document.getElementById("orphan_tab");
  124.   var items = null;
  125.   if (ca_tab.selected) {
  126.     items = caTreeView.selection;
  127.   } else if (mine_tab.selected) {
  128.     items = userTreeView.selection;
  129.   } else if (others_tab.selected) {
  130.     items = emailTreeView.selection;
  131.   } else if (websites_tab.selected) {
  132.     items = serverTreeView.selection;
  133.   } else if (orphan_tab.selected) {
  134.     items = orphanTreeView.selection;
  135.   }
  136.   selected_certs = [];
  137.   var cert = null;
  138.   var nr = 0;
  139.   if (items != null) nr = items.getRangeCount();
  140.   if (nr > 0) {
  141.     for (var i=0; i<nr; i++) {
  142.       var o1 = {};
  143.       var o2 = {};
  144.       items.getRangeAt(i, o1, o2);
  145.       var min = o1.value;
  146.       var max = o2.value;
  147.       for (var j=min; j<=max; j++) {
  148.         if (ca_tab.selected) {
  149.           cert = caTreeView.getCert(j);
  150.         } else if (mine_tab.selected) {
  151.           cert = userTreeView.getCert(j);
  152.         } else if (others_tab.selected) {
  153.           cert = emailTreeView.getCert(j);
  154.         } else if (websites_tab.selected) {
  155.           cert = serverTreeView.getCert(j);
  156.         } else if (orphan_tab.selected) {
  157.           cert = orphanTreeView.getCert(j);
  158.         }
  159.         if (cert) {
  160.           var sc = selected_certs.length;
  161.           selected_certs[sc] = cert;
  162.           selected_index[sc] = j;
  163.         }
  164.       }
  165.     }
  166.   }
  167. }
  168.  
  169. function getSelectedTreeItems()
  170. {
  171.   var ca_tab = document.getElementById("ca_tab");
  172.   var mine_tab = document.getElementById("mine_tab");
  173.   var others_tab = document.getElementById("others_tab");
  174.   var websites_tab = document.getElementById("websites_tab");
  175.   var orphan_tab = document.getElementById("orphan_tab");
  176.   var items = null;
  177.   if (ca_tab.selected) {
  178.     items = caTreeView.selection;
  179.   } else if (mine_tab.selected) {
  180.     items = userTreeView.selection;
  181.   } else if (others_tab.selected) {
  182.     items = emailTreeView.selection;
  183.   } else if (websites_tab.selected) {
  184.     items = serverTreeView.selection;
  185.   } else if (orphan_tab.selected) {
  186.     items = orphanTreeView.selection;
  187.   }
  188.   selected_certs = [];
  189.   selected_tree_items = [];
  190.   selected_index = [];
  191.   var tree_item = null;
  192.   var nr = 0;
  193.   if (items != null) nr = items.getRangeCount();
  194.   if (nr > 0) {
  195.     for (var i=0; i<nr; i++) {
  196.       var o1 = {};
  197.       var o2 = {};
  198.       items.getRangeAt(i, o1, o2);
  199.       var min = o1.value;
  200.       var max = o2.value;
  201.       for (var j=min; j<=max; j++) {
  202.         if (ca_tab.selected) {
  203.           tree_item = caTreeView.getTreeItem(j);
  204.         } else if (mine_tab.selected) {
  205.           tree_item = userTreeView.getTreeItem(j);
  206.         } else if (others_tab.selected) {
  207.           tree_item = emailTreeView.getTreeItem(j);
  208.         } else if (websites_tab.selected) {
  209.           tree_item = serverTreeView.getTreeItem(j);
  210.         } else if (orphan_tab.selected) {
  211.           tree_item = orphanTreeView.getTreeItem(j);
  212.         }
  213.         if (tree_item) {
  214.           var sc = selected_tree_items.length;
  215.           selected_tree_items[sc] = tree_item;
  216.           selected_index[sc] = j;
  217.         }
  218.       }
  219.     }
  220.   }
  221. }
  222.  
  223. function ca_enableButtons()
  224. {
  225.   var items = caTreeView.selection;
  226.   var nr = items.getRangeCount();
  227.   var toggle="false";
  228.   if (nr == 0) {
  229.     toggle="true";
  230.   }
  231.   var edit_toggle=toggle;
  232. /*
  233.   var edit_toggle="true";
  234.   if (nr > 0) {
  235.     for (var i=0; i<nr; i++) {
  236.       var o1 = {};
  237.       var o2 = {};
  238.       items.getRangeAt(i, o1, o2);
  239.       var min = o1.value;
  240.       var max = o2.value;
  241.       var stop = false;
  242.       for (var j=min; j<=max; j++) {
  243.         var tokenName = items.tree.view.getCellText(j, "tokencol");
  244.     if (tokenName == "Builtin Object Token") { stop = true; } break;
  245.       }
  246.       if (stop) break;
  247.     }
  248.     if (i == nr) {
  249.       edit_toggle="false";
  250.     }
  251.   }
  252. */
  253.   var enableViewButton=document.getElementById('ca_viewButton');
  254.   enableViewButton.setAttribute("disabled",toggle);
  255.   var enableEditButton=document.getElementById('ca_editButton');
  256.   enableEditButton.setAttribute("disabled",edit_toggle);
  257.   var enableExportButton=document.getElementById('ca_exportButton');
  258.   enableExportButton.setAttribute("disabled",toggle);
  259.   var enableDeleteButton=document.getElementById('ca_deleteButton');
  260.   enableDeleteButton.setAttribute("disabled",toggle);
  261. }
  262.  
  263. function mine_enableButtons()
  264. {
  265.   var items = userTreeView.selection;
  266.   var toggle="false";
  267.   if (items.getRangeCount() == 0) {
  268.     toggle="true";
  269.   }
  270.   var enableViewButton=document.getElementById('mine_viewButton');
  271.   enableViewButton.setAttribute("disabled",toggle);
  272.   var enableBackupButton=document.getElementById('mine_backupButton');
  273.   enableBackupButton.setAttribute("disabled",toggle);
  274.   var enableDeleteButton=document.getElementById('mine_deleteButton');
  275.   enableDeleteButton.setAttribute("disabled",toggle);
  276. }
  277.  
  278. function websites_enableButtons()
  279. {
  280.   var items = serverTreeView.selection;
  281.   var count_ranges = items.getRangeCount();
  282.  
  283.   var enable_delete = false;
  284.   var enable_view = false;
  285.   var enable_edit = false;
  286.  
  287.   if (count_ranges > 0) {
  288.     enable_delete = true;
  289.   }
  290.  
  291.   if (count_ranges == 1) {
  292.     var o1 = {};
  293.     var o2 = {};
  294.     items.getRangeAt(0, o1, o2); // the first range
  295.     if (o1.value == o2.value) {
  296.       // only a single item is selected
  297.       try {
  298.         var ti = serverTreeView.getTreeItem(o1.value);
  299.         if (ti) {
  300.           if (ti.cert) {
  301.             enable_view = true;
  302.           }
  303.           // Trust editing is not possible for override
  304.           // entries that are bound to host:port,
  305.           // where the cert is stored for convenince only.
  306.           if (!ti.hostPort.length) {
  307.             enable_edit = true;
  308.           }
  309.         }
  310.       }
  311.       catch (e) {
  312.       }
  313.     }
  314.   }
  315.  
  316.   var enableViewButton=document.getElementById('websites_viewButton');
  317.   enableViewButton.setAttribute("disabled", !enable_view);
  318.   var enableEditButton=document.getElementById('websites_editButton');
  319.   enableEditButton.setAttribute("disabled", !enable_edit);
  320.   var enableExportButton=document.getElementById('websites_exportButton');
  321.   enableExportButton.setAttribute("disabled", !enable_view);
  322.   var enableDeleteButton=document.getElementById('websites_deleteButton');
  323.   enableDeleteButton.setAttribute("disabled", !enable_delete);
  324. }
  325.  
  326. function email_enableButtons()
  327. {
  328.   var items = emailTreeView.selection;
  329.   var toggle="false";
  330.   if (items.getRangeCount() == 0) {
  331.     toggle="true";
  332.   }
  333.   var enableViewButton=document.getElementById('email_viewButton');
  334.   enableViewButton.setAttribute("disabled",toggle);
  335.   var enableEditButton=document.getElementById('email_editButton');
  336.   enableEditButton.setAttribute("disabled",toggle);
  337.   var enableExportButton=document.getElementById('email_exportButton');
  338.   enableExportButton.setAttribute("disabled",toggle);
  339.   var enableDeleteButton=document.getElementById('email_deleteButton');
  340.   enableDeleteButton.setAttribute("disabled",toggle);
  341. }
  342.  
  343. function orphan_enableButtons()
  344. {
  345.   var items = orphanTreeView.selection;
  346.   var toggle="false";
  347.   if (items.getRangeCount() == 0) {
  348.     toggle="true";
  349.   }
  350.   var enableViewButton=document.getElementById('orphan_viewButton');
  351.   enableViewButton.setAttribute("disabled",toggle);
  352.   var enableExportButton=document.getElementById('orphan_exportButton');
  353.   enableExportButton.setAttribute("disabled",toggle);
  354.   var enableDeleteButton=document.getElementById('orphan_deleteButton');
  355.   enableDeleteButton.setAttribute("disabled",toggle);
  356. }
  357.  
  358. function backupCerts()
  359. {
  360.   getSelectedCerts();
  361.   var numcerts = selected_certs.length;
  362.   if (!numcerts)
  363.     return;
  364.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  365.   var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
  366.   fp.init(window,
  367.           bundle.GetStringFromName("chooseP12BackupFileDialog"),
  368.           nsIFilePicker.modeSave);
  369.   fp.appendFilter(bundle.GetStringFromName("file_browse_PKCS12_spec"),
  370.                   "*.p12");
  371.   fp.appendFilters(nsIFilePicker.filterAll);
  372.   var rv = fp.show();
  373.   if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
  374.     certdb.exportPKCS12File(null, fp.file, 
  375.                             selected_certs.length, selected_certs);
  376.   }
  377. }
  378.  
  379. function backupAllCerts()
  380. {
  381.   // Select all rows, then call doBackup()
  382.   var items = userTreeView.selection.selectAll();
  383.   backupCerts();
  384. }
  385.  
  386. function editCerts()
  387. {
  388.   getSelectedCerts();
  389.   var numcerts = selected_certs.length;
  390.   if (!numcerts)
  391.     return;
  392.   for (var t=0; t<numcerts; t++) {
  393.     var cert = selected_certs[t];
  394.     var certkey = cert.dbKey;
  395.     if (document.getElementById("ca_tab").selected) {
  396.       window.openDialog('chrome://pippki/content/editcacert.xul', certkey,
  397.                         'chrome,centerscreen,modal');
  398.     } else if (document.getElementById("others_tab").selected) {
  399.       window.openDialog('chrome://pippki/content/editemailcert.xul', certkey,
  400.                         'chrome,centerscreen,modal');
  401.     } else if (!document.getElementById("websites_tab").selected
  402.                || !serverTreeView.isHostPortOverride(selected_index[t])) {
  403.       // If the web sites tab is select, trust editing is only allowed
  404.       // if the entry refers to a real cert, but not if it's
  405.       // a host:port override, where the cert is stored for convenince only.
  406.       window.openDialog('chrome://pippki/content/editsslcert.xul', certkey,
  407.                         'chrome,centerscreen,modal');
  408.     }
  409.   }
  410. }
  411.  
  412. function restoreCerts()
  413. {
  414.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  415.   var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
  416.   fp.init(window,
  417.           bundle.GetStringFromName("chooseP12RestoreFileDialog"),
  418.           nsIFilePicker.modeOpen);
  419.   fp.appendFilter(bundle.GetStringFromName("file_browse_PKCS12_spec"),
  420.                   "*.p12; *.pfx");
  421.   fp.appendFilters(nsIFilePicker.filterAll);
  422.   if (fp.show() == nsIFilePicker.returnOK) {
  423.     certdb.importPKCS12File(null, fp.file);
  424.  
  425.     var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
  426.     certcache.cacheAllCerts();
  427.     userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
  428.     userTreeView.selection.clearSelection();
  429.     caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
  430.     caTreeView.selection.clearSelection();
  431.   }
  432. }
  433.  
  434. function exportCerts()
  435. {
  436.   getSelectedCerts();
  437.   var numcerts = selected_certs.length;
  438.   if (!numcerts)
  439.     return;
  440.  
  441.   for (var t=0; t<numcerts; t++) {
  442.     exportToFile(window, selected_certs[t]);
  443.   }
  444. }
  445.  
  446. function deleteCerts()
  447. {
  448.   getSelectedTreeItems();
  449.   var numcerts = selected_tree_items.length;
  450.   if (!numcerts)
  451.     return;
  452.  
  453.   var params = Components.classes[nsDialogParamBlock].createInstance(nsIDialogParamBlock);
  454.   
  455.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  456.   var selTab = document.getElementById('certMgrTabbox').selectedItem;
  457.   var selTabID = selTab.getAttribute('id');
  458.   var t;
  459.  
  460.   params.SetNumberStrings(numcerts+1);
  461.  
  462.   if (selTabID == 'mine_tab') 
  463.   {
  464.     params.SetString(0, selTabID);
  465.   } 
  466.   else if (selTabID == "websites_tab") 
  467.   {
  468.     params.SetString(0, selTabID);
  469.   } 
  470.   else if (selTabID == "ca_tab") 
  471.   {
  472.     params.SetString(0, selTabID);
  473.   }
  474.   else if (selTabID == "others_tab") 
  475.   {
  476.     params.SetString(0, selTabID);
  477.   }
  478.   else if (selTabID == "orphan_tab") 
  479.   {
  480.     params.SetString(0, selTabID);
  481.   }
  482.   else
  483.   {
  484.     return;
  485.   }
  486.  
  487.   params.SetInt(0,numcerts);
  488.   for (t=0; t<numcerts; t++) 
  489.   {
  490.     var tree_item = selected_tree_items[t];
  491.     var c = tree_item.cert;
  492.     if (!c) {
  493.       params.SetString(t+1, tree_item.hostPort);
  494.     }
  495.     else {
  496.       params.SetString(t+1, c.commonName);
  497.     }
  498.  
  499.   }
  500.  
  501.   window.openDialog('chrome://pippki/content/deletecert.xul', "",
  502.                     'chrome,centerscreen,modal', params);
  503.  
  504.   if (params.GetInt(1) == 1) {
  505.     // user closed dialog with OK
  506.     var treeView = null;
  507.     var loadParam = null;
  508.  
  509.     selTab = document.getElementById('certMgrTabbox').selectedItem;
  510.     selTabID = selTab.getAttribute('id');
  511.     if (selTabID == 'mine_tab') {
  512.       treeView = userTreeView;
  513.     } else if (selTabID == "others_tab") {
  514.       treeView = emailTreeView;
  515.     } else if (selTabID == "websites_tab") {
  516.       treeView = serverTreeView;
  517.     } else if (selTabID == "ca_tab") {
  518.       treeView = caTreeView;
  519.     } else if (selTabID == "orphan_tab") {
  520.       treeView = orphanTreeView;
  521.     }
  522.  
  523.     for (t=numcerts-1; t>=0; t--)
  524.     {
  525.       treeView.deleteEntryObject(selected_index[t]);
  526.     }
  527.  
  528.     selected_tree_items = [];
  529.     selected_index = [];
  530.     treeView.selection.clearSelection();
  531.   }
  532. }
  533.  
  534. function viewCerts()
  535. {
  536.   getSelectedCerts();
  537.   var numcerts = selected_certs.length;
  538.   if (!numcerts)
  539.     return;
  540.  
  541.   for (var t=0; t<numcerts; t++) {
  542.     viewCertHelper(window, selected_certs[t]);
  543.   }
  544. }
  545.  
  546. function addCACerts()
  547. {
  548.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  549.   var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
  550.   fp.init(window,
  551.           bundle.GetStringFromName("importCACertsPrompt"),
  552.           nsIFilePicker.modeOpen);
  553.   fp.appendFilter(bundle.GetStringFromName("file_browse_Certificate_spec"),
  554.                   "*.crt; *.cert; *.cer; *.pem; *.der");
  555.   fp.appendFilters(nsIFilePicker.filterAll);
  556.   if (fp.show() == nsIFilePicker.returnOK) {
  557.     certdb.importCertsFromFile(null, fp.file, nsIX509Cert.CA_CERT);
  558.     caTreeView.loadCerts(nsIX509Cert.CA_CERT);
  559.     caTreeView.selection.clearSelection();
  560.   }
  561. }
  562.  
  563. function onSmartCardChange()
  564. {
  565.   var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
  566.   // We've change the state of the smart cards inserted or removed
  567.   // that means the available certs may have changed. Update the display
  568.   certcache.cacheAllCerts();
  569.   userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
  570.   userTreeView.selection.clearSelection();
  571.   caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
  572.   caTreeView.selection.clearSelection();
  573.   serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
  574.   serverTreeView.selection.clearSelection();
  575.   emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
  576.   emailTreeView.selection.clearSelection();
  577.   orphanTreeView.loadCertsFromCache(certcache, nsIX509Cert.UNKNOWN_CERT);
  578.   orphanTreeView.selection.clearSelection();
  579. }
  580.  
  581. function addEmailCert()
  582. {
  583.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  584.   var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
  585.   fp.init(window,
  586.           bundle.GetStringFromName("importEmailCertPrompt"),
  587.           nsIFilePicker.modeOpen);
  588.   fp.appendFilter(bundle.GetStringFromName("file_browse_Certificate_spec"),
  589.                   "*.crt; *.cert; *.cer; *.pem; *.der");
  590.   fp.appendFilters(nsIFilePicker.filterAll);
  591.   if (fp.show() == nsIFilePicker.returnOK) {
  592.     certdb.importCertsFromFile(null, fp.file, nsIX509Cert.EMAIL_CERT);
  593.     var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
  594.     certcache.cacheAllCerts();
  595.     emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
  596.     emailTreeView.selection.clearSelection();
  597.     caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
  598.     caTreeView.selection.clearSelection();
  599.   }
  600. }
  601.  
  602. function addWebSiteCert()
  603. {
  604.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  605.   var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
  606.   fp.init(window,
  607.           bundle.GetStringFromName("importServerCertPrompt"),
  608.           nsIFilePicker.modeOpen);
  609.   fp.appendFilter(bundle.GetStringFromName("file_browse_Certificate_spec"),
  610.                   "*.crt; *.cert; *.cer; *.pem; *.der");
  611.   fp.appendFilters(nsIFilePicker.filterAll);
  612.   if (fp.show() == nsIFilePicker.returnOK) {
  613.     certdb.importCertsFromFile(null, fp.file, nsIX509Cert.SERVER_CERT);
  614.  
  615.     var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
  616.     certcache.cacheAllCerts();
  617.     serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
  618.     serverTreeView.selection.clearSelection();
  619.     caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
  620.     caTreeView.selection.clearSelection();
  621.   }
  622. }
  623.  
  624. function addException()
  625. {
  626.   window.openDialog('chrome://pippki/content/exceptionDialog.xul', "",
  627.                     'chrome,centerscreen,modal');
  628.   var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
  629.   certcache.cacheAllCerts();
  630.   serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
  631.   serverTreeView.selection.clearSelection();
  632.   orphanTreeView.loadCertsFromCache(certcache, nsIX509Cert.UNKNOWN_CERT);
  633.   orphanTreeView.selection.clearSelection();
  634. }
  635.  
  636.