Roll src/third_party/WebKit 3529d49:06e8485 (svn 202554:202555)
[chromium-blink-merge.git] / remoting / webapp / crd / js / gnubby_auth_handler.js
blob724bbdc0a7ab0c4032cee47a2460c627fda3f6f4
1 // Copyright 2014 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.
5 /**
6  * @fileoverview
7  * Class that routes gnubby-auth extension messages to and from the gnubbyd
8  * extension.
9  */
11 'use strict';
13 /** @suppress {duplicate} */
14 var remoting = remoting || {};
16 /**
17  * @constructor
18  * @implements {remoting.ProtocolExtension}
19  */
20 remoting.GnubbyAuthHandler = function() {
21   /** @private {?function(string,string)} */
22   this.sendMessageToHostCallback_ = null;
25 /** @private {string} */
26 remoting.GnubbyAuthHandler.EXTENSION_TYPE = 'gnubby-auth';
28 /** @return {Array<string>} */
29 remoting.GnubbyAuthHandler.prototype.getExtensionTypes = function() {
30   return [remoting.GnubbyAuthHandler.EXTENSION_TYPE];
33 /**
34  * @param {function(string,string)} sendMessageToHost Callback to send a message
35  *     to the host.
36  */
37 remoting.GnubbyAuthHandler.prototype.startExtension =
38     function(sendMessageToHost) {
39   this.sendMessageToHostCallback_ = sendMessageToHost;
41   this.sendMessageToHost_({
42     'type': 'control',
43     'option': 'auth-v1'
44   });
47 /**
48  * @param {Object} data The data to send.
49  * @private
50  */
51 remoting.GnubbyAuthHandler.prototype.sendMessageToHost_ = function(data) {
52   this.sendMessageToHostCallback_(remoting.GnubbyAuthHandler.EXTENSION_TYPE,
53                                   JSON.stringify(data));
56 /**
57  * Processes gnubby-auth messages.
58  *
59  * @param {string} type The message type.
60  * @param {Object} message The parsed extension message data.
61  * @return {boolean} True if the extension message was handled.
62  */
63 remoting.GnubbyAuthHandler.prototype.onExtensionMessage =
64     function(type, message) {
65   var messageType = base.getStringAttr(message, 'type');
66   if (messageType == 'data') {
67     this.sendMessageToGnubbyd_({
68       'type': 'auth-agent@openssh.com',
69       'data': base.getArrayAttr(message, 'data')
70     }, this.callback_.bind(this, base.getNumberAttr(message, 'connectionId')));
71   } else {
72     console.error('Invalid gnubby-auth message: ' + messageType);
73     return false;
74   }
75   return true;
78 /**
79  * Callback invoked with data to be returned to the host.
80  * @param {number} connectionId The connection id.
81  * @param {Object} response The JSON response with the data to send to the host.
82  * @private
83  */
84 remoting.GnubbyAuthHandler.prototype.callback_ =
85     function(connectionId, response) {
86   try {
87     this.sendMessageToHost_({
88       'type': 'data',
89       'connectionId': connectionId,
90       'data': base.getArrayAttr(response, 'data')
91     });
92   } catch (/** @type {*} */ err) {
93     console.error('gnubby callback failed: ', err);
94     this.sendMessageToHost_({
95       'type': 'error',
96       'connectionId': connectionId
97     });
98     return;
99   }
103  * Send data to the gnubbyd extension.
104  * @param {Object} jsonObject The JSON object to send to the gnubbyd extension.
105  * @param {function(Object)} callback The callback to invoke with reply data.
106  * @private
107  */
108 remoting.GnubbyAuthHandler.prototype.sendMessageToGnubbyd_ =
109     function(jsonObject, callback) {
110   var kGnubbydDevExtensionId = 'dlfcjilkjfhdnfiecknlnddkmmiofjbg';
112   chrome.runtime.sendMessage(
113       kGnubbydDevExtensionId,
114       jsonObject,
115       onGnubbydDevReply_.bind(this, jsonObject, callback));
119  * Callback invoked as a result of sending a message to the gnubbyd-dev
120  * extension. If that extension is not installed, reply will be undefined;
121  * otherwise it will be the JSON response object.
122  * @param {Object} jsonObject The JSON object to send to the gnubbyd extension.
123  * @param {function(Object)} callback The callback to invoke with reply data.
124  * @param {Object} reply The reply from the extension (or Chrome, if the
125  *    extension does not exist.
126  * @private
127  */
128 function onGnubbydDevReply_(jsonObject, callback, reply) {
129   var kGnubbydStableExtensionId = 'beknehfpfkghjoafdifaflglpjkojoco';
131   if (reply) {
132     callback(reply);
133   } else {
134     chrome.runtime.sendMessage(kGnubbydStableExtensionId, jsonObject, callback);
135   }