home *** CD-ROM | disk | FTP | other *** search
- /* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla.org code.
- *
- * The Initial Developer of the Original Code is
- * Netscape Communications Corporation.
- * Portions created by the Initial Developer are Copyright (C) 2001
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- * Bob Lord <lord@netscape.com>
- * Ian McGreer <mcgreer@netscape.com>
- * Kai Engert <kengert@redhat.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
- const nsIFilePicker = Components.interfaces.nsIFilePicker;
- const nsFilePicker = "@mozilla.org/filepicker;1";
- const nsIX509CertDB = Components.interfaces.nsIX509CertDB;
- const nsX509CertDB = "@mozilla.org/security/x509certdb;1";
- const nsIX509Cert = Components.interfaces.nsIX509Cert;
- const nsICertTree = Components.interfaces.nsICertTree;
- const nsCertTree = "@mozilla.org/security/nsCertTree;1";
- const nsIDialogParamBlock = Components.interfaces.nsIDialogParamBlock;
- const nsDialogParamBlock = "@mozilla.org/embedcomp/dialogparam;1";
- const nsIPKIParamBlock = Components.interfaces.nsIPKIParamBlock;
- const nsPKIParamBlock = "@mozilla.org/security/pkiparamblock;1";
- const nsINSSCertCache = Components.interfaces.nsINSSCertCache;
- const nsNSSCertCache = "@mozilla.org/security/nsscertcache;1";
-
- var key;
-
- var selected_certs = [];
- var selected_tree_items = [];
- var selected_index = [];
- var certdb;
-
- var caTreeView;
- var serverTreeView;
- var emailTreeView;
- var userTreeView;
- var orphanTreeView;
-
- function LoadCerts()
- {
- window.crypto.enableSmartCardEvents = true;
- document.addEventListener("smartcard-insert", onSmartCardChange, false);
- document.addEventListener("smartcard-remove", onSmartCardChange, false);
-
- certdb = Components.classes[nsX509CertDB].getService(nsIX509CertDB);
- var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
-
- certcache.cacheAllCerts();
-
- caTreeView = Components.classes[nsCertTree]
- .createInstance(nsICertTree);
- caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
- document.getElementById('ca-tree')
- .treeBoxObject.view = caTreeView;
-
- serverTreeView = Components.classes[nsCertTree]
- .createInstance(nsICertTree);
- serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
- document.getElementById('server-tree')
- .treeBoxObject.view = serverTreeView;
-
- emailTreeView = Components.classes[nsCertTree]
- .createInstance(nsICertTree);
- emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
- document.getElementById('email-tree')
- .treeBoxObject.view = emailTreeView;
-
- userTreeView = Components.classes[nsCertTree]
- .createInstance(nsICertTree);
- userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
- document.getElementById('user-tree')
- .treeBoxObject.view = userTreeView;
-
- orphanTreeView = Components.classes[nsCertTree]
- .createInstance(nsICertTree);
- orphanTreeView.loadCertsFromCache(certcache, nsIX509Cert.UNKNOWN_CERT);
- document.getElementById('orphan-tree')
- .treeBoxObject.view = orphanTreeView;
-
- var rowCnt = userTreeView.rowCount;
- var enableBackupAllButton=document.getElementById('mine_backupAllButton');
- if(rowCnt < 1) {
- enableBackupAllButton.setAttribute("disabled",true);
- } else {
- enableBackupAllButton.setAttribute("enabled",true);
- }
- }
-
- function getSelectedCerts()
- {
- var ca_tab = document.getElementById("ca_tab");
- var mine_tab = document.getElementById("mine_tab");
- var others_tab = document.getElementById("others_tab");
- var websites_tab = document.getElementById("websites_tab");
- var orphan_tab = document.getElementById("orphan_tab");
- var items = null;
- if (ca_tab.selected) {
- items = caTreeView.selection;
- } else if (mine_tab.selected) {
- items = userTreeView.selection;
- } else if (others_tab.selected) {
- items = emailTreeView.selection;
- } else if (websites_tab.selected) {
- items = serverTreeView.selection;
- } else if (orphan_tab.selected) {
- items = orphanTreeView.selection;
- }
- selected_certs = [];
- var cert = null;
- var nr = 0;
- if (items != null) nr = items.getRangeCount();
- if (nr > 0) {
- for (var i=0; i<nr; i++) {
- var o1 = {};
- var o2 = {};
- items.getRangeAt(i, o1, o2);
- var min = o1.value;
- var max = o2.value;
- for (var j=min; j<=max; j++) {
- if (ca_tab.selected) {
- cert = caTreeView.getCert(j);
- } else if (mine_tab.selected) {
- cert = userTreeView.getCert(j);
- } else if (others_tab.selected) {
- cert = emailTreeView.getCert(j);
- } else if (websites_tab.selected) {
- cert = serverTreeView.getCert(j);
- } else if (orphan_tab.selected) {
- cert = orphanTreeView.getCert(j);
- }
- if (cert) {
- var sc = selected_certs.length;
- selected_certs[sc] = cert;
- selected_index[sc] = j;
- }
- }
- }
- }
- }
-
- function getSelectedTreeItems()
- {
- var ca_tab = document.getElementById("ca_tab");
- var mine_tab = document.getElementById("mine_tab");
- var others_tab = document.getElementById("others_tab");
- var websites_tab = document.getElementById("websites_tab");
- var orphan_tab = document.getElementById("orphan_tab");
- var items = null;
- if (ca_tab.selected) {
- items = caTreeView.selection;
- } else if (mine_tab.selected) {
- items = userTreeView.selection;
- } else if (others_tab.selected) {
- items = emailTreeView.selection;
- } else if (websites_tab.selected) {
- items = serverTreeView.selection;
- } else if (orphan_tab.selected) {
- items = orphanTreeView.selection;
- }
- selected_certs = [];
- selected_tree_items = [];
- selected_index = [];
- var tree_item = null;
- var nr = 0;
- if (items != null) nr = items.getRangeCount();
- if (nr > 0) {
- for (var i=0; i<nr; i++) {
- var o1 = {};
- var o2 = {};
- items.getRangeAt(i, o1, o2);
- var min = o1.value;
- var max = o2.value;
- for (var j=min; j<=max; j++) {
- if (ca_tab.selected) {
- tree_item = caTreeView.getTreeItem(j);
- } else if (mine_tab.selected) {
- tree_item = userTreeView.getTreeItem(j);
- } else if (others_tab.selected) {
- tree_item = emailTreeView.getTreeItem(j);
- } else if (websites_tab.selected) {
- tree_item = serverTreeView.getTreeItem(j);
- } else if (orphan_tab.selected) {
- tree_item = orphanTreeView.getTreeItem(j);
- }
- if (tree_item) {
- var sc = selected_tree_items.length;
- selected_tree_items[sc] = tree_item;
- selected_index[sc] = j;
- }
- }
- }
- }
- }
-
- function ca_enableButtons()
- {
- var items = caTreeView.selection;
- var nr = items.getRangeCount();
- var toggle="false";
- if (nr == 0) {
- toggle="true";
- }
- var edit_toggle=toggle;
- /*
- var edit_toggle="true";
- if (nr > 0) {
- for (var i=0; i<nr; i++) {
- var o1 = {};
- var o2 = {};
- items.getRangeAt(i, o1, o2);
- var min = o1.value;
- var max = o2.value;
- var stop = false;
- for (var j=min; j<=max; j++) {
- var tokenName = items.tree.view.getCellText(j, "tokencol");
- if (tokenName == "Builtin Object Token") { stop = true; } break;
- }
- if (stop) break;
- }
- if (i == nr) {
- edit_toggle="false";
- }
- }
- */
- var enableViewButton=document.getElementById('ca_viewButton');
- enableViewButton.setAttribute("disabled",toggle);
- var enableEditButton=document.getElementById('ca_editButton');
- enableEditButton.setAttribute("disabled",edit_toggle);
- var enableExportButton=document.getElementById('ca_exportButton');
- enableExportButton.setAttribute("disabled",toggle);
- var enableDeleteButton=document.getElementById('ca_deleteButton');
- enableDeleteButton.setAttribute("disabled",toggle);
- }
-
- function mine_enableButtons()
- {
- var items = userTreeView.selection;
- var toggle="false";
- if (items.getRangeCount() == 0) {
- toggle="true";
- }
- var enableViewButton=document.getElementById('mine_viewButton');
- enableViewButton.setAttribute("disabled",toggle);
- var enableBackupButton=document.getElementById('mine_backupButton');
- enableBackupButton.setAttribute("disabled",toggle);
- var enableDeleteButton=document.getElementById('mine_deleteButton');
- enableDeleteButton.setAttribute("disabled",toggle);
- }
-
- function websites_enableButtons()
- {
- var items = serverTreeView.selection;
- var count_ranges = items.getRangeCount();
-
- var enable_delete = false;
- var enable_view = false;
- var enable_edit = false;
-
- if (count_ranges > 0) {
- enable_delete = true;
- }
-
- if (count_ranges == 1) {
- var o1 = {};
- var o2 = {};
- items.getRangeAt(0, o1, o2); // the first range
- if (o1.value == o2.value) {
- // only a single item is selected
- try {
- var ti = serverTreeView.getTreeItem(o1.value);
- if (ti) {
- if (ti.cert) {
- enable_view = true;
- }
- // Trust editing is not possible for override
- // entries that are bound to host:port,
- // where the cert is stored for convenince only.
- if (!ti.hostPort.length) {
- enable_edit = true;
- }
- }
- }
- catch (e) {
- }
- }
- }
-
- var enableViewButton=document.getElementById('websites_viewButton');
- enableViewButton.setAttribute("disabled", !enable_view);
- var enableEditButton=document.getElementById('websites_editButton');
- enableEditButton.setAttribute("disabled", !enable_edit);
- var enableExportButton=document.getElementById('websites_exportButton');
- enableExportButton.setAttribute("disabled", !enable_view);
- var enableDeleteButton=document.getElementById('websites_deleteButton');
- enableDeleteButton.setAttribute("disabled", !enable_delete);
- }
-
- function email_enableButtons()
- {
- var items = emailTreeView.selection;
- var toggle="false";
- if (items.getRangeCount() == 0) {
- toggle="true";
- }
- var enableViewButton=document.getElementById('email_viewButton');
- enableViewButton.setAttribute("disabled",toggle);
- var enableEditButton=document.getElementById('email_editButton');
- enableEditButton.setAttribute("disabled",toggle);
- var enableExportButton=document.getElementById('email_exportButton');
- enableExportButton.setAttribute("disabled",toggle);
- var enableDeleteButton=document.getElementById('email_deleteButton');
- enableDeleteButton.setAttribute("disabled",toggle);
- }
-
- function orphan_enableButtons()
- {
- var items = orphanTreeView.selection;
- var toggle="false";
- if (items.getRangeCount() == 0) {
- toggle="true";
- }
- var enableViewButton=document.getElementById('orphan_viewButton');
- enableViewButton.setAttribute("disabled",toggle);
- var enableExportButton=document.getElementById('orphan_exportButton');
- enableExportButton.setAttribute("disabled",toggle);
- var enableDeleteButton=document.getElementById('orphan_deleteButton');
- enableDeleteButton.setAttribute("disabled",toggle);
- }
-
- function backupCerts()
- {
- getSelectedCerts();
- var numcerts = selected_certs.length;
- if (!numcerts)
- return;
- var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
- var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
- fp.init(window,
- bundle.GetStringFromName("chooseP12BackupFileDialog"),
- nsIFilePicker.modeSave);
- fp.appendFilter(bundle.GetStringFromName("file_browse_PKCS12_spec"),
- "*.p12");
- fp.appendFilters(nsIFilePicker.filterAll);
- var rv = fp.show();
- if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
- certdb.exportPKCS12File(null, fp.file,
- selected_certs.length, selected_certs);
- }
- }
-
- function backupAllCerts()
- {
- // Select all rows, then call doBackup()
- var items = userTreeView.selection.selectAll();
- backupCerts();
- }
-
- function editCerts()
- {
- getSelectedCerts();
- var numcerts = selected_certs.length;
- if (!numcerts)
- return;
- for (var t=0; t<numcerts; t++) {
- var cert = selected_certs[t];
- var certkey = cert.dbKey;
- if (document.getElementById("ca_tab").selected) {
- window.openDialog('chrome://pippki/content/editcacert.xul', certkey,
- 'chrome,centerscreen,modal');
- } else if (document.getElementById("others_tab").selected) {
- window.openDialog('chrome://pippki/content/editemailcert.xul', certkey,
- 'chrome,centerscreen,modal');
- } else if (!document.getElementById("websites_tab").selected
- || !serverTreeView.isHostPortOverride(selected_index[t])) {
- // If the web sites tab is select, trust editing is only allowed
- // if the entry refers to a real cert, but not if it's
- // a host:port override, where the cert is stored for convenince only.
- window.openDialog('chrome://pippki/content/editsslcert.xul', certkey,
- 'chrome,centerscreen,modal');
- }
- }
- }
-
- function restoreCerts()
- {
- var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
- var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
- fp.init(window,
- bundle.GetStringFromName("chooseP12RestoreFileDialog"),
- nsIFilePicker.modeOpen);
- fp.appendFilter(bundle.GetStringFromName("file_browse_PKCS12_spec"),
- "*.p12; *.pfx");
- fp.appendFilters(nsIFilePicker.filterAll);
- if (fp.show() == nsIFilePicker.returnOK) {
- certdb.importPKCS12File(null, fp.file);
-
- var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
- certcache.cacheAllCerts();
- userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
- userTreeView.selection.clearSelection();
- caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
- caTreeView.selection.clearSelection();
- }
- }
-
- function exportCerts()
- {
- getSelectedCerts();
- var numcerts = selected_certs.length;
- if (!numcerts)
- return;
-
- for (var t=0; t<numcerts; t++) {
- exportToFile(window, selected_certs[t]);
- }
- }
-
- function deleteCerts()
- {
- getSelectedTreeItems();
- var numcerts = selected_tree_items.length;
- if (!numcerts)
- return;
-
- var params = Components.classes[nsDialogParamBlock].createInstance(nsIDialogParamBlock);
-
- var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
- var selTab = document.getElementById('certMgrTabbox').selectedItem;
- var selTabID = selTab.getAttribute('id');
- var t;
-
- params.SetNumberStrings(numcerts+1);
-
- if (selTabID == 'mine_tab')
- {
- params.SetString(0, selTabID);
- }
- else if (selTabID == "websites_tab")
- {
- params.SetString(0, selTabID);
- }
- else if (selTabID == "ca_tab")
- {
- params.SetString(0, selTabID);
- }
- else if (selTabID == "others_tab")
- {
- params.SetString(0, selTabID);
- }
- else if (selTabID == "orphan_tab")
- {
- params.SetString(0, selTabID);
- }
- else
- {
- return;
- }
-
- params.SetInt(0,numcerts);
- for (t=0; t<numcerts; t++)
- {
- var tree_item = selected_tree_items[t];
- var c = tree_item.cert;
- if (!c) {
- params.SetString(t+1, tree_item.hostPort);
- }
- else {
- params.SetString(t+1, c.commonName);
- }
-
- }
-
- window.openDialog('chrome://pippki/content/deletecert.xul', "",
- 'chrome,centerscreen,modal', params);
-
- if (params.GetInt(1) == 1) {
- // user closed dialog with OK
- var treeView = null;
- var loadParam = null;
-
- selTab = document.getElementById('certMgrTabbox').selectedItem;
- selTabID = selTab.getAttribute('id');
- if (selTabID == 'mine_tab') {
- treeView = userTreeView;
- } else if (selTabID == "others_tab") {
- treeView = emailTreeView;
- } else if (selTabID == "websites_tab") {
- treeView = serverTreeView;
- } else if (selTabID == "ca_tab") {
- treeView = caTreeView;
- } else if (selTabID == "orphan_tab") {
- treeView = orphanTreeView;
- }
-
- for (t=numcerts-1; t>=0; t--)
- {
- treeView.deleteEntryObject(selected_index[t]);
- }
-
- selected_tree_items = [];
- selected_index = [];
- treeView.selection.clearSelection();
- }
- }
-
- function viewCerts()
- {
- getSelectedCerts();
- var numcerts = selected_certs.length;
- if (!numcerts)
- return;
-
- for (var t=0; t<numcerts; t++) {
- viewCertHelper(window, selected_certs[t]);
- }
- }
-
- function addCACerts()
- {
- var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
- var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
- fp.init(window,
- bundle.GetStringFromName("importCACertsPrompt"),
- nsIFilePicker.modeOpen);
- fp.appendFilter(bundle.GetStringFromName("file_browse_Certificate_spec"),
- "*.crt; *.cert; *.cer; *.pem; *.der");
- fp.appendFilters(nsIFilePicker.filterAll);
- if (fp.show() == nsIFilePicker.returnOK) {
- certdb.importCertsFromFile(null, fp.file, nsIX509Cert.CA_CERT);
- caTreeView.loadCerts(nsIX509Cert.CA_CERT);
- caTreeView.selection.clearSelection();
- }
- }
-
- function onSmartCardChange()
- {
- var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
- // We've change the state of the smart cards inserted or removed
- // that means the available certs may have changed. Update the display
- certcache.cacheAllCerts();
- userTreeView.loadCertsFromCache(certcache, nsIX509Cert.USER_CERT);
- userTreeView.selection.clearSelection();
- caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
- caTreeView.selection.clearSelection();
- serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
- serverTreeView.selection.clearSelection();
- emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
- emailTreeView.selection.clearSelection();
- orphanTreeView.loadCertsFromCache(certcache, nsIX509Cert.UNKNOWN_CERT);
- orphanTreeView.selection.clearSelection();
- }
-
- function addEmailCert()
- {
- var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
- var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
- fp.init(window,
- bundle.GetStringFromName("importEmailCertPrompt"),
- nsIFilePicker.modeOpen);
- fp.appendFilter(bundle.GetStringFromName("file_browse_Certificate_spec"),
- "*.crt; *.cert; *.cer; *.pem; *.der");
- fp.appendFilters(nsIFilePicker.filterAll);
- if (fp.show() == nsIFilePicker.returnOK) {
- certdb.importCertsFromFile(null, fp.file, nsIX509Cert.EMAIL_CERT);
- var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
- certcache.cacheAllCerts();
- emailTreeView.loadCertsFromCache(certcache, nsIX509Cert.EMAIL_CERT);
- emailTreeView.selection.clearSelection();
- caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
- caTreeView.selection.clearSelection();
- }
- }
-
- function addWebSiteCert()
- {
- var bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties");
- var fp = Components.classes[nsFilePicker].createInstance(nsIFilePicker);
- fp.init(window,
- bundle.GetStringFromName("importServerCertPrompt"),
- nsIFilePicker.modeOpen);
- fp.appendFilter(bundle.GetStringFromName("file_browse_Certificate_spec"),
- "*.crt; *.cert; *.cer; *.pem; *.der");
- fp.appendFilters(nsIFilePicker.filterAll);
- if (fp.show() == nsIFilePicker.returnOK) {
- certdb.importCertsFromFile(null, fp.file, nsIX509Cert.SERVER_CERT);
-
- var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
- certcache.cacheAllCerts();
- serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
- serverTreeView.selection.clearSelection();
- caTreeView.loadCertsFromCache(certcache, nsIX509Cert.CA_CERT);
- caTreeView.selection.clearSelection();
- }
- }
-
- function addException()
- {
- window.openDialog('chrome://pippki/content/exceptionDialog.xul', "",
- 'chrome,centerscreen,modal');
- var certcache = Components.classes[nsNSSCertCache].createInstance(nsINSSCertCache);
- certcache.cacheAllCerts();
- serverTreeView.loadCertsFromCache(certcache, nsIX509Cert.SERVER_CERT);
- serverTreeView.selection.clearSelection();
- orphanTreeView.loadCertsFromCache(certcache, nsIX509Cert.UNKNOWN_CERT);
- orphanTreeView.selection.clearSelection();
- }
-
-