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