From 3d01e9e05852868d52f34610490de5a4ac11568a Mon Sep 17 00:00:00 2001 From: peli0101 Date: Thu, 15 Jan 2009 19:15:33 +0000 Subject: [PATCH] Initial import of Android Password Safe under the new name OI Safe. Original location: Revision 98 of android-passwordsafe at Google Code from the branch "service": http://code.google.com/p/android-passwordsafe/source/browse/?r=98#svn/branches/service The namespace has been changed from com.bitsetters.android.passwordsafe to org.openintents.safe. git-svn-id: http://openintents.googlecode.com/svn/trunk/Safe@1724 72b678ce-9140-0410-bee8-679b907dd61a --- .classpath | 6 + .project | 33 + AUTHORS | 4 + AndroidManifest.xml | 61 ++ CHANGELOG | 27 + NOTES | 21 + README | 35 + assets/help.html | 163 +++ res/anim/cycle_7.xml | 22 + res/anim/shake.xml | 23 + res/drawable/passicon.png | Bin 0 -> 4696 bytes res/layout-land/front_door.xml | 87 ++ res/layout/cat_edit.xml | 45 + res/layout/cat_list.xml | 35 + res/layout/chg_pass.xml | 75 ++ res/layout/front_door.xml | 81 ++ res/layout/help.xml | 34 + res/layout/log_off.xml | 82 ++ res/layout/pass_edit.xml | 98 ++ res/layout/pass_gen.xml | 103 ++ res/layout/pass_list.xml | 35 + res/layout/pass_row.xml | 34 + res/layout/restore.xml | 51 + res/values/arrays.xml | 36 + res/values/colors.xml | 24 + res/values/strings.xml | 129 +++ res/xml/preferences.xml | 40 + .../openintents/intents/CryptoIntents.java | 131 +++ src/org/openintents/safe/AskPassword.java | 234 +++++ src/org/openintents/safe/Backup.java | 135 +++ src/org/openintents/safe/CSVReader.java | 251 +++++ src/org/openintents/safe/CSVWriter.java | 413 ++++++++ src/org/openintents/safe/CategoryEdit.java | 162 +++ src/org/openintents/safe/CategoryEntry.java | 26 + src/org/openintents/safe/CategoryList.java | 974 ++++++++++++++++++ src/org/openintents/safe/ChangePass.java | 379 +++++++ src/org/openintents/safe/CryptoHelper.java | 316 ++++++ .../safe/CryptoHelperException.java | 30 + src/org/openintents/safe/DBHelper.java | 682 ++++++++++++ src/org/openintents/safe/FrontDoor.java | 408 ++++++++ src/org/openintents/safe/Help.java | 112 ++ src/org/openintents/safe/LogOffActivity.java | 56 + src/org/openintents/safe/PassEdit.java | 331 ++++++ src/org/openintents/safe/PassEntry.java | 45 + src/org/openintents/safe/PassGen.java | 207 ++++ src/org/openintents/safe/PassList.java | 417 ++++++++ src/org/openintents/safe/Preferences.java | 16 + src/org/openintents/safe/Restore.java | 292 ++++++ src/org/openintents/safe/RestoreDataSet.java | 129 +++ src/org/openintents/safe/RestoreHandler.java | 178 ++++ .../safe/service/ServiceDispatch.aidl | 25 + .../safe/service/ServiceDispatchImpl.java | 137 +++ .../safe/service/ServiceNotification.java | 70 ++ tests/NOTES | 8 + tests/passwordsafe-test1.csv | 78 ++ tests/passwordsafe-test2.csv | 78 ++ tests/passwordsafe-test3.csv | 349 +++++++ tests/passwordsafe-test4.csv | 78 ++ tests/passwordsafe-test5.csv | 372 +++++++ tests/passwordsafe-test6.csv | 7 + 60 files changed, 8510 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 AUTHORS create mode 100644 AndroidManifest.xml create mode 100644 CHANGELOG create mode 100644 NOTES create mode 100644 README create mode 100644 assets/help.html create mode 100644 res/anim/cycle_7.xml create mode 100644 res/anim/shake.xml create mode 100644 res/drawable/passicon.png create mode 100644 res/layout-land/front_door.xml create mode 100644 res/layout/cat_edit.xml create mode 100644 res/layout/cat_list.xml create mode 100644 res/layout/chg_pass.xml create mode 100644 res/layout/front_door.xml create mode 100644 res/layout/help.xml create mode 100644 res/layout/log_off.xml create mode 100644 res/layout/pass_edit.xml create mode 100644 res/layout/pass_gen.xml create mode 100644 res/layout/pass_list.xml create mode 100644 res/layout/pass_row.xml create mode 100644 res/layout/restore.xml create mode 100644 res/values/arrays.xml create mode 100644 res/values/colors.xml create mode 100644 res/values/strings.xml create mode 100644 res/xml/preferences.xml create mode 100644 src/org/openintents/intents/CryptoIntents.java create mode 100644 src/org/openintents/safe/AskPassword.java create mode 100644 src/org/openintents/safe/Backup.java create mode 100644 src/org/openintents/safe/CSVReader.java create mode 100644 src/org/openintents/safe/CSVWriter.java create mode 100644 src/org/openintents/safe/CategoryEdit.java create mode 100644 src/org/openintents/safe/CategoryEntry.java create mode 100644 src/org/openintents/safe/CategoryList.java create mode 100644 src/org/openintents/safe/ChangePass.java create mode 100644 src/org/openintents/safe/CryptoHelper.java create mode 100644 src/org/openintents/safe/CryptoHelperException.java create mode 100644 src/org/openintents/safe/DBHelper.java create mode 100644 src/org/openintents/safe/FrontDoor.java create mode 100644 src/org/openintents/safe/Help.java create mode 100644 src/org/openintents/safe/LogOffActivity.java create mode 100644 src/org/openintents/safe/PassEdit.java create mode 100644 src/org/openintents/safe/PassEntry.java create mode 100644 src/org/openintents/safe/PassGen.java create mode 100644 src/org/openintents/safe/PassList.java create mode 100644 src/org/openintents/safe/Preferences.java create mode 100644 src/org/openintents/safe/Restore.java create mode 100644 src/org/openintents/safe/RestoreDataSet.java create mode 100644 src/org/openintents/safe/RestoreHandler.java create mode 100644 src/org/openintents/safe/service/ServiceDispatch.aidl create mode 100644 src/org/openintents/safe/service/ServiceDispatchImpl.java create mode 100644 src/org/openintents/safe/service/ServiceNotification.java create mode 100644 tests/NOTES create mode 100644 tests/passwordsafe-test1.csv create mode 100644 tests/passwordsafe-test2.csv create mode 100644 tests/passwordsafe-test3.csv create mode 100644 tests/passwordsafe-test4.csv create mode 100644 tests/passwordsafe-test5.csv create mode 100644 tests/passwordsafe-test6.csv diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..ef7c361 --- /dev/null +++ b/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..9673fe4 --- /dev/null +++ b/.project @@ -0,0 +1,33 @@ + + + OI Safe + + + + + + com.android.ide.eclipse.adt.ResourceManagerBuilder + + + + + com.android.ide.eclipse.adt.PreCompilerBuilder + + + + + org.eclipse.jdt.core.javabuilder + + + + + com.android.ide.eclipse.adt.ApkBuilder + + + + + + com.android.ide.eclipse.adt.AndroidNature + org.eclipse.jdt.core.javanature + + diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..bb4e305 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,4 @@ +Steven Osborn - http://steven.bitsetters.com +Randy McEoin +Isaac Potoczny-Jones +Peli diff --git a/AndroidManifest.xml b/AndroidManifest.xml new file mode 100644 index 0000000..a8aef3b --- /dev/null +++ b/AndroidManifest.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..89113ab --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,27 @@ +0.1.0 [Nov 20, 2007] - Initial release of Password Safe +0.2.0 [Sept 4, 2008] - Updated to work with Android 0.9 thanks to Randy McEoin +0.2.1 [Sept 5, 2008] - Fixed delete, fixed bug where new entries wouldn't show + up immediately. +0.2.2 [Sept 16, 2008] - Added categories and export to CSV. +0.2.3 [Oct 21, 2008] - Assorted bug fixes. Bumped database to version 2. + Initial Market Version. +0.3.0 [Nov 2, 2008] - Improved Import/Export, Help Screen, + [I7] Password Generator, + [I10] Fixed issue where initial screen ate back button + [I13] Fixed issue with passwords/categories not being saved after orientation change + Made Delete menu option disabled on list views if there is no item selected + Launching browser from password edit screen copies password to clip board +0.4.0 [Nov 15, 2008] + [I14] Added the ChangePass activity allowing user to change the + password used to unlock the app and encrypt the data + [I19] User is not prompted before deleting a password + [I20] During import a progress dialog is displayed +0.5.0 [Nov 22, 2008] + [I23] Added the ability for an encrypted backup/restore + [I24] Offer a ContextMenu on CategoryList when user long presses + [I25] Fixed crashing when user hits Go on an invalid URL in PassEdit +0.6.0 [Dec 18, 2008] + Changed encryption method to use a generated master key. User provides + a master password that decrypts the master key. The master key is used + to encrypt/decrypt the password entries. + Database is now version 3. No upgrade path provided, user must export/import. diff --git a/NOTES b/NOTES new file mode 100644 index 0000000..7e805d4 --- /dev/null +++ b/NOTES @@ -0,0 +1,21 @@ + +To grab the database to work with it locally:: + +adb pull /data/data/com.bitsetters.android.passwordsafe/databases/passwordsafe . + + +Then to open it with sqlite3:: + +sqlite3 passwordsafe + +To delete the database and force a clean start:: + +adb shell rm /data/data/com.bitsetters.android.passwordsafe/databases/passwordsafe + +To uninstall the application completely:: + +adb uninstall com.bitsetters.android.passwordsafe + +To make the keyword Id update:: + +svn propset svn:keywords Id src/com/bitsetters/android/passwordsafe/filename.java diff --git a/README b/README new file mode 100644 index 0000000..2b91eb1 --- /dev/null +++ b/README @@ -0,0 +1,35 @@ +LEGAL +------------------------------------------------------------------------------ +Key Icon is Copyright David Vignoni, http://www.icon-king.com/ and licensed +under the GNU LGPL V2.1 http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + +ALL OTHER SOURCE CODE AND CONTENT: + +Copyright 2007, Steven Osborn - http://steven.bitsetters.com and +Randy McEoin + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + +------------------------------------------------------------------------------ + +Features planned for version 1.0 +------------------------------------------------------------------------------ +* Store username, password, site name, notes +* Encrypt all data using password based encryption +* A way to launch url in browser from password safe + +Ideas for future versions: +------------------------------------------------------------------------------ +* Favicon fetching and display +* Customizeable encryption levels +* Browser plugin \ No newline at end of file diff --git a/assets/help.html b/assets/help.html new file mode 100644 index 0000000..1c4314a --- /dev/null +++ b/assets/help.html @@ -0,0 +1,163 @@ + + + + + +

