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
|
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that the default nsILoginManagerStorage module attached to the Login
* Manager service is able to save and reload nsILoginInfo properties correctly,
* even when they include special characters.
*/
"use strict";
// Globals
function* reloadAndCheckLoginsGen(aExpectedLogins)
{
yield LoginTestUtils.reloadData();
LoginTestUtils.checkLogins(aExpectedLogins);
LoginTestUtils.clearData();
}
// Tests
/**
* Tests addLogin with valid non-ASCII characters.
*/
add_task(function* test_storage_addLogin_nonascii()
{
let hostname = "http://" + String.fromCharCode(355) + ".example.com";
// Store the strings "user" and "pass" using similarly looking glyphs.
let loginInfo = TestData.formLogin({
hostname: hostname,
formSubmitURL: hostname,
username: String.fromCharCode(533, 537, 7570, 345),
password: String.fromCharCode(421, 259, 349, 537),
usernameField: "field_" + String.fromCharCode(533, 537, 7570, 345),
passwordField: "field_" + String.fromCharCode(421, 259, 349, 537),
});
Services.logins.addLogin(loginInfo);
yield* reloadAndCheckLoginsGen([loginInfo]);
// Store the string "test" using similarly looking glyphs.
loginInfo = TestData.authLogin({
httpRealm: String.fromCharCode(355, 277, 349, 357),
});
Services.logins.addLogin(loginInfo);
yield* reloadAndCheckLoginsGen([loginInfo]);
});
/**
* Tests addLogin with newline characters in the username and password.
*/
add_task(function* test_storage_addLogin_newlines()
{
let loginInfo = TestData.formLogin({
username: "user\r\nname",
password: "password\r\n",
});
Services.logins.addLogin(loginInfo);
yield* reloadAndCheckLoginsGen([loginInfo]);
});
/**
* Tests addLogin with a single dot in fields where it is allowed.
*
* These tests exist to verify the legacy "signons.txt" storage format.
*/
add_task(function* test_storage_addLogin_dot()
{
let loginInfo = TestData.formLogin({ hostname: ".", passwordField: "." });
Services.logins.addLogin(loginInfo);
yield* reloadAndCheckLoginsGen([loginInfo]);
loginInfo = TestData.authLogin({ httpRealm: "." });
Services.logins.addLogin(loginInfo);
yield* reloadAndCheckLoginsGen([loginInfo]);
});
/**
* Tests addLogin with parentheses in hostnames.
*
* These tests exist to verify the legacy "signons.txt" storage format.
*/
add_task(function* test_storage_addLogin_parentheses()
{
let loginList = [
TestData.authLogin({ httpRealm: "(realm" }),
TestData.authLogin({ httpRealm: "realm)" }),
TestData.authLogin({ httpRealm: "(realm)" }),
TestData.authLogin({ httpRealm: ")realm(" }),
TestData.authLogin({ hostname: "http://parens(.example.com" }),
TestData.authLogin({ hostname: "http://parens).example.com" }),
TestData.authLogin({ hostname: "http://parens(example).example.com" }),
TestData.authLogin({ hostname: "http://parens)example(.example.com" }),
];
for (let loginInfo of loginList) {
Services.logins.addLogin(loginInfo);
}
yield* reloadAndCheckLoginsGen(loginList);
});
|