// 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); } }