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