| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 cr.define('options', function() { | |
| 6 | |
| 7 var OptionsPage = options.OptionsPage; | |
| 8 | |
| 9 ///////////////////////////////////////////////////////////////////////////// | |
| 10 // CertificateManagerTab class: | |
| 11 | |
| 12 /** | |
| 13 * blah | |
| 14 * @param {!string} id The id of this tab. | |
| 15 */ | |
| 16 function CertificateManagerTab(id) { | |
| 17 this.tree = $(id + '-tree'); | |
| 18 | |
| 19 options.CertificatesTree.decorate(this.tree); | |
| 20 this.tree.addEventListener('change', | |
| 21 this.handleCertificatesTreeChange_.bind(this)); | |
| 22 | |
| 23 var tree = this.tree; | |
| 24 | |
| 25 this.viewButton = $(id + '-view'); | |
| 26 this.viewButton.onclick = function(e) { | |
| 27 var selected = tree.selectedItem; | |
| 28 chrome.send('viewCertificate', [selected.data.id]); | |
| 29 } | |
| 30 | |
| 31 this.editButton = $(id + '-edit'); | |
| 32 if (this.editButton !== null) { | |
| 33 if (id == 'serverCertsTab') { | |
| 34 this.editButton.onclick = function(e) { | |
| 35 var selected = tree.selectedItem; | |
| 36 chrome.send('editServerCertificate', [selected.data.id]); | |
| 37 } | |
| 38 } else if (id == 'caCertsTab') { | |
| 39 this.editButton.onclick = function(e) { | |
| 40 var data = tree.selectedItem.data; | |
| 41 CertificateEditCaTrustOverlay.show(data.id, data.name); | |
| 42 } | |
| 43 } | |
| 44 } | |
| 45 | |
| 46 this.backupButton = $(id + '-backup'); | |
| 47 if (this.backupButton !== null) { | |
| 48 this.backupButton.onclick = function(e) { | |
| 49 var selected = tree.selectedItem; | |
| 50 chrome.send('exportPersonalCertificate', [selected.data.id]); | |
| 51 } | |
| 52 } | |
| 53 | |
| 54 this.backupAllButton = $(id + '-backup-all'); | |
| 55 if (this.backupAllButton !== null) { | |
| 56 this.backupAllButton.onclick = function(e) { | |
| 57 chrome.send('exportAllPersonalCertificates', []); | |
| 58 } | |
| 59 } | |
| 60 | |
| 61 this.importButton = $(id + '-import'); | |
| 62 if (this.importButton !== null) { | |
| 63 if (id == 'personalCertsTab') { | |
| 64 this.importButton.onclick = function(e) { | |
| 65 chrome.send('importPersonalCertificate', [false]); | |
| 66 } | |
| 67 } else if (id == 'serverCertsTab') { | |
| 68 this.importButton.onclick = function(e) { | |
| 69 chrome.send('importServerCertificate', []); | |
| 70 } | |
| 71 } else if (id == 'caCertsTab') { | |
| 72 this.importButton.onclick = function(e) { | |
| 73 chrome.send('importCaCertificate', []); | |
| 74 } | |
| 75 } | |
| 76 } | |
| 77 | |
| 78 this.importAndBindButton = $(id + '-import-and-bind'); | |
| 79 if (this.importAndBindButton !== null) { | |
| 80 if (id == 'personalCertsTab') { | |
| 81 this.importAndBindButton.onclick = function(e) { | |
| 82 chrome.send('importPersonalCertificate', [true]); | |
| 83 } | |
| 84 } | |
| 85 } | |
| 86 | |
| 87 this.exportButton = $(id + '-export'); | |
| 88 if (this.exportButton !== null) { | |
| 89 this.exportButton.onclick = function(e) { | |
| 90 var selected = tree.selectedItem; | |
| 91 chrome.send('exportCertificate', [selected.data.id]); | |
| 92 } | |
| 93 } | |
| 94 | |
| 95 this.deleteButton = $(id + '-delete'); | |
| 96 this.deleteButton.onclick = function(e) { | |
| 97 var data = tree.selectedItem.data; | |
| 98 AlertOverlay.show( | |
| 99 localStrings.getStringF(id + 'DeleteConfirm', data.name), | |
| 100 localStrings.getString(id + 'DeleteImpact'), | |
| 101 localStrings.getString('ok'), | |
| 102 localStrings.getString('cancel'), | |
| 103 function() { | |
| 104 tree.selectedItem = null; | |
| 105 chrome.send('deleteCertificate', [data.id]); | |
| 106 }); | |
| 107 } | |
| 108 } | |
| 109 | |
| 110 CertificateManagerTab.prototype = { | |
| 111 | |
| 112 /** | |
| 113 * Update button state. | |
| 114 * @private | |
| 115 * @param {!Object} data The data of the selected item. | |
| 116 */ | |
| 117 updateButtonState: function(data) { | |
| 118 var isCert = !!data && data.id.substr(0, 5) == 'cert-'; | |
| 119 var readOnly = !!data && data.readonly; | |
| 120 var hasChildren = this.tree.items.length > 0; | |
| 121 this.viewButton.disabled = !isCert; | |
| 122 if (this.editButton !== null) | |
| 123 this.editButton.disabled = !isCert; | |
| 124 if (this.backupButton !== null) | |
| 125 this.backupButton.disabled = !isCert; | |
| 126 if (this.backupAllButton !== null) | |
| 127 this.backupAllButton.disabled = !hasChildren; | |
| 128 if (this.exportButton !== null) | |
| 129 this.exportButton.disabled = !isCert; | |
| 130 this.deleteButton.disabled = !isCert || readOnly; | |
| 131 }, | |
| 132 | |
| 133 /** | |
| 134 * Handles certificate tree selection change. | |
| 135 * @private | |
| 136 * @param {!Event} e The change event object. | |
| 137 */ | |
| 138 handleCertificatesTreeChange_: function(e) { | |
| 139 var data = null; | |
| 140 if (this.tree.selectedItem) { | |
| 141 data = this.tree.selectedItem.data; | |
| 142 } | |
| 143 | |
| 144 this.updateButtonState(data); | |
| 145 }, | |
| 146 | |
| 147 } | |
| 148 | |
| 149 // TODO(xiyuan): Use notification from backend instead of polling. | |
| 150 // TPM token check polling timer. | |
| 151 var tpmPollingTimer; | |
| 152 | |
| 153 // Initiate tpm token check if needed. | |
| 154 function checkTpmToken() { | |
| 155 var importAndBindButton = $('personalCertsTab-import-and-bind'); | |
| 156 | |
| 157 if (importAndBindButton && importAndBindButton.disabled) | |
| 158 chrome.send('checkTpmTokenReady'); | |
| 159 } | |
| 160 | |
| 161 // Stop tpm polling timer. | |
| 162 function stopTpmTokenCheckPolling() { | |
| 163 if (tpmPollingTimer) { | |
| 164 window.clearTimeout(tpmPollingTimer); | |
| 165 tpmPollingTimer = undefined; | |
| 166 } | |
| 167 } | |
| 168 | |
| 169 ///////////////////////////////////////////////////////////////////////////// | |
| 170 // CertificateManager class: | |
| 171 | |
| 172 /** | |
| 173 * Encapsulated handling of ChromeOS accounts options page. | |
| 174 * @constructor | |
| 175 */ | |
| 176 function CertificateManager(model) { | |
| 177 OptionsPage.call(this, 'certificates', | |
| 178 templateData.certificateManagerPageTabTitle, | |
| 179 'certificateManagerPage'); | |
| 180 } | |
| 181 | |
| 182 cr.addSingletonGetter(CertificateManager); | |
| 183 | |
| 184 CertificateManager.prototype = { | |
| 185 __proto__: OptionsPage.prototype, | |
| 186 | |
| 187 initializePage: function() { | |
| 188 OptionsPage.prototype.initializePage.call(this); | |
| 189 | |
| 190 this.personalTab = new CertificateManagerTab('personalCertsTab'); | |
| 191 this.serverTab = new CertificateManagerTab('serverCertsTab'); | |
| 192 this.caTab = new CertificateManagerTab('caCertsTab'); | |
| 193 this.otherTab = new CertificateManagerTab('otherCertsTab'); | |
| 194 | |
| 195 this.addEventListener('visibleChange', this.handleVisibleChange_); | |
| 196 }, | |
| 197 | |
| 198 initalized_: false, | |
| 199 | |
| 200 /** | |
| 201 * Handler for OptionsPage's visible property change event. | |
| 202 * @private | |
| 203 * @param {Event} e Property change event. | |
| 204 */ | |
| 205 handleVisibleChange_: function(e) { | |
| 206 if (!this.initalized_ && this.visible) { | |
| 207 this.initalized_ = true; | |
| 208 OptionsPage.showTab($('personal-certs-nav-tab')); | |
| 209 chrome.send('populateCertificateManager'); | |
| 210 } | |
| 211 | |
| 212 if (cr.isChromeOS) { | |
| 213 // Ensure TPM token check on visible and stop polling when hidden. | |
| 214 if (this.visible) | |
| 215 checkTpmToken(); | |
| 216 else | |
| 217 stopTpmTokenCheckPolling(); | |
| 218 } | |
| 219 } | |
| 220 }; | |
| 221 | |
| 222 // CertificateManagerHandler callbacks. | |
| 223 CertificateManager.onPopulateTree = function(args) { | |
| 224 $(args[0]).populate(args[1]); | |
| 225 }; | |
| 226 | |
| 227 CertificateManager.exportPersonalAskPassword = function(args) { | |
| 228 CertificateBackupOverlay.show(); | |
| 229 }; | |
| 230 | |
| 231 CertificateManager.importPersonalAskPassword = function(args) { | |
| 232 CertificateRestoreOverlay.show(); | |
| 233 }; | |
| 234 | |
| 235 CertificateManager.onCheckTpmTokenReady = function(ready) { | |
| 236 var importAndBindButton = $('personalCertsTab-import-and-bind'); | |
| 237 if (importAndBindButton) { | |
| 238 importAndBindButton.disabled = !ready; | |
| 239 | |
| 240 // Check again after 5 seconds if Tpm is not ready and certificate manager | |
| 241 // is still visible. | |
| 242 if (!ready && CertificateManager.getInstance().visible) | |
| 243 tpmPollingTimer = window.setTimeout(checkTpmToken, 5000); | |
| 244 } | |
| 245 }; | |
| 246 | |
| 247 // Export | |
| 248 return { | |
| 249 CertificateManagerTab: CertificateManagerTab, | |
| 250 CertificateManager: CertificateManager | |
| 251 }; | |
| 252 | |
| 253 }); | |
| OLD | NEW |