some refactoring with nicer icons...
This commit is contained in:
parent
17ba2275ec
commit
c3696b2f49
9 changed files with 212 additions and 118 deletions
38
README.md
Normal file
38
README.md
Normal file
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -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);
|
||||
if (resultCode == RESULT_OK)
|
||||
checkLocalRepository(this.currentDir);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
24
app/src/main/res/drawable-xxhdpi/red_rectangle.xml
Normal file
24
app/src/main/res/drawable-xxhdpi/red_rectangle.xml
Normal file
|
@ -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>
|
|
@ -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"
|
||||
|
|
|
@ -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,6 +11,11 @@
|
|||
android:orientation="vertical"
|
||||
android:background="#eee">
|
||||
|
||||
<LinearLayout
|
||||
android:layout_width="fill_parent"
|
||||
android:layout_height="fill_parent"
|
||||
android:orientation="vertical">
|
||||
|
||||
<GridLayout
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
|
@ -32,13 +37,13 @@
|
|||
android:id="@+id/crypto_show_button"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@drawable/ic_key"
|
||||
android:src="@drawable/ico_add"
|
||||
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
|
||||
|
@ -111,5 +116,18 @@
|
|||
</LinearLayout>
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
<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>
|
|
@ -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"
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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>
|
Loading…
Reference in a new issue