summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/caps/browser_principalSerialization_json.js
blob: f79f269fd7c9f55425e5b1f8f03a9779a1d59e8f (plain)
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
"use strict";

/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/ */

/*
  This test file exists to ensure whenever changes to principal serialization happens,
  we guarantee that the data can be restored and generated into a new principal.

  The tests are written to be brittle so we encode all versions of the changes into the tests.
*/

add_task(async function test_nullPrincipal() {
  const nullId = "0";
  // fields
  const uri = 0;
  const suffix = 1;

  const nullReplaceRegex =
    /moz-nullprincipal:{[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}}/;
  const NULL_REPLACE = "NULL_PRINCIPAL_URL";

  /*
   This test should NOT be resilient to changes in versioning,
   however it exists purely to verify the code doesn't unintentionally change without updating versioning and migration code.
  */
  let tests = [
    {
      input: { OA: {} },
      expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}"}}`,
    },
    {
      input: { OA: {} },
      expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}"}}`,
    },
    {
      input: { OA: { userContextId: 0 } },
      expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}"}}`,
    },
    {
      input: { OA: { userContextId: 2 } },
      expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}","${suffix}":"^userContextId=2"}}`,
    },
    {
      input: { OA: { privateBrowsingId: 1 } },
      expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}","${suffix}":"^privateBrowsingId=1"}}`,
    },
    {
      input: { OA: { privateBrowsingId: 0 } },
      expected: `{"${nullId}":{"${uri}":"${NULL_REPLACE}"}}`,
    },
  ];

  for (let test of tests) {
    let p = Services.scriptSecurityManager.createNullPrincipal(test.input.OA);
    let sp = E10SUtils.serializePrincipal(p);
    // Not sure why cppjson is adding a \n here
    let spr = sp.replace(nullReplaceRegex, NULL_REPLACE);
    is(
      test.expected,
      spr,
      "Expected serialized object for " + JSON.stringify(test.input)
    );
    let dp = E10SUtils.deserializePrincipal(sp);

    // Check all the origin attributes
    for (let key in test.input.OA) {
      is(
        dp.originAttributes[key],
        test.input.OA[key],
        "Ensure value of " + key + " is " + test.input.OA[key]
      );
    }
  }
});

add_task(async function test_contentPrincipal() {
  const contentId = "1";
  // fields
  const content = 0;
  // const domain = 1;
  const suffix = 2;
  // const csp = 3;

  /*
   This test should NOT be resilient to changes in versioning,
   however it exists purely to verify the code doesn't unintentionally change without updating versioning and migration code.
  */
  let tests = [
    {
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
      input: { uri: "http://example.com/", OA: {} },
      expected: `{"${contentId}":{"${content}":"http://example.com/"}}`,
    },
    {
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
      input: { uri: "http://mozilla1.com/", OA: {} },
      expected: `{"${contentId}":{"${content}":"http://mozilla1.com/"}}`,
    },
    {
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
      input: { uri: "http://mozilla2.com/", OA: { userContextId: 0 } },
      expected: `{"${contentId}":{"${content}":"http://mozilla2.com/"}}`,
    },
    {
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
      input: { uri: "http://mozilla3.com/", OA: { userContextId: 2 } },
      expected: `{"${contentId}":{"${content}":"http://mozilla3.com/","${suffix}":"^userContextId=2"}}`,
    },
    {
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
      input: { uri: "http://mozilla4.com/", OA: { privateBrowsingId: 1 } },
      expected: `{"${contentId}":{"${content}":"http://mozilla4.com/","${suffix}":"^privateBrowsingId=1"}}`,
    },
    {
      // eslint-disable-next-line @microsoft/sdl/no-insecure-url
      input: { uri: "http://mozilla5.com/", OA: { privateBrowsingId: 0 } },
      expected: `{"${contentId}":{"${content}":"http://mozilla5.com/"}}`,
    },
  ];

  for (let test of tests) {
    let uri = Services.io.newURI(test.input.uri);
    let p = Services.scriptSecurityManager.createContentPrincipal(
      uri,
      test.input.OA
    );
    let sp = E10SUtils.serializePrincipal(p);
    is(test.expected, sp, "Expected serialized object for " + test.input.uri);
    let dp = E10SUtils.deserializePrincipal(sp);
    is(dp.URI.spec, test.input.uri, "Ensure spec is the same");

    // Check all the origin attributes
    for (let key in test.input.OA) {
      is(
        dp.originAttributes[key],
        test.input.OA[key],
        "Ensure value of " + key + " is " + test.input.OA[key]
      );
    }
  }
});

add_task(async function test_systemPrincipal() {
  const systemId = "3";
  /*
   This test should NOT be resilient to changes in versioning,
   however it exists purely to verify the code doesn't unintentionally change without updating versioning and migration code.
  */
  const expected = `{"${systemId}":{}}`;

  let p = Services.scriptSecurityManager.getSystemPrincipal();
  let sp = E10SUtils.serializePrincipal(p);
  is(expected, sp, "Expected serialized object for system principal");
  let dp = E10SUtils.deserializePrincipal(sp);
  is(
    dp,
    Services.scriptSecurityManager.getSystemPrincipal(),
    "Deserialized the system principal"
  );
});