Home | History | Annotate | Download | only in webapp
      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.
      4 
      5 /**
      6  * @fileoverview
      7  * Class that routes gnubby-auth extension messages to and from the gnubbyd
      8  * extension.
      9  */
     10 
     11 'use strict';
     12 
     13 /** @suppress {duplicate} */
     14 var remoting = remoting || {};
     15 
     16 /**
     17  * @constructor
     18  * @param {!remoting.ClientSession} clientSession The client session to send
     19  *     gnubby-auth response messages to.
     20  */
     21 remoting.GnubbyAuthHandler = function(clientSession) {
     22   this.clientSession_ = clientSession;
     23 };
     24 
     25 /**
     26  * Processes gnubby-auth messages.
     27  * @param {string} data The gnubby-auth message data.
     28  */
     29 remoting.GnubbyAuthHandler.prototype.onMessage = function(data) {
     30   var message = getJsonObjectFromString(data);
     31   var messageType = getStringAttr(message, 'type');
     32   if (messageType == 'data') {
     33     this.sendMessageToGnubbyd_({
     34       'type': 'auth-agent (a] openssh.com',
     35       'data': getArrayAttr(message, 'data')
     36     }, this.callback_.bind(this, getNumberAttr(message, 'connectionId')));
     37   } else {
     38     console.error('Invalid gnubby-auth message: ' + messageType);
     39   }
     40 };
     41 
     42 /**
     43  * Callback invoked with data to be returned to the host.
     44  * @param {number} connectionId The connection id.
     45  * @param {Object} response The JSON response with the data to send to the host.
     46  * @private
     47  */
     48 remoting.GnubbyAuthHandler.prototype.callback_ =
     49     function(connectionId, response) {
     50   try {
     51     this.clientSession_.sendGnubbyAuthMessage({
     52       'type': 'data',
     53       'connectionId': connectionId,
     54       'data': getArrayAttr(response, 'data')
     55     });
     56   } catch (err) {
     57     console.error('gnubby callback failed: ', /** @type {*} */ (err));
     58     this.clientSession_.sendGnubbyAuthMessage({
     59       'type': 'error',
     60       'connectionId': connectionId
     61     });
     62     return;
     63   }
     64 };
     65 
     66 /**
     67  * Send data to the gnubbyd extension.
     68  * @param {Object} jsonObject The JSON object to send to the gnubbyd extension.
     69  * @param {function(Object)} callback The callback to invoke with reply data.
     70  * @private
     71  */
     72 remoting.GnubbyAuthHandler.prototype.sendMessageToGnubbyd_ =
     73     function(jsonObject, callback) {
     74   var kGnubbydDevExtensionId = 'dlfcjilkjfhdnfiecknlnddkmmiofjbg';
     75 
     76   chrome.runtime.sendMessage(
     77       kGnubbydDevExtensionId,
     78       jsonObject,
     79       onGnubbydDevReply_.bind(this, jsonObject, callback));
     80 };
     81 
     82 /**
     83  * Callback invoked as a result of sending a message to the gnubbyd-dev
     84  * extension. If that extension is not installed, reply will be undefined;
     85  * otherwise it will be the JSON response object.
     86  * @param {Object} jsonObject The JSON object to send to the gnubbyd extension.
     87  * @param {function(Object)} callback The callback to invoke with reply data.
     88  * @param {Object} reply The reply from the extension (or Chrome, if the
     89  *    extension does not exist.
     90  * @private
     91  */
     92 function onGnubbydDevReply_(jsonObject, callback, reply) {
     93   var kGnubbydStableExtensionId = 'beknehfpfkghjoafdifaflglpjkojoco';
     94 
     95   if (reply) {
     96     callback(reply);
     97   } else {
     98     chrome.runtime.sendMessage(kGnubbydStableExtensionId, jsonObject, callback);
     99   }
    100 }
    101