tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_multipart_contentdisp.js (3403B)


      1 "use strict";
      2 
      3 const { HttpServer } = ChromeUtils.importESModule(
      4  "resource://testing-common/httpd.sys.mjs"
      5 );
      6 
      7 var httpserver = null;
      8 
      9 ChromeUtils.defineLazyGetter(this, "uri", function () {
     10  return "http://localhost:" + httpserver.identity.primaryPort;
     11 });
     12 
     13 function make_channel(url) {
     14  return NetUtil.newChannel({ uri: url, loadUsingSystemPrincipal: true });
     15 }
     16 
     17 var multipartBody =
     18  "--boundary\r\nContent-Type: text/html\r\nContent-Disposition: inline\r\n\r\n<script>alert(document.domain)</script>\r\n--boundary--";
     19 
     20 function contentHandler(metadata, response) {
     21  response.setHeader("Content-Type", 'multipart/mixed; boundary="boundary"');
     22  response.bodyOutputStream.write(multipartBody, multipartBody.length);
     23 }
     24 
     25 function contentHandler2(metadata, response) {
     26  response.setHeader("Content-Type", 'multipart/mixed; boundary="boundary"');
     27  response.setHeader("Content-Disposition", "attachment");
     28 
     29  response.bodyOutputStream.write(multipartBody, multipartBody.length);
     30 }
     31 
     32 class MultipartListener {
     33  QueryInterface = ChromeUtils.generateQI([
     34    "nsIStreamListener",
     35    "nsIRequestObserver",
     36    "nsIMultiPartChannelListener",
     37  ]);
     38 
     39  constructor(callback) {
     40    this.entries = [];
     41    this.entry = null;
     42    this.callback = callback;
     43  }
     44 
     45  onStartRequest(request) {
     46    this.entry = {
     47      request,
     48      data: "",
     49    };
     50  }
     51 
     52  onDataAvailable(request, stream, offset, count) {
     53    try {
     54      this.entry.data = this.entry.data.concat(read_stream(stream, count));
     55      dump("BUFFEEE: " + this.entry.data + "\n\n");
     56    } catch (ex) {
     57      do_throw("Error in onDataAvailable: " + ex);
     58    }
     59  }
     60 
     61  onStopRequest(_request) {
     62    this.entries.push(this.entry);
     63    this.entry = null;
     64  }
     65 
     66  onAfterLastPart(status) {
     67    this.callback(this.entries, status);
     68  }
     69 }
     70 
     71 add_setup(async () => {
     72  httpserver = new HttpServer();
     73  httpserver.registerPathHandler("/multipart", contentHandler);
     74  httpserver.registerPathHandler("/multipart2", contentHandler2);
     75  httpserver.start(-1);
     76 });
     77 
     78 add_task(async function test_contentDisp() {
     79  var streamConv = Cc["@mozilla.org/streamConverters;1"].getService(
     80    Ci.nsIStreamConverterService
     81  );
     82  let req = await new Promise(resolve => {
     83    let multipartListener = new MultipartListener(resolve);
     84    var conv = streamConv.asyncConvertData(
     85      "multipart/mixed",
     86      "*/*",
     87      multipartListener,
     88      null
     89    );
     90    var chan = make_channel(`${uri}/multipart`);
     91    chan.asyncOpen(conv, null);
     92  });
     93  Assert.ok(req.length);
     94  req[0].request.QueryInterface(Ci.nsIChannel);
     95  Assert.equal(req[0].request.contentType, "text/html");
     96  Assert.equal(
     97    req[0].request.contentDisposition,
     98    Ci.nsIChannel.DISPOSITION_INLINE
     99  );
    100 });
    101 
    102 add_task(async function test_contentDisp() {
    103  var streamConv = Cc["@mozilla.org/streamConverters;1"].getService(
    104    Ci.nsIStreamConverterService
    105  );
    106  let req = await new Promise(resolve => {
    107    let multipartListener = new MultipartListener(resolve);
    108    var conv = streamConv.asyncConvertData(
    109      "multipart/mixed",
    110      "*/*",
    111      multipartListener,
    112      null
    113    );
    114    var chan = make_channel(`${uri}/multipart2`);
    115    chan.asyncOpen(conv, null);
    116  });
    117  Assert.ok(req.length);
    118  req[0].request.QueryInterface(Ci.nsIChannel);
    119  Assert.equal(req[0].request.contentType, "text/html");
    120  Assert.equal(
    121    req[0].request.contentDisposition,
    122    Ci.nsIChannel.DISPOSITION_ATTACHMENT
    123  );
    124 });