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.
10 const STORAGE_TYPE
= "legacy";
17 /* ========== 0 ========== */
19 var testdesc
= "Initial connection to storage module"
21 var storage
= Cc
["@mozilla.org/login-manager/storage/legacy;1"].
22 createInstance(Ci
.nsILoginManagerStorage
);
24 throw "Couldn't create storage instance.";
27 /* ========== 1 ========== */
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
56 /* ========== 2 ========== */
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 ========== */
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 ========== */
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 ========== */
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 ========== */
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 ========== */
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 ========== */
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 ========== */
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 ========== */
190 function tryAddUser(storage
, aUser
, aExpectedError
) {
193 storage
.addLogin(aUser
);
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";
222 storage
.setLoginSavingEnabled(failHost
, false);
226 LoginTest
.checkExpectedError(/Invalid hostname/, error
);
228 // CR in "never for this site" address.
229 failHost
= "http://new\rline.never.net";
232 storage
.setLoginSavingEnabled(failHost
, false);
236 LoginTest
.checkExpectedError(/Invalid hostname/, error
);
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 ========== */
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
, [], []);
317 storage
.setLoginSavingEnabled(failHost
, false);
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 ========== */
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/);
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 ========== */
428 testdesc
= "storing data values with embedded nulls."
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";
449 storage
.setLoginSavingEnabled(nullHost
, false);
453 LoginTest
.checkExpectedError(/Invalid hostname/, error
);
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 ========== */
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 ========== */
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 ========== */
591 throw ("FAILED in test #" + testnum
+ " -- " + testdesc
+ ": " + e
);