forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			161 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			161 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Any copyright is dedicated to the Public Domain.
 | |
|  * http://creativecommons.org/publicdomain/zero/1.0/ */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| var MockFilePicker = SpecialPowers.MockFilePicker;
 | |
| 
 | |
| function createTemporarySaveDirectory() {
 | |
|   var saveDir = Services.dirsvc.get("TmpD", Ci.nsIFile);
 | |
|   saveDir.append("testsavedir");
 | |
|   if (!saveDir.exists()) {
 | |
|     info("create testsavedir!");
 | |
|     saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, 0o755);
 | |
|   }
 | |
|   info("return from createTempSaveDir: " + saveDir.path);
 | |
|   return saveDir;
 | |
| }
 | |
| 
 | |
| // Create the folder the certificates will be saved into.
 | |
| var destDir = createTemporarySaveDirectory();
 | |
| registerCleanupFunction(function () {
 | |
|   destDir.remove(true);
 | |
|   BrowserTestUtils.removeTab(gBrowser.selectedTab);
 | |
| });
 | |
| 
 | |
| function stringOrArrayEquals(actual, expected, message) {
 | |
|   is(
 | |
|     typeof actual,
 | |
|     typeof expected,
 | |
|     "actual, expected should have the same type"
 | |
|   );
 | |
|   if (typeof expected == "string") {
 | |
|     is(actual, expected, message);
 | |
|   } else {
 | |
|     is(actual.toString(), expected.toString(), message);
 | |
|   }
 | |
| }
 | |
| 
 | |
| var dialogWin;
 | |
| var exportButton;
 | |
| var expectedCert;
 | |
| 
 | |
| async function setupTest() {
 | |
|   await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
 | |
|   let certButton = gBrowser.selectedBrowser.contentDocument.getElementById(
 | |
|     "viewCertificatesButton"
 | |
|   );
 | |
|   certButton.scrollIntoView();
 | |
|   let certDialogLoaded = promiseLoadSubDialog(
 | |
|     "chrome://pippki/content/certManager.xhtml"
 | |
|   );
 | |
|   certButton.click();
 | |
|   dialogWin = await certDialogLoaded;
 | |
|   let doc = dialogWin.document;
 | |
|   doc.getElementById("certmanagertabs").selectedTab =
 | |
|     doc.getElementById("ca_tab");
 | |
|   let treeView = doc.getElementById("ca-tree").view;
 | |
|   // Select any which cert. Ignore parent rows (ie rows without certs):
 | |
|   for (let i = 0; i < treeView.rowCount; i++) {
 | |
|     treeView.selection.select(i);
 | |
|     dialogWin.getSelectedCerts();
 | |
|     let certs = dialogWin.selected_certs; // yuck... but this is how the dialog works.
 | |
|     if (certs && certs.length == 1 && certs[0]) {
 | |
|       expectedCert = certs[0];
 | |
|       // OK, we managed to select a cert!
 | |
|       break;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   exportButton = doc.getElementById("ca_exportButton");
 | |
|   is(exportButton.disabled, false, "Should enable export button");
 | |
| }
 | |
| 
 | |
| async function checkCertExportWorks(
 | |
|   exportType,
 | |
|   encoding,
 | |
|   expectedFileContents
 | |
| ) {
 | |
|   MockFilePicker.displayDirectory = destDir;
 | |
|   var destFile = destDir.clone();
 | |
|   MockFilePicker.init(window);
 | |
|   MockFilePicker.filterIndex = exportType;
 | |
|   MockFilePicker.showCallback = function (fp) {
 | |
|     info("showCallback");
 | |
|     let fileName = fp.defaultString;
 | |
|     info("fileName: " + fileName);
 | |
|     destFile.append(fileName);
 | |
|     MockFilePicker.setFiles([destFile]);
 | |
|     info("done showCallback");
 | |
|   };
 | |
|   let finishedExporting = TestUtils.topicObserved("cert-export-finished");
 | |
|   exportButton.click();
 | |
|   await finishedExporting;
 | |
|   MockFilePicker.cleanup();
 | |
|   if (destFile && destFile.exists()) {
 | |
|     let contents;
 | |
|     if (encoding === "utf-8") {
 | |
|       contents = await IOUtils.readUTF8(destFile.path);
 | |
|     } else {
 | |
|       is(encoding, "", "expected either utf-8 or empty string for encoding");
 | |
|       contents = await IOUtils.read(destFile.path);
 | |
|     }
 | |
|     stringOrArrayEquals(
 | |
|       contents,
 | |
|       expectedFileContents,
 | |
|       "Should have written correct contents"
 | |
|     );
 | |
|     destFile.remove(false);
 | |
|   } else {
 | |
|     ok(false, "No cert saved!");
 | |
|   }
 | |
| }
 | |
| 
 | |
| add_task(setupTest);
 | |
| 
 | |
| add_task(async function checkCertPEMExportWorks() {
 | |
|   let expectedContents = dialogWin.getPEMString(expectedCert);
 | |
|   await checkCertExportWorks(0, /* 0 = PEM */ "utf-8", expectedContents);
 | |
| });
 | |
| 
 | |
| add_task(async function checkCertPEMChainExportWorks() {
 | |
|   let expectedContents = dialogWin.getPEMString(expectedCert);
 | |
|   await checkCertExportWorks(
 | |
|     1, // 1 = PEM chain, but the chain is of length 1
 | |
|     "utf-8",
 | |
|     expectedContents
 | |
|   );
 | |
| });
 | |
| 
 | |
| add_task(async function checkCertDERExportWorks() {
 | |
|   let expectedContents = Uint8Array.from(expectedCert.getRawDER());
 | |
|   await checkCertExportWorks(2, /* 2 = DER */ "", expectedContents);
 | |
| });
 | |
| 
 | |
| function stringToTypedArray(str) {
 | |
|   let arr = new Uint8Array(str.length);
 | |
|   for (let i = 0; i < arr.length; i++) {
 | |
|     arr[i] = str.charCodeAt(i);
 | |
|   }
 | |
|   return arr;
 | |
| }
 | |
| 
 | |
| add_task(async function checkCertPKCS7ExportWorks() {
 | |
|   let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(
 | |
|     Ci.nsIX509CertDB
 | |
|   );
 | |
|   let expectedContents = stringToTypedArray(certdb.asPKCS7Blob([expectedCert]));
 | |
|   await checkCertExportWorks(3, /* 3 = PKCS7 */ "", expectedContents);
 | |
| });
 | |
| 
 | |
| add_task(async function checkCertPKCS7ChainExportWorks() {
 | |
|   let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(
 | |
|     Ci.nsIX509CertDB
 | |
|   );
 | |
|   let expectedContents = stringToTypedArray(certdb.asPKCS7Blob([expectedCert]));
 | |
|   await checkCertExportWorks(
 | |
|     4, // 4 = PKCS7 chain, but the chain is of length 1
 | |
|     "",
 | |
|     expectedContents
 | |
|   );
 | |
| });
 | 