Help

+ +

Categories

+ +

Categories are used to contain passwords. You might have one for Work and + one for Personal. This helps keep your passwords organized.

+ +

Begin by adding one via the Menu. After you've created one, you can touch it + to open that category. Once a category is selected you may then create password entries.

+ + +

Passwords

+ +

After first selecting a category, you may Edit, Add or Delete password entries + from the Password List activity.

+ +

Password entries consist of the following fields:

+ +

+
Description
+
Description is a required field. This is what is shown in the password list.
+ +
Website
+
If appropriate, provide the full URL to the website associated with this entry.
+ +
Username
+
Username for the password, if appropriate.
+ +
Password
+
Finally the password itself.
+ +
Notes
+
Miscellaneous notes about this entry. You may type as much as you want, the field + will expand to accommodate.
+
+ +

Master Password

+ +

When you run Password Safe for the very first time, you are + prompted for a 'Master Password'. This password is + used to encrypt a generated Master Key. The Master Key is in turn + used to encrypt and decrypt all the password entries.

+ +

Each time that you launch Password Safe, the Master Password that + you type is used to decrypt, or unlock, the Master Key. The Master + Key is used to decrypt/encrypt the password entries.

+ +

The Master Key does not change. When you use the 'Change Master Password' + Menu option, you are merely re-encrypting the Master Key with a new + password. The encrypted password entries are untouched, since + they are encrypted with the Master Key.

