| // Copyright 2015 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /** |
| * @constructor |
| * @param {?string} initPassphrase Initial passphrase for the first passphrase |
| * request or NULL if not available. In such case, call to getPassphrase() |
| * will invoke a dialog. |
| */ |
| unpacker.PassphraseManager = function(initPassphrase) { |
| /** |
| * @private {?string} |
| */ |
| this.initPassphrase_ = initPassphrase; |
| |
| /** |
| * @public {?string} |
| */ |
| this.rememberedPassphrase = initPassphrase; |
| }; |
| |
| /** |
| * Requests a passphrase from the user. If a passphrase was previously |
| * remembered, then tries it first. Otherwise shows a passphrase dialog. |
| * @return {!Promise.<string>} |
| */ |
| unpacker.PassphraseManager.prototype.getPassphrase = function() { |
| return new Promise(function(fulfill, reject) { |
| // For the first passphrase request try the init passphrase (which may be |
| // incorrect though, so do it only once). |
| if (this.initPassphrase_) { |
| fulfill(this.initPassphrase_); |
| this.initPassphrase_ = null; |
| return; |
| } |
| |
| // Ask user for a passphrase. |
| chrome.app.window.create( |
| '../html/passphrase.html', |
| /** @type {!chrome.app.window.CreateWindowOptions} */ ({ |
| innerBounds: {width: 320, height: 160}, |
| alwaysOnTop: true, |
| resizable: false, |
| frame: 'none', |
| hidden: true |
| }), |
| function(passphraseWindow) { |
| var passphraseSucceeded = false; |
| |
| passphraseWindow.onClosed.addListener(function() { |
| if (passphraseSucceeded) |
| return; |
| reject('FAILED'); |
| }.bind(this)); |
| |
| passphraseWindow.contentWindow.onPassphraseSuccess = |
| function(passphrase, remember) { |
| passphraseSucceeded = true; |
| this.rememberedPassphrase = remember ? passphrase : null; |
| fulfill(passphrase); |
| }.bind(this); |
| }.bind(this)); |
| }.bind(this)); |
| } |