|
1 package org.mozilla.gecko.tests; |
|
2 |
|
3 import java.io.File; |
|
4 |
|
5 import org.json.JSONObject; |
|
6 import org.mozilla.gecko.NSSBridge; |
|
7 import org.mozilla.gecko.db.BrowserContract; |
|
8 |
|
9 import android.content.ContentResolver; |
|
10 import android.content.ContentValues; |
|
11 import android.content.Context; |
|
12 import android.database.Cursor; |
|
13 import android.net.Uri; |
|
14 |
|
15 public class testPasswordEncrypt extends BaseTest { |
|
16 public void testPasswordEncrypt() { |
|
17 Context context = (Context)getActivity(); |
|
18 ContentResolver cr = context.getContentResolver(); |
|
19 mAsserter.isnot(cr, null, "Found a content resolver"); |
|
20 ContentValues cvs = new ContentValues(); |
|
21 |
|
22 blockForGeckoReady(); |
|
23 |
|
24 File db = new File(mProfile, "signons.sqlite"); |
|
25 String dbPath = db.getPath(); |
|
26 |
|
27 Uri passwordUri; |
|
28 cvs.put("hostname", "http://www.example.com"); |
|
29 cvs.put("encryptedUsername", "username"); |
|
30 cvs.put("encryptedPassword", "password"); |
|
31 |
|
32 // Attempt to insert into the db |
|
33 passwordUri = BrowserContract.Passwords.CONTENT_URI; |
|
34 Uri.Builder builder = passwordUri.buildUpon(); |
|
35 passwordUri = builder.appendQueryParameter("profilePath", mProfile).build(); |
|
36 |
|
37 Uri uri = cr.insert(passwordUri, cvs); |
|
38 Uri expectedUri = passwordUri.buildUpon().appendPath("1").build(); |
|
39 mAsserter.is(uri.toString(), expectedUri.toString(), "Insert returned correct uri"); |
|
40 |
|
41 Cursor list = mActions.querySql(dbPath, "SELECT encryptedUsername FROM moz_logins"); |
|
42 list.moveToFirst(); |
|
43 String decryptedU = null; |
|
44 try { |
|
45 decryptedU = NSSBridge.decrypt(context, mProfile, list.getString(0)); |
|
46 } catch (Exception e) { |
|
47 mAsserter.ok(false, "NSSBridge.decrypt through Exception " + e, ""); // TODO: What is diag? |
|
48 } |
|
49 mAsserter.is(decryptedU, "username", "Username was encrypted correctly when inserting"); |
|
50 |
|
51 list = mActions.querySql(dbPath, "SELECT encryptedPassword, encType FROM moz_logins"); |
|
52 list.moveToFirst(); |
|
53 String decryptedP = null; |
|
54 try { |
|
55 decryptedP = NSSBridge.decrypt(context, mProfile, list.getString(0)); |
|
56 } catch (Exception e) { |
|
57 mAsserter.ok(false, "NSSBridge.decrypt through Exception " + e, ""); // TODO: What is diag? |
|
58 } |
|
59 mAsserter.is(decryptedP, "password", "Password was encrypted correctly when inserting"); |
|
60 mAsserter.is(list.getInt(1), 1, "Password has correct encryption type"); |
|
61 |
|
62 cvs.put("encryptedUsername", "username2"); |
|
63 cvs.put("encryptedPassword", "password2"); |
|
64 cr.update(passwordUri, cvs, null, null); |
|
65 |
|
66 list = mActions.querySql(dbPath, "SELECT encryptedUsername FROM moz_logins"); |
|
67 list.moveToFirst(); |
|
68 try { |
|
69 decryptedU = NSSBridge.decrypt(context, mProfile, list.getString(0)); |
|
70 } catch (Exception e) { |
|
71 mAsserter.ok(false, "NSSBridge.decrypt through Exception " + e, ""); // TODO: What is diag? |
|
72 } |
|
73 mAsserter.is(decryptedU, "username2", "Username was encrypted when updating"); |
|
74 |
|
75 list = mActions.querySql(dbPath, "SELECT encryptedPassword FROM moz_logins"); |
|
76 list.moveToFirst(); |
|
77 try { |
|
78 decryptedP = NSSBridge.decrypt(context, mProfile, list.getString(0)); |
|
79 } catch (Exception e) { |
|
80 mAsserter.ok(false, "NSSBridge.decrypt through Exception " + e, ""); // TODO: What is diag? |
|
81 } |
|
82 mAsserter.is(decryptedP, "password2", "Password was encrypted when updating"); |
|
83 |
|
84 // Trying to store a password while master password is enabled should throw, |
|
85 // but because Android can't send Exceptions across processes |
|
86 // it just results in a null uri/cursor being returned. |
|
87 toggleMasterPassword("password"); |
|
88 try { |
|
89 uri = cr.insert(passwordUri, cvs); |
|
90 // TODO: restore this assertion -- see bug 764901 |
|
91 // mAsserter.is(uri, null, "Storing a password while MP was set should fail"); |
|
92 |
|
93 Cursor c = cr.query(passwordUri, null, null, null, null); |
|
94 // TODO: restore this assertion -- see bug 764901 |
|
95 // mAsserter.is(c, null, "Querying passwords while MP was set should fail"); |
|
96 } catch (Exception ex) { |
|
97 // Password provider currently can not throw across process |
|
98 // so we should not catch this exception here |
|
99 mAsserter.ok(false, "Caught exception", ex.toString()); |
|
100 } |
|
101 toggleMasterPassword("password"); |
|
102 } |
|
103 |
|
104 private void toggleMasterPassword(String passwd) { |
|
105 JSONObject jsonPref = new JSONObject(); |
|
106 try { |
|
107 jsonPref.put("name", "privacy.masterpassword.enabled"); |
|
108 jsonPref.put("type", "string"); |
|
109 jsonPref.put("value", passwd); |
|
110 setPreferenceAndWaitForChange(jsonPref); |
|
111 } catch (Exception ex) { |
|
112 mAsserter.ok(false, "exception in toggleMasterPassword", ex.toString()); |
|
113 } |
|
114 } |
|
115 |
|
116 @Override |
|
117 public void tearDown() throws Exception { |
|
118 // remove the entire signons.sqlite file |
|
119 File profile = new File(mProfile); |
|
120 File db = new File(profile, "signons.sqlite"); |
|
121 if (db.delete()) { |
|
122 mAsserter.dumpLog("tearDown deleted "+db.toString()); |
|
123 } else { |
|
124 mAsserter.dumpLog("tearDown did not delete "+db.toString()); |
|
125 } |
|
126 |
|
127 super.tearDown(); |
|
128 } |
|
129 } |