diff options
author | Zeapo <mohamed@zenadi.com> | 2014-08-06 20:35:03 +0100 |
---|---|---|
committer | Zeapo <mohamed@zenadi.com> | 2014-08-06 20:35:03 +0100 |
commit | c3696b2f495425436a42e058e7f50a7229d343cc (patch) | |
tree | 6e01eec78232cbfac7434f299ab65e69782324af | |
parent | 17ba2275ec41432d2999f9dc075299f44cacde7c (diff) |
some refactoring with nicer icons...
-rw-r--r-- | README.md | 38 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/PasswordStore.java | 11 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java | 66 | ||||
-rw-r--r-- | app/src/main/res/drawable-xxhdpi/red_rectangle.xml | 24 | ||||
-rw-r--r-- | app/src/main/res/layout/activity_pwdstore.xml | 2 | ||||
-rw-r--r-- | app/src/main/res/layout/decrypt_layout.xml | 164 | ||||
-rw-r--r-- | app/src/main/res/layout/encrypt_layout.xml | 4 | ||||
-rw-r--r-- | app/src/main/res/menu/pwdstore.xml | 10 | ||||
-rw-r--r-- | app/src/main/res/xml/preference.xml | 3 |
9 files changed, 208 insertions, 114 deletions
diff --git a/README.md b/README.md new file mode 100644 index 00000000..c7781b17 --- /dev/null +++ b/README.md @@ -0,0 +1,38 @@ +PwdStore +======== + +This application tries to be 100% compatible with [pass](http://www.zx2c4.com/projects/password-store/) + +Feautres +======== +- Clone an existing pass repository +- List the passwords +- Handle the directories as categories +- Decrypt the password files (first line is the password, the rest is extra data) +- Add a new password to the current category (or no category if added at the root) + +Libraries +========= +This project uses three libraries: +- [OpenKeyChain](https://github.com/open-keychain/open-keychain) for encryption and decryption of passwords +- [JGit]() a pretty good git lib +- [Apache's FileUtils]() for files manipulations + +TODOs +===== +- Initialize a new pass repository +- Pull from/Push to a pass repository +- Create a new cateogry +- Multi-select (for password deletion) +- Multiple password stores (multiple git repositories). +- More UI enhancements + +Needed +====== +- Icons: the current ones are CC, but would be great to have our own icons +- UI enhancements: any UI changes or suggestions are welcome + + + + + diff --git a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java index 890a76bc..da90e33b 100644 --- a/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java +++ b/app/src/main/java/com/zeapo/pwdstore/PasswordStore.java @@ -80,6 +80,13 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI } return true; + case R.id.menu_add_password: + createPassword(getCurrentFocus()); + break; + + case R.id.menu_add_category: + break; + case R.id.referesh: PasswordFragment plist; if (null != @@ -204,7 +211,6 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI try { Intent intent = new Intent(this, PgpHandler.class); intent.putExtra("PGP-ID", FileUtils.readFileToString(PasswordRepository.getFile("/.gpg-id"))); - intent.putExtra("NAME", "test.gpg"); intent.putExtra("FILE_PATH", this.currentDir.getAbsolutePath()); intent.putExtra("Operation", "ENCRYPT"); // TODO Define different operations here @@ -217,6 +223,7 @@ public class PasswordStore extends Activity implements ToCloneOrNot.OnFragmentI protected void onActivityResult(int requestCode, int resultCode, Intent data) { System.out.println(resultCode); - checkLocalRepository(this.currentDir); + if (resultCode == RESULT_OK) + checkLocalRepository(this.currentDir); } } diff --git a/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java b/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java index fec575ac..8e7cfe65 100644 --- a/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java +++ b/app/src/main/java/com/zeapo/pwdstore/crypto/PgpHandler.java @@ -2,7 +2,9 @@ package com.zeapo.pwdstore.crypto; import android.app.ActionBar; import android.app.Activity; +import android.app.AlertDialog; import android.app.PendingIntent; +import android.content.DialogInterface; import android.content.Intent; import android.content.IntentSender; import android.content.SharedPreferences; @@ -20,7 +22,6 @@ import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; -import android.widget.GridLayout.LayoutParams; import com.zeapo.pwdstore.R; import com.zeapo.pwdstore.UserPreference; @@ -37,7 +38,6 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStream; import java.io.OutputStream; -import java.io.StringReader; import java.io.UnsupportedEncodingException; public class PgpHandler extends Activity { @@ -67,14 +67,9 @@ public class PgpHandler extends Activity { Bundle extra = getIntent().getExtras(); if (extra.getString("Operation").equals("DECRYPT")) { setContentView(R.layout.decrypt_layout); - ((TextView) findViewById(R.id.crypto_password_file)).setText(extra.getString("NAME")); - findViewById(R.id.crypto_show_button).setVisibility(View.VISIBLE); } else if (extra.getString("Operation").equals("ENCRYPT")) { setContentView(R.layout.encrypt_layout); - - ((EditText) findViewById(R.id.crypto_password_edit)).setText(extra.getString("NAME")); - findViewById(R.id.crypto_password_edit_layout).setVisibility(View.VISIBLE); } // some persistance @@ -113,6 +108,7 @@ public class PgpHandler extends Activity { int id = item.getItemId(); switch (id) { case android.R.id.home: + setResult(RESULT_OK); finish(); return true; } @@ -130,6 +126,8 @@ public class PgpHandler extends Activity { case R.id.crypto_cancel_add: finish(); break; + case R.id.crypto_delete_button: + deletePassword(); default: // should not happen @@ -267,7 +265,7 @@ public class PgpHandler extends Activity { showToast(os.toString()); } - setResult(998); + setResult(RESULT_OK); finish(); } catch (Exception e) { Log.e(Constants.TAG, "UnsupportedEncodingException", e); @@ -341,9 +339,20 @@ public class PgpHandler extends Activity { data.putExtra(OpenPgpApi.EXTRA_USER_IDS, new String[] {"default"}); data.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); + String name = ((EditText) findViewById(R.id.crypto_password_file_edit)).getText().toString(); String pass = ((EditText) findViewById(R.id.crypto_password_edit)).getText().toString(); String extra = ((EditText) findViewById(R.id.crypto_extra_edit)).getText().toString(); + if (name.isEmpty()) { + showToast("Please provide a file name"); + return; + } + + if (pass.isEmpty()) { + showToast("You cannot use an empty password or empty extra content"); + return; + } + ByteArrayInputStream is; try { @@ -360,13 +369,26 @@ public class PgpHandler extends Activity { } + private void deletePassword() { + new AlertDialog.Builder(this). + setMessage("Are you sure you want to delete the password " + + getIntent().getExtras().getString("NAME") + ) + .setPositiveButton("YES", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { + (new File(getIntent().getExtras().getString("FILE_PATH"))).delete(); + setResult(RESULT_OK); + finish(); + } + }) + .setNegativeButton("NO", new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialogInterface, int i) { - public void getKeyIds(Intent data) { - data.setAction(OpenPgpApi.ACTION_GET_KEY_IDS); - data.putExtra(OpenPgpApi.EXTRA_USER_IDS, new String[]{getIntent().getExtras().getString("PGP-ID")}); - - OpenPgpApi api = new OpenPgpApi(this, mServiceConnection.getService()); - api.executeApiAsync(data, null, null, new MyCallback(false, null, REQUEST_CODE_GET_KEY_IDS)); + } + }) + .show(); } @Override @@ -383,30 +405,14 @@ public class PgpHandler extends Activity { * interaction, for example selected key ids. */ switch (requestCode) { -// case REQUEST_CODE_SIGN: { -// sign(data); -// break; -// } case REQUEST_CODE_ENCRYPT: { encrypt(data); break; } -// case REQUEST_CODE_SIGN_AND_ENCRYPT: { -// signAndEncrypt(data); -// break; -// } case REQUEST_CODE_DECRYPT_AND_VERIFY: { decryptAndVerify(data); break; } -// case REQUEST_CODE_GET_KEY: { -// getKey(data); -// break; -// } - case REQUEST_CODE_GET_KEY_IDS: { - getKeyIds(data); - break; - } } } } diff --git a/app/src/main/res/drawable-xxhdpi/red_rectangle.xml b/app/src/main/res/drawable-xxhdpi/red_rectangle.xml new file mode 100644 index 00000000..b8e6a5d6 --- /dev/null +++ b/app/src/main/res/drawable-xxhdpi/red_rectangle.xml @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> + +<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> + <item> + <shape android:shape="rectangle" + android:dither="true"> + <corners android:radius="2dp"/> + <solid android:color="#ccc" /> + + </shape> + </item> + + <item android:bottom="2dp"> + <shape android:shape="rectangle" android:dither="true"> + <corners android:radius="2dp" /> + <solid android:color="@android:color/holo_red_light" /> + + <padding android:bottom="8dp" + android:left="8dp" + android:right="8dp" + android:top="8dp" /> + </shape> + </item> +</layer-list>
\ No newline at end of file diff --git a/app/src/main/res/layout/activity_pwdstore.xml b/app/src/main/res/layout/activity_pwdstore.xml index de559be0..08dcf2ad 100644 --- a/app/src/main/res/layout/activity_pwdstore.xml +++ b/app/src/main/res/layout/activity_pwdstore.xml @@ -20,7 +20,7 @@ <ImageButton android:layout_width="wrap_content" android:layout_height="wrap_content" - android:src="@android:drawable/ic_input_add" + android:src="@drawable/ico_add" android:background="@drawable/oval" android:layout_gravity="center_vertical" android:onClick="createPassword" diff --git a/app/src/main/res/layout/decrypt_layout.xml b/app/src/main/res/layout/decrypt_layout.xml index f422c439..b80d3e50 100644 --- a/app/src/main/res/layout/decrypt_layout.xml +++ b/app/src/main/res/layout/decrypt_layout.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" +<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" @@ -11,105 +11,123 @@ android:orientation="vertical" android:background="#eee"> - <GridLayout - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:background="@drawable/rectangle" - android:orientation="horizontal"> - - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textColor="@android:color/holo_orange_dark" - android:text="Large Text" - android:id="@+id/crypto_password_file" - android:layout_gravity="center_vertical" - android:layout_marginLeft="8dp" - android:layout_column="0" - android:layout_row="0"/> - - <ImageButton - android:id="@+id/crypto_show_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:src="@drawable/ic_key" - android:background="@android:drawable/screen_background_light_transparent" - android:layout_gravity="center_vertical" - android:visibility="invisible" - android:onClick="handleClick" - android:layout_column="2" - android:layout_row="0"/> - </GridLayout> - <LinearLayout - android:id="@+id/crypto_container" - android:orientation="vertical" android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:background="@drawable/rectangle" - android:layout_marginTop="@dimen/activity_vertical_margin" - android:visibility="invisible"> + android:layout_height="fill_parent" + android:orientation="vertical"> <GridLayout - android:id="@+id/crypto_password_show_layout" android:layout_width="match_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + android:background="@drawable/rectangle" + android:orientation="horizontal"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textStyle="bold" - android:textColor="@android:color/black" - android:text="Password: " - android:layout_row="0" - android:layout_column="0"/> - <TextView - android:id="@+id/crypto_password_show" + android:textColor="@android:color/holo_orange_dark" + android:text="Large Text" + android:id="@+id/crypto_password_file" + android:layout_gravity="center_vertical" + android:layout_marginLeft="8dp" + android:layout_column="0" + android:layout_row="0"/> + + <ImageButton + android:id="@+id/crypto_show_button" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:typeface="monospace" - android:textColor="@android:color/black" + android:src="@drawable/ico_add" + android:background="@android:drawable/screen_background_light_transparent" + android:layout_gravity="center_vertical" + android:onClick="handleClick" android:layout_column="2" android:layout_row="0"/> - <ProgressBar - android:id="@+id/pbLoading" - android:layout_width="match_parent" - android:layout_height="2dp" - android:layout_marginTop="8dp" - android:layout_marginBottom="8dp" - style="?android:attr/progressBarStyleHorizontal" - android:layout_row="1" - android:layout_column="0" - android:layout_columnSpan="3"/> </GridLayout> <LinearLayout - android:id="@+id/crypto_extra_show_layout" - android:layout_width="match_parent" - android:layout_height="wrap_content" + android:id="@+id/crypto_container" android:orientation="vertical" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:background="@drawable/rectangle" + android:layout_marginTop="@dimen/activity_vertical_margin" android:visibility="invisible"> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:textStyle="bold" - android:textColor="@android:color/black" - android:text="Extra content: "/> - <ScrollView - android:layout_width="wrap_content" + <GridLayout + android:id="@+id/crypto_password_show_layout" + android:layout_width="match_parent" android:layout_height="wrap_content"> + <TextView - android:id="@+id/crypto_extra_show" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:textStyle="bold" + android:textColor="@android:color/black" + android:text="Password: " + android:layout_row="0" + android:layout_column="0"/> + <TextView + android:id="@+id/crypto_password_show" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:typeface="monospace" + android:textColor="@android:color/black" + android:layout_column="2" + android:layout_row="0"/> + + <ProgressBar + android:id="@+id/pbLoading" android:layout_width="match_parent" + android:layout_height="2dp" + android:layout_marginTop="8dp" + android:layout_marginBottom="8dp" + style="?android:attr/progressBarStyleHorizontal" + android:layout_row="1" + android:layout_column="0" + android:layout_columnSpan="3"/> + </GridLayout> + + <LinearLayout + android:id="@+id/crypto_extra_show_layout" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:visibility="invisible"> + + <TextView + android:layout_width="wrap_content" android:layout_height="wrap_content" + android:textStyle="bold" android:textColor="@android:color/black" - android:typeface="monospace"/> - </ScrollView> + android:text="Extra content: "/> + <ScrollView + android:layout_width="wrap_content" + android:layout_height="wrap_content"> + <TextView + android:id="@+id/crypto_extra_show" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:textColor="@android:color/black" + android:typeface="monospace"/> + </ScrollView> + </LinearLayout> </LinearLayout> + </LinearLayout> -</LinearLayout>
\ No newline at end of file + <ImageButton + android:id="@+id/crypto_delete_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:src="@drawable/ico_del" + android:background="@drawable/oval" + android:layout_gravity="center_vertical" + android:onClick="handleClick" + android:layout_alignParentBottom="true" + android:layout_alignParentLeft="true"/> + +</RelativeLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout/encrypt_layout.xml b/app/src/main/res/layout/encrypt_layout.xml index c4949c9a..abc75fe5 100644 --- a/app/src/main/res/layout/encrypt_layout.xml +++ b/app/src/main/res/layout/encrypt_layout.xml @@ -98,7 +98,7 @@ <ImageButton android:layout_height="wrap_content" android:layout_width="wrap_content" - android:src="@android:drawable/ic_input_add" + android:src="@drawable/ico_check" android:background="@drawable/oval" android:id="@+id/crypto_confirm_add" android:onClick="handleClick" @@ -109,7 +109,7 @@ <ImageButton android:layout_height="wrap_content" android:layout_width="wrap_content" - android:src="@android:drawable/ic_delete" + android:src="@drawable/ico_cancel" android:background="@drawable/oval" android:id="@+id/crypto_cancel_add" android:onClick="handleClick" diff --git a/app/src/main/res/menu/pwdstore.xml b/app/src/main/res/menu/pwdstore.xml index c8acb162..c6c4b348 100644 --- a/app/src/main/res/menu/pwdstore.xml +++ b/app/src/main/res/menu/pwdstore.xml @@ -1,6 +1,12 @@ <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context=".pwdstore" > + <item android:id="@+id/menu_add_password" + android:title="New password"/> + + <item android:id="@+id/menu_add_category" + android:title="New category"/> + <item android:id="@+id/referesh" android:title="Refresh" android:showAsAction="ifRoom" @@ -8,8 +14,6 @@ <item android:id="@+id/user_pref" android:title="Settings" - android:orderInCategory="100" - android:showAsAction="ifRoom" - android:icon="@android:drawable/ic_menu_manage"/> + android:orderInCategory="100"/> </menu> diff --git a/app/src/main/res/xml/preference.xml b/app/src/main/res/xml/preference.xml index 402a1bd3..8686dff7 100644 --- a/app/src/main/res/xml/preference.xml +++ b/app/src/main/res/xml/preference.xml @@ -5,8 +5,5 @@ <org.openintents.openpgp.util.OpenPgpListPreference android:key="openpgp_provider_list" android:title="Select OpenPGP Provider!" /> - <Preference - android:key="openpgp_provider_demo" - android:title="OpenPGP Provider Demo" /> </PreferenceCategory> </PreferenceScreen>
\ No newline at end of file |