// Copyright (c) 2011 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.
cr.define('options', function() {
var OptionsPage = options.OptionsPage;
/////////////////////////////////////////////////////////////////////////////
// CertificateManagerTab class:
/**
* blah
* @param {!string} id The id of this tab.
*/
function CertificateManagerTab(id) {
this.tree = $(id + '-tree');
options.CertificatesTree.decorate(this.tree);
this.tree.addEventListener('change',
this.handleCertificatesTreeChange_.bind(this));
var tree = this.tree;
this.viewButton = $(id + '-view');
this.viewButton.onclick = function(e) {
var selected = tree.selectedItem;
chrome.send('viewCertificate', [selected.data.id]);
}
this.editButton = $(id + '-edit');
if (this.editButton !== null) {
if (id == 'serverCertsTab') {
this.editButton.onclick = function(e) {
var selected = tree.selectedItem;
chrome.send('editServerCertificate', [selected.data.id]);
}
} else if (id == 'caCertsTab') {
this.editButton.onclick = function(e) {
var data = tree.selectedItem.data;
CertificateEditCaTrustOverlay.show(data.id, data.name);
}
}
}
this.backupButton = $(id + '-backup');
if (this.backupButton !== null) {
this.backupButton.onclick = function(e) {
var selected = tree.selectedItem;
chrome.send('exportPersonalCertificate', [selected.data.id]);
}
}
this.backupAllButton = $(id + '-backup-all');
if (this.backupAllButton !== null) {
this.backupAllButton.onclick = function(e) {
chrome.send('exportAllPersonalCertificates', []);
}
}
this.importButton = $(id + '-import');
if (this.importButton !== null) {
if (id == 'personalCertsTab') {
this.importButton.onclick = function(e) {
chrome.send('importPersonalCertificate', [false]);
}
} else if (id == 'serverCertsTab') {
this.importButton.onclick = function(e) {
chrome.send('importServerCertificate', []);
}
} else if (id == 'caCertsTab') {
this.importButton.onclick = function(e) {
chrome.send('importCaCertificate', []);
}
}
}
this.importAndBindButton = $(id + '-import-and-bind');
if (this.importAndBindButton !== null) {
if (id == 'personalCertsTab') {
this.importAndBindButton.onclick = function(e) {
chrome.send('importPersonalCertificate', [true]);
}
}
}
this.exportButton = $(id + '-export');
if (this.exportButton !== null) {
this.exportButton.onclick = function(e) {
var selected = tree.selectedItem;
chrome.send('exportCertificate', [selected.data.id]);
}
}
this.deleteButton = $(id + '-delete');
this.deleteButton.onclick = function(e) {
var data = tree.selectedItem.data;
AlertOverlay.show(
localStrings.getStringF(id + 'DeleteConfirm', data.name),
localStrings.getString(id + 'DeleteImpact'),
localStrings.getString('ok'),
localStrings.getString('cancel'),
function() { chrome.send('deleteCertificate', [data.id]); });
}
}
CertificateManagerTab.prototype = {
/**
* Update button state.
* @private
* @param {!Object} data The data of the selected item.
*/
updateButtonState: function(data) {
var isCert = !!data && data.id.substr(0, 5) == 'cert-';
var readOnly = !!data && data.readonly;
var hasChildren = this.tree.items.length > 0;
this.viewButton.disabled = !isCert;
if (this.editButton !== null)
this.editButton.disabled = !isCert;
if (this.backupButton !== null)
this.backupButton.disabled = !isCert;
if (this.backupAllButton !== null)
this.backupAllButton.disabled = !hasChildren;
if (this.exportButton !== null)
this.exportButton.disabled = !isCert;
this.deleteButton.disabled = !isCert || readOnly;
},
/**
* Handles certificate tree selection change.
* @private
* @param {!Event} e The change event object.
*/
handleCertificatesTreeChange_: function(e) {
var data = null;
if (this.tree.selectedItem) {
data = this.tree.selectedItem.data;
}
this.updateButtonState(data);
},
}
// TODO(xiyuan): Use notification from backend instead of polling.
// TPM token check polling timer.
var tpmPollingTimer;
// Initiate tpm token check if needed.
function checkTpmToken() {
var importAndBindButton = $('personalCertsTab-import-and-bind');
if (importAndBindButton && importAndBindButton.disabled)
chrome.send('checkTpmTokenReady');
}
// Stop tpm polling timer.
function stopTpmTokenCheckPolling() {
if (tpmPollingTimer) {
window.clearTimeout(tpmPollingTimer);
tpmPollingTimer = undefined;
}
}
/////////////////////////////////////////////////////////////////////////////
// CertificateManager class:
/**
* Encapsulated handling of ChromeOS accounts options page.
* @constructor
*/
function CertificateManager(model) {
OptionsPage.call(this, 'certificates',
templateData.certificateManagerPageTabTitle,
'certificateManagerPage');
}
cr.addSingletonGetter(CertificateManager);
CertificateManager.prototype = {
__proto__: OptionsPage.prototype,
initializePage: function() {
OptionsPage.prototype.initializePage.call(this);
this.personalTab = new CertificateManagerTab('personalCertsTab');
this.serverTab = new CertificateManagerTab('serverCertsTab');
this.caTab = new CertificateManagerTab('caCertsTab');
this.otherTab = new CertificateManagerTab('otherCertsTab');
this.addEventListener('visibleChange', this.handleVisibleChange_);
},
initalized_: false,
/**
* Handler for OptionsPage's visible property change event.
* @private
* @param {Event} e Property change event.
*/
handleVisibleChange_: function(e) {
if (!this.initalized_ && this.visible) {
this.initalized_ = true;
chrome.send('populateCertificateManager');
}
if (cr.isChromeOS) {
// Ensure TPM token check on visible and stop polling when hidden.
if (this.visible)
checkTpmToken();
else
stopTpmTokenCheckPolling();
}
}
};
// CertificateManagerHandler callbacks.
CertificateManager.onPopulateTree = function(args) {
$(args[0]).populate(args[1]);
};
CertificateManager.exportPersonalAskPassword = function(args) {
CertificateBackupOverlay.show();
};
CertificateManager.importPersonalAskPassword = function(args) {
CertificateRestoreOverlay.show();
};
CertificateManager.onCheckTpmTokenReady = function(ready) {
var importAndBindButton = $('personalCertsTab-import-and-bind');
if (importAndBindButton) {
importAndBindButton.disabled = !ready;
// Check again after 5 seconds if Tpm is not ready and certificate manager
// is still visible.
if (!ready && CertificateManager.getInstance().visible)
tpmPollingTimer = window.setTimeout(checkTpmToken, 5000);
}
};
// Export
return {
CertificateManagerTab: CertificateManagerTab,
CertificateManager: CertificateManager
};
});