Bug 1336208 - Part 7: Add a test case for testing fonts downloading for fingerprinting resistance. r?leplatrem,jfkthame,arthuredelstein draft
authorTim Huang <tihuang@mozilla.com>
Wed, 23 Aug 2017 16:31:51 +0800
changeset 710230 c6f26f8befd5257bd262e9cf4181df79fb08383c
parent 710229 14ab0e063a87ae6f6980b926bf6ed9df9b288916
child 743551 b4e968a58f84ba23afa4b1bef48969abb47d688d
push id92788
push userbmo:tihuang@mozilla.com
push dateFri, 08 Dec 2017 23:11:53 +0000
reviewersleplatrem, jfkthame, arthuredelstein
bugs1336208
milestone59.0a1
Bug 1336208 - Part 7: Add a test case for testing fonts downloading for fingerprinting resistance. r?leplatrem,jfkthame,arthuredelstein This patch adds a test case and two fonts into test suite for testing fonts downloading. This test case will start a http server for faking a Kinto server and use this server to verify font downloading. The test case will first issue FontRFPClient to get a fonts list from server and then flip the 'privacy.resistFingerprinting' pref to start downloading fonts from the server according to the list. After downloading is finished, it will check that whether fonts have been downloaded into the staging directory. In addition, it will also trigger the nsRFPService to move fonts from staging directory to the font directory and check whether they have been moved properly. MozReview-Commit-ID: IlnrzzyB99T
browser/components/resistfingerprinting/test/browser/NotoSansKhmer-Regular.ttf.gz
browser/components/resistfingerprinting/test/browser/NotoSansLao-Regular.ttf.gz
browser/components/resistfingerprinting/test/browser/browser.ini
browser/components/resistfingerprinting/test/browser/browser_fonts_downloading.js
new file mode 100644
index 0000000000000000000000000000000000000000..521f1cc90e9e925ce087231d7e9b9049ba254b23
GIT binary patch
literal 23792
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
YgZmlbm4$Ze)z>#IG^9(Lt#97^AK3pWc>n+a
new file mode 100644
index 0000000000000000000000000000000000000000..446e63168aadad89ff824a309d7b04f8de59162b
GIT binary patch
literal 19155
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
--- a/browser/components/resistfingerprinting/test/browser/browser.ini
+++ b/browser/components/resistfingerprinting/test/browser/browser.ini
@@ -1,19 +1,22 @@
 [DEFAULT]
 tags = resistfingerprinting
 support-files =
   file_dummy.html
   file_navigator.html
   file_navigatorWorker.js
   file_workerNetInfo.js
   file_workerPerformance.js
+  NotoSansKhmer-Regular.ttf.gz
+  NotoSansLao-Regular.ttf.gz
   head.js
 
 [browser_block_mozAddonManager.js]
