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 @@ + + + + + + + + + + + + + + + + + + + + \ 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 @@ - - - - - - - - + android:layout_height="fill_parent" + android:orientation="vertical"> + android:layout_height="wrap_content" + android:background="@drawable/rectangle" + android:orientation="horizontal"> - + + - - - - - + + + + + + + + + + + + + + + - \ No newline at end of file + + + \ 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 @@ + + + + + android:orderInCategory="100"/> 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 @@ - \ No newline at end of file