tor-browser

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

cookieStore_set_arguments.https.any.js (16991B)


      1 // META: title=Cookie Store API: cookieStore.set() arguments
      2 // META: script=resources/cookie-test-helpers.js
      3 // META: global=window,serviceworker
      4 
      5 'use strict';
      6 
      7 promise_test(async testCase => {
      8  await cookieStore.delete('cookie-name');
      9 
     10  await cookieStore.set('cookie-name', 'cookie-value');
     11  testCase.add_cleanup(async () => {
     12    await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`);
     13  });
     14 
     15  const cookie = await cookieStore.get('cookie-name');
     16  assert_equals(cookie.name, 'cookie-name');
     17  assert_equals(cookie.value, 'cookie-value');
     18 }, 'cookieStore.set with positional name and value');
     19 
     20 promise_test(async testCase => {
     21  await cookieStore.delete('cookie-name');
     22 
     23  await cookieStore.set({ name: 'cookie-name', value: 'cookie-value' });
     24  testCase.add_cleanup(async () => {
     25    await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`);
     26  });
     27  const cookie = await cookieStore.get('cookie-name');
     28  assert_equals(cookie.name, 'cookie-name');
     29  assert_equals(cookie.value, 'cookie-value');
     30 }, 'cookieStore.set with name and value in options');
     31 
     32 promise_test(async testCase => {
     33  await promise_rejects_js(testCase, TypeError,
     34      cookieStore.set('', ''));
     35 }, "cookieStore.set fails with empty name and empty value");
     36 
     37 promise_test(async testCase => {
     38  await promise_rejects_js(testCase, TypeError,
     39      cookieStore.set('', 'suspicious-value=resembles-name-and-value'));
     40 }, "cookieStore.set with empty name and an '=' in value");
     41 
     42 promise_test(async testCase => {
     43  await cookieStore.delete('cookie-name');
     44  cookieStore.set('cookie-name', 'suspicious-value=resembles-name-and-value');
     45  testCase.add_cleanup(async () => {
     46    await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`);
     47  });
     48  const cookie = await cookieStore.get('cookie-name');
     49  assert_equals(cookie.name, 'cookie-name');
     50  assert_equals(cookie.value, 'suspicious-value=resembles-name-and-value');
     51 }, "cookieStore.set with normal name and an '=' in value");
     52 
     53 let invalidCharacters = [ '\u0000', '\u0001', '\u0002'
     54                        , '\u0003', '\u0004', '\u0005'
     55                        , '\u0006', '\u0007', '\u0008'
     56                                  , '\u0010', '\u0011'
     57                        , '\u0012', '\u0013', '\u0014'
     58                        , '\u0015', '\u0016', '\u0017'
     59                        , '\u0018', '\u0019', '\u001A'
     60                        , '\u001B', '\u001C', '\u001D'
     61                        , '\u001E', '\u001F'
     62                        , '\u003B', '\u007F'];
     63 
     64 invalidCharacters.forEach(invalidCharacter => {
     65  let invalidCookieName = 'cookie' + invalidCharacter + 'name';
     66  let invalidCookieValue = 'cookie' + invalidCharacter + 'value';
     67  promise_test(async testCase => {
     68    await promise_rejects_js(testCase, TypeError,
     69        cookieStore.set(invalidCookieName, 'cookie-value'));
     70    await promise_rejects_js(testCase, TypeError,
     71      cookieStore.set('cookie-name', invalidCookieValue));
     72  }, `cookieStore.set checks if name or value contain invalid character U+${invalidCharacter.charCodeAt(0).toString(16).padStart(4, "0").toUpperCase()}`);
     73 });
     74 
     75 promise_test(async testCase => {
     76  const tenYears = 10 * 365 * 24 * 60 * 60 * 1000;
     77  const tenYearsFromNow = Date.now() + tenYears;
     78  await cookieStore.delete('cookie-name');
     79 
     80  await cookieStore.set(
     81      { name: 'cookie-name',
     82        value: 'cookie-value',
     83        expires: new Date(tenYearsFromNow) });
     84  testCase.add_cleanup(async () => {
     85    await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`);
     86  });
     87  const cookie = await cookieStore.get('cookie-name');
     88  assert_equals(cookie.name, 'cookie-name');
     89  assert_equals(cookie.value, 'cookie-value');
     90 }, 'cookieStore.set with expires set to a future Date');
     91 
     92 promise_test(async testCase => {
     93  const tenYears = 10 * 365 * 24 * 60 * 60 * 1000;
     94  const tenYearsAgo = Date.now() - tenYears;
     95  await cookieStore.delete('cookie-name');
     96 
     97  await cookieStore.set(
     98      { name :'cookie-name',
     99        value: 'cookie-value',
    100        expires: new Date(tenYearsAgo) });
    101  testCase.add_cleanup(async () => {
    102    await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`);
    103  });
    104  const cookie = await cookieStore.get('cookie-name');
    105  assert_equals(cookie, null);
    106 }, 'cookieStore.set with expires set to a past Date');
    107 
    108 promise_test(async testCase => {
    109  const tenYears = 10 * 365 * 24 * 60 * 60 * 1000;
    110  const tenYearsFromNow = Date.now() + tenYears;
    111  await cookieStore.delete('cookie-name');
    112 
    113  await cookieStore.set(
    114      { name: 'cookie-name', value: 'cookie-value', expires: tenYearsFromNow });
    115  testCase.add_cleanup(async () => {
    116    await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`);
    117  });
    118  const cookie = await cookieStore.get('cookie-name');
    119  assert_equals(cookie.name, 'cookie-name');
    120  assert_equals(cookie.value, 'cookie-value');
    121 }, 'cookieStore.set with expires set to a future timestamp');
    122 
    123 promise_test(async testCase => {
    124  const tenYears = 10 * 365 * 24 * 60 * 60 * 1000;
    125  const tenYearsAgo = Date.now() - tenYears;
    126  await cookieStore.delete('cookie-name');
    127 
    128  await cookieStore.set(
    129      { name: 'cookie-name', value: 'cookie-value', expires: tenYearsAgo });
    130  testCase.add_cleanup(async () => {
    131    await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`);
    132  });
    133  const cookie = await cookieStore.get('cookie-name');
    134  assert_equals(cookie, null);
    135 }, 'cookieStore.set with expires set to a past timestamp');
    136 
    137 promise_test(async testCase => {
    138  const currentUrl = new URL(self.location.href);
    139  const currentDomain = currentUrl.hostname;
    140 
    141  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    142      { name: 'cookie-name',
    143        value: 'cookie-value',
    144        domain: `.${currentDomain}` }));
    145 }, 'cookieStore.set domain starts with "."');
    146 
    147 promise_test(async testCase => {
    148  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    149      { name: 'cookie-name', value: 'cookie-value', domain: 'example.com' }));
    150 }, 'cookieStore.set with domain that is not equal current host');
    151 
    152 promise_test(async testCase => {
    153  const currentUrl = new URL(self.location.href);
    154  const currentDomain = currentUrl.hostname;
    155  await cookieStore.delete({ name: 'cookie-name', domain: currentDomain });
    156 
    157  await cookieStore.set(
    158      { name: 'cookie-name', value: 'cookie-value', domain: currentDomain });
    159  testCase.add_cleanup(async () => {
    160    await setCookieStringHttp(`cookie-name=deleted; Domain=${currentDomain}; Path=/; Max-Age=0`);
    161  });
    162  const cookie = await cookieStore.get('cookie-name');
    163  assert_equals(cookie.name, 'cookie-name');
    164  assert_equals(cookie.value, 'cookie-value');
    165 }, 'cookieStore.set with domain set to the current hostname');
    166 
    167 promise_test(async testCase => {
    168  const currentUrl = new URL(self.location.href);
    169  const currentDomain = currentUrl.hostname;
    170  const subDomain = `sub.${currentDomain}`;
    171 
    172  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    173      { name: 'cookie-name', value: 'cookie-value', domain: subDomain }));
    174  const cookie = await cookieStore.get('cookie-name');
    175  assert_equals(cookie, null);
    176 }, 'cookieStore.set with domain set to a subdomain of the current hostname');
    177 
    178 promise_test(async testCase => {
    179  const currentUrl = new URL(self.location.href);
    180  const currentDomain = currentUrl.hostname;
    181  assert_not_equals(currentDomain[0] === '.',
    182      'this test assumes that the current hostname does not start with .');
    183  const domainSuffix = currentDomain.substr(1);
    184 
    185  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    186      { name: 'cookie-name', value: 'cookie-value', domain: domainSuffix }));
    187  const cookie = await cookieStore.get('cookie-name');
    188  assert_equals(cookie, null);
    189 }, 'cookieStore.set with domain set to a non-domain-matching suffix of the ' +
    190   'current hostname');
    191 
    192 promise_test(async testCase => {
    193  const currentUrl = new URL(self.location.href);
    194  const currentDomain = currentUrl.hostname;
    195  await cookieStore.delete('cookie-name');
    196 
    197  await cookieStore.set('cookie-name', 'cookie-value1');
    198  testCase.add_cleanup(async () => {
    199    await setCookieStringHttp(`cookie-name=deleted; Path=/; Max-Age=0`);
    200  });
    201  await cookieStore.set(
    202      { name: 'cookie-name', value: 'cookie-value2', domain: currentDomain });
    203  testCase.add_cleanup(async () => {
    204    await setCookieStringHttp(`cookie-name=deleted; Domain=${currentDomain}; Path=/; Max-Age=0`);
    205  });
    206 
    207  const cookies = await cookieStore.getAll('cookie-name');
    208  assert_equals(cookies.length, 2);
    209 
    210  assert_equals(cookies[0].name, 'cookie-name');
    211  assert_equals(cookies[1].name, 'cookie-name');
    212 
    213  const values = cookies.map((cookie) => cookie.value);
    214  values.sort();
    215  assert_array_equals(values, ['cookie-value1', 'cookie-value2']);
    216 }, 'cookieStore.set default domain is null and differs from current hostname');
    217 
    218 promise_test(async testCase => {
    219  const currentUrl = new URL(self.location.href);
    220  const currentPath = currentUrl.pathname;
    221  const currentDirectory =
    222      currentPath.substr(0, currentPath.lastIndexOf('/') + 1);
    223  await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
    224 
    225  await cookieStore.set(
    226      { name: 'cookie-name', value: 'cookie-value', path: currentDirectory });
    227  testCase.add_cleanup(async () => {
    228    await setCookieStringHttp(`cookie-name=deleted; Path=${currentDirectory}; Max-Age=0`);
    229  });
    230  const cookie = await cookieStore.get('cookie-name');
    231  assert_equals(cookie.name, 'cookie-name');
    232  assert_equals(cookie.value, 'cookie-value');
    233 }, 'cookieStore.set with path set to the current directory');
    234 
    235 promise_test(async testCase => {
    236  const currentUrl = new URL(self.location.href);
    237  const currentPath = currentUrl.pathname;
    238  const currentDirectory =
    239      currentPath.substr(0, currentPath.lastIndexOf('/') + 1);
    240  const subDirectory = currentDirectory + "subdir/";
    241  await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
    242  await cookieStore.delete({ name: 'cookie-name', path: subDirectory });
    243 
    244  await cookieStore.set(
    245      { name: 'cookie-name', value: 'cookie-value', path: subDirectory });
    246  testCase.add_cleanup(async () => {
    247    await setCookieStringHttp(`cookie-name=deleted; Path=${subDirectory}; Max-Age=0`);
    248  });
    249  const cookie = await cookieStore.get('cookie-name');
    250  assert_equals(cookie, null);
    251 }, 'cookieStore.set with path set to a subdirectory of the current directory');
    252 
    253 promise_test(async testCase => {
    254  await cookieStore.delete('cookie-name');
    255 
    256  await cookieStore.set('cookie-name', 'cookie-old-value');
    257  testCase.add_cleanup(async () => {
    258    await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`);
    259  });
    260 
    261  await cookieStore.set(
    262      { name: 'cookie-name', value: 'cookie-new-value', path: '/' });
    263  testCase.add_cleanup(async () => {
    264    await setCookieStringHttp(`cookie-name=deleted; Path=/; Max-Age=0`);
    265  });
    266 
    267  const cookies = await cookieStore.getAll('cookie-name');
    268  assert_equals(cookies.length, 1);
    269  assert_equals(cookies[0].name, 'cookie-name');
    270  assert_equals(cookies[0].value, 'cookie-new-value');
    271 }, 'cookieStore.set default path is /');
    272 
    273 promise_test(async testCase => {
    274  const currentUrl = new URL(self.location.href);
    275  const currentPath = currentUrl.pathname;
    276  const currentDirectory = currentPath.substr(0, currentPath.lastIndexOf('/'));
    277  await cookieStore.delete({ name: 'cookie-name', path: currentDirectory });
    278 
    279  await cookieStore.set(
    280      { name: 'cookie-name', value: 'cookie-value', path: currentDirectory });
    281  testCase.add_cleanup(async () => {
    282    await setCookieStringHttp(`cookie-name=deleted; Path=${currentDirectory}/; Max-Age=0`);
    283  });
    284  await setCookieStringHttp(`cookie-name=deleted; Path=${currentDirectory}; Max-Age=0`);
    285  const cookie = await cookieStore.get('cookie-name');
    286  assert_equals(cookie, null);
    287 }, 'cookieStore.set does not add / to path that does not end with /');
    288 
    289 promise_test(async testCase => {
    290  if (typeof self.document === 'undefined') {
    291    // The test is being run from a service worker context where document is undefined
    292    testCase.done();
    293    return;
    294  }
    295  const currentUrl = new URL(self.location.href);
    296  const currentPath = currentUrl.pathname;
    297  const currentDirectory = currentPath.substr(0, currentPath.lastIndexOf('/'));
    298  await setCookieStringDocument('cookie-name=cookie-value; path=' + currentDirectory);
    299  await cookieStore.set(
    300    { name: 'cookie-name', value: 'new-cookie-value', path: currentDirectory });
    301  testCase.add_cleanup(async () => {
    302    await setCookieStringHttp(`cookie-name=deleted; Path=${currentDirectory}; Max-Age=0`);
    303    await setCookieStringHttp(`cookie-name=deleted; Path=${currentDirectory}/; Max-Age=0`);
    304  });
    305  const cookies = await cookieStore.getAll('cookie-name');
    306  assert_equals(cookies.length, 1);
    307  assert_equals(cookies[0].name, 'cookie-name');
    308  assert_equals(cookies[0].value, 'new-cookie-value');
    309 }, 'cookieStore.set can modify a cookie set by document.cookie if document is defined');
    310 
    311 promise_test(async testCase => {
    312  const currentUrl = new URL(self.location.href);
    313  const currentPath = currentUrl.pathname;
    314  const currentDirectory =
    315      currentPath.substr(0, currentPath.lastIndexOf('/') + 1);
    316  const invalidPath = currentDirectory.substr(1);
    317 
    318  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    319      { name: 'cookie-name', value: 'cookie-value', path: invalidPath }));
    320 }, 'cookieStore.set with path that does not start with /');
    321 
    322 promise_test(async testCase => {
    323  await cookieStore.set('cookie-name', 'old-cookie-value');
    324  testCase.add_cleanup(async () => {
    325    await setCookieStringHttp(`cookie-name=deleted; Max-Age=0`);
    326  });
    327 
    328  const cookie_attributes = await cookieStore.get('cookie-name');
    329  assert_equals(cookie_attributes.name, 'cookie-name');
    330  assert_equals(cookie_attributes.value, 'old-cookie-value');
    331 
    332  cookie_attributes.value = 'new-cookie-value';
    333  await cookieStore.set(cookie_attributes.name, cookie_attributes.value);
    334  const cookie = await cookieStore.get('cookie-name');
    335  assert_equals(cookie.name, 'cookie-name');
    336  assert_equals(cookie.value, 'new-cookie-value');
    337 }, 'cookieStore.set with get result');
    338 
    339 promise_test(async testCase => {
    340  // The maximum attribute value size is specified as 1024 bytes at https://cookiestore.spec.whatwg.org/#cookie-maximum-attribute-value-size.
    341  await cookieStore.delete('cookie-name');
    342 
    343  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    344      { name: 'cookie-name',
    345        value: 'cookie-value',
    346        path: '/' + 'a'.repeat(1023) + '/' }));
    347  const cookie = await cookieStore.get('cookie-name');
    348  assert_equals(cookie, null);
    349 }, 'cookieStore.set checks if the path is too long');
    350 
    351 promise_test(async testCase => {
    352  // The maximum attribute value size is specified as 1024 bytes at https://cookiestore.spec.whatwg.org/#cookie-maximum-attribute-value-size.
    353  await cookieStore.delete('cookie-name');
    354 
    355  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    356      { name: 'cookie-name',
    357        value: 'cookie-value',
    358        domain: 'a'.repeat(1025) }));
    359  const cookie = await cookieStore.get('cookie-name');
    360  assert_equals(cookie, null);
    361 }, 'cookieStore.set checks if the domain is too long');
    362 
    363 promise_test(async testCase => {
    364  // Cookies having a __Host- prefix are not allowed to specify a domain
    365  await cookieStore.delete('cookie-name');
    366 
    367  const currentUrl = new URL(self.location.href);
    368  const currentDomain = currentUrl.hostname;
    369 
    370  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    371      { name: '__Host-cookie-name',
    372        value: 'cookie-value',
    373        domain: currentDomain }));
    374  const cookie = await cookieStore.get('cookie-name');
    375  assert_equals(cookie, null);
    376 }, 'cookieStore.set with a __Host- prefix should not have a domain');
    377 
    378 promise_test(async testCase => {
    379  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    380      { name: '',
    381        value: ' ' }));
    382 
    383  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    384      { name: ' ',
    385        value: '' }));
    386 
    387  await promise_rejects_js(testCase, TypeError, cookieStore.set(
    388      { name: '  ',
    389        value: '  ' }));
    390 }, 'cookieStore.set with whitespace only name and value');
    391 
    392 promise_test(async testCase => {
    393  const tests = [
    394    { set: ['a b', 'x y'], get: ['a b', 'x y'] },
    395    { set: ['a ', 'x'], get: ['a', 'x'] },
    396    { set: ['a\t', 'x'], get: ['a', 'x'] },
    397    { set: ['  a', 'x'], get: ['a', 'x'] },
    398    { set: [' \t a', 'x'], get: ['a', 'x'] },
    399    { set: [' \t a  \t\t', 'x'], get: ['a', 'x'] },
    400    { set: ['a', 'x '], get: ['a', 'x'] },
    401    { set: ['a', 'x\t'], get: ['a', 'x'] },
    402    { set: ['a', ' x'], get: ['a', 'x'] },
    403    { set: ['a', ' \t x'], get: ['a', 'x'] },
    404    { set: ['a', ' \t x  \t\t'], get: ['a', 'x'] },
    405  ];
    406 
    407  for (const t of tests) {
    408    await cookieStore.set(t.set[0], t.set[1]);
    409    let cookie = await cookieStore.get(t.get[0]);
    410    assert_equals(cookie.value, t.get[1]);
    411 
    412    await cookieStore.delete(t.get[0]);
    413 
    414    cookie = await cookieStore.get(t.get[0]);
    415    assert_equals(cookie, null);
    416  }
    417 
    418 }, 'cookieStore.set with whitespace at begining or end');