From 3e60e56c265bdc329965dca77cc24bf4d64255b3 Mon Sep 17 00:00:00 2001 From: "stefanh@inbox.com" Date: Wed, 1 Feb 2017 20:55:09 +0100 Subject: [PATCH] Bug 1333485 - Remove LogUtils.jsm from services/crypto/modules/. r=markh. --- services/crypto/modules/LogUtils.jsm | 101 ------------------ services/crypto/modules/jwcrypto.jsm | 37 +++++-- services/crypto/moz.build | 1 - .../crypto/tests/unit/test_crypto_service.js | 26 +++-- services/crypto/tests/unit/test_jwcrypto.js | 3 + .../tests/xpcshell/test_accounts.js | 3 +- tools/lint/eslint/modules.json | 1 - 7 files changed, 47 insertions(+), 125 deletions(-) delete mode 100644 services/crypto/modules/LogUtils.jsm diff --git a/services/crypto/modules/LogUtils.jsm b/services/crypto/modules/LogUtils.jsm deleted file mode 100644 index c19f1280005b..000000000000 --- a/services/crypto/modules/LogUtils.jsm +++ /dev/null @@ -1,101 +0,0 @@ -/* -*- js-indent-level: 2; indent-tabs-mode: nil -*- */ -/* vim: set ft=javascript ts=2 et sw=2 tw=80: */ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this file, - * You can obtain one at http://mozilla.org/MPL/2.0/. */ - -"use strict"; - -this.EXPORTED_SYMBOLS = ["Logger"]; -const PREF_DEBUG = "services.sync.log.cryptoDebug"; - -const Cu = Components.utils; -const Ci = Components.interfaces; -const Cc = Components.classes; -const Cr = Components.results; - -Cu.import("resource://gre/modules/XPCOMUtils.jsm"); -Cu.import("resource://gre/modules/Services.jsm"); - -function IdentityLogger() { - Services.prefs.addObserver(PREF_DEBUG, this, false); - this._debug = Services.prefs.getBoolPref(PREF_DEBUG); - return this; -} - -IdentityLogger.prototype = { - QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports, Ci.nsIObserver]), - - observe: function observe(aSubject, aTopic, aData) { - switch (aTopic) { - case "nsPref:changed": - this._debug = Services.prefs.getBoolPref(PREF_DEBUG); - break; - - case "quit-application-granted": - Services.prefs.removeObserver(PREF_DEBUG, this); - break; - - default: - this.log("Logger observer", "Unknown topic:", aTopic); - break; - } - }, - - _generateLogMessage: function _generateLogMessage(aPrefix, args) { - // create a string representation of a list of arbitrary things - let strings = []; - - // XXX bug 770418 - args look like flattened array, not list of strings - - args.forEach(function(arg) { - if (typeof arg === "string") { - strings.push(arg); - } else if (typeof arg === "undefined") { - strings.push("undefined"); - } else if (arg === null) { - strings.push("null"); - } else { - try { - strings.push(JSON.stringify(arg, null, 2)); - } catch (err) { - strings.push("<>"); - } - } - }); - return "Identity " + aPrefix + ": " + strings.join(" "); - }, - - /** - * log() - utility function to print a list of arbitrary things - * - * Enable with about:config pref services.sync.log.cryptoDebug - */ - log: function log(aPrefix, ...args) { - if (!this._debug) { - return; - } - let output = this._generateLogMessage(aPrefix, args); - dump(output + "\n"); - - // Additionally, make the output visible in the Error Console - Services.console.logStringMessage(output); - }, - - /** - * reportError() - report an error through component utils as well as - * our log function - */ - reportError: function reportError(aPrefix, ...aArgs) { - // Report the error in the browser - let output = this._generateLogMessage(aPrefix, aArgs); - Cu.reportError(output); - dump("ERROR: " + output + "\n"); - for (let frame = Components.stack.caller; frame; frame = frame.caller) { - dump(frame + "\n"); - } - } - -}; - -this.Logger = new IdentityLogger(); diff --git a/services/crypto/modules/jwcrypto.jsm b/services/crypto/modules/jwcrypto.jsm index e04ef1890782..6cd7d9b870ea 100644 --- a/services/crypto/modules/jwcrypto.jsm +++ b/services/crypto/modules/jwcrypto.jsm @@ -14,7 +14,7 @@ const Cr = Components.results; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); -Cu.import("resource://gre/modules/services-crypto/LogUtils.jsm"); +Cu.import("resource://gre/modules/Log.jsm"); XPCOMUtils.defineLazyServiceGetter(this, "IdentityCryptoService", @@ -23,15 +23,32 @@ XPCOMUtils.defineLazyServiceGetter(this, this.EXPORTED_SYMBOLS = ["jwcrypto"]; +const PREF_LOG_LEVEL = "services.crypto.jwcrypto.log.level"; + +XPCOMUtils.defineLazyGetter(this, "log", function() { + let log = Log.repository.getLogger("Services.Crypto.jwcrypto"); + // Default log level is "Error", but consumers can change this with the pref + // "services.crypto.jwcrypto.log.level". + log.level = Log.Level.Error; + let appender = new Log.DumpAppender(); + log.addAppender(appender); + try { + let level = + Services.prefs.getPrefType(PREF_LOG_LEVEL) == Ci.nsIPrefBranch.PREF_STRING + && Services.prefs.getCharPref(PREF_LOG_LEVEL); + log.level = Log.Level[level] || Log.Level.Error; + } catch (e) { + log.error(e); + } + + return log; +}); + const ALGORITHMS = { RS256: "RS256", DS160: "DS160" }; const DURATION_MS = 1000 * 60 * 2; // 2 minutes default assertion lifetime -function log(...aMessageArgs) { - Logger.log.apply(Logger, ["jwcrypto"].concat(aMessageArgs)); -} - function generateKeyPair(aAlgorithmName, aCallback) { - log("Generate key pair; alg =", aAlgorithmName); + log.debug("Generate key pair; alg = " + aAlgorithmName); IdentityCryptoService.generateKeyPair(aAlgorithmName, function(rv, aKeyPair) { if (!Components.isSuccessCode(rv)) { @@ -75,10 +92,10 @@ function generateKeyPair(aAlgorithmName, aCallback) { function sign(aPayload, aKeypair, aCallback) { aKeypair._kp.sign(aPayload, function(rv, signature) { if (!Components.isSuccessCode(rv)) { - log("ERROR: signer.sign failed"); + log.error("signer.sign failed"); return aCallback("Sign failed"); } - log("signer.sign: success"); + log.debug("signer.sign: success"); return aCallback(null, signature); }); } @@ -110,7 +127,7 @@ jwcryptoClass.prototype = { }, generateKeyPair(aAlgorithmName, aCallback) { - log("generating"); + log.debug("generating"); generateKeyPair(aAlgorithmName, aCallback); }, @@ -163,7 +180,7 @@ jwcryptoClass.prototype = { var payloadBytes = IdentityCryptoService.base64UrlEncode( JSON.stringify(payload)); - log("payload bytes", payload, payloadBytes); + log.debug("payload", { payload, payloadBytes }); sign(headerBytes + "." + payloadBytes, aKeyPair, function(err, signature) { if (err) return aCallback(err); diff --git a/services/crypto/moz.build b/services/crypto/moz.build index 26d0ae4960ff..7777f7c2fd80 100644 --- a/services/crypto/moz.build +++ b/services/crypto/moz.build @@ -13,7 +13,6 @@ XPCSHELL_TESTS_MANIFESTS += ['tests/unit/xpcshell.ini'] EXTRA_JS_MODULES['services-crypto'] += [ 'modules/jwcrypto.jsm', - 'modules/LogUtils.jsm', 'modules/utils.js', 'modules/WeaveCrypto.js', ] diff --git a/services/crypto/tests/unit/test_crypto_service.js b/services/crypto/tests/unit/test_crypto_service.js index de08a45c53b0..0c7c8a4ba01e 100644 --- a/services/crypto/tests/unit/test_crypto_service.js +++ b/services/crypto/tests/unit/test_crypto_service.js @@ -3,7 +3,7 @@ "use strict"; -Cu.import("resource://gre/modules/services-crypto/LogUtils.jsm"); +Cu.import("resource://gre/modules/Log.jsm"); const idService = Cc["@mozilla.org/identity/crypto-service;1"] .getService(Ci.nsIIdentityCryptoService); @@ -30,15 +30,19 @@ const BASE64_URL_ENCODINGS = [ "z4DPjM67zrsnIM6_4by2zrQnIOG8gM67z47PgM63zr4sIOG8gM67zrsnIOG8kM-H4b-Wzr3Ov8-CIOG8k869IM68zq3Os86x"], ]; +let log = Log.repository.getLogger("crypto.service.test"); +(function() { + let appender = new Log.DumpAppender(); + log.level = Log.Level.Debug; + log.addAppender(appender); + } +)(); + // When the output of an operation is a function do_check_eq_or_slightly_less(x, y) { do_check_true(x >= y - (3 * 8)); } -function log(...aMessageArgs) { - Logger.log.apply(Logger, ["test"].concat(aMessageArgs)); -} - function test_base64_roundtrip() { let message = "Attack at dawn!"; let encoded = idService.base64UrlEncode(message); @@ -50,7 +54,7 @@ function test_base64_roundtrip() { function test_dsa() { idService.generateKeyPair(ALG_DSA, function(rv, keyPair) { - log("DSA generateKeyPair finished ", rv); + log.debug("DSA generateKeyPair finished " + rv); do_check_true(Components.isSuccessCode(rv)); do_check_eq(typeof keyPair.sign, "function"); do_check_eq(keyPair.keyType, ALG_DSA); @@ -60,9 +64,9 @@ function test_dsa() { do_check_eq_or_slightly_less(keyPair.hexDSAPublicValue.length, 1024 / 8 * 2); // XXX: test that RSA parameters throw the correct error - log("about to sign with DSA key"); + log.debug("about to sign with DSA key"); keyPair.sign("foo", function(rv2, signature) { - log("DSA sign finished ", rv2, signature); + log.debug("DSA sign finished " + rv2 + " " + signature); do_check_true(Components.isSuccessCode(rv2)); do_check_true(signature.length > 1); // TODO: verify the signature with the public key @@ -73,7 +77,7 @@ function test_dsa() { function test_rsa() { idService.generateKeyPair(ALG_RSA, function(rv, keyPair) { - log("RSA generateKeyPair finished ", rv); + log.debug("RSA generateKeyPair finished " + rv); do_check_true(Components.isSuccessCode(rv)); do_check_eq(typeof keyPair.sign, "function"); do_check_eq(keyPair.keyType, ALG_RSA); @@ -81,9 +85,9 @@ function test_rsa() { 2048 / 8); do_check_true(keyPair.hexRSAPublicKeyExponent.length > 1); - log("about to sign with RSA key"); + log.debug("about to sign with RSA key"); keyPair.sign("foo", function(rv2, signature) { - log("RSA sign finished ", rv2, signature); + log.debug("RSA sign finished " + rv2 + " " + signature); do_check_true(Components.isSuccessCode(rv2)); do_check_true(signature.length > 1); run_next_test(); diff --git a/services/crypto/tests/unit/test_jwcrypto.js b/services/crypto/tests/unit/test_jwcrypto.js index fe91e4bac645..d85508775f70 100644 --- a/services/crypto/tests/unit/test_jwcrypto.js +++ b/services/crypto/tests/unit/test_jwcrypto.js @@ -18,6 +18,9 @@ const SECOND_MS = 1000; const MINUTE_MS = SECOND_MS * 60; const HOUR_MS = MINUTE_MS * 60; +// Enable logging from jwcrypto.jsm. +Services.prefs.setCharPref("services.crypto.jwcrypto.log.level", "Debug"); + function test_sanity() { do_test_pending(); diff --git a/services/fxaccounts/tests/xpcshell/test_accounts.js b/services/fxaccounts/tests/xpcshell/test_accounts.js index 924e1d86ef4f..447f64e25548 100644 --- a/services/fxaccounts/tests/xpcshell/test_accounts.js +++ b/services/fxaccounts/tests/xpcshell/test_accounts.js @@ -26,9 +26,10 @@ Cu.importGlobalProperties(["atob"]); var log = Log.repository.getLogger("Services.FxAccounts.test"); log.level = Log.Level.Debug; -// See verbose logging from FxAccounts.jsm +// See verbose logging from FxAccounts.jsm and jwcrypto.jsm. Services.prefs.setCharPref("identity.fxaccounts.loglevel", "Trace"); Log.repository.getLogger("FirefoxAccounts").level = Log.Level.Trace; +Services.prefs.setCharPref("services.crypto.jwcrypto.log.level", "Debug"); // The oauth server is mocked, but set these prefs to pass param checks Services.prefs.setCharPref("identity.fxaccounts.remote.oauth.uri", "https://example.com/v1"); diff --git a/tools/lint/eslint/modules.json b/tools/lint/eslint/modules.json index 11b5324e5ce6..0c6cf355b40a 100644 --- a/tools/lint/eslint/modules.json +++ b/tools/lint/eslint/modules.json @@ -126,7 +126,6 @@ "LoginManagerContent.jsm": ["LoginManagerContent", "LoginFormFactory", "UserAutoCompleteResult"], "LoginRecipes.jsm": ["LoginRecipesContent", "LoginRecipesParent"], "logmanager.js": ["LogManager"], - "LogUtils.jsm": ["Logger"], "lz4.js": ["Lz4"], "lz4_internal.js": ["Primitives"], "main.js": ["Weave"],