blob: 0d57f2b9d4ab033d11cfb862ab00c7d7ca462061 [file] [log] [blame]
// 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 U2F gnubbyd background page
*/
'use strict';
// Singleton tracking available devices.
var gnubbies = new Gnubbies();
llUsbGnubby.register(gnubbies);
// Only include HID support if it's available in this browser.
if (chrome.hid) {
llHidGnubby.register(gnubbies);
}
var GNUBBY_FACTORY = new UsbGnubbyFactory(gnubbies);
var SIGN_HELPER_FACTORY = new UsbSignHelperFactory(GNUBBY_FACTORY);
var ENROLL_HELPER_FACTORY = new UsbEnrollHelperFactory(GNUBBY_FACTORY);
/**
* @param {boolean} toleratesMultipleResponses Whether the web page can handle
* multiple responses given to its sendResponse callback.
* @param {Object} request Request object
* @param {MessageSender} sender Sender frame
* @param {Function} sendResponse Response callback
* @return {?Closeable} Optional handler object that should be closed when port
* closes
*/
function handleWebPageRequest(toleratesMultipleResponses, request, sender,
sendResponse) {
switch (request.type) {
case GnubbyMsgTypes.ENROLL_WEB_REQUEST:
return handleEnrollRequest(ENROLL_HELPER_FACTORY, sender, request,
sendResponse, toleratesMultipleResponses);
case GnubbyMsgTypes.SIGN_WEB_REQUEST:
return handleSignRequest(SIGN_HELPER_FACTORY, sender, request,
sendResponse, toleratesMultipleResponses);
default:
var response = formatWebPageResponse(
GnubbyMsgTypes.ENROLL_WEB_REPLY, GnubbyCodeTypes.BAD_REQUEST);
sendResponse(response);
return null;
}
}
// Message handler for requests coming from web pages.
function messageHandler(toleratesMultipleResponses, request, sender,
sendResponse) {
console.log(UTIL_fmt('onMessageExternal listener: ' + request.type));
console.log(UTIL_fmt('request'));
console.log(request);
console.log(UTIL_fmt('sender'));
console.log(sender);
handleWebPageRequest(toleratesMultipleResponses, request, sender,
sendResponse);
return true;
}
// Listen to web pages.
chrome.runtime.onMessageExternal.addListener(messageHandler.bind(null, false));
// List to connection events, and wire up a message handler on the port.
chrome.runtime.onConnectExternal.addListener(function(port) {
var closeable;
port.onMessage.addListener(function(request) {
var toleratesMultipleResponses = true;
closeable = handleWebPageRequest(toleratesMultipleResponses, request,
port.sender,
function(response) {
response['requestId'] = request['requestId'];
port.postMessage(response);
});
});
port.onDisconnect.addListener(function() {
if (closeable) {
closeable.close();
}
});
});