1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/manager/pki/resources/content/pippki.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,160 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- 1.5 + * 1.6 + * This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +/* 1.11 + * These are helper functions to be included 1.12 + * pippki UI js files. 1.13 + */ 1.14 + 1.15 +function setText(id, value) { 1.16 + var element = document.getElementById(id); 1.17 + if (!element) return; 1.18 + if (element.hasChildNodes()) 1.19 + element.removeChild(element.firstChild); 1.20 + var textNode = document.createTextNode(value); 1.21 + element.appendChild(textNode); 1.22 +} 1.23 + 1.24 +const nsICertificateDialogs = Components.interfaces.nsICertificateDialogs; 1.25 +const nsCertificateDialogs = "@mozilla.org/nsCertificateDialogs;1" 1.26 + 1.27 +function viewCertHelper(parent, cert) { 1.28 + if (!cert) 1.29 + return; 1.30 + 1.31 + var cd = Components.classes[nsCertificateDialogs].getService(nsICertificateDialogs); 1.32 + cd.viewCert(parent, cert); 1.33 +} 1.34 + 1.35 +function getDERString(cert) 1.36 +{ 1.37 + var length = {}; 1.38 + var derArray = cert.getRawDER(length); 1.39 + var derString = ''; 1.40 + for (var i = 0; i < derArray.length; i++) { 1.41 + derString += String.fromCharCode(derArray[i]); 1.42 + } 1.43 + return derString; 1.44 +} 1.45 + 1.46 +function getPKCS7String(cert, chainMode) 1.47 +{ 1.48 + var length = {}; 1.49 + cert.QueryInterface(Components.interfaces.nsIX509Cert3); 1.50 + var pkcs7Array = cert.exportAsCMS(chainMode, length); 1.51 + var pkcs7String = ''; 1.52 + for (var i = 0; i < pkcs7Array.length; i++) { 1.53 + pkcs7String += String.fromCharCode(pkcs7Array[i]); 1.54 + } 1.55 + return pkcs7String; 1.56 +} 1.57 + 1.58 +function getPEMString(cert) 1.59 +{ 1.60 + var derb64 = btoa(getDERString(cert)); 1.61 + // Wrap the Base64 string into lines of 64 characters, 1.62 + // with CRLF line breaks (as specified in RFC 1421). 1.63 + var wrapped = derb64.replace(/(\S{64}(?!$))/g, "$1\r\n"); 1.64 + return "-----BEGIN CERTIFICATE-----\r\n" 1.65 + + wrapped 1.66 + + "\r\n-----END CERTIFICATE-----\r\n"; 1.67 +} 1.68 + 1.69 +function alertPromptService(title, message) 1.70 +{ 1.71 + var ps = null; 1.72 + var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. 1.73 + getService(Components.interfaces.nsIPromptService); 1.74 + ps.alert(window, title, message); 1.75 +} 1.76 + 1.77 +function exportToFile(parent, cert) 1.78 +{ 1.79 + var bundle = document.getElementById("pippki_bundle"); 1.80 + if (!cert) 1.81 + return; 1.82 + 1.83 + var nsIFilePicker = Components.interfaces.nsIFilePicker; 1.84 + var fp = Components.classes["@mozilla.org/filepicker;1"]. 1.85 + createInstance(nsIFilePicker); 1.86 + fp.init(parent, bundle.getString("SaveCertAs"), 1.87 + nsIFilePicker.modeSave); 1.88 + var filename = cert.commonName; 1.89 + if (!filename.length) 1.90 + filename = cert.windowTitle; 1.91 + // remove all whitespace from the default filename 1.92 + fp.defaultString = filename.replace(/\s*/g,''); 1.93 + fp.defaultExtension = "crt"; 1.94 + fp.appendFilter(bundle.getString("CertFormatBase64"), "*.crt; *.pem"); 1.95 + fp.appendFilter(bundle.getString("CertFormatBase64Chain"), "*.crt; *.pem"); 1.96 + fp.appendFilter(bundle.getString("CertFormatDER"), "*.der"); 1.97 + fp.appendFilter(bundle.getString("CertFormatPKCS7"), "*.p7c"); 1.98 + fp.appendFilter(bundle.getString("CertFormatPKCS7Chain"), "*.p7c"); 1.99 + fp.appendFilters(nsIFilePicker.filterAll); 1.100 + var res = fp.show(); 1.101 + if (res != nsIFilePicker.returnOK && res != nsIFilePicker.returnReplace) 1.102 + return; 1.103 + 1.104 + var content = ''; 1.105 + switch (fp.filterIndex) { 1.106 + case 1: 1.107 + content = getPEMString(cert); 1.108 + var chain = cert.getChain(); 1.109 + for (var i = 1; i < chain.length; i++) 1.110 + content += getPEMString(chain.queryElementAt(i, Components.interfaces.nsIX509Cert)); 1.111 + break; 1.112 + case 2: 1.113 + content = getDERString(cert); 1.114 + break; 1.115 + case 3: 1.116 + content = getPKCS7String(cert, Components.interfaces.nsIX509Cert3.CMS_CHAIN_MODE_CertOnly); 1.117 + break; 1.118 + case 4: 1.119 + content = getPKCS7String(cert, Components.interfaces.nsIX509Cert3.CMS_CHAIN_MODE_CertChainWithRoot); 1.120 + break; 1.121 + case 0: 1.122 + default: 1.123 + content = getPEMString(cert); 1.124 + break; 1.125 + } 1.126 + var msg; 1.127 + var written = 0; 1.128 + try { 1.129 + var file = Components.classes["@mozilla.org/file/local;1"]. 1.130 + createInstance(Components.interfaces.nsILocalFile); 1.131 + file.initWithPath(fp.file.path); 1.132 + var fos = Components.classes["@mozilla.org/network/file-output-stream;1"]. 1.133 + createInstance(Components.interfaces.nsIFileOutputStream); 1.134 + // flags: PR_WRONLY | PR_CREATE_FILE | PR_TRUNCATE 1.135 + fos.init(file, 0x02 | 0x08 | 0x20, 00644, 0); 1.136 + written = fos.write(content, content.length); 1.137 + fos.close(); 1.138 + } 1.139 + catch(e) { 1.140 + switch (e.result) { 1.141 + case Components.results.NS_ERROR_FILE_ACCESS_DENIED: 1.142 + msg = bundle.getString("writeFileAccessDenied"); 1.143 + break; 1.144 + case Components.results.NS_ERROR_FILE_IS_LOCKED: 1.145 + msg = bundle.getString("writeFileIsLocked"); 1.146 + break; 1.147 + case Components.results.NS_ERROR_FILE_NO_DEVICE_SPACE: 1.148 + case Components.results.NS_ERROR_FILE_DISK_FULL: 1.149 + msg = bundle.getString("writeFileNoDeviceSpace"); 1.150 + break; 1.151 + default: 1.152 + msg = e.message; 1.153 + break; 1.154 + } 1.155 + } 1.156 + if (written != content.length) { 1.157 + if (!msg.length) 1.158 + msg = bundle.getString("writeFileUnknownError"); 1.159 + alertPromptService(bundle.getString("writeFileFailure"), 1.160 + bundle.getFormattedString("writeFileFailed", 1.161 + [fp.file.path, msg])); 1.162 + } 1.163 +}