home *** CD-ROM | disk | FTP | other *** search
/ PC World 2003 May / PCWorld_2003-05_cd.bin / Komunik / phoenix / chrome / pippki.jar / content / pippki / certManager.js < prev    next >
Text File  |  2002-11-13  |  15KB  |  472 lines

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  *
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  *
  12.  * The Original Code is mozilla.org code.
  13.  *
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are
  16.  * Copyright (C) 2001 Netscape Communications Corporation. All
  17.  * Rights Reserved.
  18.  *
  19.  * Contributor(s):
  20.  *  Bob Lord <lord@netscape.com>
  21.  *  Ian McGreer <mcgreer@netscape.com>
  22.  */
  23.  
  24. const nsIFilePicker = Components.interfaces.nsIFilePicker;
  25. const nsFilePicker = "@mozilla.org/filepicker;1";
  26. const nsIX509CertDB = Components.interfaces.nsIX509CertDB;
  27. const nsX509CertDB = "@mozilla.org/security/x509certdb;1";
  28. const nsIX509Cert = Components.interfaces.nsIX509Cert;
  29. const nsICertTree = Components.interfaces.nsICertTree;
  30. const nsCertTree = "@mozilla.org/security/nsCertTree;1";
  31. const nsIDialogParamBlock = Components.interfaces.nsIDialogParamBlock;
  32. const nsDialogParamBlock = "@mozilla.org/embedcomp/dialogparam;1";
  33. const nsIPKIParamBlock    = Components.interfaces.nsIPKIParamBlock;
  34. const nsPKIParamBlock    = "@mozilla.org/security/pkiparamblock;1";
  35. const nsINSSCertCache = Components.interfaces.nsINSSCertCache;
  36. const nsNSSCertCache = "@mozilla.org/security/nsscertcache;1";
  37.  
  38. var key;
  39.  
  40. var selected_certs = [];
  41. var selected_cert_index = [];
  42. var certdb;
  43.  
  44. var caTreeView;
  45. var serverTreeView;
  46. var emailTreeView;
  47. var userTreeView;
  48.  
  49. function LoadCerts()
  50. {
  51.   certdb = Components.classes[nsX509CertDB].getService(nsIX509CertDB);
  52.   var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
  53.   
  54.   certcache.cacheAllCerts();
  55.  
  56.   caTreeView = Components.classes[nsCertTree]
  57.                     .createInstance(nsICertTree);
  58.   caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
  59.   document.getElementById('ca-tree')
  60.    .treeBoxObject.view = caTreeView;
  61.  
  62.   serverTreeView = Components.classes[nsCertTree]
  63.                         .createInstance(nsICertTree);
  64.   serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
  65.   document.getElementById('server-tree')
  66.    .treeBoxObject.view = serverTreeView;
  67.  
  68.   emailTreeView = Components.classes[nsCertTree]
  69.                        .createInstance(nsICertTree);
  70.   emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
  71.   document.getElementById('email-tree')
  72.    .treeBoxObject.view = emailTreeView; 
  73.  
  74.   userTreeView = Components.classes[nsCertTree]
  75.                       .createInstance(nsICertTree);
  76.   userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
  77.   document.getElementById('user-tree')
  78.    .treeBoxObject.view = userTreeView;
  79.  
  80.   var rowCnt = userTreeView.rowCount;
  81.   var enableBackupAllButton=document.getElementById('mine_backupAllButton');
  82.   if(rowCnt < 1) {
  83.     enableBackupAllButton.setAttribute("disabled",true);
  84.   } else  {
  85.     enableBackupAllButton.setAttribute("enabled",true);
  86.   }
  87.  
  88.   if (certdb.isOcspOn) {
  89.     document.getElementById('ocsp_info').removeAttribute("hidden");
  90.   }
  91. }
  92.  
  93. function getSelectedTab()
  94. {
  95.   var selTab = document.getElementById('certMgrTabbox').selectedItem;
  96.   var selTabID = selTab.getAttribute('id');
  97.   if (selTabID == 'mine_tab') {
  98.     key = "my_certs";
  99.   } else if (selTabID == "others_tab") {
  100.     key = "others_certs";
  101.   } else if (selTabID == "websites_tab") {
  102.     key = "web_certs";
  103.   } else if (selTabID == "ca_tab") {
  104.     key = "ca_certs";
  105.   }  
  106.   return key;
  107. }
  108.  
  109.  
  110. function doHelpButton() {
  111.    var uri = getSelectedTab();
  112.    openHelp(uri);
  113. }
  114.  
  115.  
  116. function getSelectedCerts()
  117. {
  118.   var ca_tab = document.getElementById("ca_tab");
  119.   var mine_tab = document.getElementById("mine_tab");
  120.   var others_tab = document.getElementById("others_tab");
  121.   var websites_tab = document.getElementById("websites_tab");
  122.   var items = null;
  123.   if (ca_tab.selected) {
  124.     items = caTreeView.selection;
  125.   } else if (mine_tab.selected) {
  126.     items = userTreeView.selection;
  127.   } else if (others_tab.selected) {
  128.     items = emailTreeView.selection;
  129.   } else if (websites_tab.selected) {
  130.     items = serverTreeView.selection;
  131.   }
  132.   selected_certs = [];
  133.   var cert = null;
  134.   var nr = 0;
  135.   if (items != null) nr = items.getRangeCount();
  136.   if (nr > 0) {
  137.     for (var i=0; i<nr; i++) {
  138.       var o1 = {};
  139.       var o2 = {};
  140.       items.getRangeAt(i, o1, o2);
  141.       var min = o1.value;
  142.       var max = o2.value;
  143.       for (var j=min; j<=max; j++) {
  144.         if (ca_tab.selected) {
  145.           cert = caTreeView.getCert(j);
  146.         } else if (mine_tab.selected) {
  147.           cert = userTreeView.getCert(j);
  148.         } else if (others_tab.selected) {
  149.           cert = emailTreeView.getCert(j);
  150.         } else if (websites_tab.selected) {
  151.           cert = serverTreeView.getCert(j);
  152.         }
  153.         if (cert) {
  154.           var sc = selected_certs.length;
  155.           selected_certs[sc] = cert;
  156.           selected_cert_index[sc] = j;
  157.         }
  158.       }
  159.     }
  160.   }
  161. }
  162.  
  163. function ca_enableButtons()
  164. {
  165.   var items = caTreeView.selection;
  166.   var nr = items.getRangeCount();
  167.   var toggle="false";
  168.   if (nr == 0) {
  169.     toggle="true";
  170.   }
  171.   var edit_toggle=toggle;
  172. /*
  173.   var edit_toggle="true";
  174.   if (nr > 0) {
  175.     for (var i=0; i<nr; i++) {
  176.       var o1 = {};
  177.       var o2 = {};
  178.       items.getRangeAt(i, o1, o2);
  179.       var min = o1.value;
  180.       var max = o2.value;
  181.       var stop = false;
  182.       for (var j=min; j<=max; j++) {
  183.         var tokenName = items.tree.view.getCellText(j, "tokencol");
  184.     if (tokenName == "Builtin Object Token") { stop = true; } break;
  185.       }
  186.       if (stop) break;
  187.     }
  188.     if (i == nr) {
  189.       edit_toggle="false";
  190.     }
  191.   }
  192. */
  193.   var enableViewButton=document.getElementById('ca_viewButton');
  194.   enableViewButton.setAttribute("disabled",toggle);
  195.   var enableEditButton=document.getElementById('ca_editButton');
  196.   enableEditButton.setAttribute("disabled",edit_toggle);
  197.   var enableDeleteButton=document.getElementById('ca_deleteButton');
  198.   enableDeleteButton.setAttribute("disabled",toggle);
  199. }
  200.  
  201. function mine_enableButtons()
  202. {
  203.   var items = userTreeView.selection;
  204.   var toggle="false";
  205.   if (items.getRangeCount() == 0) {
  206.     toggle="true";
  207.   }
  208.   var enableViewButton=document.getElementById('mine_viewButton');
  209.   enableViewButton.setAttribute("disabled",toggle);
  210.   var enableBackupButton=document.getElementById('mine_backupButton');
  211.   enableBackupButton.setAttribute("disabled",toggle);
  212.   var enableDeleteButton=document.getElementById('mine_deleteButton');
  213.   enableDeleteButton.setAttribute("disabled",toggle);
  214. }
  215.  
  216. function websites_enableButtons()
  217. {
  218.   var items = serverTreeView.selection;
  219.   var toggle="false";
  220.   if (items.getRangeCount() == 0) {
  221.     toggle="true";
  222.   }
  223.   var enableViewButton=document.getElementById('websites_viewButton');
  224.   enableViewButton.setAttribute("disabled",toggle);
  225.   var enableEditButton=document.getElementById('websites_editButton');
  226.   enableEditButton.setAttribute("disabled",toggle);
  227.   var enableDeleteButton=document.getElementById('websites_deleteButton');
  228.   enableDeleteButton.setAttribute("disabled",toggle);
  229. }
  230.  
  231. function email_enableButtons()
  232. {
  233.   var items = emailTreeView.selection;
  234.   var toggle="false";
  235.   if (items.getRangeCount() == 0) {
  236.     toggle="true";
  237.   }
  238.   var enableViewButton=document.getElementById('email_viewButton');
  239.   enableViewButton.setAttribute("disabled",toggle);
  240.   var enableEditButton=document.getElementById('email_editButton');
  241.   enableEditButton.setAttribute("disabled",toggle);
  242.   var enableDeleteButton=document.getElementById('email_deleteButton');
  243.   enableDeleteButton.setAttribute("disabled",toggle);
  244. }
  245.  
  246. function backupCerts()
  247. {
  248.   getSelectedCerts();
  249.   var numcerts = selected_certs.length;
  250.   if (!numcerts)
  251.     return;
  252.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  253.   var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
  254.   fp.init(window,
  255.           bundle.GetStringFromName("chooseP12BackupFileDialog"),
  256.           nsIFilePicker.modeSave);
  257.   fp.appendFilter("PKCS12 Files", "*.p12");
  258.   fp.appendFilters(nsIFilePicker.filterAll);
  259.   var rv = fp.show();
  260.   if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
  261.     certdb.exportPKCS12File(null, fp.file, 
  262.                             selected_certs.length, selected_certs);
  263.   }
  264. }
  265.  
  266. function backupAllCerts()
  267. {
  268.   // Select all rows, then call doBackup()
  269.   var items = userTreeView.selection.selectAll();
  270.   backupCerts();
  271. }
  272.  
  273. function editCerts()
  274. {
  275.   getSelectedCerts();
  276.   var numcerts = selected_certs.length;
  277.   if (!numcerts)
  278.     return;
  279.   for (var t=0; t<numcerts; t++) {
  280.     var cert = selected_certs[t];
  281.     var certkey = cert.dbKey;
  282.     var ca_tab = document.getElementById("ca_tab");
  283.     var others_tab = document.getElementById("others_tab");
  284.     if (ca_tab.selected) {
  285.       window.openDialog('chrome://pippki/content/editcacert.xul', certkey,
  286.                   'chrome,width=100,resizable=1,modal');
  287.     } else if (others_tab.selected) {
  288.       window.openDialog('chrome://pippki/content/editemailcert.xul', certkey,
  289.                   'chrome,width=100,resizable=1,modal');
  290.     } else {
  291.       window.openDialog('chrome://pippki/content/editsslcert.xul', certkey,
  292.                   'chrome,width=100,resizable=1,modal');
  293.     }
  294.   }
  295. }
  296.  
  297. function restoreCerts()
  298. {
  299.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  300.   var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
  301.   fp.init(window,
  302.           bundle.GetStringFromName("chooseP12RestoreFileDialog"),
  303.           nsIFilePicker.modeOpen);
  304.   fp.appendFilter("PKCS12 Files", "*.p12; *.pfx");
  305.   fp.appendFilters(nsIFilePicker.filterAll);
  306.   if (fp.show() == nsIFilePicker.returnOK) {
  307.     certdb.importPKCS12File(null, fp.file);
  308.  
  309.     var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
  310.     certcache.cacheAllCerts();
  311.     userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
  312.     userTreeView.selection.clearSelection();
  313.     caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
  314.     caTreeView.selection.clearSelection();
  315.   }
  316. }
  317.  
  318. function deleteCerts()
  319. {
  320.   getSelectedCerts();
  321.   var numcerts = selected_certs.length;
  322.   if (!numcerts)
  323.     return;
  324.  
  325.   var params = Components.classes[nsDialogParamBlock].createInstance(nsIDialogParamBlock);
  326.   
  327.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  328.   var selTab = document.getElementById('certMgrTabbox').selectedItem;
  329.   var selTabID = selTab.getAttribute('id');
  330.   var t;
  331.  
  332.   params.SetNumberStrings(numcerts+1);
  333.  
  334.   if (selTabID == 'mine_tab') 
  335.   {
  336.     params.SetString(0,bundle.GetStringFromName("deleteUserCertFlag"));
  337.   } 
  338.   else if (selTabID == "websites_tab") 
  339.   {
  340.     params.SetString(0,bundle.GetStringFromName("deleteSslCertFlag"));
  341.   } 
  342.   else if (selTabID == "ca_tab") 
  343.   {
  344.     params.SetString(0,bundle.GetStringFromName("deleteCaCertFlag"));
  345.   }
  346.   else if (selTabID == "others_tab") 
  347.   {
  348.     params.SetString(0,bundle.GetStringFromName("deleteEmailCertFlag"));
  349.   }
  350.   else
  351.   {
  352.     return;
  353.   }
  354.  
  355.   params.SetInt(0,numcerts);
  356.   for (t=0; t<numcerts; t++) 
  357.   {
  358.     var cert = selected_certs[t];
  359.     params.SetString(t+1, cert.dbKey);  
  360.   }
  361.   
  362.   // The dialog will modify the params.
  363.   // Every param item where the corresponding cert could get deleted,
  364.   // will still contain the db key.
  365.   // Certs which could not get deleted, will have their corrensponding
  366.   // param string erased.
  367.   window.openDialog('chrome://pippki/content/deletecert.xul', "",
  368.                 'chrome,resizable=1,modal',params);
  369.  
  370.   if (params.GetInt(1) == 1) {
  371.     // user closed dialog with OK
  372.     var treeView = null;
  373.     var loadParam = null;
  374.  
  375.     selTab = document.getElementById('certMgrTabbox').selectedItem;
  376.     selTabID = selTab.getAttribute('id');
  377.     if (selTabID == 'mine_tab') {
  378.       treeView = userTreeView;
  379.       loadParam = nsIX509Cert.USER_CERT;
  380.     } else if (selTabID == "others_tab") {
  381.       treeView = emailTreeView;
  382.       loadParam = nsIX509Cert.EMAIL_CERT;
  383.     } else if (selTabID == "websites_tab") {
  384.       treeView = serverTreeView;
  385.       loadParam = nsIX509Cert.SERVER_CERT;
  386.     } else if (selTabID == "ca_tab") {
  387.       treeView = caTreeView;
  388.       loadParam = nsIX509Cert.CA_CERT;
  389.     }
  390.  
  391.     for (t=numcerts-1; t>=0; t--)
  392.     {
  393.       var s = params.GetString(t+1);
  394.       if (s.length) {
  395.         // This cert was deleted.
  396.         treeView.removeCert(selected_cert_index[t]);
  397.       }
  398.     }
  399.  
  400.     treeView.selection.clearSelection();
  401.   }
  402. }
  403.  
  404. function viewCerts()
  405. {
  406.   getSelectedCerts();
  407.   var numcerts = selected_certs.length;
  408.   if (!numcerts)
  409.     return;
  410.  
  411.   for (var t=0; t<numcerts; t++) {
  412.     viewCertHelper(window, selected_certs[t]);
  413.   }
  414. }
  415.  
  416. function addCACerts()
  417. {
  418.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  419.   var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
  420.   fp.init(window,
  421.           bundle.GetStringFromName("importCACertsPrompt"),
  422.           nsIFilePicker.modeOpen);
  423.   fp.appendFilter("Certificate Files", "*.crt; *.cert; *.cer; *.pem; *.der");
  424.   fp.appendFilters(nsIFilePicker.filterAll);
  425.   if (fp.show() == nsIFilePicker.returnOK) {
  426.     certdb.importCertsFromFile(null, fp.file, nsIX509Cert.CA_CERT);
  427.     caTreeView.loadCerts(nsIX509Cert.CA_CERT);
  428.     caTreeView.selection.clearSelection();
  429.   }
  430. }
  431.  
  432. function addEmailCert()
  433. {
  434.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  435.   var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
  436.   fp.init(window,
  437.           bundle.GetStringFromName("importEmailCertPrompt"),
  438.           nsIFilePicker.modeOpen);
  439.   fp.appendFilter("Certificate Files", "*.crt; *.cert; *.cer; *.pem; *.der");
  440.   fp.appendFilters(nsIFilePicker.filterAll);
  441.   if (fp.show() == nsIFilePicker.returnOK) {
  442.     certdb.importCertsFromFile(null, fp.file, nsIX509Cert.EMAIL_CERT);
  443.     var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
  444.     certcache.cacheAllCerts();
  445.     emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
  446.     emailTreeView.selection.clearSelection();
  447.     caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
  448.     caTreeView.selection.clearSelection();
  449.   }
  450. }
  451.  
  452. function addWebSiteCert()
  453. {
  454.   var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
  455.   var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
  456.   fp.init(window,
  457.           bundle.GetStringFromName("importWebSiteCertPrompt"),
  458.           nsIFilePicker.modeOpen);
  459.   fp.appendFilter("Certificate Files", "*.crt; *.cert; *.cer; *.pem; *.der");
  460.   fp.appendFilters(nsIFilePicker.filterAll);
  461.   if (fp.show() == nsIFilePicker.returnOK) {
  462.     certdb.importCertsFromFile(null, fp.file, nsIX509Cert.SERVER_CERT);
  463.  
  464.     var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
  465.     certcache.cacheAllCerts();
  466.     serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
  467.     serverTreeView.selection.clearSelection();
  468.     caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
  469.     caTreeView.selection.clearSelection();
  470.   }
  471. }
  472.