Ctrl K
ComunidadGuías…

test/capsule-csp.test.js

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
var assert = require("node:assert/strict");
var childProcess = require("node:child_process");
var http = require("node:http");
var path = require("node:path");
var test = require("node:test");

function startFixture() {
  return new Promise(function (resolve, reject) {
    var child = childProcess.fork(path.join(__dirname, "fixtures/capsule-csp-server.js"), [], { silent: true });
    var settled = false;
    child.stdout.on("data", function () {});
    child.stderr.on("data", function () {});
    child.once("message", function (message) {
      settled = true;
      resolve({ child: child, port: message.port });
    });
    child.once("error", reject);
    child.once("exit", function (code) {
      if (!settled) reject(new Error("Capsule CSP fixture exited before listening with code " + code + "."));
    });
  });
}

function stopFixture(child) {
  return new Promise(function (resolve) {
    if (!child || child.exitCode !== null) {
      resolve();
      return;
    }
    child.once("exit", function () { resolve(); });
    child.send("close");
  });
}

function requestRoot(port) {
  return new Promise(function (resolve, reject) {
    http.get({ host: "127.0.0.1", port: port, path: "/" }, function (response) {
      response.resume();
      response.once("end", function () { resolve(response); });
    }).once("error", reject);
  });
}

function parseDirectives(value) {
  return value.split(";").map(function (directive) {
    return directive.trim().split(/\s+/).filter(Boolean);
  }).filter(function (directive) { return directive.length > 0; });
}

function findDirective(directives, name) {
  for (var i = 0; i < directives.length; i++) {
    if (directives[i][0] === name) return directives[i];
  }
  return null;
}

test("real Clay response permits only self and Blob Capsule workers", async function () {
  var fixture = await startFixture();
  try {
    var response = await requestRoot(fixture.port);
    assert.equal(response.statusCode, 200);
    var csp = response.headers["content-security-policy"];
    assert.equal(typeof csp, "string");
    var directives = parseDirectives(csp);
    assert.deepEqual(findDirective(directives, "worker-src"), ["worker-src", "'self'", "blob:"]);
    assert.equal(directives.filter(function (directive) { return directive[0] === "worker-src"; }).length, 1);
    assert.deepEqual(findDirective(directives, "script-src"), ["script-src", "'self'", "'unsafe-inline'", "https://cdn.jsdelivr.net", "https://esm.sh"]);
    assert.equal(findDirective(directives, "script-src").indexOf("blob:"), -1);
    assert.deepEqual(findDirective(directives, "default-src"), ["default-src", "'self'"]);
    // The rich-Display frame lives on the same hostname at another port, so
    // frame-src must allow exactly that: the request's own hostname, any
    // port, the app's own scheme, and nothing wider.
    assert.deepEqual(findDirective(directives, "frame-src"), ["frame-src", "'self'", "http://127.0.0.1:*"]);
  } finally {
    await stopFixture(fixture.child);
  }
});