+[browser_fonts_downloading.js]
 [browser_navigator.js]
 [browser_netInfo.js]
 [browser_performanceAPI.js]
 [browser_roundedWindow_dialogWindow.js]
 [browser_roundedWindow_newWindow.js]
 [browser_roundedWindow_open_max_inner.js]
 [browser_roundedWindow_open_max_outer.js]
 [browser_roundedWindow_open_mid_inner.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/resistfingerprinting/test/browser/browser_fonts_downloading.js
@@ -0,0 +1,458 @@
+/**
+ * Bug 1336208 - A test case to verify that fonts downloading for fingerprinting
+ *   resistance is working correctly.
+ */
+
+const { classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu } = Components;
+
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+XPCOMUtils.defineLazyModuleGetter(this, "HttpServer",
+  "resource://testing-common/httpd.js");
+XPCOMUtils.defineLazyModuleGetter(this, "gFontsClient",
+  "resource://services-common/blocklist-clients.js", "FontsRFPClient");
+XPCOMUtils.defineLazyModuleGetter(this, "OS",
+  "resource://gre/modules/osfile.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "FirefoxAdapter",
+  "resource://services-common/kinto-storage-adapter.js");
+XPCOMUtils.defineLazyModuleGetter(this, "FontsDownloader",
+  "resource:///modules/FontsDownloader.jsm");
+
+const TEST_BASE_PATH = "http://www.example.com/browser/browser/components/resistfingerprinting/test/browser/";
+const RFP_FONT_DIR = "rfp-fonts";
+const RFP_FONT_STAGING_DIR = "rfp-fonts-staging";
+
+let server;
+
+let gFontData = [];
+
+/**
+ * A helper function for load testing fonts from the local files and build the meta data
+ *   for describing it for Kinto server.
+ *
+ * @param {Sting} aName           The font's file name.
+ * @param {Sting} aOriginHash     The hash value for the original font file.
+ * @param {Sting} aOriginSize     The file size of the original font file.
+ * @param {Sting} aAttachmentName The the name of the font which should be displayed
+ *                                at the attachment of Kinto server.
+ */
+function getFontFile(aName, aOriginHash, aOriginSize, aAttachmentName) {
+  return new Promise(resolve => {
+    NetUtil.asyncFetch({
+      uri: TEST_BASE_PATH + aName + ".gz",
+      loadUsingSystemPrincipal: true,
+      contentPolicyType: Ci.nsIContentPolicy.TYPE_OTHER
+    }, function(inputStream, status) {
+        let size = inputStream.available();
+        let data = NetUtil.readInputStreamToString(inputStream, size);
+        resolve({
+          data,
+          filename: aName,
+          hash: aOriginHash,
+          size: aOriginSize,
+          gzippedSize: size,
+          attachment_name: aAttachmentName
+        });
+    });
+  });
+}
+
+/**
+ * A clean up function for removing downloaded fonts.
+ */
+async function clearFontFiles() {
+  let greDir = Services.dirsvc.get("GreD", Ci.nsIFile);
+
+  for (let font of gFontData) {
+    let fontFilePath = OS.Path.join(greDir.path, RFP_FONT_DIR, font.filename);
+    await OS.File.remove(fontFilePath);
+  }
+}
+
+/**
+ * A helper function for waiting a specific observer topic after calling certain
+ * function.
+ *
+ * @param {*} aTopic The observer topic to wait.
+ * @param {*} aFunc  The function should be called.
+ */
+async function waitObserverAfterFunction(aTopic, aFunc) {
+  return new Promise(resolve => {
+    function observer() {
+      Services.obs.removeObserver(observer, aTopic);
+      ok(true, `Got ${aTopic}.`);
+      resolve();
+    }
+
+    Services.obs.addObserver(observer, aTopic);
+    aFunc();
+  });
+}
+
+add_task(async function setup() {
+  // Create a fake server to act as a Kinto server.
+  server = new HttpServer();
+  server.start(-1);
+
+  // Load font data.
+  gFontData.push(
+    await getFontFile("NotoSansKhmer-Regular.ttf",
+                      "8bbc4388f9af2bfbe3635b2e79f0d76269d8e892f7884d8055c593203494ac25",
+                      47584,
+                      "fbf1ebf4-6761-404e-ac64-b55bc2b07e65.ttf")
+  );
+
+  gFontData.push(
+    await getFontFile("NotoSansLao-Regular.ttf",
+                      "e870d1c4c7f74e7bf315240479150a7f43bb28f60af9740e02c9af3ce494dcc8",
+                      40148,
+                      "af5c9984-1498-49ed-9244-c2479a4343b1.ttf")
+  );
+
+  // Point the blocklist clients to use this local HTTP server.
+  await SpecialPowers.pushPrefEnv({"set":
+    [["services.settings.server", `http://localhost:${server.identity.primaryPort}/v1`]]
+  });
+
+  // Point the font downloader to use this local HTTP server.
+  await SpecialPowers.pushPrefEnv({"set":
+    [["privacy.resistFingerprinting.fonts.server",
+        `http://localhost:${server.identity.primaryPort}/`]]
+  });
+
+  // Ensure that signature verification is disabled to prevent interference
+  // with tests.
+  await SpecialPowers.pushPrefEnv({"set":
+    [["services.blocklist.signing.enforced", false]]
+  });
+
+  // Setup server fake responses.
+  function handleResponse(request, response) {
+    try {
+      const sample = getSampleResponse(request, server.identity.primaryPort);
+      if (!sample) {
+        ok(false, `unexpected ${request.method} request for ${request.path}?${request.queryString}`);
+      }
+
+      response.setStatusLine(null, sample.status.status,
+                             sample.status.statusText);
+      // send the headers
+      for (let headerLine of sample.sampleHeaders) {
+        let headerElements = headerLine.split(":");
+        response.setHeader(headerElements[0], headerElements[1].trimLeft());
+      }
+      response.setHeader("Date", (new Date()).toUTCString());
+
+      response.write(sample.responseBody);
+    } catch (e) {
+      ok(false, e);
+    }
+  }
+
+  const configPath = "/v1/";
+  const fontRecordsPath  = "/v1/buckets/fingerprinting-defenses/collections/fonts/records";
+  const attachmentPath = "/attachments/";
+
+  server.registerPathHandler(configPath, handleResponse);
+  server.registerPathHandler(fontRecordsPath, handleResponse);
+  server.registerPathHandler(attachmentPath + gFontData[0].attachment_name, handleResponse);
+  server.registerPathHandler(attachmentPath + gFontData[1].attachment_name, handleResponse);
+  server.registerPathHandler(attachmentPath + "must_fail.ttf", (request, response) => {
+    response.setStatusLine(null, 404, "Not Found");
+    ok(false, `This should not be accessed.`);
+  })
+});
+
+/**
+ * Get a response for a given request from sample data
+ */
+function getSampleResponse(req, port) {
+  const responses = {
+    "OPTIONS": {
+      "sampleHeaders": [
+        "Access-Control-Allow-Headers: Content-Length,Expires,Backoff,Retry-After,Last-Modified,Total-Records,ETag,Pragma,Cache-Control,authorization,content-type,if-none-match,Alert,Next-Page",
+        "Access-Control-Allow-Methods: GET,HEAD,OPTIONS,POST,DELETE,OPTIONS",
+        "Access-Control-Allow-Origin: *",
+        "Content-Type: application/json; charset=UTF-8",
+        "Server: waitress"
+      ],
+      "status": {status: 200, statusText: "OK"},
+      "responseBody": "null"
+    },
+    "GET:/v1/?": {
+      "sampleHeaders": [
+        "Access-Control-Allow-Origin: *",
+        "Access-Control-Expose-Headers: Retry-After, Content-Length, Alert, Backoff",
+        "Content-Type: application/json; charset=UTF-8",
+        "Server: waitress"
+      ],
+      "status": {status: 200, statusText: "OK"},
+      "responseBody": JSON.stringify({
+        "settings": {
+          "batch_max_requests": 25
+        },
+        "url": `http://localhost:${port}/v1/`,
+        "documentation": "https://kinto.readthedocs.org/",
+        "version": "1.5.1",
+        "commit": "cbc6f58",
+        "hello": "kinto"
+      })
+    },
+    "GET:/v1/buckets/fingerprinting-defenses/collections/fonts/records?_sort=-last_modified": {
+      "sampleHeaders": [
+        "Access-Control-Allow-Origin: *",
+        "Access-Control-Expose-Headers: Retry-After, Content-Length, Alert, Backoff",
+        "Content-Type: application/json; charset=UTF-8",
+        "Server: waitress",
+        "Etag: \"3000\""
+      ],
+      "status": {status: 200, statusText: "OK"},
+      "responseBody": JSON.stringify({"data": [{
+        "attachment": {
+          "hash": gFontData[0].hash,
+          "mimetype": "application/x-font-ttf",
+          "location": `attachments/${gFontData[0].attachment_name}`,
+          "size": gFontData[0].size,
+          "filename": `${gFontData[0].filename}`
+        },
+        "last_modified": 3000,
+        "id": "88cb8e59-2918-21ee-3f46-61ec2bc8d636",
+        "platforms": [
+          "macosx",
+          "win",
+          "linux"
+        ]
+      }]})
+    },
+    "GET:/v1/buckets/fingerprinting-defenses/collections/fonts/records?_sort=-last_modified&_since=3000": {
+      "sampleHeaders": [
+        "Access-Control-Allow-Origin: *",
+        "Access-Control-Expose-Headers: Retry-After, Content-Length, Alert, Backoff",
+        "Content-Type: application/json; charset=UTF-8",
+        "Server: waitress",
+        "Etag: \"4000\""
+      ],
+      "status": {status: 200, statusText: "OK"},
+      "responseBody": JSON.stringify({"data": [{
+        "attachment": {
+          "hash": gFontData[0].hash,
+          "mimetype": "application/x-font-ttf",
+          "location": `attachments/${gFontData[0].attachment_name}`,
+          "size": gFontData[0].size,
+          "filename": `${gFontData[0].filename}`
+        },
+        "last_modified": 4000,
+        "id": "344be8b1-b76f-48f6-83f6-3cd625350ce2",
+        "platforms": [
+          "macosx",
+          "win",
+          "linux"
+        ]
+      },
+      {
+        "attachment": {
+          "hash": gFontData[1].hash,
+          "mimetype": "application/x-font-ttf",
+          "location": `attachments/${gFontData[1].attachment_name}`,
+          "size": gFontData[1].size,
+          "filename": `${gFontData[1].filename}`
+        },
+        "last_modified": 4000,
+        "id": "981b9dfa-11e0-94b2-a6e3-e245f832f8b7",
+        "platforms": [
+          "macosx",
+          "win",
+          "linux"
+        ]
+      }]})
+    },
+    "GET:/v1/buckets/fingerprinting-defenses/collections/fonts/records?_sort=-last_modified&_since=4000": {
+      "sampleHeaders": [
+        "Access-Control-Allow-Origin: *",
+        "Access-Control-Expose-Headers: Retry-After, Content-Length, Alert, Backoff",
+        "Content-Type: application/json; charset=UTF-8",
+        "Server: waitress",
+        "Etag: \"4000\""
+      ],
+      "status": {status: 200, statusText: "OK"},
+      "responseBody": JSON.stringify({"data": [{
+        "attachment": {
+          "hash": gFontData[0].hash,
+          "mimetype": "application/x-font-ttf",
+          "location": `attachments/${gFontData[0].attachment_name}`,
+          "size": gFontData[0].size,
+          "filename": `${gFontData[0].filename}`
+        },
+        "last_modified": 4000,
+        "id": "344be8b1-b76f-48f6-83f6-3cd625350ce2",
+        "platforms": [
+          "macosx",
+          "win",
+          "linux"
+        ]
+      },
+      {
+        "attachment": {
+          "hash": gFontData[1].hash,
+          "mimetype": "application/x-font-ttf",
+          "location": `attachments/${gFontData[1].attachment_name}`,
+          "size": gFontData[1].size,
+          "filename": `${gFontData[1].filename}`
+        },
+        "last_modified": 4000,
+        "id": "981b9dfa-11e0-94b2-a6e3-e245f832f8b7",
+        "platforms": [
+          "macosx",
+          "win",
+          "linux"
+        ]
+      },
+      {
+        "attachment": {
+          "hash": "fakeHash",
+          "mimetype": "application/x-font-ttf",
+          "location": "attachments/must_fail.ttf",
+          "size": 0,
+          "filename": "fakeFont.ttf"
+        },
+        "last_modified": Date.now() - 3000,
+        "id": "47ed60f5-b395-4384-8da8-d55c2eb2d6a9",
+        "platforms": [
+          "macosx",
+          "win",
+          "linux"
+        ]
+      }]})
+    },
+    "GET:/attachments/fbf1ebf4-6761-404e-ac64-b55bc2b07e65.ttf?": {
+      "sampleHeaders": [
+        "Access-Control-Allow-Origin: *",
+        "Content-Type: application/x-font-ttf",
+        "Content-Encoding: gzip",
+        "Server: waitress",
+        `Content-Length: ${gFontData[0].gzippedSize}`
+      ],
+      "status": {status: 200, statusText: "OK"},
+      "responseBody": gFontData[0].data
+    },
+    "GET:/attachments/af5c9984-1498-49ed-9244-c2479a4343b1.ttf?": {
+      "sampleHeaders": [
+        "Access-Control-Allow-Origin: *",
+        "Content-Type: application/x-font-ttf",
+        "Content-Encoding: gzip",
+        "Server: waitress",
+        `Content-Length: ${gFontData[1].gzippedSize}`
+      ],
+      "status": {status: 200, statusText: "OK"},
+      "responseBody": gFontData[1].data
+    }
+  };
+  return responses[`${req.method}:${req.path}?${req.queryString}`] ||
+         responses[req.method];
+
+}
+
+registerCleanupFunction(() => {
+  server.stop(() => {
+    server = null;
+  });
+});
+
+add_task(async function test_download_fonts() {
+  // First, fetch records from the server and wait until the
+  // 'resist-fingerprinting:download-fonts' notified. This topic indicates
+  // the font list has been loaded.
+  await waitObserverAfterFunction("resist-fingerprinting:download-fonts", () => {
+    gFontsClient.maybeSync(2000, Date.now(), {loadDump: false});
+  });
+
+  let fontListPath = `${gFontsClient.identifier}.json`;
+
+  let fontListFullPath = OS.Path.join(OS.Constants.Path.profileDir,
+                                      ...fontListPath.split("/"));
+  ok(await OS.File.exists(fontListFullPath), "Font list has been loaded successfully.");
+
+  await FontsDownloader.maybeDownloadFonts();
+
+  // Check that fonts have been put at the correct place.
+  let fontFilePath = OS.Path.join(OS.Constants.Path.profileDir,
+                                  RFP_FONT_STAGING_DIR,
+                                  gFontData[0].filename);
+  ok(await OS.File.exists(fontFilePath), "The font has been put at the staging directory.");
+
+  // Notify the observer to start moving fonts and wait until it finishes.
+  await waitObserverAfterFunction("resist-fingerprinting:move-fonts-finish", () => {
+    Services.obs.notifyObservers(null, "resist-fingerprinting:move-fonts");
+  });
+
+  let greDir = Services.dirsvc.get("GreD", Ci.nsIFile);
+  let localFontPath = OS.Path.join(greDir.path, RFP_FONT_DIR,
+                                   gFontData[0].filename);
+
+  ok(await OS.File.exists(localFontPath), "The font has been put at the font directory.");
+});
+
+add_task(async function test_download_font_when_font_list_get_updated() {
+  // Fetch the updated font list.
+  await waitObserverAfterFunction("resist-fingerprinting:download-fonts", () => {
+    gFontsClient.maybeSync(3001, Date.now(), {loadDump: false});
+  });
+
+  // Set the pref "privacy.resistFingerprinting.fonts.last_update_time" to a proper
+  // time.
+  await SpecialPowers.pushPrefEnv({"set":
+    [["privacy.resistFingerprinting.fonts.last_update_time", 3]]
+  });
+
+  await FontsDownloader.maybeDownloadFonts();
+
+  // Check that the first downloaded font should not be downloaded again.
+  let stagingFontPath = OS.Path.join(OS.Constants.Path.profileDir,
+                                     RFP_FONT_STAGING_DIR, gFontData[0].filename);
+  ok(!await OS.File.exists(stagingFontPath), "The first downloaded font should not be downloaded again.");
+
+  // Check that the font has been put at the staging directory.
+  stagingFontPath = OS.Path.join(OS.Constants.Path.profileDir,
+                                 RFP_FONT_STAGING_DIR, gFontData[1].filename);
+  ok(await OS.File.exists(stagingFontPath), "The second downloaded font has been put at the staging directory.");
+
+  // Notify the observer to start moving fonts and wait until it finishes.
+  await waitObserverAfterFunction("resist-fingerprinting:move-fonts-finish", () => {
+    Services.obs.notifyObservers(null, "resist-fingerprinting:move-fonts");
+  })
+
+  let greDir = Services.dirsvc.get("GreD", Ci.nsIFile);
+
+  // Check that fonts have been put at the correct place.
+  const localFontFilePaths = [
+    OS.Path.join(greDir.path, RFP_FONT_DIR, gFontData[0].filename),
+    OS.Path.join(greDir.path, RFP_FONT_DIR, gFontData[1].filename),
+  ];
+  ok(await OS.File.exists(localFontFilePaths[0]), "The first font has been put at the font directory.");
+  ok(await OS.File.exists(localFontFilePaths[1]), "The second font has been put at the font directory.");
+});
+
+add_task(async function test_last_update_time() {
+  // Fetch the updated font list which has the attachment should not be downloaded.
+  // This attachment's last modified time would be 3 seconds before, which means
+  // the FontsDownloader should not download it since it's last update time is now.
+  await waitObserverAfterFunction("resist-fingerprinting:download-fonts", () => {
+    gFontsClient.maybeSync(4001, Date.now(), {loadDump: false});
+  });
+
+  // Should download nothing here.
+  await FontsDownloader.maybeDownloadFonts();
+});
+
+add_task(async function test_flip_RFP_pref() {
+  // Flip the pref 'privacy.resistFingerprinting' to see whether the observer
+  // 'resist-fingerprinting:start-download-fonts' been notified.
+  await waitObserverAfterFunction("resist-fingerprinting:start-download-fonts", () => {
+    SpecialPowers.pushPrefEnv({"set":
+      [["privacy.resistFingerprinting", true]]
+    });
+  })
+});
+
+add_task(clearFontFiles);