/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ const nsIX509Cert = Components.interfaces.nsIX509Cert; const nsIX509Cert3 = Components.interfaces.nsIX509Cert3; const nsX509CertDB = "@mozilla.org/security/x509certdb;1"; const nsIX509CertDB = Components.interfaces.nsIX509CertDB; const nsPK11TokenDB = "@mozilla.org/security/pk11tokendb;1"; const nsIPK11TokenDB = Components.interfaces.nsIPK11TokenDB; const nsIPKIParamBlock = Components.interfaces.nsIPKIParamBlock; const nsIASN1Object = Components.interfaces.nsIASN1Object; const nsIASN1Sequence = Components.interfaces.nsIASN1Sequence; const nsIASN1PrintableItem = Components.interfaces.nsIASN1PrintableItem; const nsIASN1Tree = Components.interfaces.nsIASN1Tree; const nsASN1Tree = "@mozilla.org/security/nsASN1Tree;1" var bundle; function doPrompt(msg) { let prompts = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. getService(Components.interfaces.nsIPromptService); prompts.alert(window, null, msg); } function AddCertChain(node, chain, idPrefix) { var idfier = idPrefix+"chain_"; var child = document.getElementById(node); var numCerts = chain.length; var currCert; var displayVal; var addTwistie; for (var i=numCerts-1; i>=0; i--) { currCert = chain.queryElementAt(i, nsIX509Cert); if (currCert.commonName) { displayVal = currCert.commonName; } else { displayVal = currCert.windowTitle; } if (0 == i) { addTwistie = false; } else { addTwistie = true; } child = addChildrenToTree(child, displayVal, currCert.dbKey,addTwistie); } } function AddUsage(usage,verifyInfoBox) { var text = document.createElement("textbox"); text.setAttribute("value", usage); text.setAttribute("style", "margin: 2px 5px"); text.setAttribute("readonly", "true"); text.setAttribute("class", "scrollfield"); verifyInfoBox.appendChild(text); } function setWindowName() { // Get the cert from the cert database var certdb = Components.classes[nsX509CertDB].getService(nsIX509CertDB); var myName = self.name; bundle = srGetStrBundle("chrome://pippki/locale/pippki.properties"); var cert; var certDetails = bundle.GetStringFromName('certDetails'); if (myName != "") { document.title = certDetails + '"' + myName + '"'; // XXX l10n? // Get the token // XXX ignore this for now. NSS will find the cert on a token // by "tokenname:certname", which is what we have. //var tokenName = ""; //var pk11db = Components.classes[nsPK11TokenDB].getService(nsIPK11TokenDB); //var token = pk11db.findTokenByName(tokenName); //var cert = certdb.findCertByNickname(token, myName); cert = certdb.findCertByNickname(null, myName); } else { var pkiParams = window.arguments[0].QueryInterface(nsIPKIParamBlock); var isupport = pkiParams.getISupportAtIndex(1); cert = isupport.QueryInterface(nsIX509Cert); document.title = certDetails + '"' + cert.windowTitle + '"'; // XXX l10n? } // // Set the cert attributes for viewing // // The chain of trust var chain = cert.getChain(); AddCertChain("treesetDump", chain, "dump_"); DisplayGeneralDataFromCert(cert); BuildPrettyPrint(cert); if (cert instanceof nsIX509Cert3) { cert.requestUsagesArrayAsync(new listener()); } } function addChildrenToTree(parentTree,label,value,addTwistie) { var treeChild1 = document.createElement("treechildren"); var treeElement = addTreeItemToTreeChild(treeChild1,label,value,addTwistie); parentTree.appendChild(treeChild1); return treeElement; } function addTreeItemToTreeChild(treeChild,label,value,addTwistie) { var treeElem1 = document.createElement("treeitem"); if (addTwistie) { treeElem1.setAttribute("container","true"); treeElem1.setAttribute("open","true"); } var treeRow = document.createElement("treerow"); var treeCell = document.createElement("treecell"); treeCell.setAttribute("label",label); if (value) treeCell.setAttribute("display",value); treeRow.appendChild(treeCell); treeElem1.appendChild(treeRow); treeChild.appendChild(treeElem1); return treeElem1; } function displaySelected() { var asn1Tree = document.getElementById('prettyDumpTree'). treeBoxObject.view.QueryInterface(nsIASN1Tree); var items = asn1Tree.selection; var certDumpVal = document.getElementById('certDumpVal'); if (items.currentIndex != -1) { var value = asn1Tree.getDisplayData(items.currentIndex); certDumpVal.value = value; } else { certDumpVal.value =""; } } function BuildPrettyPrint(cert) { var certDumpTree = Components.classes[nsASN1Tree]. createInstance(nsIASN1Tree); certDumpTree.loadASN1Structure(cert.ASN1Structure); document.getElementById('prettyDumpTree'). treeBoxObject.view = certDumpTree; } function addAttributeFromCert(nodeName, value) { var node = document.getElementById(nodeName); if (!value) { value = bundle.GetStringFromName('notPresent'); } node.setAttribute('value',value) } function listener() { } listener.prototype.QueryInterface = function(iid) { if (iid.equals(Components.interfaces.nsISupports) || iid.equals(Components.interfaces.nsICertVerificationListener)) return this; throw Components.results.NS_ERROR_NO_INTERFACE; } listener.prototype.notify = function(cert, result) { DisplayVerificationData(cert, result); } function DisplayVerificationData(cert, result) { document.getElementById("verify_pending").setAttribute("hidden", "true"); if (!result || !cert) return; // no results could be produced if (!(cert instanceof Components.interfaces.nsIX509Cert)) return; // Verification and usage var verifystr = ""; var o1 = {}; var o2 = {}; var o3 = {}; if (!(result instanceof Components.interfaces.nsICertVerificationResult)) return; result.getUsagesArrayResult(o1, o2, o3); var verifystate = o1.value; var count = o2.value; var usageList = o3.value; if (verifystate == cert.VERIFIED_OK) { verifystr = bundle.GetStringFromName('certVerified'); } else if (verifystate == cert.CERT_REVOKED) { verifystr = bundle.GetStringFromName('certNotVerified_CertRevoked'); } else if (verifystate == cert.CERT_EXPIRED) { verifystr = bundle.GetStringFromName('certNotVerified_CertExpired'); } else if (verifystate == cert.CERT_NOT_TRUSTED) { verifystr = bundle.GetStringFromName('certNotVerified_CertNotTrusted'); } else if (verifystate == cert.ISSUER_NOT_TRUSTED) { verifystr = bundle.GetStringFromName('certNotVerified_IssuerNotTrusted'); } else if (verifystate == cert.ISSUER_UNKNOWN) { verifystr = bundle.GetStringFromName('certNotVerified_IssuerUnknown'); } else if (verifystate == cert.INVALID_CA) { verifystr = bundle.GetStringFromName('certNotVerified_CAInvalid'); } else if (verifystate == cert.SIGNATURE_ALGORITHM_DISABLED) { verifystr = bundle.GetStringFromName('certNotVerified_AlgorithmDisabled'); } else { /* if (verifystate == cert.NOT_VERIFIED_UNKNOWN || == USAGE_NOT_ALLOWED) */ verifystr = bundle.GetStringFromName('certNotVerified_Unknown'); } var verified=document.getElementById('verified'); verified.textContent = verifystr; if (count > 0) { var verifyInfoBox = document.getElementById('verify_info_box'); for (var i=0; i= 0) { var item = tree.contentView.getItemAtIndex(realIndex); var dbKey = item.firstChild.firstChild.getAttribute('display'); var certdb = Components.classes[nsX509CertDB].getService(nsIX509CertDB); var cert = certdb.findCertByDBKey(dbKey,null); return cert; } /* shouldn't really happen */ return null; }