blob: 33e780de083f5a3e17e0026de4023051f8df37cf [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview A helper object used from the "Manage certificates" section
* to interact with the browser.
*/
/**
* @typedef {{
* extractable: boolean,
* id: string,
* name: string,
* policy: boolean,
* webTrustAnchor: boolean,
* readonly: boolean,
* untrusted: boolean,
* }}
* @see chrome/browser/ui/webui/settings/certificates_handler.cc
*/
let CertificateSubnode;
/**
* A data structure describing a certificate that is currently being imported,
* therefore it has no ID yet, but it has a name. Used within JS only.
* @typedef {{
* name: string,
* }}
*/
let NewCertificateSubNode;
/**
* Top-level grouping node in a certificate list, representing an organization
* and containing certs that belong to the organization in |subnodes|. If a
* certificate does not have an organization name, it will be grouped under its
* own CertificatesOrgGroup with |name| set to its display name.
* @typedef {{
* id: string,
* name: string,
* containsPolicyCerts: boolean,
* subnodes: !Array<!CertificateSubnode>
* }}
* @see chrome/browser/ui/webui/settings/certificates_handler.cc
*/
let CertificatesOrgGroup;
/**
* @typedef {{
* ssl: boolean,
* email: boolean,
* objSign: boolean
* }}
*/
let CaTrustInfo;
/**
* Generic error returned from C++ via a Promise reject callback.
* @typedef {{
* title: string,
* description: string
* }}
* @see chrome/browser/ui/webui/settings/certificates_handler.cc
*/
let CertificatesError;
/**
* Enumeration of all possible certificate types.
* @enum {string}
*/
const CertificateType = {
CA: 'ca',
OTHER: 'other',
PERSONAL: 'personal',
SERVER: 'server',
};
/**
* Error returned from C++ via a Promise reject callback, when some certificates
* fail to be imported.
* @typedef {{
* title: string,
* description: string,
* certificateErrors: !Array<{name: string, error: string}>
* }}
* @see chrome/browser/ui/webui/settings/certificates_handler.cc
*/
let CertificatesImportError;
cr.define('certificate_manager', function() {
/** @interface */
class CertificatesBrowserProxy {
/**
* Triggers 5 events in the following order
* 1x 'certificates-model-ready' event.
* 4x 'certificates-changed' event, one for each certificate category.
*/
refreshCertificates() {}
/** @param {string} id */
viewCertificate(id) {}
/** @param {string} id */
exportCertificate(id) {}
/**
* @param {string} id
* @return {!Promise} A promise resolved when the certificate has been
* deleted successfully or rejected with a CertificatesError.
*/
deleteCertificate(id) {}
/**
* @param {string} id
* @return {!Promise<!CaTrustInfo>}
*/
getCaCertificateTrust(id) {}
/**
* @param {string} id
* @param {boolean} ssl
* @param {boolean} email
* @param {boolean} objSign
* @return {!Promise}
*/
editCaCertificateTrust(id, ssl, email, objSign) {}
cancelImportExportCertificate() {}
/**
* @param {string} id
* @return {!Promise} A promise firing once the user has selected
* the export location. A prompt should be shown to asking for a
* password to use for encrypting the file. The password should be
* passed back via a call to
* exportPersonalCertificatePasswordSelected().
*/
exportPersonalCertificate(id) {}
/**
* @param {string} password
* @return {!Promise}
*/
exportPersonalCertificatePasswordSelected(password) {}
/**
* @param {boolean} useHardwareBacked
* @return {!Promise<boolean>} A promise firing once the user has selected
* the file to be imported. If true a password prompt should be shown to
* the user, and the password should be passed back via a call to
* importPersonalCertificatePasswordSelected().
*/
importPersonalCertificate(useHardwareBacked) {}
/**
* @param {string} password
* @return {!Promise}
*/
importPersonalCertificatePasswordSelected(password) {}
/**
* @return {!Promise} A promise firing once the user has selected
* the file to be imported, or failing with CertificatesError.
* Upon success, a prompt should be shown to the user to specify the
* trust levels, and that information should be passed back via a call
* to importCaCertificateTrustSelected().
*/
importCaCertificate() {}
/**
* @param {boolean} ssl
* @param {boolean} email
* @param {boolean} objSign
* @return {!Promise} A promise firing once the trust level for the imported
* certificate has been successfully set. The promise is rejected if an
* error occurred with either a CertificatesError or
* CertificatesImportError.
*/
importCaCertificateTrustSelected(ssl, email, objSign) {}
/**
* @return {!Promise} A promise firing once the certificate has been
* imported. The promise is rejected if an error occurred, with either
* a CertificatesError or CertificatesImportError.
*/
importServerCertificate() {}
}
/**
* @implements {certificate_manager.CertificatesBrowserProxy}
*/
class CertificatesBrowserProxyImpl {
/** @override */
refreshCertificates() {
chrome.send('refreshCertificates');
}
/** @override */
viewCertificate(id) {
chrome.send('viewCertificate', [id]);
}
/** @override */
exportCertificate(id) {
chrome.send('exportCertificate', [id]);
}
/** @override */
deleteCertificate(id) {
return cr.sendWithPromise('deleteCertificate', id);
}
/** @override */
exportPersonalCertificate(id) {
return cr.sendWithPromise('exportPersonalCertificate', id);
}
/** @override */
exportPersonalCertificatePasswordSelected(password) {
return cr.sendWithPromise(
'exportPersonalCertificatePasswordSelected', password);
}
/** @override */
importPersonalCertificate(useHardwareBacked) {
return cr.sendWithPromise('importPersonalCertificate', useHardwareBacked);
}
/** @override */
importPersonalCertificatePasswordSelected(password) {
return cr.sendWithPromise(
'importPersonalCertificatePasswordSelected', password);
}
/** @override */
getCaCertificateTrust(id) {
return cr.sendWithPromise('getCaCertificateTrust', id);
}
/** @override */
editCaCertificateTrust(id, ssl, email, objSign) {
return cr.sendWithPromise(
'editCaCertificateTrust', id, ssl, email, objSign);
}
/** @override */
importCaCertificateTrustSelected(ssl, email, objSign) {
return cr.sendWithPromise(
'importCaCertificateTrustSelected', ssl, email, objSign);
}
/** @override */
cancelImportExportCertificate() {
chrome.send('cancelImportExportCertificate');
}
/** @override */
importCaCertificate() {
return cr.sendWithPromise('importCaCertificate');
}
/** @override */
importServerCertificate() {
return cr.sendWithPromise('importServerCertificate');
}
}
// The singleton instance_ is replaced with a test version of this wrapper
// during testing.
cr.addSingletonGetter(CertificatesBrowserProxyImpl);
return {
CertificatesBrowserProxy: CertificatesBrowserProxy,
CertificatesBrowserProxyImpl: CertificatesBrowserProxyImpl,
};
});