Verified Commit 2b4271f7 authored by Rob Wu's avatar Rob Wu Committed by ma1
Browse files

Bug 2061470 - Don't drop __proto__ from webRequest bodies r=rpl

parent 5bdc9fc9
Loading
Loading
Loading
Loading
Loading
+11 −2
Changes for toolkit/components/extensions/test/mochitest/test_ext_webrequest_upload.html: 11 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@
  enctype="multipart/form-data"
  >
<input type="text" name="textInput2" value="value2">
<input type="text" name="__proto__" value="regression test for bug 2061470">
<input type="file" name="testFile">
<input type="file" name="emptyFile">
</form>
@@ -161,11 +162,19 @@ add_task(async function test_xhr_forms() {
    }
    let action = new URL(form.action);
    let formData = new FormData(form);
    let webRequestFD = {};

    let updateActionURL = () => {
      let webRequestFD = {};
      for (let name of formData.keys()) {
        webRequestFD[name] = name in uploads ? [uploads[name].fileName] : formData.getAll(name);
        if (Object.hasOwn(webRequestFD, name)) {
          // Ignore duplicate keys; formData.getAll already read all values.
          continue;
        }
        const value = Object.hasOwn(uploads, name) ? [uploads[name].fileName] : formData.getAll(name);
        // Cannot use webRequestFD[name] = value, because for "__proto__" as
        // name, that would trigger the Object.prototype.__proto__ setter
        // instead of defining a data property.
        Object.defineProperty(webRequestFD, name, { value, enumerable: true });
      }
      action.searchParams.set("upload", JSON.stringify(webRequestFD));
      action.searchParams.set("enctype", form.enctype);
+1 −17
Changes for toolkit/components/extensions/webrequest/WebRequestUpload.sys.mjs: 1 added line, 17 removed lines.
Original line number Diff line number Diff line
@@ -117,22 +117,6 @@ class Headers extends Map {
  }
}

/**
 * Creates a new Object with a corresponding property for every
 * key-value pair in the given Map.
 *
 * @param {Map} map
 *        The map to convert.
 * @returns {object}
 */
function mapToObject(map) {
  let result = {};
  for (let [key, value] of map) {
    result[key] = value;
  }
  return result;
}

/**
 * Rewinds the given seekable input stream to its beginning, and catches
 * any resulting errors.
@@ -446,7 +430,7 @@ function createFormData(stream, channel, lenient) {
  try {
    let formData = parseFormData(stream, channel, lenient);
    if (formData) {
      return mapToObject(formData);
      return Object.fromEntries(formData);
    }
  } catch (e) {
    Cu.reportError(e);