File: file_form_submission.sjs

package info (click to toggle)
firefox 147.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,683,324 kB
  • sloc: cpp: 7,607,156; javascript: 6,532,492; ansic: 3,775,158; python: 1,415,368; xml: 634,556; asm: 438,949; java: 186,241; sh: 62,751; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (99 lines) | stat: -rw-r--r-- 2,989 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
const CC = Components.Constructor;
const BinaryInputStream = CC(
  "@mozilla.org/binaryinputstream;1",
  "nsIBinaryInputStream",
  "setInputStream"
);

function makeResponse(success) {
  let res = `
  <html>
    <body>
      send message, downgraded
    <script type="application/javascript">
      let scheme = document.location.protocol;
      const loc = document.location.href;
      window.opener.postMessage({location: loc, scheme: scheme, form:"test=${
        success ? "success" : "failure"
      }" }, '*');
    </script>
    </body>
  </html>`;
  return res;
}

function makeForm(method, testID) {
  return `
  <html>
      <body>
          <form action="http://example.com/tests/dom/security/test/https-first/file_form_submission.sjs" method="${method}" id="testform">
              <div>
              <label id="submit">Submit</label>
              <input name="test" id="form" value="${testID}">
              <input name="result" id="form" value="success">
              </div>
          </form>
          <script class="testbody" type="text/javascript">
              document.getElementById("testform").submit();
          </script>
      </body>
  </html>
  `;
}

function handleRequest(request, response) {
  // avoid confusing cache behaviors
  response.setHeader("Cache-Control", "no-cache", false);
  let queryString = request.queryString;
  // Endpoints to return a form
  if (
    (request.scheme === "https" && queryString === "test=1") ||
    (request.scheme === "http" && queryString === "test=2")
  ) {
    response.write(makeForm("GET", queryString.substr(-1, 1)));
    return;
  }
  if (queryString === "test=3" || queryString === "test=4") {
    response.write(makeForm("POST", queryString.substr(-1, 1)));
    return;
  }
  // Endpoints to trigger downgrades because of timeouts
  if (
    request.scheme === "https" &&
    (queryString === "test=2" || queryString === "test=4")
  ) {
    response.processAsync();
    return;
  }
  // Endpoints for receiving the form data
  if (
    request.method == "GET" &&
    ((queryString.includes("test=1") && request.scheme === "https") ||
      queryString.includes("test=2")) &&
    queryString.includes("result=success")
  ) {
    response.write(makeResponse(true));
    return;
  }
  if (request.method == "POST" && request.scheme === "http") {
    // extract form parameters
    let body = new BinaryInputStream(request.bodyInputStream);
    let avail;
    let bytes = [];
    while ((avail = body.available()) > 0) {
      Array.prototype.push.apply(bytes, body.readByteArray(avail));
    }
    let requestBodyContents = String.fromCharCode.apply(null, bytes);

    response.write(
      makeResponse(
        (requestBodyContents.includes("test=3") ||
          requestBodyContents.includes("test=4")) &&
          requestBodyContents.includes("result=success")
      )
    );
    return;
  }
  // we should never get here; just in case, return something unexpected
  response.write(makeResponse(false));
}