Bug 451155 ? Password manager does not work correctly on IDN site whose name contains...
[wine-gecko.git] / toolkit / components / passwordmgr / test / unit / test_storage_legacy_3.js
blob01860439b04fe68a5aa266073f94ab1ade94feda
1 /*
2 * Test suite for storage-Legacy.js -- various bug fixes.
4 * This test interfaces directly with the legacy login storage module,
5 * bypassing the normal login manager usage.
7 */
10 const STORAGE_TYPE = "legacy";
12 function run_test() {
14 try {
17 /* ========== 0 ========== */
18 var testnum = 0;
19 var testdesc = "Initial connection to storage module"
21 var storage = Cc["@mozilla.org/login-manager/storage/legacy;1"].
22 createInstance(Ci.nsILoginManagerStorage);
23 if (!storage)
24 throw "Couldn't create storage instance.";
27 /* ========== 1 ========== */
28 testnum++;
29 var testdesc = "Create nsILoginInfo instances for testing with"
31 var dummyuser1 = Cc["@mozilla.org/login-manager/loginInfo;1"].
32 createInstance(Ci.nsILoginInfo);
33 var dummyuser2 = Cc["@mozilla.org/login-manager/loginInfo;1"].
34 createInstance(Ci.nsILoginInfo);
35 var dummyuser3 = Cc["@mozilla.org/login-manager/loginInfo;1"].
36 createInstance(Ci.nsILoginInfo);
38 dummyuser1.init("http://dummyhost.mozilla.org", "", null,
39 "testuser1", "testpass1", "put_user_here", "put_pw_here");
41 dummyuser2.init("http://dummyhost2.mozilla.org", "", null,
42 "testuser2", "testpass2", "put_user2_here", "put_pw2_here");
44 dummyuser3.init("http://dummyhost2.mozilla.org", "", null,
45 "testuser3", "testpass3", "put_user3_here", "put_pw3_here");
50 * ---------------------- Bug 380961 ----------------------
51 * Need to support decoding the mime64-obscured format still
52 * used by SeaMonkey.
56 /* ========== 2 ========== */
57 testnum++;
59 testdesc = "checking import of mime64-obscured entries"
60 storage = LoginTest.initStorage(INDIR, "signons-380961-1.txt",
61 OUTDIR, "output-380961-1.txt");
62 LoginTest.checkStorageData(storage, [], [dummyuser1]);
64 testdesc = "[flush and reload for verification]"
65 storage = LoginTest.reloadStorage(OUTDIR, "output-380961-1.txt");
66 LoginTest.checkStorageData(storage, [], [dummyuser1]);
68 /* ========== 3 ========== */
69 testnum++;
71 testdesc = "testing import of multiple mime-64 entries for a host"
72 storage = LoginTest.initStorage(INDIR, "signons-380961-2.txt",
73 OUTDIR, "output-380961-2.txt");
74 LoginTest.checkStorageData(storage, [], [dummyuser2, dummyuser3]);
76 testdesc = "[flush and reload for verification]"
77 storage = LoginTest.reloadStorage(OUTDIR, "output-380961-2.txt");
78 LoginTest.checkStorageData(storage, [], [dummyuser2, dummyuser3]);
80 /* ========== 4 ========== */
81 testnum++;
83 testdesc = "testing import of mixed encrypted and mime-64 entries."
84 storage = LoginTest.initStorage(INDIR, "signons-380961-3.txt",
85 OUTDIR, "output-380961-3.txt");
86 LoginTest.checkStorageData(storage, [], [dummyuser1, dummyuser2, dummyuser3]);
88 testdesc = "[flush and reload for verification]"
89 storage = LoginTest.reloadStorage(OUTDIR, "output-380961-3.txt");
90 LoginTest.checkStorageData(storage, [], [dummyuser1, dummyuser2, dummyuser3]);
94 * ---------------------- Bug 381262 ----------------------
95 * The SecretDecoderRing can't handle UCS2, failure to
96 * convert to UTF8 garbles the result.
98 * Note: dump()ing to the console on OS X (at least) outputs
99 * garbage, whereas the "bad" UCS2 looks ok!
102 /* ========== 5 ========== */
103 testnum++;
105 testdesc = "initializing login with non-ASCII data."
106 var dummyuser4 = Cc["@mozilla.org/login-manager/loginInfo;1"].
107 createInstance(Ci.nsILoginInfo);
109 dummyuser4.hostname = "https://site.org";
110 dummyuser4.username = String.fromCharCode(
111 355, 277, 349, 357, 533, 537, 101, 345, 185);
112 // "testuser1" using similar-looking glyphs
113 dummyuser4.usernameField = "username";
114 dummyuser4.password = "testpa" + String.fromCharCode(223) + "1";
115 // "ss" replaced with German eszett.
116 dummyuser4.passwordField = "password";
117 dummyuser4.formSubmitURL = "https://site.org";
118 dummyuser4.httpRealm = null;
121 /* ========== 6 ========== */
122 testnum++;
124 testdesc = "testing import of non-ascii username and password."
125 storage = LoginTest.initStorage(INDIR, "signons-381262.txt",
126 OUTDIR, "output-381262-1.txt");
127 LoginTest.checkStorageData(storage, [], [dummyuser4]);
129 testdesc = "[flush and reload for verification]"
130 storage = LoginTest.reloadStorage(OUTDIR, "output-381262-1.txt");
131 LoginTest.checkStorageData(storage, [], [dummyuser4]);
134 /* ========== 7 ========== */
135 testnum++;
137 testdesc = "testing storage of non-ascii username and password."
138 storage = LoginTest.initStorage(INDIR, "signons-empty.txt",
139 OUTDIR, "output-381262-2.txt");
140 LoginTest.checkStorageData(storage, [], []);
141 storage.addLogin(dummyuser4);
142 LoginTest.checkStorageData(storage, [], [dummyuser4]);
144 testdesc = "[flush and reload for verification]"
145 storage = LoginTest.reloadStorage(OUTDIR, "output-381262-2.txt");
146 LoginTest.checkStorageData(storage, [], [dummyuser4]);
150 * ---------------------- Bug 400751 ----------------------
151 * Migrating from existing mime64 encoded format causes
152 * errors in storage legacy's code
156 /* ========== 8 ========== */
157 testnum++;
159 testdesc = "checking double reading of mime64-obscured entries";
160 storage = LoginTest.initStorage(INDIR, "signons-380961-1.txt");
161 LoginTest.checkStorageData(storage, [], [dummyuser1]);
163 testdesc = "checking double reading of mime64-obscured entries part 2";
164 LoginTest.checkStorageData(storage, [], [dummyuser1]);
166 /* ========== 9 ========== */
167 testnum++;
169 testdesc = "checking correct storage of mime64 converted entries";
170 storage = LoginTest.initStorage(INDIR, "signons-380961-1.txt",
171 OUTDIR, "output-400751-1.txt");
172 LoginTest.checkStorageData(storage, [], [dummyuser1]);
173 LoginTest.checkStorageData(storage, [], [dummyuser1]);
174 storage.addLogin(dummyuser2); // trigger a write
175 LoginTest.checkStorageData(storage, [], [dummyuser1, dummyuser2]);
177 testdesc = "[flush and reload for verification]";
178 storage = LoginTest.reloadStorage(OUTDIR, "output-400751-1.txt");
179 LoginTest.checkStorageData(storage, [], [dummyuser1, dummyuser2]);
182 * ---------------------- Bug 394610 ----------------------
183 * Ensure input which might mess with the format or structure of
184 * the store file is appropriately filtered.
187 /* ========== 10 ========== */
188 testnum++;
190 function tryAddUser(storage, aUser, aExpectedError) {
191 var err = null;
192 try {
193 storage.addLogin(aUser);
194 } catch (e) {
195 err = e;
198 LoginTest.checkExpectedError(aExpectedError, err);
201 testdesc = "preparting to try logins with bogus values";
202 storage = LoginTest.initStorage(INDIR, "signons-empty.txt",
203 OUTDIR, "output-394610-1.txt");
204 LoginTest.checkStorageData(storage, [], []);
207 var failUser = Cc["@mozilla.org/login-manager/loginInfo;1"].
208 createInstance(Ci.nsILoginInfo);
209 // init with legal values, we'll change on-the-fly
210 failUser.init("http://failure.site.org",
211 "http://failure.site.org", null,
212 "username", "password", "uname", "pword");
215 testdesc = "storing data values with embedded newlines."
218 // newline in "never for this site" address.
219 var failHost = "http://new\nline.never.net";
220 var error = null;
221 try {
222 storage.setLoginSavingEnabled(failHost, false);
223 } catch (e) {
224 error = e;
226 LoginTest.checkExpectedError(/Invalid hostname/, error);
228 // CR in "never for this site" address.
229 failHost = "http://new\rline.never.net";
230 error = null;
231 try {
232 storage.setLoginSavingEnabled(failHost, false);
233 } catch (e) {
234 error = e;
236 LoginTest.checkExpectedError(/Invalid hostname/, error);
239 // check hostname
240 failUser.hostname = "http://fail\nure.site.org";
241 tryAddUser(storage, failUser, /login values can't contain newlines/);
243 failUser.hostname = "http://fail\rure.site.org";
244 tryAddUser(storage, failUser, /login values can't contain newlines/);
246 failUser.hostname = "http://failure.site.org";
249 // check httpRealm and formSubmitURL
250 failUser.httpRealm = "http://fail\nure.site.org";
251 failUser.formSubmitURL = null;
252 tryAddUser(storage, failUser, /login values can't contain newlines/);
254 failUser.httpRealm = "http://fail\rure.site.org";
255 failUser.formSubmitURL = null;
256 tryAddUser(storage, failUser, /login values can't contain newlines/);
258 failUser.formSubmitURL = "http://fail\nure.site.org";
259 failUser.httpRealm = null;
260 tryAddUser(storage, failUser, /login values can't contain newlines/);
262 failUser.formSubmitURL = "http://fail\rure.site.org";
263 failUser.httpRealm = null;
264 tryAddUser(storage, failUser, /login values can't contain newlines/);
266 failUser.formSubmitURL = "http://failure.site.org";
269 // check usernameField
270 failUser.usernameField = "u\nname";
271 tryAddUser(storage, failUser, /login values can't contain newlines/);
273 failUser.usernameField = "u\rname";
274 tryAddUser(storage, failUser, /login values can't contain newlines/);
276 failUser.usernameField = "uname";
279 // check passwordField
280 failUser.passwordField = "p\nword";
281 tryAddUser(storage, failUser, /login values can't contain newlines/);
283 failUser.passwordField = "p\rword";
284 tryAddUser(storage, failUser, /login values can't contain newlines/);
286 failUser.passwordField = "pword";
289 // check username and password, which are OK with embedded newlines.
290 failUser.username = "user\r\nname";
291 failUser.password = "pass\r\nword";
292 tryAddUser(storage, failUser, null);
294 var numLines = LoginTest.countLinesInFile(OUTDIR, "output-394610-1.txt");
295 do_check_eq(numLines, 10);
297 testdesc = "[flush and reload for verification]"
298 storage = LoginTest.reloadStorage(OUTDIR, "output-394610-1.txt");
299 LoginTest.checkStorageData(storage, [], [failUser]);
301 failUser.username = "username";
302 failUser.password = "password";
305 /* ========== 11 ========== */
306 testnum++;
308 testdesc = "storing data values with special period-only value"
309 storage = LoginTest.initStorage(INDIR, "signons-empty.txt",
310 OUTDIR, "output-394610-2.txt");
311 LoginTest.checkStorageData(storage, [], []);
314 failHost = ".";
315 error = null;
316 try {
317 storage.setLoginSavingEnabled(failHost, false);
318 } catch (e) {
319 error = e;
321 LoginTest.checkExpectedError(/Invalid hostname/, error);
325 // check usernameField
326 failUser.usernameField = ".";
327 tryAddUser(storage, failUser, /login values can't be periods/);
328 failUser.usernameField = "uname";
330 // check formSubmitURL
331 failUser.usernameField = ".";
332 tryAddUser(storage, failUser, /login values can't be periods/);
333 failUser.formSubmitURL = "http://failure.site.org";
335 testdesc = "check added data"
336 LoginTest.checkStorageData(storage, [], []);
337 var numLines = LoginTest.countLinesInFile(OUTDIR, "output-394610-2.txt");
338 do_check_eq(numLines, 2);
340 testdesc = "[flush and reload for verification]"
341 storage = LoginTest.reloadStorage(OUTDIR, "output-394610-2.txt");
342 LoginTest.checkStorageData(storage, [], []);
345 /* ========== 12 ========== */
346 testnum++;
348 testdesc = "create logins with parens in host/httpRealm"
350 storage = LoginTest.initStorage(INDIR, "signons-empty.txt",
351 OUTDIR, "output-394610-3.txt");
352 LoginTest.checkStorageData(storage, [], []);
354 var parenUser1 = Cc["@mozilla.org/login-manager/loginInfo;1"].
355 createInstance(Ci.nsILoginInfo);
356 var parenUser2 = Cc["@mozilla.org/login-manager/loginInfo;1"].
357 createInstance(Ci.nsILoginInfo);
358 var parenUser3 = Cc["@mozilla.org/login-manager/loginInfo;1"].
359 createInstance(Ci.nsILoginInfo);
360 var parenUser4 = Cc["@mozilla.org/login-manager/loginInfo;1"].
361 createInstance(Ci.nsILoginInfo);
362 var parenUser5 = Cc["@mozilla.org/login-manager/loginInfo;1"].
363 createInstance(Ci.nsILoginInfo);
364 var parenUser6 = Cc["@mozilla.org/login-manager/loginInfo;1"].
365 createInstance(Ci.nsILoginInfo);
366 var parenUser7 = Cc["@mozilla.org/login-manager/loginInfo;1"].
367 createInstance(Ci.nsILoginInfo);
368 var parenUser8 = Cc["@mozilla.org/login-manager/loginInfo;1"].
369 createInstance(Ci.nsILoginInfo);
370 var parenUser9 = Cc["@mozilla.org/login-manager/loginInfo;1"].
371 createInstance(Ci.nsILoginInfo);
373 // realm as "(realm", "realm)", "(realm)", ")realm("
374 parenUser1.init("http://parens.site.org", null, "(realm",
375 "user1", "pass1", "uname", "pword");
376 parenUser2.init("http://parens.site.org", null, "realm)",
377 "user2", "pass2", "uname", "pword");
378 parenUser3.init("http://parens.site.org", null, "(realm)",
379 "user3", "pass3", "uname", "pword");
380 parenUser4.init("http://parens.site.org", null, ")realm(",
381 "user4", "pass4", "uname", "pword");
383 // hostname as "xx(xx", "xx)xx", "xx()xx", "xx)(xx"
384 parenUser5.init("http://parens(yay.site.org", null, "realm",
385 "user5", "pass5", "uname", "pword");
386 parenUser6.init("http://parens)yay.site.org", null, "realm",
387 "user6", "pass6", "uname", "pword");
388 parenUser7.init("http://parens(yay).site.org", null, "realm",
389 "user7", "pass7", "uname", "pword");
390 parenUser8.init("http://parens)yay(.site.org", null, "realm",
391 "user8", "pass8", "uname", "pword");
393 // "xx (xx" as a special case
394 parenUser9.init("http://parens (.site.org", null, "realm",
395 "user9", "pass9", "uname", "pword");
397 testdesc = "add logins with parens in host/httpRealm"
398 tryAddUser(storage, parenUser1, null);
399 tryAddUser(storage, parenUser2, null);
400 tryAddUser(storage, parenUser3, null);
401 tryAddUser(storage, parenUser4, null);
402 tryAddUser(storage, parenUser5, null);
403 tryAddUser(storage, parenUser6, null);
404 tryAddUser(storage, parenUser7, null);
405 tryAddUser(storage, parenUser8, null);
407 // we expect this one to fail.
408 tryAddUser(storage, parenUser9, /bad parens in hostname/);
410 var parenLogins = [
411 parenUser1, parenUser2, parenUser3, parenUser4,
412 parenUser5, parenUser6, parenUser7, parenUser8
415 testdesc = "check added data"
416 LoginTest.checkStorageData(storage, [], parenLogins);
417 var numLines = LoginTest.countLinesInFile(OUTDIR, "output-394610-3.txt");
418 do_check_eq(numLines, 66);
420 testdesc = "[flush and reload for verification]"
421 storage = LoginTest.reloadStorage(OUTDIR, "output-394610-3.txt");
422 LoginTest.checkStorageData(storage, [], parenLogins);
425 /* ========== 13 ========== */
426 testnum++;
428 testdesc = "storing data values with embedded nulls."
430 // sanity check
431 do_check_eq( "foo\0bar", "foo\0bar");
432 do_check_neq("foo\0bar", "foobar");
434 storage = LoginTest.initStorage(INDIR, "signons-empty.txt",
435 OUTDIR, "output-394610-4.txt");
436 LoginTest.checkStorageData(storage, [], []);
438 var nullUser = Cc["@mozilla.org/login-manager/loginInfo;1"].
439 createInstance(Ci.nsILoginInfo);
441 nullUser.init("http://null.site.org",
442 "http://null.site.org", null,
443 "username", "password", "usernull", "passnull");
445 // null in "never for this site" address.
446 var nullHost = "http://never\0X.sit.org";
447 error = null;
448 try {
449 storage.setLoginSavingEnabled(nullHost, false);
450 } catch (e) {
451 error = e;
453 LoginTest.checkExpectedError(/Invalid hostname/, error);
456 // check hostname
457 nullUser.hostname = "http://null\0X.site.org";
458 tryAddUser(storage, nullUser, /login values can't contain nulls/);
459 nullUser.hostname = "http://null.site.org";
462 // check httpRealm and formSubmitURL
463 nullUser.httpRealm = "http://null\0X.site.org";
464 nullUser.formSubmitURL = null;
465 tryAddUser(storage, nullUser, /login values can't contain nulls/);
467 nullUser.formSubmitURL = "http://null\0X.site.org";
468 nullUser.httpRealm = null;
469 tryAddUser(storage, nullUser, /login values can't contain nulls/);
471 nullUser.formSubmitURL = "http://null.site.org";
474 // check usernameField
475 nullUser.usernameField = "usernull\0X";
476 tryAddUser(storage, nullUser, /login values can't contain nulls/);
477 nullUser.usernameField = "usernull";
479 // check usernameField with a special case value
480 nullUser.usernameField = ".\0";
481 tryAddUser(storage, nullUser, /login values can't contain nulls/);
482 nullUser.usernameField = "usernull";
484 // check passwordField
485 nullUser.passwordField = "passnull\0X";
486 tryAddUser(storage, nullUser, /login values can't contain nulls/);
487 nullUser.passwordField = "passnull";
490 // check username with null
491 nullUser.username = "user\0name";
492 tryAddUser(storage, nullUser, /login values can't contain nulls/);
493 nullUser.username = "username";
495 // check password with null
496 nullUser.password = "pass\0word";
497 tryAddUser(storage, nullUser, /login values can't contain nulls/);
498 nullUser.password = "password";
501 // Final sanity check, to make sure we didn't store anything unexpected.
502 LoginTest.checkStorageData(storage, [], []);
503 var numLines = LoginTest.countLinesInFile(OUTDIR, "output-394610-4.txt");
504 do_check_eq(numLines, 2);
506 testdesc = "[flush and reload for verification]"
507 storage = LoginTest.reloadStorage(OUTDIR, "output-394610-4.txt");
508 LoginTest.checkStorageData(storage, [], []);
512 * ---------------------- Bug 449701 ----------------------
513 * Ensure changes to login objects given to / obtained from
514 * the storage module don't affect the internal storage.
517 /* ========== 14 ========== */
518 testnum++;
519 testdesc = "ensure internal login objects not shared with callers."
521 storage = LoginTest.initStorage(INDIR, "signons-empty.txt",
522 OUTDIR, "output-449701.txt");
523 LoginTest.checkStorageData(storage, [], []);
525 // dummyuser1 == dummyuser2
526 dummyuser1.init("http://dummyhost.mozilla.org", "", null,
527 "testuser1", "testpass1", "put_user_here", "put_pw_here");
528 dummyuser2.init("http://dummyhost.mozilla.org", "", null,
529 "testuser1", "testpass1", "put_user_here", "put_pw_here");
532 // Add a login, modify it, make sure orginal values are still stored.
533 storage.addLogin(dummyuser1);
534 LoginTest.checkStorageData(storage, [], [dummyuser2]);
535 dummyuser1.usernameField = "ohnoes";
536 LoginTest.checkStorageData(storage, [], [dummyuser2]);
538 // Get a stored login, modify it, make sure the stored login wasn't changed.
539 var logins = storage.getAllLogins({});
540 do_check_eq(logins.length, 1);
541 var obtainedLogin1 = logins[0];
542 obtainedLogin1.usernameField = "ohnoes";
544 logins = storage.getAllLogins({});
545 var obtainedLogin2 = logins[0];
547 do_check_neq(obtainedLogin1.usernameField, obtainedLogin2.usernameField);
551 * ---------------------- Bug 451155 ----------------------
552 * Ensure that we don't mangle strings when then contain
553 * UCS2 characters above U+00FF.
556 /* ========== 15 ========== */
557 testnum++;
558 testdesc = "ensure UCS2 strings don't get mangled."
560 storage = LoginTest.initStorage(INDIR, "signons-empty.txt",
561 OUTDIR, "output-451155.txt");
562 LoginTest.checkStorageData(storage, [], []);
564 var testString = String.fromCharCode(355, 277, 349, 357, 533, 537, 101, 345, 185);
566 var utfHost = "http://" + testString + ".org";
567 var utfUser1 = Cc["@mozilla.org/login-manager/loginInfo;1"].
568 createInstance(Ci.nsILoginInfo);
569 var utfUser2 = Cc["@mozilla.org/login-manager/loginInfo;1"].
570 createInstance(Ci.nsILoginInfo);
572 utfUser1.init("http://" + testString + ".org",
573 "http://" + testString + ".org", null,
574 testString, testString, testString, testString);
575 utfUser2.init("http://realm.check.net", null, "realm " + testString + " test",
576 "user", "pass", "", "");
578 storage.addLogin(utfUser1);
579 storage.addLogin(utfUser2);
580 storage.setLoginSavingEnabled(utfHost, false);
582 LoginTest.checkStorageData(storage, [utfHost], [utfUser1, utfUser2]);
584 testdesc = "[flush and reload for verification]"
585 storage = LoginTest.reloadStorage(OUTDIR, "output-451155.txt");
586 LoginTest.checkStorageData(storage, [utfHost], [utfUser1, utfUser2]);
589 /* ========== end ========== */
590 } catch (e) {
591 throw ("FAILED in test #" + testnum + " -- " + testdesc + ": " + e);