Javascript  |  101行  |  3.05 KB

// Copyright 2014 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.

/**
 * @fileoverview
 * Class that routes gnubby-auth extension messages to and from the gnubbyd
 * extension.
 */

'use strict';

/** @suppress {duplicate} */
var remoting = remoting || {};

/**
 * @constructor
 * @param {!remoting.ClientSession} clientSession The client session to send
 *     gnubby-auth response messages to.
 */
remoting.GnubbyAuthHandler = function(clientSession) {
  this.clientSession_ = clientSession;
};

/**
 * Processes gnubby-auth messages.
 * @param {string} data The gnubby-auth message data.
 */
remoting.GnubbyAuthHandler.prototype.onMessage = function(data) {
  var message = getJsonObjectFromString(data);
  var messageType = getStringAttr(message, 'type');
  if (messageType == 'data') {
    this.sendMessageToGnubbyd_({
      'type': 'auth-agent@openssh.com',
      'data': getArrayAttr(message, 'data')
    }, this.callback_.bind(this, getNumberAttr(message, 'connectionId')));
  } else {
    console.error('Invalid gnubby-auth message: ' + messageType);
  }
};

/**
 * Callback invoked with data to be returned to the host.
 * @param {number} connectionId The connection id.
 * @param {Object} response The JSON response with the data to send to the host.
 * @private
 */
remoting.GnubbyAuthHandler.prototype.callback_ =
    function(connectionId, response) {
  try {
    this.clientSession_.sendGnubbyAuthMessage({
      'type': 'data',
      'connectionId': connectionId,
      'data': getArrayAttr(response, 'data')
    });
  } catch (err) {
    console.error('gnubby callback failed: ', /** @type {*} */ (err));
    this.clientSession_.sendGnubbyAuthMessage({
      'type': 'error',
      'connectionId': connectionId
    });
    return;
  }
};

/**
 * Send data to the gnubbyd extension.
 * @param {Object} jsonObject The JSON object to send to the gnubbyd extension.
 * @param {function(Object)} callback The callback to invoke with reply data.
 * @private
 */
remoting.GnubbyAuthHandler.prototype.sendMessageToGnubbyd_ =
    function(jsonObject, callback) {
  var kGnubbydDevExtensionId = 'dlfcjilkjfhdnfiecknlnddkmmiofjbg';

  chrome.runtime.sendMessage(
      kGnubbydDevExtensionId,
      jsonObject,
      onGnubbydDevReply_.bind(this, jsonObject, callback));
};

/**
 * Callback invoked as a result of sending a message to the gnubbyd-dev
 * extension. If that extension is not installed, reply will be undefined;
 * otherwise it will be the JSON response object.
 * @param {Object} jsonObject The JSON object to send to the gnubbyd extension.
 * @param {function(Object)} callback The callback to invoke with reply data.
 * @param {Object} reply The reply from the extension (or Chrome, if the
 *    extension does not exist.
 * @private
 */
function onGnubbydDevReply_(jsonObject, callback, reply) {
  var kGnubbydStableExtensionId = 'beknehfpfkghjoafdifaflglpjkojoco';

  if (reply) {
    callback(reply);
  } else {
    chrome.runtime.sendMessage(kGnubbydStableExtensionId, jsonObject, callback);
  }
}