-
Notifications
You must be signed in to change notification settings - Fork 5
/
identifier-test.js
92 lines (78 loc) · 2.65 KB
/
identifier-test.js
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
/**
* @license
* Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
* This code may only be used under the BSD style license found at
* http://polymer.github.io/LICENSE.txt
* The complete set of authors may be found at
* http://polymer.github.io/AUTHORS.txt
* The complete set of contributors may be found at
* http://polymer.github.io/CONTRIBUTORS.txt
* Code distributed by Google as part of the polymer project is also
* subject to an additional IP rights grant found at
* http://polymer.github.io/PATENTS.txt
*/
goog.provide('security.polymer_resin.identifier_test');
goog.require('goog.string.Const');
suite(
'Identifier',
function () {
var identifierFixture;
var input;
var label;
setup(function () {
identifierFixture = fixture('identifier-test-fixture');
input = identifierFixture.$$('input');
label = identifierFixture.$$('label');
});
function assertId(want, inputValue) {
identifierFixture.x = inputValue;
var ok =
(typeof want == 'function')
? /** @type {function(*):boolean} */ (want)
: function (x) { return x == want; };
function check(desc, x) {
assert.isOk(
ok(x),
(desc + ', want ' + want + ', got ' + x));
}
check('input.id', input.id);
check('input.name', input.name);
check('label.htmlFor', label.htmlFor);
}
test('allowed_string', function() {
assertId('safe-id', 'safe-id');
});
test('allowed_constant', function() {
// constant strings allowed
assertId('my-id', goog.string.Const.from('my-id'));
});
test('disallowed', function() {
assertId('zClosurez', 'unsafe');
});
test('case-sensitive', function() {
assertId('zClosurez', 'Safe-string');
});
test('not-at-start', function() {
assertId('zClosurez', 'evil-not-safe-at-all');
});
test('doppelganger', function() {
var doppelganger = {
b: false,
toString: function () {
// Return 'safe-at-first-blush' the first time a
// doppelganger is sampled to get through a safe value,
// and 'evil' to provide the payload.
// Probably out of bounds for XSS mitigation.
var s = this.b ? 'evil': 'safe-at-first-blush';
this.b = !this.b;
return s;
}
};
assertId(
function (x) {
// Allow either.
return x == 'safe-at-first-blush' || x == 'zClosurez';
},
doppelganger);
});
});