+ +

Backup and Restore

+ +

You should backup your database of passwords from time to time. To do this + use Menu -> Backup. This will create a file named 'passwordsafe.xml' on + the sdcard. Connect your phone to a computer and allow the USB mounting. + Look for 'passwordsafe.xml' and copy that to a safe location on your computer. + The file is encrypted using the same encryption as the database on your phone.

+ +

Import and Export

+ +

You can import data into Password Safe using CSV files. It is easiest to + create and manage a CSV within a spreadsheet program like Excel or + OpenOffice. Create a file with the following columns in the first row.

+ + + + + + + + + + +
CategoryDescriptionWebsiteUsernamePasswordNotes
+ +

Password Safe import is very sensitive about the first row, + so please specify the first + row exactly like the above list. You may also find it helpful to + put some data into the Password Safe and perform an export first, so + that you can see what the CSV should look like.

+ +

Use the name 'passwordsafe.csv' for your filename. Connect the + phone to your computer and copy 'passwordsafe.csv' onto the phone. + The file must be in the base directory of the phone's USB storage.

+ +

Once the CSV file is in place, use Menu -> Import to import the file. + Be sure that your phone is not connected to your computer as the sdcard + is not allowed to be accessed by both your computer and the phone at + the same time.

+ +

Exporting is a snap. Just use Menu -> Export. This will create the + file 'passwordsafe.csv'. Connect your phone to a computer to retrieve + this file. +

WARNING: The exported file is not encrypted!! + After exporting and working with the file, you should delete it + as soon as possible!

+ +

Security Concerns

+ +

Password Safe was written to safely store your passwords so that nobody can see + them other than you. + The password you use to unlock Password Safe is used to encrypt the data. + Data is stored within a SQLite database within your phone. That database stays + local. It does not get transferred to the Internet. In fact, the application + doesn't have the security privileges to even access the Internet.

+ +

Because Password Safe cannot access the Internet, the data is not + automatically backed up. + In order to backup, you will need to use Menu -> Backup.

+ +

Locking

+ +

Any of the following actions will cause Password Safe to lock:

+ + + +

Really, the easiest way to lock is to just hit the power button on the phone briefly and + turn off the screen.

+ +

Credits

+ +

Authors:

+ +

Key Icon is Copyright David Vignoni, and licensed +under the GNU LGPL V2.1

+ +

More Information

+ +

For further information about this application, please visit the + Android Password Safe + project web page at + http://code.google.com/p/android-passwordsafe.

+ + + \ No newline at end of file diff --git a/res/anim/cycle_7.xml b/res/anim/cycle_7.xml new file mode 100644 index 0000000..dfbfdab --- /dev/null +++ b/res/anim/cycle_7.xml @@ -0,0 +1,22 @@ + + + + \ No newline at end of file diff --git a/res/anim/shake.xml b/res/anim/shake.xml new file mode 100644 index 0000000..c05ab40 --- /dev/null +++ b/res/anim/shake.xml @@ -0,0 +1,23 @@ + + + + \ No newline at end of file diff --git a/res/drawable/passicon.png b/res/drawable/passicon.png new file mode 100644 index 0000000000000000000000000000000000000000..bf8d7e42a18f113dbef30c6945a6dcd03e2103e9 GIT binary patch literal 4696 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 T02J-l5D>UMc-voo + + + + + + + + + + + + + + + + + +