working on decrypt and restructering...

This commit is contained in:
Dominik 2012-06-20 14:49:57 +03:00
parent 437ec9c49a
commit e9c01957f4
57 changed files with 1507 additions and 1363 deletions

View File

@ -42,7 +42,7 @@
android:protectionLevel="dangerous" /> android:protectionLevel="dangerous" />
<application <application
android:name="ApgApplication" android:name=".ApgApplication"
android:hardwareAccelerated="true" android:hardwareAccelerated="true"
android:icon="@drawable/icon" android:icon="@drawable/icon"
android:label="@string/app_name" android:label="@string/app_name"
@ -217,9 +217,11 @@
android:configChanges="keyboardHidden|orientation|keyboard" android:configChanges="keyboardHidden|orientation|keyboard"
android:label="@string/title_preferences" /> android:label="@string/title_preferences" />
<activity <activity
android:name=".ui.KeyServerPreferenceActivity" android:name=".ui.PreferencesKeyServerActivity"
android:configChanges="keyboardHidden|orientation|keyboard" android:configChanges="keyboardHidden|orientation|keyboard"
android:label="@string/title_keyServerPreference" /> android:label="@string/title_keyServerPreference"
android:uiOptions="splitActionBarWhenNarrow"
android:windowSoftInputMode="stateHidden" />
<activity <activity
android:name=".ui.SignKeyActivity" android:name=".ui.SignKeyActivity"
android:configChanges="keyboardHidden|orientation|keyboard" android:configChanges="keyboardHidden|orientation|keyboard"
@ -237,7 +239,7 @@
<!-- TODO: need to be moved into new service model --> <!-- TODO: need to be moved into new service model -->
<service <service
android:name=".service.ApgService2" android:name=".deprecated.ApgService2"
android:enabled="true" android:enabled="true"
android:exported="true" android:exported="true"
android:permission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" android:permission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS"
@ -256,7 +258,7 @@
android:authorities="org.thialfihar.android.apg.provider" android:authorities="org.thialfihar.android.apg.provider"
android:readPermission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" /> android:readPermission="org.thialfihar.android.apg.permission.READ_KEY_DETAILS" />
<provider <provider
android:name=".provider.blob.ApgServiceBlobProvider" android:name=".deprecated.ApgServiceBlobProvider"
android:authorities="org.thialfihar.android.apg.provider.apgserviceblobprovider" android:authorities="org.thialfihar.android.apg.provider.apgserviceblobprovider"
android:permission="org.thialfihar.android.apg.permission.STORE_BLOBS" /> android:permission="org.thialfihar.android.apg.permission.STORE_BLOBS" />
</application> </application>

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2010 Thialfihar <thi@thialfihar.org> <!--
Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
@ -14,30 +15,29 @@
limitations under the License. limitations under the License.
--> -->
<LinearLayout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical"> android:orientation="vertical" >
<LinearLayout <LinearLayout
android:id="@+android:id/text_layout" android:id="@+android:id/text_layout"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight" android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center_vertical"> android:orientation="horizontal" >
<RelativeLayout <RelativeLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="6sp"
android:layout_marginLeft="16sp" android:layout_marginLeft="16sp"
android:layout_marginRight="6sp" android:layout_marginRight="6sp"
android:layout_marginTop="6sp" android:layout_marginTop="6sp"
android:layout_marginBottom="6sp"
android:layout_weight="1" android:layout_weight="1"
android:focusable="true" android:background="@android:drawable/menuitem_background"
android:background="@android:drawable/menuitem_background"> android:focusable="true" >
<TextView <TextView
android:id="@+id/title" android:id="@+id/title"
@ -51,65 +51,40 @@
android:id="@+id/summary" android:id="@+id/summary"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@android:id/title"
android:layout_alignLeft="@android:id/title" android:layout_alignLeft="@android:id/title"
android:textAppearance="?android:attr/textAppearanceSmall" android:layout_below="@android:id/title"
android:maxLines="2" /> android:maxLines="2"
android:textAppearance="?android:attr/textAppearanceSmall" />
</RelativeLayout> </RelativeLayout>
<ImageView <ImageView
android:id="@+id/add" android:id="@+id/add"
style="@style/PlusButton"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginLeft="4dip" android:layout_marginLeft="4dip"
android:layout_marginRight="6dip" android:layout_marginRight="6dip"
android:layout_gravity="center_vertical" android:clickable="true" />
android:clickable="true"
style="@style/PlusButton"/>
</LinearLayout> </LinearLayout>
<View <View
android:id="@+id/separator" android:id="@+id/separator"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="1dip" android:layout_height="1dip"
android:background="?android:attr/listDivider"/> android:background="?android:attr/listDivider" />
<ScrollView <ScrollView
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="0dip" android:layout_height="0dip"
android:layout_weight="1" android:layout_weight="1"
android:orientation="vertical"> android:orientation="vertical" >
<LinearLayout <LinearLayout
android:id="@+id/editors" android:id="@+id/editors"
android:layout_width="fill_parent" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical"/> android:orientation="vertical" />
</ScrollView> </ScrollView>
<LinearLayout </LinearLayout>
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
style="@android:style/ButtonBar">
<Button
android:text="@android:string/ok"
android:id="@+id/btn_ok"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<Button
android:text="@android:string/cancel"
android:id="@+id/btn_cancel"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>

View File

@ -8,7 +8,7 @@ And don't add newlines before or after p tags because of transifex -->
<p><a href="https://github.com/dschuermann/apg">https://github.com/dschuermann/apg</a></p> <p><a href="https://github.com/dschuermann/apg">https://github.com/dschuermann/apg</a></p>
<p>Android Privacy Guard (APG) is a OpenPGP implementation for Android.</p> <p>Android Privacy Guard (APG) is a OpenPGP implementation for Android.</p>
<p>License: Apache License v2</p> <p>License: Apache License v2</p>
<p>Developer: Thialfihar (Main developer), Senecaso (QRCode, sign key, upload key), Markus Doits (AIDL), Oliver Runge, Dominik Schürmann (Version 2 and up)</p> <p>Developer: Thialfihar (Main developer v1.x), Senecaso (QRCode, sign key, upload key), Markus Doits (AIDL), Oliver Runge, Dominik Schürmann (Developer v2.x)</p>
<h2>Libraries</h2> <h2>Libraries</h2>
<p><a href="http://actionbarsherlock.com/">ActionBarSherlock</a> (Apache License v2) <p><a href="http://actionbarsherlock.com/">ActionBarSherlock</a> (Apache License v2)

View File

@ -26,7 +26,7 @@ public class ApgApplication extends Application {
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
/** Start passphrase cache service */ /* Start passphrase cache service */
PassphraseCacheService.startCacheService(this); PassphraseCacheService.startCacheService(this);
} }

View File

@ -27,8 +27,6 @@ public final class Constants {
} }
public static final class pref { public static final class pref {
public static final String HAS_SEEN_HELP = "seenHelp";
public static final String HAS_SEEN_CHANGE_LOG = "seenChangeLogDialog";
public static final String DEFAULT_ENCRYPTION_ALGORITHM = "defaultEncryptionAlgorithm"; public static final String DEFAULT_ENCRYPTION_ALGORITHM = "defaultEncryptionAlgorithm";
public static final String DEFAULT_HASH_ALGORITHM = "defaultHashAlgorithm"; public static final String DEFAULT_HASH_ALGORITHM = "defaultHashAlgorithm";
public static final String DEFAULT_ASCII_ARMOUR = "defaultAsciiArmour"; public static final String DEFAULT_ASCII_ARMOUR = "defaultAsciiArmour";
@ -44,6 +42,7 @@ public final class Constants {
public static final String KEY_SERVERS = "pool.sks-keyservers.net, subkeys.pgp.net, pgp.mit.edu"; public static final String KEY_SERVERS = "pool.sks-keyservers.net, subkeys.pgp.net, pgp.mit.edu";
} }
// TODO: rework!
public static final class extras { public static final class extras {
public static final String PROGRESS = "progress"; public static final String PROGRESS = "progress";
public static final String PROGRESS_MAX = "max"; public static final String PROGRESS_MAX = "max";

View File

@ -1,99 +0,0 @@
/*
* 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.
*/
package org.thialfihar.android.apg;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Serializable;
import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg.GeneralException;
import android.content.Context;
import android.os.Environment;
public class DataDestination implements Serializable {
private static final long serialVersionUID = -6478075911319320498L;
private String mStreamFilename;
private String mFilename;
private int mMode = Id.mode.undefined;
public DataDestination() {
}
public void setMode(int mode) {
mMode = mode;
}
public void setFilename(String filename) {
mFilename = filename;
}
public String getStreamFilename() {
return mStreamFilename;
}
public OutputStream getOutputStream(Context context) throws Apg.GeneralException,
FileNotFoundException, IOException {
OutputStream out = null;
mStreamFilename = null;
switch (mMode) {
case Id.mode.stream: {
try {
while (true) {
mStreamFilename = Apg.generateRandomString(32);
if (mStreamFilename == null) {
throw new Apg.GeneralException("couldn't generate random file name");
}
context.openFileInput(mStreamFilename).close();
}
} catch (FileNotFoundException e) {
// found a name that isn't used yet
}
out = context.openFileOutput(mStreamFilename, Context.MODE_PRIVATE);
break;
}
case Id.mode.byte_array: {
out = new ByteArrayOutputStream();
break;
}
case Id.mode.file: {
if (mFilename.startsWith(Environment.getExternalStorageDirectory().getAbsolutePath())) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
throw new GeneralException(
context.getString(R.string.error_externalStorageNotReady));
}
}
out = new FileOutputStream(mFilename);
break;
}
default: {
break;
}
}
return out;
}
}

View File

@ -1,137 +0,0 @@
/*
* 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.
*/
package org.thialfihar.android.apg;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg.GeneralException;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
public class DataSource implements Serializable {
private static final long serialVersionUID = 2377217399907415255L;
private Uri mContentUri = null;
private String mText = null;
private byte[] mData = null;
public DataSource() {
}
public void setUri(Uri uri) {
mContentUri = uri;
mText = null;
mData = null;
}
public void setUri(String uri) {
if (uri.startsWith("/")) {
setUri(Uri.parse("file://" + uri));
} else {
setUri(Uri.parse(uri));
}
}
public Uri getUri() {
return mContentUri;
}
public void setText(String text) {
mText = text;
mData = null;
mContentUri = null;
}
public void setData(byte[] data) {
mData = data;
mText = null;
mContentUri = null;
}
public boolean isText() {
return mText != null;
}
public boolean isBinary() {
return mData != null || mContentUri != null;
}
public byte[] getBytes() {
byte[] bytes = null;
if (mData != null) {
bytes = mData;
} else {
bytes = mText.getBytes();
}
return bytes;
}
public InputData getInputData(Context context, boolean withSize) throws GeneralException,
FileNotFoundException, IOException {
InputStream in = null;
long size = 0;
if (mContentUri != null) {
if (mContentUri.getScheme().equals("file")) {
// get the rest after "file://"
String path = Uri.decode(mContentUri.toString().substring(7));
if (path.startsWith(Environment.getExternalStorageDirectory().getAbsolutePath())) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
throw new GeneralException(
context.getString(R.string.error_externalStorageNotReady));
}
}
in = new FileInputStream(path);
File file = new File(path);
if (withSize) {
size = file.length();
}
} else {
in = context.getContentResolver().openInputStream(mContentUri);
if (withSize) {
InputStream tmp = context.getContentResolver().openInputStream(mContentUri);
size = Apg.getLengthOfStream(tmp);
tmp.close();
}
}
} else if (mText != null || mData != null) {
byte[] bytes = null;
if (mData != null) {
bytes = mData;
} else {
bytes = mText.getBytes();
}
in = new ByteArrayInputStream(bytes);
if (withSize) {
size = bytes.length;
}
}
return new InputData(in, size);
}
}

View File

@ -1,138 +0,0 @@
/*
* Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
*
* 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.
*/
package org.thialfihar.android.apg;
import org.thialfihar.android.apg.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;
/**
*
*
* SHOUDL BE DELTED, DileDialogFragment is the new implementation
*
*
* @author ds1
*
*/
public class FileDialog {
private static EditText mFilename;
private static ImageButton mBrowse;
private static CheckBox mCheckBox;
private static Activity mActivity;
private static int mRequestCode;
public static interface OnClickListener {
public void onCancelClick();
public void onOkClick(String filename, boolean checkbox);
}
public static AlertDialog build(Activity activity, String title, String message,
String defaultFile, OnClickListener onClickListener, String fileManagerTitle,
String fileManagerButton, String checkboxText, int requestCode) {
// TODO: fileManagerTitle and fileManagerButton are deprecated, no use for them right now,
// but maybe the Intent now used will someday support them again, so leaving them in
LayoutInflater inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
AlertDialog.Builder alert = new AlertDialog.Builder(activity);
alert.setTitle(title);
alert.setMessage(message);
View view = inflater.inflate(R.layout.file_dialog, null);
mActivity = activity;
mFilename = (EditText) view.findViewById(R.id.input);
mFilename.setText(defaultFile);
mBrowse = (ImageButton) view.findViewById(R.id.btn_browse);
mBrowse.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
openFile();
}
});
mRequestCode = requestCode;
mCheckBox = (CheckBox) view.findViewById(R.id.checkbox);
if (checkboxText == null) {
mCheckBox.setEnabled(false);
mCheckBox.setVisibility(View.GONE);
} else {
mCheckBox.setEnabled(true);
mCheckBox.setVisibility(View.VISIBLE);
mCheckBox.setText(checkboxText);
}
alert.setView(view);
final OnClickListener clickListener = onClickListener;
alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
boolean checked = false;
if (mCheckBox.isEnabled()) {
checked = mCheckBox.isChecked();
}
clickListener.onOkClick(mFilename.getText().toString(), checked);
}
});
alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
clickListener.onCancelClick();
}
});
return alert.create();
}
public static void setFilename(String filename) {
if (mFilename != null) {
mFilename.setText(filename);
}
}
/**
* Opens the file manager to select a file to open.
*/
private static void openFile() {
String filename = mFilename.getText().toString();
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setData(Uri.parse("file://" + filename));
intent.setType("text/plain"); // only .asc or .gpg files
try {
mActivity.startActivityForResult(intent, mRequestCode);
} catch (ActivityNotFoundException e) {
// No compatible file manager was found.
Toast.makeText(mActivity, R.string.noFilemanagerInstalled, Toast.LENGTH_SHORT).show();
}
}
}

View File

@ -1,4 +1,6 @@
/* /*
* Copyright (C) 2011 Senecaso
*
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -42,6 +44,7 @@ import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair; import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.thialfihar.android.apg.helper.PGPHelper;
import android.text.Html; import android.text.Html;
@ -178,8 +181,8 @@ public class HkpKeyServer extends KeyServer {
KeyInfo info = new KeyInfo(); KeyInfo info = new KeyInfo();
info.size = Integer.parseInt(matcher.group(1)); info.size = Integer.parseInt(matcher.group(1));
info.algorithm = matcher.group(2); info.algorithm = matcher.group(2);
info.keyId = Apg.keyFromHex(matcher.group(3)); info.keyId = PGPHelper.keyFromHex(matcher.group(3));
info.fingerPrint = Apg.getSmallFingerPrint(info.keyId); info.fingerPrint = PGPHelper.getSmallFingerPrint(info.keyId);
String chunks[] = matcher.group(4).split("-"); String chunks[] = matcher.group(4).split("-");
info.date = new GregorianCalendar(Integer.parseInt(chunks[0]), info.date = new GregorianCalendar(Integer.parseInt(chunks[0]),
Integer.parseInt(chunks[1]), Integer.parseInt(chunks[2])).getTime(); Integer.parseInt(chunks[1]), Integer.parseInt(chunks[2])).getTime();
@ -210,7 +213,7 @@ public class HkpKeyServer extends KeyServer {
HttpClient client = new DefaultHttpClient(); HttpClient client = new DefaultHttpClient();
try { try {
HttpGet get = new HttpGet("http://" + mHost + ":" + mPort HttpGet get = new HttpGet("http://" + mHost + ":" + mPort
+ "/pks/lookup?op=get&search=0x" + Apg.keyToHex(keyId)); + "/pks/lookup?op=get&search=0x" + PGPHelper.keyToHex(keyId));
HttpResponse response = client.execute(get); HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
@ -220,7 +223,7 @@ public class HkpKeyServer extends KeyServer {
HttpEntity entity = response.getEntity(); HttpEntity entity = response.getEntity();
InputStream is = entity.getContent(); InputStream is = entity.getContent();
String data = readAll(is, EntityUtils.getContentCharSet(entity)); String data = readAll(is, EntityUtils.getContentCharSet(entity));
Matcher matcher = Apg.PGP_PUBLIC_KEY.matcher(data); Matcher matcher = PGPHelper.PGP_PUBLIC_KEY.matcher(data);
if (matcher.find()) { if (matcher.find()) {
return matcher.group(1); return matcher.group(1);
} }
@ -234,7 +237,7 @@ public class HkpKeyServer extends KeyServer {
} }
@Override @Override
void add(String armouredText) throws AddKeyException { public void add(String armouredText) throws AddKeyException {
HttpClient client = new DefaultHttpClient(); HttpClient client = new DefaultHttpClient();
try { try {
HttpPost post = new HttpPost("http://" + mHost + ":" + mPort + "/pks/add"); HttpPost post = new HttpPost("http://" + mHost + ":" + mPort + "/pks/add");

View File

@ -18,6 +18,13 @@ package org.thialfihar.android.apg;
import org.spongycastle.bcpg.CompressionAlgorithmTags; import org.spongycastle.bcpg.CompressionAlgorithmTags;
/**
*
* TODO:
*
* - refactor ids, some are not needed and can be done with xml
*
*/
public final class Id { public final class Id {
public static final String TAG = "APG"; public static final String TAG = "APG";
@ -83,7 +90,7 @@ public final class Id {
// public static final int query_done = 0x21070010; // public static final int query_done = 0x21070010;
// public static final int unknown_signature_key = 0x21070011; // public static final int unknown_signature_key = 0x21070011;
// } // }
// use only lower 16 bits due to compatibility lib // use only lower 16 bits due to compatibility lib
public static final class request { public static final class request {
public static final int public_keys = 0x00007001; public static final int public_keys = 0x00007001;
@ -96,18 +103,18 @@ public final class Id {
public static final int import_from_qr_code = 0x00007008; public static final int import_from_qr_code = 0x00007008;
public static final int sign_key = 0x00007009; public static final int sign_key = 0x00007009;
} }
// public static final class request { // public static final class request {
// public static final int public_keys = 0x21070001; // public static final int public_keys = 0x21070001;
// public static final int secret_keys = 0x21070002; // public static final int secret_keys = 0x21070002;
// public static final int filename = 0x21070003; // public static final int filename = 0x21070003;
// public static final int output_filename = 0x21070004; // public static final int output_filename = 0x21070004;
// public static final int key_server_preference = 0x21070005; // public static final int key_server_preference = 0x21070005;
// public static final int look_up_key_id = 0x21070006; // public static final int look_up_key_id = 0x21070006;
// public static final int export_to_server = 0x21070007; // public static final int export_to_server = 0x21070007;
// public static final int import_from_qr_code = 0x21070008; // public static final int import_from_qr_code = 0x21070008;
// public static final int sign_key = 0x21070009; // public static final int sign_key = 0x21070009;
// } // }
public static final class dialog { public static final class dialog {
public static final int pass_phrase = 0x21070001; public static final int pass_phrase = 0x21070001;

View File

@ -1,4 +1,6 @@
/* /*
* Copyright (C) 2011 Senecaso
*
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at

View File

@ -1,4 +1,7 @@
/* /*
* Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de>
* Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
*
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -23,8 +26,7 @@ import android.content.SharedPreferences;
import java.util.Vector; import java.util.Vector;
/** /**
* Singelton Implementation of a Preference Helper * Singleton Implementation of a Preference Helper
*
*/ */
public class Preferences { public class Preferences {
private static Preferences mPreferences; private static Preferences mPreferences;

View File

@ -14,10 +14,10 @@
* limitations under the License. * limitations under the License.
*/ */
package org.thialfihar.android.apg.util; package org.thialfihar.android.apg.deprecated;
import org.thialfihar.android.apg.service.IApgService2; import org.thialfihar.android.apg.deprecated.ApgConInterface.OnCallFinishListener;
import org.thialfihar.android.apg.util.ApgConInterface.OnCallFinishListener; import org.thialfihar.android.apg.deprecated.IApgService2;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentResolver; import android.content.ContentResolver;

View File

@ -12,7 +12,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.thialfihar.android.apg.util; package org.thialfihar.android.apg.deprecated;
public interface ApgConInterface { public interface ApgConInterface {
public static interface OnCallFinishListener { public static interface OnCallFinishListener {

View File

@ -12,7 +12,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.thialfihar.android.apg.service; package org.thialfihar.android.apg.deprecated;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
@ -25,19 +25,19 @@ import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.deprecated.IApgService2;
import org.thialfihar.android.apg.service.IApgService2;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.InputData;
import org.thialfihar.android.apg.Preferences; import org.thialfihar.android.apg.Preferences;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.service.IApgService2.Stub; import org.thialfihar.android.apg.deprecated.IApgService2.Stub;
import org.thialfihar.android.apg.Id.database; import org.thialfihar.android.apg.Id.database;
import org.thialfihar.android.apg.R.string; import org.thialfihar.android.apg.R.string;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.passphrase.PassphraseCacheService; import org.thialfihar.android.apg.passphrase.PassphraseCacheService;
import org.thialfihar.android.apg.provider.KeyRings; import org.thialfihar.android.apg.provider.KeyRings;
import org.thialfihar.android.apg.provider.Keys; import org.thialfihar.android.apg.provider.Keys;
import org.thialfihar.android.apg.provider.UserIds; import org.thialfihar.android.apg.provider.UserIds;
import org.thialfihar.android.apg.util.InputData;
import android.content.ContentResolver; import android.content.ContentResolver;
import android.content.Intent; import android.content.Intent;
@ -204,7 +204,7 @@ public class ApgService2 extends PassphraseCacheService {
typeWhere = KeyRings.TABLE_NAME + "." + KeyRings.TYPE + " = ?"; typeWhere = KeyRings.TABLE_NAME + "." + KeyRings.TYPE + " = ?";
typeVal = new String[] { "" + pParams.get("key_type") }; typeVal = new String[] { "" + pParams.get("key_type") };
} }
return qb.query(Apg.getDatabase().db(), (String[]) pParams.get("columns"), typeWhere, return qb.query(PGPHelper.getDatabase().db(), (String[]) pParams.get("columns"), typeWhere,
typeVal, null, null, orderBy); typeVal, null, null, orderBy);
} }
@ -253,7 +253,7 @@ public class ApgService2 extends PassphraseCacheService {
long curMkey = mCursor.getLong(0); long curMkey = mCursor.getLong(0);
String curUser = mCursor.getString(1); String curUser = mCursor.getString(1);
String curFprint = Apg.getSmallFingerPrint(curMkey); String curFprint = PGPHelper.getSmallFingerPrint(curMkey);
if (LOCAL_LOGV) if (LOCAL_LOGV)
Log.v(TAG, "current user: " + curUser + " (" + curFprint + ")"); Log.v(TAG, "current user: " + curUser + " (" + curFprint + ")");
if (pSearchKeys.contains(curFprint) || pSearchKeys.contains(curUser)) { if (pSearchKeys.contains(curFprint) || pSearchKeys.contains(curUser)) {
@ -427,7 +427,7 @@ public class ApgService2 extends PassphraseCacheService {
} }
private boolean prepareArgs(String pCall, Bundle pArgs, Bundle pReturn) { private boolean prepareArgs(String pCall, Bundle pArgs, Bundle pReturn) {
Apg.initialize(getBaseContext()); PGPHelper.initialize(getBaseContext());
/* add default return values for all functions */ /* add default return values for all functions */
addDefaultReturns(pReturn); addDefaultReturns(pReturn);
@ -493,7 +493,7 @@ public class ApgService2 extends PassphraseCacheService {
if (LOCAL_LOGV) if (LOCAL_LOGV)
Log.v(TAG, "About to encrypt"); Log.v(TAG, "About to encrypt");
try { try {
Apg.encrypt(getBaseContext(), // context PGPHelper.encrypt(getBaseContext(), // context
in, // input stream in, // input stream
out, // output stream out, // output stream
pArgs.getBoolean(arg.ARMORED_OUTPUT.name()), // ARMORED_OUTPUT pArgs.getBoolean(arg.ARMORED_OUTPUT.name()), // ARMORED_OUTPUT
@ -569,8 +569,8 @@ public class ApgService2 extends PassphraseCacheService {
ArrayList<String> ids = new ArrayList<String>(); ArrayList<String> ids = new ArrayList<String>();
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
if (LOCAL_LOGV) if (LOCAL_LOGV)
Log.v(TAG, "adding key " + Apg.getSmallFingerPrint(cursor.getLong(0))); Log.v(TAG, "adding key " + PGPHelper.getSmallFingerPrint(cursor.getLong(0)));
fPrints.add(Apg.getSmallFingerPrint(cursor.getLong(0))); fPrints.add(PGPHelper.getSmallFingerPrint(cursor.getLong(0)));
ids.add(cursor.getString(1)); ids.add(cursor.getString(1));
} }
cursor.close(); cursor.close();
@ -625,7 +625,7 @@ public class ApgService2 extends PassphraseCacheService {
if (LOCAL_LOGV) if (LOCAL_LOGV)
Log.v(TAG, "About to decrypt"); Log.v(TAG, "About to decrypt");
try { try {
Apg.decrypt(getBaseContext(), in, out, passphrase, null, // progress PGPHelper.decrypt(getBaseContext(), in, out, passphrase, null, // progress
pArgs.getString(arg.SYMMETRIC_PASSPHRASE.name()) != null // symmetric pArgs.getString(arg.SYMMETRIC_PASSPHRASE.name()) != null // symmetric
); );
} catch (Exception e) { } catch (Exception e) {

View File

@ -12,9 +12,8 @@
* limitations under the License. * limitations under the License.
*/ */
package org.thialfihar.android.apg.provider.blob; package org.thialfihar.android.apg.deprecated;
import org.thialfihar.android.apg.service.ApgService2;
import android.content.ContentUris; import android.content.ContentUris;
import android.content.ContentValues; import android.content.ContentValues;

View File

@ -12,10 +12,9 @@
* limitations under the License. * limitations under the License.
*/ */
package org.thialfihar.android.apg.provider.blob; package org.thialfihar.android.apg.deprecated;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.service.ApgService2;
import android.content.ContentProvider; import android.content.ContentProvider;
import android.content.ContentValues; import android.content.ContentValues;

View File

@ -1,3 +1,4 @@
package org.thialfihar.android.apg.deprecated;
//package org.thialfihar.android.apg.provider.blob; //package org.thialfihar.android.apg.provider.blob;
// //
//import android.net.Uri; //import android.net.Uri;

View File

@ -1,4 +1,4 @@
package org.thialfihar.android.apg.service; package org.thialfihar.android.apg.deprecated;
interface IApgService2 { interface IApgService2 {

View File

@ -0,0 +1,57 @@
package org.thialfihar.android.apg.helper;
import org.thialfihar.android.apg.R;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Environment;
import android.widget.Toast;
public class FileHelper {
/**
* Checks if external storage is mounted if file is located on external storage
*
* @param file
* @return true if storage is mounted
*/
public static boolean isStorageMounted(String file) {
if (file.startsWith(Environment.getExternalStorageDirectory().getAbsolutePath())) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
return false;
}
}
return true;
}
/**
* Opens the preferred installed file manager on Android and shows a toast if no manager is
* installed.
*
* @param activity
* @param filename
* default selected file, not supported by all file managers
* @param type
* can be text/plain for example
* @param requestCode
* requestCode used to identify the result coming back from file manager to
* onActivityResult() in your activity
*/
public static void openFile(Activity activity, String filename, String type, int requestCode) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setData(Uri.parse("file://" + filename));
intent.setType(type);
try {
activity.startActivityForResult(intent, requestCode);
} catch (ActivityNotFoundException e) {
// No compatible file manager was found.
Toast.makeText(activity, R.string.noFilemanagerInstalled, Toast.LENGTH_SHORT).show();
}
}
}

View File

@ -0,0 +1,74 @@
/*
* Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de>
*
* 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.
*/
package org.thialfihar.android.apg.helper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.GregorianCalendar;
import android.content.Context;
public class OtherHelper {
/**
* Reads html files from /res/raw/example.html to output them as string. See
* http://www.monocube.com/2011/02/08/android-tutorial-html-file-in-webview/
*
* @param context
* current context
* @param resourceID
* of html file to read
* @return content of html file with formatting
*/
public static String readContentFromResource(Context context, int resourceID) {
InputStream raw = context.getResources().openRawResource(resourceID);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
int i;
try {
i = raw.read();
while (i != -1) {
stream.write(i);
i = raw.read();
}
raw.close();
} catch (IOException e) {
e.printStackTrace();
}
return stream.toString();
}
/**
* Return the number if days between two dates
*
* @param first
* @param second
* @return number of days
*/
public static long getNumDaysBetween(GregorianCalendar first, GregorianCalendar second) {
GregorianCalendar tmp = new GregorianCalendar();
tmp.setTime(first.getTime());
long numDays = (second.getTimeInMillis() - first.getTimeInMillis()) / 1000 / 86400;
tmp.add(Calendar.DAY_OF_MONTH, (int) numDays);
while (tmp.before(second)) {
tmp.add(Calendar.DAY_OF_MONTH, 1);
++numDays;
}
return numDays;
}
}

View File

@ -14,14 +14,11 @@
* limitations under the License. * limitations under the License.
*/ */
package org.thialfihar.android.apg.util; package org.thialfihar.android.apg.helper;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Iterator; import java.util.Iterator;
import java.util.Vector; import java.util.Vector;
@ -29,82 +26,10 @@ import org.spongycastle.openpgp.PGPObjectFactory;
import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.R;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.util.Log; import android.util.Log;
import android.widget.Toast;
public class Utils {
/**
* Opens the file manager to select a file to open.
*/
public static void openFile(Activity activity, String filename, String type, int requestCode) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.setData(Uri.parse("file://" + filename));
intent.setType(type);
try {
activity.startActivityForResult(intent, requestCode);
} catch (ActivityNotFoundException e) {
// No compatible file manager was found.
Toast.makeText(activity, R.string.noFilemanagerInstalled, Toast.LENGTH_SHORT).show();
}
}
/**
* Reads html files from /res/raw/example.html to output them as string. See
* http://www.monocube.com/2011/02/08/android-tutorial-html-file-in-webview/
*
* @param context
* current context
* @param resourceID
* of html file to read
* @return content of html file with formatting
*/
public static String readContentFromResource(Context context, int resourceID) {
InputStream raw = context.getResources().openRawResource(resourceID);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
int i;
try {
i = raw.read();
while (i != -1) {
stream.write(i);
i = raw.read();
}
raw.close();
} catch (IOException e) {
e.printStackTrace();
}
return stream.toString();
}
/**
* Return the number if days between two dates
*
* @param first
* @param second
* @return number of days
*/
public static long getNumDaysBetween(GregorianCalendar first, GregorianCalendar second) {
GregorianCalendar tmp = new GregorianCalendar();
tmp.setTime(first.getTime());
long numDays = (second.getTimeInMillis() - first.getTimeInMillis()) / 1000 / 86400;
tmp.add(Calendar.DAY_OF_MONTH, (int) numDays);
while (tmp.before(second)) {
tmp.add(Calendar.DAY_OF_MONTH, 1);
++numDays;
}
return numDays;
}
public class PGPConversionHelper {
/** /**
* Converts Vector<PGPSecretKey> to a byte[] array to send it by intent to service * Converts Vector<PGPSecretKey> to a byte[] array to send it by intent to service
* *
@ -185,5 +110,4 @@ public class Utils {
return null; return null;
} }
} }
} }

View File

@ -1,4 +1,5 @@
/* /*
* Copyright (C) 2012 Dominik Schürmann <dominik@dominikschuermann.de>
* Copyright (C) 2010 Thialfihar <thi@thialfihar.org> * Copyright (C) 2010 Thialfihar <thi@thialfihar.org>
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
@ -14,7 +15,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.thialfihar.android.apg; package org.thialfihar.android.apg.helper;
import org.spongycastle.bcpg.ArmoredInputStream; import org.spongycastle.bcpg.ArmoredInputStream;
import org.spongycastle.bcpg.ArmoredOutputStream; import org.spongycastle.bcpg.ArmoredOutputStream;
@ -62,20 +63,37 @@ import org.spongycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBu
import org.spongycastle.openpgp.operator.jcajce.JcaPGPKeyPair; import org.spongycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder;
import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyEncryptorBuilder; import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyEncryptorBuilder;
import org.thialfihar.android.apg.Id.choice;
import org.thialfihar.android.apg.Id.content;
import org.thialfihar.android.apg.Id.database;
import org.thialfihar.android.apg.Id.key;
import org.thialfihar.android.apg.Id.return_value; import org.thialfihar.android.apg.Id.return_value;
import org.thialfihar.android.apg.Id.type;
import org.thialfihar.android.apg.Id.choice.algorithm;
import org.thialfihar.android.apg.Id.choice.compression;
import org.thialfihar.android.apg.Id.choice.usage;
import org.thialfihar.android.apg.KeyServer.AddKeyException; import org.thialfihar.android.apg.KeyServer.AddKeyException;
import org.thialfihar.android.apg.R.string;
import org.thialfihar.android.apg.passphrase.CachedPassPhrase; import org.thialfihar.android.apg.passphrase.CachedPassPhrase;
import org.thialfihar.android.apg.provider.DataProvider; import org.thialfihar.android.apg.provider.DataProvider;
import org.thialfihar.android.apg.provider.Database; import org.thialfihar.android.apg.provider.Database;
import org.thialfihar.android.apg.provider.KeyRings; import org.thialfihar.android.apg.provider.KeyRings;
import org.thialfihar.android.apg.provider.Keys; import org.thialfihar.android.apg.provider.Keys;
import org.thialfihar.android.apg.provider.UserIds; import org.thialfihar.android.apg.provider.UserIds;
import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.ui.BaseActivity; import org.thialfihar.android.apg.ui.BaseActivity;
import org.thialfihar.android.apg.ui.widget.KeyEditor; import org.thialfihar.android.apg.ui.widget.KeyEditor;
import org.thialfihar.android.apg.ui.widget.SectionView; import org.thialfihar.android.apg.ui.widget.SectionView;
import org.thialfihar.android.apg.ui.widget.UserIdEditor; import org.thialfihar.android.apg.ui.widget.UserIdEditor;
import org.thialfihar.android.apg.util.InputData;
import org.thialfihar.android.apg.util.IterableIterator; import org.thialfihar.android.apg.util.IterableIterator;
import org.thialfihar.android.apg.util.Utils; import org.thialfihar.android.apg.util.PositionAwareInputStream;
import org.thialfihar.android.apg.util.Primes;
import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.HkpKeyServer;
import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.KeyServer;
import org.thialfihar.android.apg.ProgressDialogUpdater;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import android.app.Activity; import android.app.Activity;
@ -122,7 +140,15 @@ import java.util.Map;
import java.util.Vector; import java.util.Vector;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public class Apg { /**
* TODO:
*
* - Externalize the constants
*
* - Separate this file into different helpers
*
*/
public class PGPHelper {
static { static {
// register spongy castle provider // register spongy castle provider
@ -161,13 +187,9 @@ public class Apg {
public static final String EXTRA_ENCRYPTED_MESSAGE = "encryptedMessage"; public static final String EXTRA_ENCRYPTED_MESSAGE = "encryptedMessage";
public static final String EXTRA_ENCRYPTED_DATA = "encryptedData"; public static final String EXTRA_ENCRYPTED_DATA = "encryptedData";
public static final String EXTRA_RESULT_URI = "resultUri"; public static final String EXTRA_RESULT_URI = "resultUri";
public static final String EXTRA_SIGNATURE = "signature";
public static final String EXTRA_SIGNATURE_KEY_ID = "signatureKeyId";
public static final String EXTRA_SIGNATURE_USER_ID = "signatureUserId";
public static final String EXTRA_SIGNATURE_SUCCESS = "signatureSuccess";
public static final String EXTRA_SIGNATURE_UNKNOWN = "signatureUnknown";
public static final String EXTRA_SIGNATURE_DATA = "signatureData"; public static final String EXTRA_SIGNATURE_DATA = "signatureData";
public static final String EXTRA_SIGNATURE_TEXT = "signatureText"; public static final String EXTRA_SIGNATURE_TEXT = "signatureText";
public static final String EXTRA_SIGNATURE_KEY_ID = "signatureKeyId";
public static final String EXTRA_USER_ID = "userId"; public static final String EXTRA_USER_ID = "userId";
public static final String EXTRA_USER_IDS = "userIds"; public static final String EXTRA_USER_IDS = "userIds";
public static final String EXTRA_KEY_ID = "keyId"; public static final String EXTRA_KEY_ID = "keyId";
@ -426,7 +448,7 @@ public class Apg {
public static void buildSecretKey(Context context, ArrayList<String> userIds, public static void buildSecretKey(Context context, ArrayList<String> userIds,
ArrayList<PGPSecretKey> keys, ArrayList<Integer> keysUsages, long masterKeyId, ArrayList<PGPSecretKey> keys, ArrayList<Integer> keysUsages, long masterKeyId,
String oldPassPhrase, String newPassPhrase, ProgressDialogUpdater progress) String oldPassPhrase, String newPassPhrase, ProgressDialogUpdater progress)
throws Apg.GeneralException, NoSuchProviderException, PGPException, throws PGPHelper.GeneralException, NoSuchProviderException, PGPException,
NoSuchAlgorithmException, SignatureException, IOException, Database.GeneralException { NoSuchAlgorithmException, SignatureException, IOException, Database.GeneralException {
if (progress != null) if (progress != null)
@ -1143,9 +1165,9 @@ public class Apg {
} }
public static String getFingerPrint(long keyId) { public static String getFingerPrint(long keyId) {
PGPPublicKey key = Apg.getPublicKey(keyId); PGPPublicKey key = PGPHelper.getPublicKey(keyId);
if (key == null) { if (key == null) {
PGPSecretKey secretKey = Apg.getSecretKey(keyId); PGPSecretKey secretKey = PGPHelper.getSecretKey(keyId);
if (secretKey == null) { if (secretKey == null) {
return ""; return "";
} }
@ -1654,9 +1676,9 @@ public class Apg {
progress.setProgress(R.string.progress_done, 100, 100); progress.setProgress(R.string.progress_done, 100, 100);
} }
public static long getDecryptionKeyId(Context context, InputData data) throws GeneralException, public static long getDecryptionKeyId(Context context, InputStream inputStream)
NoAsymmetricEncryptionException, IOException { throws GeneralException, NoAsymmetricEncryptionException, IOException {
InputStream in = PGPUtil.getDecoderStream(data.getInputStream()); InputStream in = PGPUtil.getDecoderStream(inputStream);
PGPObjectFactory pgpF = new PGPObjectFactory(in); PGPObjectFactory pgpF = new PGPObjectFactory(in);
PGPEncryptedDataList enc; PGPEncryptedDataList enc;
Object o = pgpF.nextObject(); Object o = pgpF.nextObject();
@ -1700,9 +1722,9 @@ public class Apg {
return secretKey.getKeyID(); return secretKey.getKeyID();
} }
public static boolean hasSymmetricEncryption(Context context, InputData data) public static boolean hasSymmetricEncryption(Context context, InputStream inputStream)
throws GeneralException, IOException { throws GeneralException, IOException {
InputStream in = PGPUtil.getDecoderStream(data.getInputStream()); InputStream in = PGPUtil.getDecoderStream(inputStream);
PGPObjectFactory pgpF = new PGPObjectFactory(in); PGPObjectFactory pgpF = new PGPObjectFactory(in);
PGPEncryptedDataList enc; PGPEncryptedDataList enc;
Object o = pgpF.nextObject(); Object o = pgpF.nextObject();
@ -1850,7 +1872,7 @@ public class Apg {
if (dataChunk instanceof PGPOnePassSignatureList) { if (dataChunk instanceof PGPOnePassSignatureList) {
if (progress != null) if (progress != null)
progress.setProgress(R.string.progress_processingSignature, currentProgress, 100); progress.setProgress(R.string.progress_processingSignature, currentProgress, 100);
returnData.putBoolean(EXTRA_SIGNATURE, true); returnData.putBoolean(ApgService.EXTRA_SIGNATURE, true);
PGPOnePassSignatureList sigList = (PGPOnePassSignatureList) dataChunk; PGPOnePassSignatureList sigList = (PGPOnePassSignatureList) dataChunk;
for (int i = 0; i < sigList.size(); ++i) { for (int i = 0; i < sigList.size(); ++i) {
signature = sigList.get(i); signature = sigList.get(i);
@ -1868,17 +1890,17 @@ public class Apg {
if (sigKeyRing != null) { if (sigKeyRing != null) {
userId = getMainUserId(getMasterKey(sigKeyRing)); userId = getMainUserId(getMasterKey(sigKeyRing));
} }
returnData.putString(EXTRA_SIGNATURE_USER_ID, userId); returnData.putString(ApgService.EXTRA_SIGNATURE_USER_ID, userId);
break; break;
} }
} }
returnData.putLong(EXTRA_SIGNATURE_KEY_ID, signatureKeyId); returnData.putLong(ApgService.EXTRA_SIGNATURE_KEY_ID, signatureKeyId);
if (signature != null) { if (signature != null) {
signature.initVerify(signatureKey, new BouncyCastleProvider()); signature.initVerify(signatureKey, new BouncyCastleProvider());
} else { } else {
returnData.putBoolean(EXTRA_SIGNATURE_UNKNOWN, true); returnData.putBoolean(ApgService.EXTRA_SIGNATURE_UNKNOWN, true);
} }
dataChunk = plainFact.nextObject(); dataChunk = plainFact.nextObject();
@ -1915,7 +1937,7 @@ public class Apg {
try { try {
signature.update(buffer, 0, n); signature.update(buffer, 0, n);
} catch (SignatureException e) { } catch (SignatureException e) {
returnData.putBoolean(EXTRA_SIGNATURE_SUCCESS, false); returnData.putBoolean(ApgService.EXTRA_SIGNATURE_SUCCESS, false);
signature = null; signature = null;
} }
} }
@ -1938,9 +1960,9 @@ public class Apg {
PGPSignatureList signatureList = (PGPSignatureList) plainFact.nextObject(); PGPSignatureList signatureList = (PGPSignatureList) plainFact.nextObject();
PGPSignature messageSignature = signatureList.get(signatureIndex); PGPSignature messageSignature = signatureList.get(signatureIndex);
if (signature.verify(messageSignature)) { if (signature.verify(messageSignature)) {
returnData.putBoolean(EXTRA_SIGNATURE_SUCCESS, true); returnData.putBoolean(ApgService.EXTRA_SIGNATURE_SUCCESS, true);
} else { } else {
returnData.putBoolean(EXTRA_SIGNATURE_SUCCESS, false); returnData.putBoolean(ApgService.EXTRA_SIGNATURE_SUCCESS, false);
} }
} }
} }
@ -1963,7 +1985,7 @@ public class Apg {
return returnData; return returnData;
} }
public static Bundle verifyText(BaseActivity context, InputData data, OutputStream outStream, public static Bundle verifyText(Context context, InputData data, OutputStream outStream,
ProgressDialogUpdater progress) throws IOException, GeneralException, PGPException, ProgressDialogUpdater progress) throws IOException, GeneralException, PGPException,
SignatureException { SignatureException {
Bundle returnData = new Bundle(); Bundle returnData = new Bundle();
@ -1995,7 +2017,7 @@ public class Apg {
byte[] clearText = out.toByteArray(); byte[] clearText = out.toByteArray();
outStream.write(clearText); outStream.write(clearText);
returnData.putBoolean(EXTRA_SIGNATURE, true); returnData.putBoolean(ApgService.EXTRA_SIGNATURE, true);
if (progress != null) if (progress != null)
progress.setProgress(R.string.progress_processingSignature, 60, 100); progress.setProgress(R.string.progress_processingSignature, 60, 100);
@ -2015,16 +2037,17 @@ public class Apg {
signatureKeyId = signature.getKeyID(); signatureKeyId = signature.getKeyID();
} }
if (signatureKey == null) { if (signatureKey == null) {
Bundle pauseData = new Bundle(); // TODO: reimplement!
pauseData.putInt(Constants.extras.STATUS, Id.message.unknown_signature_key); // Bundle pauseData = new Bundle();
pauseData.putLong(Constants.extras.KEY_ID, signatureKeyId); // pauseData.putInt(Constants.extras.STATUS, Id.message.unknown_signature_key);
Message msg = new Message(); // pauseData.putLong(Constants.extras.KEY_ID, signatureKeyId);
msg.setData(pauseData); // Message msg = new Message();
context.sendMessage(msg); // msg.setData(pauseData);
// pause here // context.sendMessage(msg);
context.getRunningThread().pause(); // // pause here
// see whether the key was found in the meantime // context.getRunningThread().pause();
signatureKey = getPublicKey(signature.getKeyID()); // // see whether the key was found in the meantime
// signatureKey = getPublicKey(signature.getKeyID());
} }
if (signatureKey == null) { if (signatureKey == null) {
@ -2036,15 +2059,15 @@ public class Apg {
if (sigKeyRing != null) { if (sigKeyRing != null) {
userId = getMainUserId(getMasterKey(sigKeyRing)); userId = getMainUserId(getMasterKey(sigKeyRing));
} }
returnData.putString(EXTRA_SIGNATURE_USER_ID, userId); returnData.putString(ApgService.EXTRA_SIGNATURE_USER_ID, userId);
break; break;
} }
} }
returnData.putLong(EXTRA_SIGNATURE_KEY_ID, signatureKeyId); returnData.putLong(ApgService.EXTRA_SIGNATURE_KEY_ID, signatureKeyId);
if (signature == null) { if (signature == null) {
returnData.putBoolean(EXTRA_SIGNATURE_UNKNOWN, true); returnData.putBoolean(ApgService.EXTRA_SIGNATURE_UNKNOWN, true);
if (progress != null) if (progress != null)
progress.setProgress(R.string.progress_done, 100, 100); progress.setProgress(R.string.progress_done, 100, 100);
return returnData; return returnData;
@ -2069,7 +2092,7 @@ public class Apg {
} while (lookAhead != -1); } while (lookAhead != -1);
} }
returnData.putBoolean(EXTRA_SIGNATURE_SUCCESS, signature.verify()); returnData.putBoolean(ApgService.EXTRA_SIGNATURE_SUCCESS, signature.verify());
if (progress != null) if (progress != null)
progress.setProgress(R.string.progress_done, 100, 100); progress.setProgress(R.string.progress_done, 100, 100);

View File

@ -20,9 +20,9 @@ import org.spongycastle.jce.provider.BouncyCastleProvider;
import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.PGPException;
import org.spongycastle.openpgp.PGPPrivateKey; import org.spongycastle.openpgp.PGPPrivateKey;
import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKey;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.helper.PGPHelper;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
@ -55,7 +55,7 @@ public class AskForPassphrase {
secretKey = null; secretKey = null;
alert.setMessage(context.getString(R.string.passPhraseForSymmetricEncryption)); alert.setMessage(context.getString(R.string.passPhraseForSymmetricEncryption));
} else { } else {
secretKey = Apg.getMasterKey(Apg.getSecretKeyRing(secretKeyId)); secretKey = PGPHelper.getMasterKey(PGPHelper.getSecretKeyRing(secretKeyId));
if (secretKey == null) { if (secretKey == null) {
alert.setTitle(R.string.title_keyNotFound); alert.setTitle(R.string.title_keyNotFound);
alert.setMessage(context.getString(R.string.keyNotFound, secretKeyId)); alert.setMessage(context.getString(R.string.keyNotFound, secretKeyId));
@ -67,7 +67,7 @@ public class AskForPassphrase {
alert.setCancelable(false); alert.setCancelable(false);
return alert.create(); return alert.create();
} }
String userId = Apg.getMainUserIdSafe(context, secretKey); String userId = PGPHelper.getMainUserIdSafe(context, secretKey);
alert.setMessage(context.getString(R.string.passPhraseFor, userId)); alert.setMessage(context.getString(R.string.passPhraseFor, userId));
} }
@ -111,7 +111,7 @@ public class AskForPassphrase {
} }
// cache again // cache again
Apg.setCachedPassPhrase(keyId, passPhrase); PGPHelper.setCachedPassPhrase(keyId, passPhrase);
// return by callback // return by callback
cb.passPhraseCallback(keyId, passPhrase); cb.passPhraseCallback(keyId, passPhrase);
} }
@ -133,7 +133,7 @@ public class AskForPassphrase {
Log.d("APG", "Key has no passphrase!"); Log.d("APG", "Key has no passphrase!");
// cache null // cache null
Apg.setCachedPassPhrase(secretKey.getKeyID(), null); PGPHelper.setCachedPassPhrase(secretKey.getKeyID(), null);
// return by callback // return by callback
cb.passPhraseCallback(secretKey.getKeyID(), null); cb.passPhraseCallback(secretKey.getKeyID(), null);

View File

@ -14,8 +14,8 @@
package org.thialfihar.android.apg.passphrase; package org.thialfihar.android.apg.passphrase;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Preferences; import org.thialfihar.android.apg.Preferences;
import org.thialfihar.android.apg.helper.PGPHelper;
import android.app.Service; import android.app.Service;
import android.content.Context; import android.content.Context;
@ -47,7 +47,7 @@ public class PassphraseCacheService extends Service {
delay = 60000; delay = 60000;
} }
delay = Apg.cleanUpCache(mPassPhraseCacheTtl, delay); delay = PGPHelper.cleanUpCache(mPassPhraseCacheTtl, delay);
// don't check too often, even if we were close // don't check too often, even if we were close
if (delay < 5000) { if (delay < 5000) {
delay = 5000; delay = 5000;

View File

@ -19,8 +19,8 @@ import org.spongycastle.openpgp.PGPPublicKey;
import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.util.IterableIterator; import org.thialfihar.android.apg.util.IterableIterator;
import android.content.ContentValues; import android.content.ContentValues;
@ -318,11 +318,11 @@ public class Database extends SQLiteOpenHelper {
values.put(Keys.IS_MASTER_KEY, key.isMasterKey()); values.put(Keys.IS_MASTER_KEY, key.isMasterKey());
values.put(Keys.ALGORITHM, key.getAlgorithm()); values.put(Keys.ALGORITHM, key.getAlgorithm());
values.put(Keys.KEY_SIZE, key.getBitStrength()); values.put(Keys.KEY_SIZE, key.getBitStrength());
values.put(Keys.CAN_SIGN, Apg.isSigningKey(key)); values.put(Keys.CAN_SIGN, PGPHelper.isSigningKey(key));
values.put(Keys.CAN_ENCRYPT, Apg.isEncryptionKey(key)); values.put(Keys.CAN_ENCRYPT, PGPHelper.isEncryptionKey(key));
values.put(Keys.IS_REVOKED, key.isRevoked()); values.put(Keys.IS_REVOKED, key.isRevoked());
values.put(Keys.CREATION, Apg.getCreationDate(key).getTime() / 1000); values.put(Keys.CREATION, PGPHelper.getCreationDate(key).getTime() / 1000);
Date expiryDate = Apg.getExpiryDate(key); Date expiryDate = PGPHelper.getExpiryDate(key);
if (expiryDate != null) { if (expiryDate != null) {
values.put(Keys.EXPIRY, expiryDate.getTime() / 1000); values.put(Keys.EXPIRY, expiryDate.getTime() / 1000);
} }
@ -367,11 +367,11 @@ public class Database extends SQLiteOpenHelper {
values.put(Keys.IS_MASTER_KEY, key.isMasterKey()); values.put(Keys.IS_MASTER_KEY, key.isMasterKey());
values.put(Keys.ALGORITHM, key.getPublicKey().getAlgorithm()); values.put(Keys.ALGORITHM, key.getPublicKey().getAlgorithm());
values.put(Keys.KEY_SIZE, key.getPublicKey().getBitStrength()); values.put(Keys.KEY_SIZE, key.getPublicKey().getBitStrength());
values.put(Keys.CAN_SIGN, Apg.isSigningKey(key)); values.put(Keys.CAN_SIGN, PGPHelper.isSigningKey(key));
values.put(Keys.CAN_ENCRYPT, Apg.isEncryptionKey(key)); values.put(Keys.CAN_ENCRYPT, PGPHelper.isEncryptionKey(key));
values.put(Keys.IS_REVOKED, key.getPublicKey().isRevoked()); values.put(Keys.IS_REVOKED, key.getPublicKey().isRevoked());
values.put(Keys.CREATION, Apg.getCreationDate(key).getTime() / 1000); values.put(Keys.CREATION, PGPHelper.getCreationDate(key).getTime() / 1000);
Date expiryDate = Apg.getExpiryDate(key); Date expiryDate = PGPHelper.getExpiryDate(key);
if (expiryDate != null) { if (expiryDate != null) {
values.put(Keys.EXPIRY, expiryDate.getTime() / 1000); values.put(Keys.EXPIRY, expiryDate.getTime() / 1000);
} }

View File

@ -28,23 +28,23 @@ import java.util.ArrayList;
import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.InputData;
import org.thialfihar.android.apg.Preferences; import org.thialfihar.android.apg.Preferences;
import org.thialfihar.android.apg.ProgressDialogUpdater; import org.thialfihar.android.apg.ProgressDialogUpdater;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg.GeneralException; import org.thialfihar.android.apg.helper.FileHelper;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.helper.PGPHelper.GeneralException;
import org.thialfihar.android.apg.helper.PGPConversionHelper;
import org.thialfihar.android.apg.provider.DataProvider; import org.thialfihar.android.apg.provider.DataProvider;
import org.thialfihar.android.apg.util.Utils; import org.thialfihar.android.apg.util.InputData;
import android.app.IntentService; import android.app.IntentService;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment;
import android.os.Message; import android.os.Message;
import android.os.Messenger; import android.os.Messenger;
import android.os.RemoteException; import android.os.RemoteException;
@ -55,7 +55,16 @@ import android.util.Log;
* data from the activities or other apps, queues these intents, executes them, and stops itself * data from the activities or other apps, queues these intents, executes them, and stops itself
* after doing them. * after doing them.
*/ */
// TODO: ProgressDialogUpdater rework???
/**
* TODO:
*
* - ProgressDialogUpdater rework???
*
* - put recurring things into private functions when possible
*
*
*/
public class ApgService extends IntentService implements ProgressDialogUpdater { public class ApgService extends IntentService implements ProgressDialogUpdater {
// extras that can be given by intent // extras that can be given by intent
@ -64,6 +73,26 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
public static final String EXTRA_DATA = "data"; public static final String EXTRA_DATA = "data";
// keys for data bundle // keys for data bundle
// encrypt
public static final String SECRET_KEY_ID = "secret_key_id";
public static final String USE_ASCII_AMOR = "use_ascii_amor";
public static final String ENCRYPTION_KEYS_IDS = "encryption_keys_ids";
public static final String SIGNATURE_KEY_ID = "signature_key_id";
public static final String COMPRESSION_ID = "compression_id";
public static final String GENERATE_SIGNATURE = "generate_signature";
public static final String SIGN_ONLY = "sign_only";
public static final String MESSAGE_BYTES = "message_bytes";
public static final String INPUT_FILE = "input_file";
public static final String OUTPUT_FILE = "output_file";
public static final String PROVIDER_URI = "provider_uri";
// decrypt
public static final String SIGNED_ONLY = "signed_only";
public static final String RETURN_BYTES = "return_binary";
public static final String CIPHERTEXT_BYTES = "ciphertext_bytes";
public static final String ASSUME_SYMMETRIC = "assume_symmetric";
// edit keys // edit keys
public static final String NEW_PASSPHRASE = "new_passphrase"; public static final String NEW_PASSPHRASE = "new_passphrase";
public static final String CURRENT_PASSPHRASE = "current_passphrase"; public static final String CURRENT_PASSPHRASE = "current_passphrase";
@ -78,41 +107,44 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
public static final String SYMMETRIC_PASSPHRASE = "passphrase"; public static final String SYMMETRIC_PASSPHRASE = "passphrase";
public static final String MASTER_KEY = "master_key"; public static final String MASTER_KEY = "master_key";
// encrypt
public static final String SECRET_KEY_ID = "secret_key_id";
public static final String USE_ASCII_AMOR = "use_ascii_amor";
public static final String ENCRYPTION_KEYS_IDS = "encryption_keys_ids";
public static final String SIGNATURE_KEY_ID = "signature_key_id";
public static final String COMPRESSION_ID = "compression_id";
public static final String GENERATE_SIGNATURE = "generate_signature";
public static final String SIGN_ONLY = "sign_only";
public static final String BYTES = "bytes";
public static final String INPUT_FILE = "input_file";
public static final String OUTPUT_FILE = "output_file";
public static final String PROVIDER_URI = "provider_uri";
// delete file securely // delete file securely
public static final String DELETE_FILE = "delete_file"; public static final String DELETE_FILE = "delete_file";
// possible ints for EXTRA_ACTION // possible EXTRA_ACTIONs
public static final int ACTION_SAVE_KEYRING = 1; public static final int ACTION_ENCRYPT_SIGN_BYTES = 10;
public static final int ACTION_GENERATE_KEY = 2; public static final int ACTION_ENCRYPT_SIGN_FILE = 11;
public static final int ACTION_GENERATE_DEFAULT_RSA_KEYS = 3; public static final int ACTION_ENCRYPT_SIGN_STREAM = 12;
public static final int ACTION_ENCRYPT_SIGN_BYTES = 4; public static final int ACTION_DECRYPT_BYTES = 20;
public static final int ACTION_ENCRYPT_SIGN_FILE = 5; public static final int ACTION_DECRYPT_FILE = 21;
public static final int ACTION_ENCRYPT_SIGN_STREAM = 6; public static final int ACTION_DECRYPT_STREAM = 22;
public static final int ACTION_DELETE_FILE_SECURELY = 7; public static final int ACTION_SAVE_KEYRING = 30;
public static final int ACTION_GENERATE_KEY = 31;
public static final int ACTION_GENERATE_DEFAULT_RSA_KEYS = 32;
public static final int ACTION_DELETE_FILE_SECURELY = 40;
// possible data keys as result // possible data keys as result
// keys
public static final String RESULT_NEW_KEY = "new_key"; public static final String RESULT_NEW_KEY = "new_key";
public static final String RESULT_NEW_KEY2 = "new_key2"; public static final String RESULT_NEW_KEY2 = "new_key2";
public static final String RESULT_SIGNATURE_DATA = "signatureData";
public static final String RESULT_SIGNATURE_TEXT = "signatureText"; // encrypt
public static final String RESULT_ENCRYPTED_MESSAGE = "encryptedMessage"; public static final String RESULT_SIGNATURE_DATA = "signature_data";
public static final String RESULT_ENCRYPTED_DATA = "encryptedData"; public static final String RESULT_SIGNATURE_TEXT = "signature_text";
public static final String RESULT_URI = "resultUri"; public static final String RESULT_ENCRYPTED_MESSAGE = "encrypted_message";
public static final String RESULT_ENCRYPTED_DATA = "encrypted_data";
public static final String RESULT_URI = "result_uri";
// decrypt
public static final String RESULT_DECRYPTED_MESSAGE = "decrypted_message";
public static final String RESULT_DECRYPTED_DATA = "decrypted_data";
public static final String EXTRA_SIGNATURE = "signature";
public static final String EXTRA_SIGNATURE_KEY_ID = "signature_key_id";
public static final String EXTRA_SIGNATURE_USER_ID = "signature_user_id";
public static final String EXTRA_SIGNATURE_SUCCESS = "signature_success";
public static final String EXTRA_SIGNATURE_UNKNOWN = "signature_unknown";
Messenger mMessenger; Messenger mMessenger;
@ -149,7 +181,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
case ACTION_SAVE_KEYRING: case ACTION_SAVE_KEYRING:
try { try {
// Input /* Input */
String oldPassPhrase = data.getString(CURRENT_PASSPHRASE); String oldPassPhrase = data.getString(CURRENT_PASSPHRASE);
String newPassPhrase = data.getString(NEW_PASSPHRASE); String newPassPhrase = data.getString(NEW_PASSPHRASE);
if (newPassPhrase == null) { if (newPassPhrase == null) {
@ -157,19 +189,19 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
ArrayList<String> userIds = (ArrayList<String>) data.getSerializable(USER_IDS); ArrayList<String> userIds = (ArrayList<String>) data.getSerializable(USER_IDS);
ArrayList<PGPSecretKey> keys = Utils.BytesToPGPSecretKeyList(data ArrayList<PGPSecretKey> keys = PGPConversionHelper.BytesToPGPSecretKeyList(data
.getByteArray(KEYS)); .getByteArray(KEYS));
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
ArrayList<Integer> keysUsages = (ArrayList<Integer>) data ArrayList<Integer> keysUsages = (ArrayList<Integer>) data
.getSerializable(KEYS_USAGES); .getSerializable(KEYS_USAGES);
long masterKeyId = data.getLong(MASTER_KEY_ID); long masterKeyId = data.getLong(MASTER_KEY_ID);
// Operation /* Operation */
Apg.buildSecretKey(this, userIds, keys, keysUsages, masterKeyId, oldPassPhrase, PGPHelper.buildSecretKey(this, userIds, keys, keysUsages, masterKeyId,
newPassPhrase, this); oldPassPhrase, newPassPhrase, this);
Apg.setCachedPassPhrase(masterKeyId, newPassPhrase); PGPHelper.setCachedPassPhrase(masterKeyId, newPassPhrase);
// Output /* Output */
sendMessageToHandler(ApgHandler.MESSAGE_OKAY); sendMessageToHandler(ApgHandler.MESSAGE_OKAY);
} catch (Exception e) { } catch (Exception e) {
sendErrorToHandler(e); sendErrorToHandler(e);
@ -180,22 +212,24 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
case ACTION_GENERATE_KEY: case ACTION_GENERATE_KEY:
try { try {
// Input /* Input */
int algorithm = data.getInt(ALGORITHM); int algorithm = data.getInt(ALGORITHM);
String passphrase = data.getString(SYMMETRIC_PASSPHRASE); String passphrase = data.getString(SYMMETRIC_PASSPHRASE);
int keysize = data.getInt(KEY_SIZE); int keysize = data.getInt(KEY_SIZE);
PGPSecretKey masterKey = null; PGPSecretKey masterKey = null;
if (data.containsKey(MASTER_KEY)) { if (data.containsKey(MASTER_KEY)) {
masterKey = Utils.BytesToPGPSecretKey(data.getByteArray(MASTER_KEY)); masterKey = PGPConversionHelper.BytesToPGPSecretKey(data
.getByteArray(MASTER_KEY));
} }
// Operation /* Operation */
PGPSecretKeyRing newKeyRing = Apg.createKey(this, algorithm, keysize, passphrase, PGPSecretKeyRing newKeyRing = PGPHelper.createKey(this, algorithm, keysize,
masterKey); passphrase, masterKey);
// Output /* Output */
Bundle resultData = new Bundle(); Bundle resultData = new Bundle();
resultData.putByteArray(RESULT_NEW_KEY, Utils.PGPSecretKeyRingToBytes(newKeyRing)); resultData.putByteArray(RESULT_NEW_KEY,
PGPConversionHelper.PGPSecretKeyRingToBytes(newKeyRing));
sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData); sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) { } catch (Exception e) {
sendErrorToHandler(e); sendErrorToHandler(e);
@ -206,20 +240,22 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
case ACTION_GENERATE_DEFAULT_RSA_KEYS: case ACTION_GENERATE_DEFAULT_RSA_KEYS:
// generate one RSA 2048 key for signing and one subkey for encrypting! // generate one RSA 2048 key for signing and one subkey for encrypting!
try { try {
/* Input */
String passphrase = data.getString(SYMMETRIC_PASSPHRASE); String passphrase = data.getString(SYMMETRIC_PASSPHRASE);
// Operation /* Operation */
PGPSecretKeyRing masterKeyRing = Apg.createKey(this, Id.choice.algorithm.rsa, 2048, PGPSecretKeyRing masterKeyRing = PGPHelper.createKey(this, Id.choice.algorithm.rsa,
passphrase, null); 2048, passphrase, null);
PGPSecretKeyRing subKeyRing = Apg.createKey(this, Id.choice.algorithm.rsa, 2048, PGPSecretKeyRing subKeyRing = PGPHelper.createKey(this, Id.choice.algorithm.rsa,
passphrase, masterKeyRing.getSecretKey()); 2048, passphrase, masterKeyRing.getSecretKey());
// Output /* Output */
Bundle resultData = new Bundle(); Bundle resultData = new Bundle();
resultData.putByteArray(RESULT_NEW_KEY, resultData.putByteArray(RESULT_NEW_KEY,
Utils.PGPSecretKeyRingToBytes(masterKeyRing)); PGPConversionHelper.PGPSecretKeyRingToBytes(masterKeyRing));
resultData.putByteArray(RESULT_NEW_KEY2, Utils.PGPSecretKeyRingToBytes(subKeyRing)); resultData.putByteArray(RESULT_NEW_KEY2,
PGPConversionHelper.PGPSecretKeyRingToBytes(subKeyRing));
sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData); sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) { } catch (Exception e) {
sendErrorToHandler(e); sendErrorToHandler(e);
@ -230,11 +266,11 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
case ACTION_ENCRYPT_SIGN_BYTES: case ACTION_ENCRYPT_SIGN_BYTES:
try { try {
// Input /* Input */
long secretKeyId = data.getLong(SECRET_KEY_ID); long secretKeyId = data.getLong(SECRET_KEY_ID);
String passphrase = data.getString(SYMMETRIC_PASSPHRASE); String passphrase = data.getString(SYMMETRIC_PASSPHRASE);
byte[] bytes = data.getByteArray(BYTES); byte[] bytes = data.getByteArray(MESSAGE_BYTES);
boolean useAsciiArmour = data.getBoolean(USE_ASCII_AMOR); boolean useAsciiArmour = data.getBoolean(USE_ASCII_AMOR);
long encryptionKeyIds[] = data.getLongArray(ENCRYPTION_KEYS_IDS); long encryptionKeyIds[] = data.getLongArray(ENCRYPTION_KEYS_IDS);
@ -243,7 +279,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE); boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE);
boolean signOnly = data.getBoolean(SIGN_ONLY); boolean signOnly = data.getBoolean(SIGN_ONLY);
// Operation /* Operation */
ByteArrayInputStream inStream = new ByteArrayInputStream(bytes); ByteArrayInputStream inStream = new ByteArrayInputStream(bytes);
int inLength = bytes.length; int inLength = bytes.length;
@ -252,20 +288,20 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
if (generateSignature) { if (generateSignature) {
Log.d(Constants.TAG, "generate signature..."); Log.d(Constants.TAG, "generate signature...");
Apg.generateSignature(this, inputData, outStream, useAsciiArmour, false, PGPHelper.generateSignature(this, inputData, outStream, useAsciiArmour, false,
secretKeyId, Apg.getCachedPassPhrase(secretKeyId), Preferences secretKeyId, PGPHelper.getCachedPassPhrase(secretKeyId), Preferences
.getPreferences(this).getDefaultHashAlgorithm(), Preferences .getPreferences(this).getDefaultHashAlgorithm(), Preferences
.getPreferences(this).getForceV3Signatures(), this); .getPreferences(this).getForceV3Signatures(), this);
} else if (signOnly) { } else if (signOnly) {
Log.d(Constants.TAG, "sign only..."); Log.d(Constants.TAG, "sign only...");
Apg.signText(this, inputData, outStream, secretKeyId, Apg PGPHelper.signText(this, inputData, outStream, secretKeyId, PGPHelper
.getCachedPassPhrase(secretKeyId), Preferences.getPreferences(this) .getCachedPassPhrase(secretKeyId), Preferences.getPreferences(this)
.getDefaultHashAlgorithm(), Preferences.getPreferences(this) .getDefaultHashAlgorithm(), Preferences.getPreferences(this)
.getForceV3Signatures(), this); .getForceV3Signatures(), this);
} else { } else {
Log.d(Constants.TAG, "encrypt..."); Log.d(Constants.TAG, "encrypt...");
Apg.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds, PGPHelper.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds,
signatureKeyId, Apg.getCachedPassPhrase(signatureKeyId), this, signatureKeyId, PGPHelper.getCachedPassPhrase(signatureKeyId), this,
Preferences.getPreferences(this).getDefaultEncryptionAlgorithm(), Preferences.getPreferences(this).getDefaultEncryptionAlgorithm(),
Preferences.getPreferences(this).getDefaultHashAlgorithm(), Preferences.getPreferences(this).getDefaultHashAlgorithm(),
compressionId, Preferences.getPreferences(this).getForceV3Signatures(), compressionId, Preferences.getPreferences(this).getForceV3Signatures(),
@ -274,7 +310,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
outStream.close(); outStream.close();
// Output /* Output */
Bundle resultData = new Bundle(); Bundle resultData = new Bundle();
if (useAsciiArmour) { if (useAsciiArmour) {
@ -302,7 +338,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
case ACTION_ENCRYPT_SIGN_FILE: case ACTION_ENCRYPT_SIGN_FILE:
try { try {
// Input /* Input */
long secretKeyId = data.getLong(SECRET_KEY_ID); long secretKeyId = data.getLong(SECRET_KEY_ID);
String passphrase = data.getString(SYMMETRIC_PASSPHRASE); String passphrase = data.getString(SYMMETRIC_PASSPHRASE);
@ -316,51 +352,41 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE); boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE);
boolean signOnly = data.getBoolean(SIGN_ONLY); boolean signOnly = data.getBoolean(SIGN_ONLY);
/* Operation */
// check if storage is ready
if (!FileHelper.isStorageMounted(inputFile)
|| !FileHelper.isStorageMounted(outputFile)) {
sendErrorToHandler(new GeneralException(
getString(R.string.error_externalStorageNotReady)));
return;
}
// InputStream // InputStream
long inLength = -1; long inLength = -1;
FileInputStream inStream = null; FileInputStream inStream = new FileInputStream(inputFile);
if (inputFile.startsWith(Environment.getExternalStorageDirectory()
.getAbsolutePath())) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
sendErrorToHandler(new GeneralException(
getString(R.string.error_externalStorageNotReady)));
return;
}
}
inStream = new FileInputStream(inputFile);
File file = new File(inputFile); File file = new File(inputFile);
inLength = file.length(); inLength = file.length();
InputData inputData = new InputData(inStream, inLength); InputData inputData = new InputData(inStream, inLength);
// OutputStream // OutputStream
if (outputFile.startsWith(Environment.getExternalStorageDirectory()
.getAbsolutePath())) {
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
sendErrorToHandler(new GeneralException(
getString(R.string.error_externalStorageNotReady)));
return;
}
}
FileOutputStream outStream = new FileOutputStream(outputFile); FileOutputStream outStream = new FileOutputStream(outputFile);
// Operation
if (generateSignature) { if (generateSignature) {
Log.d(Constants.TAG, "generate signature..."); Log.d(Constants.TAG, "generate signature...");
Apg.generateSignature(this, inputData, outStream, useAsciiArmour, true, PGPHelper.generateSignature(this, inputData, outStream, useAsciiArmour, true,
secretKeyId, Apg.getCachedPassPhrase(secretKeyId), Preferences secretKeyId, PGPHelper.getCachedPassPhrase(secretKeyId), Preferences
.getPreferences(this).getDefaultHashAlgorithm(), Preferences .getPreferences(this).getDefaultHashAlgorithm(), Preferences
.getPreferences(this).getForceV3Signatures(), this); .getPreferences(this).getForceV3Signatures(), this);
} else if (signOnly) { } else if (signOnly) {
Log.d(Constants.TAG, "sign only..."); Log.d(Constants.TAG, "sign only...");
Apg.signText(this, inputData, outStream, secretKeyId, Apg PGPHelper.signText(this, inputData, outStream, secretKeyId, PGPHelper
.getCachedPassPhrase(secretKeyId), Preferences.getPreferences(this) .getCachedPassPhrase(secretKeyId), Preferences.getPreferences(this)
.getDefaultHashAlgorithm(), Preferences.getPreferences(this) .getDefaultHashAlgorithm(), Preferences.getPreferences(this)
.getForceV3Signatures(), this); .getForceV3Signatures(), this);
} else { } else {
Log.d(Constants.TAG, "encrypt..."); Log.d(Constants.TAG, "encrypt...");
Apg.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds, PGPHelper.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds,
signatureKeyId, Apg.getCachedPassPhrase(signatureKeyId), this, signatureKeyId, PGPHelper.getCachedPassPhrase(signatureKeyId), this,
Preferences.getPreferences(this).getDefaultEncryptionAlgorithm(), Preferences.getPreferences(this).getDefaultEncryptionAlgorithm(),
Preferences.getPreferences(this).getDefaultHashAlgorithm(), Preferences.getPreferences(this).getDefaultHashAlgorithm(),
compressionId, Preferences.getPreferences(this).getForceV3Signatures(), compressionId, Preferences.getPreferences(this).getForceV3Signatures(),
@ -369,6 +395,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
outStream.close(); outStream.close();
/* Output */
sendMessageToHandler(ApgHandler.MESSAGE_OKAY); sendMessageToHandler(ApgHandler.MESSAGE_OKAY);
} catch (Exception e) { } catch (Exception e) {
sendErrorToHandler(e); sendErrorToHandler(e);
@ -377,7 +404,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
case ACTION_ENCRYPT_SIGN_STREAM: case ACTION_ENCRYPT_SIGN_STREAM:
try { try {
// Input /* Input */
long secretKeyId = data.getLong(SECRET_KEY_ID); long secretKeyId = data.getLong(SECRET_KEY_ID);
String passphrase = data.getString(SYMMETRIC_PASSPHRASE); String passphrase = data.getString(SYMMETRIC_PASSPHRASE);
@ -389,20 +416,21 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
int compressionId = data.getInt(COMPRESSION_ID); int compressionId = data.getInt(COMPRESSION_ID);
boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE); boolean generateSignature = data.getBoolean(GENERATE_SIGNATURE);
boolean signOnly = data.getBoolean(SIGN_ONLY); boolean signOnly = data.getBoolean(SIGN_ONLY);
/* Operation */
// InputStream // InputStream
InputStream in = getContentResolver().openInputStream(providerUri); InputStream in = getContentResolver().openInputStream(providerUri);
long inLength = Apg.getLengthOfStream(in); long inLength = PGPHelper.getLengthOfStream(in);
InputData inputData = new InputData(in, inLength); InputData inputData = new InputData(in, inLength);
// OutputStream // OutputStream
String streamFilename = null; String streamFilename = null;
try { try {
while (true) { while (true) {
streamFilename = Apg.generateRandomString(32); streamFilename = PGPHelper.generateRandomString(32);
if (streamFilename == null) { if (streamFilename == null) {
throw new Apg.GeneralException("couldn't generate random file name"); throw new PGPHelper.GeneralException(
"couldn't generate random file name");
} }
openFileInput(streamFilename).close(); openFileInput(streamFilename).close();
} }
@ -411,20 +439,19 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
} }
FileOutputStream outStream = openFileOutput(streamFilename, Context.MODE_PRIVATE); FileOutputStream outStream = openFileOutput(streamFilename, Context.MODE_PRIVATE);
// Operation
if (generateSignature) { if (generateSignature) {
Apg.generateSignature(this, inputData, outStream, useAsciiArmour, true, PGPHelper.generateSignature(this, inputData, outStream, useAsciiArmour, true,
secretKeyId, Apg.getCachedPassPhrase(secretKeyId), Preferences secretKeyId, PGPHelper.getCachedPassPhrase(secretKeyId), Preferences
.getPreferences(this).getDefaultHashAlgorithm(), Preferences .getPreferences(this).getDefaultHashAlgorithm(), Preferences
.getPreferences(this).getForceV3Signatures(), this); .getPreferences(this).getForceV3Signatures(), this);
} else if (signOnly) { } else if (signOnly) {
Apg.signText(this, inputData, outStream, secretKeyId, Apg PGPHelper.signText(this, inputData, outStream, secretKeyId, PGPHelper
.getCachedPassPhrase(secretKeyId), Preferences.getPreferences(this) .getCachedPassPhrase(secretKeyId), Preferences.getPreferences(this)
.getDefaultHashAlgorithm(), Preferences.getPreferences(this) .getDefaultHashAlgorithm(), Preferences.getPreferences(this)
.getForceV3Signatures(), this); .getForceV3Signatures(), this);
} else { } else {
Apg.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds, PGPHelper.encrypt(this, inputData, outStream, useAsciiArmour, encryptionKeyIds,
signatureKeyId, Apg.getCachedPassPhrase(signatureKeyId), this, signatureKeyId, PGPHelper.getCachedPassPhrase(signatureKeyId), this,
Preferences.getPreferences(this).getDefaultEncryptionAlgorithm(), Preferences.getPreferences(this).getDefaultEncryptionAlgorithm(),
Preferences.getPreferences(this).getDefaultHashAlgorithm(), Preferences.getPreferences(this).getDefaultHashAlgorithm(),
compressionId, Preferences.getPreferences(this).getForceV3Signatures(), compressionId, Preferences.getPreferences(this).getForceV3Signatures(),
@ -433,7 +460,7 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
outStream.close(); outStream.close();
// Output /* Output */
Bundle resultData = new Bundle(); Bundle resultData = new Bundle();
String uri = "content://" + DataProvider.AUTHORITY + "/data/" + streamFilename; String uri = "content://" + DataProvider.AUTHORITY + "/data/" + streamFilename;
@ -448,21 +475,21 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
case ACTION_DELETE_FILE_SECURELY: case ACTION_DELETE_FILE_SECURELY:
try { try {
// Input /* Input */
String deleteFile = data.getString(DELETE_FILE); String deleteFile = data.getString(DELETE_FILE);
// Operation /* Operation */
try { try {
Apg.deleteFileSecurely(this, new File(deleteFile), this); PGPHelper.deleteFileSecurely(this, new File(deleteFile), this);
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
throw new Apg.GeneralException(getString(R.string.error_fileNotFound, throw new PGPHelper.GeneralException(getString(R.string.error_fileNotFound,
deleteFile)); deleteFile));
} catch (IOException e) { } catch (IOException e) {
throw new Apg.GeneralException(getString(R.string.error_fileDeleteFailed, throw new PGPHelper.GeneralException(getString(R.string.error_fileDeleteFailed,
deleteFile)); deleteFile));
} }
// Output /* Output */
sendMessageToHandler(ApgHandler.MESSAGE_OKAY); sendMessageToHandler(ApgHandler.MESSAGE_OKAY);
} catch (Exception e) { } catch (Exception e) {
sendErrorToHandler(e); sendErrorToHandler(e);
@ -470,6 +497,157 @@ public class ApgService extends IntentService implements ProgressDialogUpdater {
break; break;
case ACTION_DECRYPT_BYTES:
try {
/* Input */
long secretKeyId = data.getLong(SECRET_KEY_ID);
byte[] bytes = data.getByteArray(CIPHERTEXT_BYTES);
boolean signedOnly = data.getBoolean(SIGNED_ONLY);
boolean returnBytes = data.getBoolean(RETURN_BYTES);
boolean assumeSymmetricEncryption = data.getBoolean(ASSUME_SYMMETRIC);
/* Operation */
ByteArrayInputStream inStream = new ByteArrayInputStream(bytes);
int inLength = bytes.length;
InputData inputData = new InputData(inStream, inLength);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
Bundle resultData = new Bundle();
// verifyText and decrypt returning additional resultData values for the
// verification of signatures
if (signedOnly) {
resultData = PGPHelper.verifyText(this, inputData, outStream, this);
} else {
resultData = PGPHelper.decrypt(this, inputData, outStream,
PGPHelper.getCachedPassPhrase(secretKeyId), this,
assumeSymmetricEncryption);
}
outStream.close();
/* Output */
if (returnBytes) {
byte output[] = outStream.toByteArray();
resultData.putByteArray(RESULT_DECRYPTED_DATA, output);
} else {
String output = new String(outStream.toByteArray());
resultData.putString(RESULT_DECRYPTED_MESSAGE, output);
}
sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_DECRYPT_FILE:
try {
/* Input */
long secretKeyId = data.getLong(SECRET_KEY_ID);
boolean signedOnly = data.getBoolean(SIGNED_ONLY);
boolean assumeSymmetricEncryption = data.getBoolean(ASSUME_SYMMETRIC);
String inputFile = data.getString(INPUT_FILE);
String outputFile = data.getString(OUTPUT_FILE);
/* Operation */
// check if storage is ready
if (!FileHelper.isStorageMounted(inputFile)
|| !FileHelper.isStorageMounted(outputFile)) {
sendErrorToHandler(new GeneralException(
getString(R.string.error_externalStorageNotReady)));
return;
}
// InputStream
long inLength = -1;
FileInputStream inStream = new FileInputStream(inputFile);
File file = new File(inputFile);
inLength = file.length();
InputData inputData = new InputData(inStream, inLength);
// OutputStream
FileOutputStream outStream = new FileOutputStream(outputFile);
Bundle resultData = new Bundle();
// verifyText and decrypt returning additional output values for the
// verification of signatures
if (signedOnly) {
resultData = PGPHelper.verifyText(this, inputData, outStream, this);
} else {
resultData = PGPHelper.decrypt(this, inputData, outStream,
PGPHelper.getCachedPassPhrase(secretKeyId), this,
assumeSymmetricEncryption);
}
outStream.close();
/* Output */
sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
case ACTION_DECRYPT_STREAM:
try {
/* Input */
long secretKeyId = data.getLong(SECRET_KEY_ID);
boolean signedOnly = data.getBoolean(SIGNED_ONLY);
boolean assumeSymmetricEncryption = data.getBoolean(ASSUME_SYMMETRIC);
Uri providerUri = Uri.parse(data.getString(PROVIDER_URI));
/* Operation */
// InputStream
InputStream in = getContentResolver().openInputStream(providerUri);
long inLength = PGPHelper.getLengthOfStream(in);
InputData inputData = new InputData(in, inLength);
// OutputStream
String streamFilename = null;
try {
while (true) {
streamFilename = PGPHelper.generateRandomString(32);
if (streamFilename == null) {
throw new PGPHelper.GeneralException(
"couldn't generate random file name");
}
openFileInput(streamFilename).close();
}
} catch (FileNotFoundException e) {
// found a name that isn't used yet
}
FileOutputStream outStream = openFileOutput(streamFilename, Context.MODE_PRIVATE);
Bundle resultData = new Bundle();
// verifyText and decrypt returning additional output values for the
// verification of signatures
if (signedOnly) {
resultData = PGPHelper.verifyText(this, inputData, outStream, this);
} else {
resultData = PGPHelper.decrypt(this, inputData, outStream,
PGPHelper.getCachedPassPhrase(secretKeyId), this,
assumeSymmetricEncryption);
}
outStream.close();
/* Output */
String uri = "content://" + DataProvider.AUTHORITY + "/data/" + streamFilename;
resultData.putString(RESULT_URI, uri);
sendMessageToHandler(ApgHandler.MESSAGE_OKAY, resultData);
} catch (Exception e) {
sendErrorToHandler(e);
}
break;
default: default:
break; break;
} }

View File

@ -21,12 +21,12 @@ import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.PausableThread; import org.thialfihar.android.apg.PausableThread;
import org.thialfihar.android.apg.Preferences; import org.thialfihar.android.apg.Preferences;
import org.thialfihar.android.apg.ProgressDialogUpdater; import org.thialfihar.android.apg.ProgressDialogUpdater;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.passphrase.AskForPassphrase; import org.thialfihar.android.apg.passphrase.AskForPassphrase;
import org.thialfihar.android.apg.passphrase.PassphraseCacheService; import org.thialfihar.android.apg.passphrase.PassphraseCacheService;
@ -79,7 +79,7 @@ public class BaseActivity extends SherlockFragmentActivity implements Runnable,
// not needed later: // not needed later:
mPreferences = Preferences.getPreferences(this); mPreferences = Preferences.getPreferences(this);
Apg.initialize(this); PGPHelper.initialize(this);
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File dir = new File(Constants.path.APP_DIR); File dir = new File(Constants.path.APP_DIR);
@ -275,7 +275,7 @@ public class BaseActivity extends SherlockFragmentActivity implements Runnable,
case Id.request.secret_keys: { case Id.request.secret_keys: {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
Bundle bundle = data.getExtras(); Bundle bundle = data.getExtras();
setSecretKeyId(bundle.getLong(Apg.EXTRA_KEY_ID)); setSecretKeyId(bundle.getLong(PGPHelper.EXTRA_KEY_ID));
} else { } else {
setSecretKeyId(Id.key.none); setSecretKeyId(Id.key.none);
} }
@ -378,7 +378,7 @@ public class BaseActivity extends SherlockFragmentActivity implements Runnable,
public void passPhraseCallback(long keyId, String passPhrase) { public void passPhraseCallback(long keyId, String passPhrase) {
// TODO: Not needed anymore, now implemented in AskForSecretKeyPass // TODO: Not needed anymore, now implemented in AskForSecretKeyPass
Apg.setCachedPassPhrase(keyId, passPhrase); PGPHelper.setCachedPassPhrase(keyId, passPhrase);
} }
public void sendMessage(Message msg) { public void sendMessage(Message msg) {

View File

@ -19,9 +19,11 @@ package org.thialfihar.android.apg.ui;
import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.helper.OtherHelper;
import org.thialfihar.android.apg.helper.PGPConversionHelper;
import org.thialfihar.android.apg.service.ApgHandler; import org.thialfihar.android.apg.service.ApgHandler;
import org.thialfihar.android.apg.service.ApgService; import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment; import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment;
@ -29,7 +31,6 @@ import org.thialfihar.android.apg.ui.widget.KeyEditor;
import org.thialfihar.android.apg.ui.widget.SectionView; import org.thialfihar.android.apg.ui.widget.SectionView;
import org.thialfihar.android.apg.ui.widget.UserIdEditor; import org.thialfihar.android.apg.ui.widget.UserIdEditor;
import org.thialfihar.android.apg.util.IterableIterator; import org.thialfihar.android.apg.util.IterableIterator;
import org.thialfihar.android.apg.util.Utils;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar;
@ -132,7 +133,7 @@ public class EditKeyActivity extends SherlockFragmentActivity {
mActionBar.setDisplayShowTitleEnabled(true); mActionBar.setDisplayShowTitleEnabled(true);
// set actionbar without home button if called from another app // set actionbar without home button if called from another app
if (getCallingPackage() != null && getCallingPackage().equals(Apg.PACKAGE_NAME)) { if (getCallingPackage() != null && getCallingPackage().equals(PGPHelper.PACKAGE_NAME)) {
mActionBar.setDisplayHomeAsUpEnabled(true); mActionBar.setDisplayHomeAsUpEnabled(true);
mActionBar.setHomeButtonEnabled(true); mActionBar.setHomeButtonEnabled(true);
} else { } else {
@ -153,7 +154,7 @@ public class EditKeyActivity extends SherlockFragmentActivity {
// Handle intents // Handle intents
Bundle extras = mIntent.getExtras(); Bundle extras = mIntent.getExtras();
if (Apg.Intent.CREATE_KEY.equals(mIntent.getAction())) { if (PGPHelper.Intent.CREATE_KEY.equals(mIntent.getAction())) {
mActionBar.setTitle(R.string.title_createKey); mActionBar.setTitle(R.string.title_createKey);
@ -161,14 +162,14 @@ public class EditKeyActivity extends SherlockFragmentActivity {
if (extras != null) { if (extras != null) {
// if userId is given, prefill the fields // if userId is given, prefill the fields
if (extras.containsKey(Apg.EXTRA_USER_IDS)) { if (extras.containsKey(PGPHelper.EXTRA_USER_IDS)) {
Log.d(Constants.TAG, "UserIds are given!"); Log.d(Constants.TAG, "UserIds are given!");
mUserIds.add(extras.getString(Apg.EXTRA_USER_IDS)); mUserIds.add(extras.getString(PGPHelper.EXTRA_USER_IDS));
} }
// if no passphrase is given // if no passphrase is given
if (extras.containsKey(Apg.EXTRA_NO_PASSPHRASE)) { if (extras.containsKey(PGPHelper.EXTRA_NO_PASSPHRASE)) {
boolean noPassphrase = extras.getBoolean(Apg.EXTRA_NO_PASSPHRASE); boolean noPassphrase = extras.getBoolean(PGPHelper.EXTRA_NO_PASSPHRASE);
if (noPassphrase) { if (noPassphrase) {
// check "no passphrase" checkbox and remove button // check "no passphrase" checkbox and remove button
mNoPassphrase.setChecked(true); mNoPassphrase.setChecked(true);
@ -177,9 +178,9 @@ public class EditKeyActivity extends SherlockFragmentActivity {
} }
// generate key // generate key
if (extras.containsKey(Apg.EXTRA_GENERATE_DEFAULT_KEYS)) { if (extras.containsKey(PGPHelper.EXTRA_GENERATE_DEFAULT_KEYS)) {
boolean generateDefaultKeys = extras boolean generateDefaultKeys = extras
.getBoolean(Apg.EXTRA_GENERATE_DEFAULT_KEYS); .getBoolean(PGPHelper.EXTRA_GENERATE_DEFAULT_KEYS);
if (generateDefaultKeys) { if (generateDefaultKeys) {
// build layout in handler after generating keys not directly in onCreate // build layout in handler after generating keys not directly in onCreate
@ -209,10 +210,10 @@ public class EditKeyActivity extends SherlockFragmentActivity {
if (message.arg1 == ApgHandler.MESSAGE_OKAY) { if (message.arg1 == ApgHandler.MESSAGE_OKAY) {
// get new key from data bundle returned from service // get new key from data bundle returned from service
Bundle data = message.getData(); Bundle data = message.getData();
PGPSecretKeyRing masterKeyRing = Utils PGPSecretKeyRing masterKeyRing = PGPConversionHelper
.BytesToPGPSecretKeyRing(data .BytesToPGPSecretKeyRing(data
.getByteArray(ApgService.RESULT_NEW_KEY)); .getByteArray(ApgService.RESULT_NEW_KEY));
PGPSecretKeyRing subKeyRing = Utils PGPSecretKeyRing subKeyRing = PGPConversionHelper
.BytesToPGPSecretKeyRing(data .BytesToPGPSecretKeyRing(data
.getByteArray(ApgService.RESULT_NEW_KEY2)); .getByteArray(ApgService.RESULT_NEW_KEY2));
@ -243,11 +244,11 @@ public class EditKeyActivity extends SherlockFragmentActivity {
} }
} }
} }
} else if (Apg.Intent.EDIT_KEY.equals(mIntent.getAction())) { } else if (PGPHelper.Intent.EDIT_KEY.equals(mIntent.getAction())) {
mActionBar.setTitle(R.string.title_editKey); mActionBar.setTitle(R.string.title_editKey);
mCurrentPassPhrase = Apg.getEditPassPhrase(); mCurrentPassPhrase = PGPHelper.getEditPassPhrase();
if (mCurrentPassPhrase == null) { if (mCurrentPassPhrase == null) {
mCurrentPassPhrase = ""; mCurrentPassPhrase = "";
} }
@ -260,14 +261,14 @@ public class EditKeyActivity extends SherlockFragmentActivity {
if (extras != null) { if (extras != null) {
if (extras.containsKey(Apg.EXTRA_KEY_ID)) { if (extras.containsKey(PGPHelper.EXTRA_KEY_ID)) {
long keyId = mIntent.getExtras().getLong(Apg.EXTRA_KEY_ID); long keyId = mIntent.getExtras().getLong(PGPHelper.EXTRA_KEY_ID);
if (keyId != 0) { if (keyId != 0) {
PGPSecretKey masterKey = null; PGPSecretKey masterKey = null;
mKeyRing = Apg.getSecretKeyRing(keyId); mKeyRing = PGPHelper.getSecretKeyRing(keyId);
if (mKeyRing != null) { if (mKeyRing != null) {
masterKey = Apg.getMasterKey(mKeyRing); masterKey = PGPHelper.getMasterKey(mKeyRing);
for (PGPSecretKey key : new IterableIterator<PGPSecretKey>( for (PGPSecretKey key : new IterableIterator<PGPSecretKey>(
mKeyRing.getSecretKeys())) { mKeyRing.getSecretKeys())) {
mKeys.add(key); mKeys.add(key);
@ -411,7 +412,7 @@ public class EditKeyActivity extends SherlockFragmentActivity {
try { try {
if (!isPassphraseSet()) { if (!isPassphraseSet()) {
throw new Apg.GeneralException(this.getString(R.string.setAPassPhrase)); throw new PGPHelper.GeneralException(this.getString(R.string.setAPassPhrase));
} }
// Send all information needed to service to edit key in other thread // Send all information needed to service to edit key in other thread
@ -425,7 +426,7 @@ public class EditKeyActivity extends SherlockFragmentActivity {
data.putString(ApgService.NEW_PASSPHRASE, mNewPassPhrase); data.putString(ApgService.NEW_PASSPHRASE, mNewPassPhrase);
data.putSerializable(ApgService.USER_IDS, getUserIds(mUserIdsView)); data.putSerializable(ApgService.USER_IDS, getUserIds(mUserIdsView));
Vector<PGPSecretKey> keys = getKeys(mKeysView); Vector<PGPSecretKey> keys = getKeys(mKeysView);
data.putByteArray(ApgService.KEYS, Utils.PGPSecretKeyListToBytes(keys)); data.putByteArray(ApgService.KEYS, PGPConversionHelper.PGPSecretKeyListToBytes(keys));
data.putSerializable(ApgService.KEYS_USAGES, getKeysUsages(mKeysView)); data.putSerializable(ApgService.KEYS_USAGES, getKeysUsages(mKeysView));
data.putLong(ApgService.MASTER_KEY_ID, getMasterKeyId()); data.putLong(ApgService.MASTER_KEY_ID, getMasterKeyId());
@ -455,7 +456,7 @@ public class EditKeyActivity extends SherlockFragmentActivity {
// start service with intent // start service with intent
startService(intent); startService(intent);
} catch (Apg.GeneralException e) { } catch (PGPHelper.GeneralException e) {
Toast.makeText(this, getString(R.string.errorMessage, e.getMessage()), Toast.makeText(this, getString(R.string.errorMessage, e.getMessage()),
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
} }
@ -467,7 +468,8 @@ public class EditKeyActivity extends SherlockFragmentActivity {
* @param userIdsView * @param userIdsView
* @return * @return
*/ */
private Vector<String> getUserIds(SectionView userIdsView) throws Apg.GeneralException { private Vector<String> getUserIds(SectionView userIdsView)
throws PGPHelper.GeneralException {
Vector<String> userIds = new Vector<String>(); Vector<String> userIds = new Vector<String>();
ViewGroup userIdEditors = userIdsView.getEditors(); ViewGroup userIdEditors = userIdsView.getEditors();
@ -479,12 +481,13 @@ public class EditKeyActivity extends SherlockFragmentActivity {
try { try {
userId = editor.getValue(); userId = editor.getValue();
} catch (UserIdEditor.NoNameException e) { } catch (UserIdEditor.NoNameException e) {
throw new Apg.GeneralException(this.getString(R.string.error_userIdNeedsAName)); throw new PGPHelper.GeneralException(
this.getString(R.string.error_userIdNeedsAName));
} catch (UserIdEditor.NoEmailException e) { } catch (UserIdEditor.NoEmailException e) {
throw new Apg.GeneralException( throw new PGPHelper.GeneralException(
this.getString(R.string.error_userIdNeedsAnEmailAddress)); this.getString(R.string.error_userIdNeedsAnEmailAddress));
} catch (UserIdEditor.InvalidEmailException e) { } catch (UserIdEditor.InvalidEmailException e) {
throw new Apg.GeneralException(e.getMessage()); throw new PGPHelper.GeneralException(e.getMessage());
} }
if (userId.equals("")) { if (userId.equals("")) {
@ -500,11 +503,12 @@ public class EditKeyActivity extends SherlockFragmentActivity {
} }
if (userIds.size() == 0) { if (userIds.size() == 0) {
throw new Apg.GeneralException(getString(R.string.error_keyNeedsAUserId)); throw new PGPHelper.GeneralException(getString(R.string.error_keyNeedsAUserId));
} }
if (!gotMainUserId) { if (!gotMainUserId) {
throw new Apg.GeneralException(getString(R.string.error_mainUserIdMustNotBeEmpty)); throw new PGPHelper.GeneralException(
getString(R.string.error_mainUserIdMustNotBeEmpty));
} }
return userIds; return userIds;
@ -516,13 +520,14 @@ public class EditKeyActivity extends SherlockFragmentActivity {
* @param keysView * @param keysView
* @return * @return
*/ */
private Vector<PGPSecretKey> getKeys(SectionView keysView) throws Apg.GeneralException { private Vector<PGPSecretKey> getKeys(SectionView keysView)
throws PGPHelper.GeneralException {
Vector<PGPSecretKey> keys = new Vector<PGPSecretKey>(); Vector<PGPSecretKey> keys = new Vector<PGPSecretKey>();
ViewGroup keyEditors = keysView.getEditors(); ViewGroup keyEditors = keysView.getEditors();
if (keyEditors.getChildCount() == 0) { if (keyEditors.getChildCount() == 0) {
throw new Apg.GeneralException(getString(R.string.error_keyNeedsMasterKey)); throw new PGPHelper.GeneralException(getString(R.string.error_keyNeedsMasterKey));
} }
for (int i = 0; i < keyEditors.getChildCount(); ++i) { for (int i = 0; i < keyEditors.getChildCount(); ++i) {
@ -539,13 +544,14 @@ public class EditKeyActivity extends SherlockFragmentActivity {
* @param keysView * @param keysView
* @return * @return
*/ */
private Vector<Integer> getKeysUsages(SectionView keysView) throws Apg.GeneralException { private Vector<Integer> getKeysUsages(SectionView keysView)
throws PGPHelper.GeneralException {
Vector<Integer> getKeysUsages = new Vector<Integer>(); Vector<Integer> getKeysUsages = new Vector<Integer>();
ViewGroup keyEditors = keysView.getEditors(); ViewGroup keyEditors = keysView.getEditors();
if (keyEditors.getChildCount() == 0) { if (keyEditors.getChildCount() == 0) {
throw new Apg.GeneralException(getString(R.string.error_keyNeedsMasterKey)); throw new PGPHelper.GeneralException(getString(R.string.error_keyNeedsMasterKey));
} }
for (int i = 0; i < keyEditors.getChildCount(); ++i) { for (int i = 0; i < keyEditors.getChildCount(); ++i) {

View File

@ -21,10 +21,11 @@ import org.spongycastle.openpgp.PGPPublicKey;
import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.Preferences; import org.thialfihar.android.apg.Preferences;
import org.thialfihar.android.apg.helper.FileHelper;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.service.ApgHandler; import org.thialfihar.android.apg.service.ApgHandler;
import org.thialfihar.android.apg.service.ApgService; import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.ui.dialog.DeleteFileDialogFragment; import org.thialfihar.android.apg.ui.dialog.DeleteFileDialogFragment;
@ -33,7 +34,6 @@ import org.thialfihar.android.apg.ui.dialog.PassphraseDialogFragment;
import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment; import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment;
import org.thialfihar.android.apg.util.Choice; import org.thialfihar.android.apg.util.Choice;
import org.thialfihar.android.apg.util.Compatibility; import org.thialfihar.android.apg.util.Compatibility;
import org.thialfihar.android.apg.util.Utils;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar;
@ -181,6 +181,18 @@ public class EncryptActivity extends SherlockFragmentActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.encrypt); setContentView(R.layout.encrypt);
// set actionbar without home button if called from another app
final ActionBar actionBar = getSupportActionBar();
Log.d(Constants.TAG, "calling package (only set when using startActivityForResult)="
+ getCallingPackage());
if (getCallingPackage() != null && getCallingPackage().equals(PGPHelper.PACKAGE_NAME)) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
} else {
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setHomeButtonEnabled(false);
}
mGenerateSignature = false; mGenerateSignature = false;
mSource = (ViewFlipper) findViewById(R.id.source); mSource = (ViewFlipper) findViewById(R.id.source);
@ -268,7 +280,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
mBrowse = (ImageButton) findViewById(R.id.btn_browse); mBrowse = (ImageButton) findViewById(R.id.btn_browse);
mBrowse.setOnClickListener(new View.OnClickListener() { mBrowse.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { public void onClick(View v) {
Utils.openFile(EncryptActivity.this, mFilename.getText().toString(), "*/*", FileHelper.openFile(EncryptActivity.this, mFilename.getText().toString(), "*/*",
Id.request.filename); Id.request.filename);
} }
}); });
@ -323,61 +335,49 @@ public class EncryptActivity extends SherlockFragmentActivity {
}); });
mIntent = getIntent(); mIntent = getIntent();
if (Apg.Intent.ENCRYPT.equals(mIntent.getAction()) if (PGPHelper.Intent.ENCRYPT.equals(mIntent.getAction())
|| Apg.Intent.ENCRYPT_FILE.equals(mIntent.getAction()) || PGPHelper.Intent.ENCRYPT_FILE.equals(mIntent.getAction())
|| Apg.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction()) || PGPHelper.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction())
|| Apg.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { || PGPHelper.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) {
mContentUri = mIntent.getData(); mContentUri = mIntent.getData();
Bundle extras = mIntent.getExtras(); Bundle extras = mIntent.getExtras();
if (extras == null) { if (extras == null) {
extras = new Bundle(); extras = new Bundle();
} }
// set actionbar without home button if called from another app if (PGPHelper.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction())
final ActionBar actionBar = getSupportActionBar(); || PGPHelper.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) {
Log.d(Constants.TAG, "calling package (only set when using startActivityForResult)="
+ getCallingPackage());
if (getCallingPackage() != null && getCallingPackage().equals(Apg.PACKAGE_NAME)) {
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
} else {
actionBar.setDisplayHomeAsUpEnabled(false);
actionBar.setHomeButtonEnabled(false);
}
if (Apg.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction())
|| Apg.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) {
mReturnResult = true; mReturnResult = true;
} }
if (Apg.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { if (PGPHelper.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) {
mGenerateSignature = true; mGenerateSignature = true;
mOverrideAsciiArmour = true; mOverrideAsciiArmour = true;
mAsciiArmourDemand = false; mAsciiArmourDemand = false;
} }
if (extras.containsKey(Apg.EXTRA_ASCII_ARMOUR)) { if (extras.containsKey(PGPHelper.EXTRA_ASCII_ARMOUR)) {
mAsciiArmourDemand = extras.getBoolean(Apg.EXTRA_ASCII_ARMOUR, true); mAsciiArmourDemand = extras.getBoolean(PGPHelper.EXTRA_ASCII_ARMOUR, true);
mOverrideAsciiArmour = true; mOverrideAsciiArmour = true;
mAsciiArmour.setChecked(mAsciiArmourDemand); mAsciiArmour.setChecked(mAsciiArmourDemand);
} }
mData = extras.getByteArray(Apg.EXTRA_DATA); mData = extras.getByteArray(PGPHelper.EXTRA_DATA);
String textData = null; String textData = null;
if (mData == null) { if (mData == null) {
textData = extras.getString(Apg.EXTRA_TEXT); textData = extras.getString(PGPHelper.EXTRA_TEXT);
} }
mSendTo = extras.getString(Apg.EXTRA_SEND_TO); mSendTo = extras.getString(PGPHelper.EXTRA_SEND_TO);
mSubject = extras.getString(Apg.EXTRA_SUBJECT); mSubject = extras.getString(PGPHelper.EXTRA_SUBJECT);
long signatureKeyId = extras.getLong(Apg.EXTRA_SIGNATURE_KEY_ID); long signatureKeyId = extras.getLong(PGPHelper.EXTRA_SIGNATURE_KEY_ID);
long encryptionKeyIds[] = extras.getLongArray(Apg.EXTRA_ENCRYPTION_KEY_IDS); long encryptionKeyIds[] = extras.getLongArray(PGPHelper.EXTRA_ENCRYPTION_KEY_IDS);
if (signatureKeyId != 0) { if (signatureKeyId != 0) {
PGPSecretKeyRing keyRing = Apg.getSecretKeyRing(signatureKeyId); PGPSecretKeyRing keyRing = PGPHelper.getSecretKeyRing(signatureKeyId);
PGPSecretKey masterKey = null; PGPSecretKey masterKey = null;
if (keyRing != null) { if (keyRing != null) {
masterKey = Apg.getMasterKey(keyRing); masterKey = PGPHelper.getMasterKey(keyRing);
if (masterKey != null) { if (masterKey != null) {
Vector<PGPSecretKey> signKeys = Apg.getUsableSigningKeys(keyRing); Vector<PGPSecretKey> signKeys = PGPHelper.getUsableSigningKeys(keyRing);
if (signKeys.size() > 0) { if (signKeys.size() > 0) {
setSecretKeyId(masterKey.getKeyID()); setSecretKeyId(masterKey.getKeyID());
} }
@ -388,16 +388,16 @@ public class EncryptActivity extends SherlockFragmentActivity {
if (encryptionKeyIds != null) { if (encryptionKeyIds != null) {
Vector<Long> goodIds = new Vector<Long>(); Vector<Long> goodIds = new Vector<Long>();
for (int i = 0; i < encryptionKeyIds.length; ++i) { for (int i = 0; i < encryptionKeyIds.length; ++i) {
PGPPublicKeyRing keyRing = Apg.getPublicKeyRing(encryptionKeyIds[i]); PGPPublicKeyRing keyRing = PGPHelper.getPublicKeyRing(encryptionKeyIds[i]);
PGPPublicKey masterKey = null; PGPPublicKey masterKey = null;
if (keyRing == null) { if (keyRing == null) {
continue; continue;
} }
masterKey = Apg.getMasterKey(keyRing); masterKey = PGPHelper.getMasterKey(keyRing);
if (masterKey == null) { if (masterKey == null) {
continue; continue;
} }
Vector<PGPPublicKey> encryptKeys = Apg.getUsableEncryptKeys(keyRing); Vector<PGPPublicKey> encryptKeys = PGPHelper.getUsableEncryptKeys(keyRing);
if (encryptKeys.size() == 0) { if (encryptKeys.size() == 0) {
continue; continue;
} }
@ -411,9 +411,9 @@ public class EncryptActivity extends SherlockFragmentActivity {
} }
} }
if (Apg.Intent.ENCRYPT.equals(mIntent.getAction()) if (PGPHelper.Intent.ENCRYPT.equals(mIntent.getAction())
|| Apg.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction()) || PGPHelper.Intent.ENCRYPT_AND_RETURN.equals(mIntent.getAction())
|| Apg.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) { || PGPHelper.Intent.GENERATE_SIGNATURE.equals(mIntent.getAction())) {
if (textData != null) { if (textData != null) {
mMessage.setText(textData); mMessage.setText(textData);
} }
@ -422,7 +422,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
while (mSource.getCurrentView().getId() != R.id.sourceMessage) { while (mSource.getCurrentView().getId() != R.id.sourceMessage) {
mSource.showNext(); mSource.showNext();
} }
} else if (Apg.Intent.ENCRYPT_FILE.equals(mIntent.getAction())) { } else if (PGPHelper.Intent.ENCRYPT_FILE.equals(mIntent.getAction())) {
if ("file".equals(mIntent.getScheme())) { if ("file".equals(mIntent.getScheme())) {
mInputFilename = Uri.decode(mIntent.getDataString().replace("file://", "")); mInputFilename = Uri.decode(mIntent.getDataString().replace("file://", ""));
mFilename.setText(mInputFilename); mFilename.setText(mInputFilename);
@ -651,7 +651,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
return; return;
} }
if (getSecretKeyId() != 0 && Apg.getCachedPassPhrase(getSecretKeyId()) == null) { if (getSecretKeyId() != 0 && PGPHelper.getCachedPassPhrase(getSecretKeyId()) == null) {
showPassphraseDialog(); showPassphraseDialog();
return; return;
@ -659,7 +659,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
} }
if (mEncryptTarget == Id.target.file) { if (mEncryptTarget == Id.target.file) {
askForOutputFilename(); showOutputFileDialog();
} else { } else {
encryptStart(); encryptStart();
} }
@ -676,7 +676,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
public void handleMessage(Message message) { public void handleMessage(Message message) {
if (message.what == PassphraseDialogFragment.MESSAGE_OKAY) { if (message.what == PassphraseDialogFragment.MESSAGE_OKAY) {
if (mEncryptTarget == Id.target.file) { if (mEncryptTarget == Id.target.file) {
askForOutputFilename(); showOutputFileDialog();
} else { } else {
encryptStart(); encryptStart();
} }
@ -692,15 +692,15 @@ public class EncryptActivity extends SherlockFragmentActivity {
messenger, mSecretKeyId); messenger, mSecretKeyId);
passphraseDialog.show(getSupportFragmentManager(), "passphraseDialog"); passphraseDialog.show(getSupportFragmentManager(), "passphraseDialog");
} catch (Apg.GeneralException e) { } catch (PGPHelper.GeneralException e) {
Log.d(Constants.TAG, "No passphrase for this secret key, encrypt directly!"); Log.d(Constants.TAG, "No passphrase for this secret key, encrypt directly!");
// send message to handler to start encryption directly // send message to handler to start encryption directly
returnHandler.sendEmptyMessage(PassphraseDialogFragment.MESSAGE_OKAY); returnHandler.sendEmptyMessage(PassphraseDialogFragment.MESSAGE_OKAY);
} }
} }
private void askForOutputFilename() { private void showOutputFileDialog() {
// Message is received after passphrase is cached // Message is received after file is selected
Handler returnHandler = new Handler() { Handler returnHandler = new Handler() {
@Override @Override
public void handleMessage(Message message) { public void handleMessage(Message message) {
@ -721,7 +721,6 @@ public class EncryptActivity extends SherlockFragmentActivity {
Id.request.output_filename); Id.request.output_filename);
mFileDialog.show(getSupportFragmentManager(), "fileDialog"); mFileDialog.show(getSupportFragmentManager(), "fileDialog");
} }
private void encryptStart() { private void encryptStart() {
@ -743,7 +742,6 @@ public class EncryptActivity extends SherlockFragmentActivity {
if (passPhrase.length() == 0) { if (passPhrase.length() == 0) {
passPhrase = null; passPhrase = null;
} }
// signatureKeyId = Id.key.symmetric;
data.putString(ApgService.SYMMETRIC_PASSPHRASE, passPhrase); data.putString(ApgService.SYMMETRIC_PASSPHRASE, passPhrase);
} else { } else {
@ -776,13 +774,13 @@ public class EncryptActivity extends SherlockFragmentActivity {
intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_ENCRYPT_SIGN_BYTES); intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_ENCRYPT_SIGN_BYTES);
if (mData != null) { if (mData != null) {
data.putByteArray(ApgService.BYTES, mData); data.putByteArray(ApgService.MESSAGE_BYTES, mData);
} else { } else {
String message = mMessage.getText().toString(); String message = mMessage.getText().toString();
if (signOnly && !mReturnResult) { if (signOnly && !mReturnResult) {
fixBadCharactersForGmail(message); fixBadCharactersForGmail(message);
} }
data.putByteArray(ApgService.BYTES, message.getBytes()); data.putByteArray(ApgService.MESSAGE_BYTES, message.getBytes());
} }
} }
@ -919,11 +917,11 @@ public class EncryptActivity extends SherlockFragmentActivity {
} else { } else {
String uid = getResources().getString(R.string.unknownUserId); String uid = getResources().getString(R.string.unknownUserId);
String uidExtra = ""; String uidExtra = "";
PGPSecretKeyRing keyRing = Apg.getSecretKeyRing(getSecretKeyId()); PGPSecretKeyRing keyRing = PGPHelper.getSecretKeyRing(getSecretKeyId());
if (keyRing != null) { if (keyRing != null) {
PGPSecretKey key = Apg.getMasterKey(keyRing); PGPSecretKey key = PGPHelper.getMasterKey(keyRing);
if (key != null) { if (key != null) {
String userId = Apg.getMainUserIdSafe(this, key); String userId = PGPHelper.getMainUserIdSafe(this, key);
String chunks[] = userId.split(" <", 2); String chunks[] = userId.split(" <", 2);
uid = chunks[0]; uid = chunks[0];
if (chunks.length > 1) { if (chunks.length > 1) {
@ -957,7 +955,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
initialKeyIds[i] = keyIds.get(i); initialKeyIds[i] = keyIds.get(i);
} }
} }
intent.putExtra(Apg.EXTRA_SELECTION, initialKeyIds); intent.putExtra(PGPHelper.EXTRA_SELECTION, initialKeyIds);
startActivityForResult(intent, Id.request.public_keys); startActivityForResult(intent, Id.request.public_keys);
} }
@ -1000,7 +998,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
case Id.request.public_keys: { case Id.request.public_keys: {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
Bundle bundle = data.getExtras(); Bundle bundle = data.getExtras();
mEncryptionKeyIds = bundle.getLongArray(Apg.EXTRA_SELECTION); mEncryptionKeyIds = bundle.getLongArray(PGPHelper.EXTRA_SELECTION);
} }
updateView(); updateView();
break; break;
@ -1009,7 +1007,7 @@ public class EncryptActivity extends SherlockFragmentActivity {
case Id.request.secret_keys: { case Id.request.secret_keys: {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
Bundle bundle = data.getExtras(); Bundle bundle = data.getExtras();
setSecretKeyId(bundle.getLong(Apg.EXTRA_KEY_ID)); setSecretKeyId(bundle.getLong(PGPHelper.EXTRA_KEY_ID));
} else { } else {
setSecretKeyId(Id.key.none); setSecretKeyId(Id.key.none);
} }

View File

@ -21,8 +21,8 @@ import java.io.InputStream;
import java.util.Vector; import java.util.Vector;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.util.Choice; import org.thialfihar.android.apg.util.Choice;
import android.content.Intent; import android.content.Intent;
@ -83,7 +83,7 @@ public class GeneralActivity extends BaseActivity {
int contentType = Id.content.unknown; int contentType = Id.content.unknown;
try { try {
contentType = Apg.getStreamContent(this, inStream); contentType = PGPHelper.getStreamContent(this, inStream);
inStream.close(); inStream.close();
} catch (IOException e) { } catch (IOException e) {
// just means that there's no PGP data in there // just means that there's no PGP data in there
@ -134,10 +134,10 @@ public class GeneralActivity extends BaseActivity {
case Id.choice.action.encrypt: { case Id.choice.action.encrypt: {
intent.setClass(this, EncryptActivity.class); intent.setClass(this, EncryptActivity.class);
if (mDataString != null) { if (mDataString != null) {
intent.setAction(Apg.Intent.ENCRYPT); intent.setAction(PGPHelper.Intent.ENCRYPT);
intent.putExtra(Apg.EXTRA_TEXT, mDataString); intent.putExtra(PGPHelper.EXTRA_TEXT, mDataString);
} else if (mDataUri != null) { } else if (mDataUri != null) {
intent.setAction(Apg.Intent.ENCRYPT_FILE); intent.setAction(PGPHelper.Intent.ENCRYPT_FILE);
intent.setDataAndType(mDataUri, mIntent.getType()); intent.setDataAndType(mDataUri, mIntent.getType());
} }
@ -147,10 +147,10 @@ public class GeneralActivity extends BaseActivity {
case Id.choice.action.decrypt: { case Id.choice.action.decrypt: {
intent.setClass(this, DecryptActivity.class); intent.setClass(this, DecryptActivity.class);
if (mDataString != null) { if (mDataString != null) {
intent.setAction(Apg.Intent.DECRYPT); intent.setAction(PGPHelper.Intent.DECRYPT);
intent.putExtra(Apg.EXTRA_TEXT, mDataString); intent.putExtra(PGPHelper.EXTRA_TEXT, mDataString);
} else if (mDataUri != null) { } else if (mDataUri != null) {
intent.setAction(Apg.Intent.DECRYPT_FILE); intent.setAction(PGPHelper.Intent.DECRYPT_FILE);
intent.setDataAndType(mDataUri, mIntent.getType()); intent.setDataAndType(mDataUri, mIntent.getType());
} }
@ -159,9 +159,9 @@ public class GeneralActivity extends BaseActivity {
case Id.choice.action.import_public: { case Id.choice.action.import_public: {
intent.setClass(this, PublicKeyListActivity.class); intent.setClass(this, PublicKeyListActivity.class);
intent.setAction(Apg.Intent.IMPORT); intent.setAction(PGPHelper.Intent.IMPORT);
if (mDataString != null) { if (mDataString != null) {
intent.putExtra(Apg.EXTRA_TEXT, mDataString); intent.putExtra(PGPHelper.EXTRA_TEXT, mDataString);
} else if (mDataUri != null) { } else if (mDataUri != null) {
intent.setDataAndType(mDataUri, mIntent.getType()); intent.setDataAndType(mDataUri, mIntent.getType());
} }
@ -170,9 +170,9 @@ public class GeneralActivity extends BaseActivity {
case Id.choice.action.import_secret: { case Id.choice.action.import_secret: {
intent.setClass(this, SecretKeyListActivity.class); intent.setClass(this, SecretKeyListActivity.class);
intent.setAction(Apg.Intent.IMPORT); intent.setAction(PGPHelper.Intent.IMPORT);
if (mDataString != null) { if (mDataString != null) {
intent.putExtra(Apg.EXTRA_TEXT, mDataString); intent.putExtra(PGPHelper.EXTRA_TEXT, mDataString);
} else if (mDataUri != null) { } else if (mDataUri != null) {
intent.setDataAndType(mDataUri, mIntent.getType()); intent.setDataAndType(mDataUri, mIntent.getType());
} }

View File

@ -18,7 +18,7 @@ package org.thialfihar.android.apg.ui;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.util.Utils; import org.thialfihar.android.apg.helper.OtherHelper;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@ -52,7 +52,7 @@ public class HelpFragmentAbout extends SherlockFragment {
View view = inflater.inflate(R.layout.help_fragment_about, container, false); View view = inflater.inflate(R.layout.help_fragment_about, container, false);
// load html from html file from /res/raw // load html from html file from /res/raw
String aboutText = Utils.readContentFromResource(this.getActivity(), R.raw.help_about); String aboutText = OtherHelper.readContentFromResource(this.getActivity(), R.raw.help_about);
TextView versionText = (TextView) view.findViewById(R.id.help_about_version); TextView versionText = (TextView) view.findViewById(R.id.help_about_version);
versionText.setText(getString(R.string.help_about_version) + " " + getVersion()); versionText.setText(getString(R.string.help_about_version) + " " + getVersion());

View File

@ -16,7 +16,7 @@
package org.thialfihar.android.apg.ui; package org.thialfihar.android.apg.ui;
import org.thialfihar.android.apg.util.Utils; import org.thialfihar.android.apg.helper.OtherHelper;
import android.app.Activity; import android.app.Activity;
import android.os.Bundle; import android.os.Bundle;
@ -68,7 +68,7 @@ public class HelpFragmentHtml extends SherlockFragment {
htmlFile = getArguments().getInt(ARG_HTML_FILE); htmlFile = getArguments().getInt(ARG_HTML_FILE);
// load html from html file from /res/raw // load html from html file from /res/raw
String helpText = Utils.readContentFromResource(this.getActivity(), htmlFile); String helpText = OtherHelper.readContentFromResource(this.getActivity(), htmlFile);
mActivity = getActivity(); mActivity = getActivity();

View File

@ -1,4 +1,6 @@
/* /*
* Copyright (C) 2011 Senecaso
*
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -19,11 +21,11 @@ import java.io.IOException;
import org.spongycastle.openpgp.PGPKeyRing; import org.spongycastle.openpgp.PGPKeyRing;
import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.HkpKeyServer; import org.thialfihar.android.apg.HkpKeyServer;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.KeyServer.QueryException; import org.thialfihar.android.apg.KeyServer.QueryException;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import android.content.Intent; import android.content.Intent;
@ -60,33 +62,33 @@ public class ImportFromQRCodeActivity extends BaseActivity {
HkpKeyServer server = new HkpKeyServer(mPreferences.getKeyServers()[0]); // TODO: there should be only 1 HkpKeyServer server = new HkpKeyServer(mPreferences.getKeyServers()[0]); // TODO: there should be only 1
String encodedKey = server.get(keyId); String encodedKey = server.get(keyId);
PGPKeyRing keyring = Apg.decodeKeyRing(new ByteArrayInputStream(encodedKey.getBytes())); PGPKeyRing keyring = PGPHelper.decodeKeyRing(new ByteArrayInputStream(encodedKey.getBytes()));
if (keyring != null && keyring instanceof PGPPublicKeyRing) { if (keyring != null && keyring instanceof PGPPublicKeyRing) {
PGPPublicKeyRing publicKeyRing = (PGPPublicKeyRing) keyring; PGPPublicKeyRing publicKeyRing = (PGPPublicKeyRing) keyring;
// make sure the fingerprints match before we cache this thing // make sure the fingerprints match before we cache this thing
String actualFingerprint = Apg.convertToHex(publicKeyRing.getPublicKey().getFingerprint()); String actualFingerprint = PGPHelper.convertToHex(publicKeyRing.getPublicKey().getFingerprint());
if (expectedFingerprint.equals(actualFingerprint)) { if (expectedFingerprint.equals(actualFingerprint)) {
// store the signed key in our local cache // store the signed key in our local cache
int retval = Apg.storeKeyRingInCache(publicKeyRing); int retval = PGPHelper.storeKeyRingInCache(publicKeyRing);
if (retval != Id.return_value.ok && retval != Id.return_value.updated) { if (retval != Id.return_value.ok && retval != Id.return_value.updated) {
status.putString(Apg.EXTRA_ERROR, "Failed to store signed key in local cache"); status.putString(PGPHelper.EXTRA_ERROR, "Failed to store signed key in local cache");
} else { } else {
Intent intent = new Intent(ImportFromQRCodeActivity.this, SignKeyActivity.class); Intent intent = new Intent(ImportFromQRCodeActivity.this, SignKeyActivity.class);
intent.putExtra(Apg.EXTRA_KEY_ID, keyId); intent.putExtra(PGPHelper.EXTRA_KEY_ID, keyId);
startActivityForResult(intent, Id.request.sign_key); startActivityForResult(intent, Id.request.sign_key);
} }
} else { } else {
status.putString(Apg.EXTRA_ERROR, "Scanned fingerprint does NOT match the fingerprint of the received key. You shouldnt trust this key."); status.putString(PGPHelper.EXTRA_ERROR, "Scanned fingerprint does NOT match the fingerprint of the received key. You shouldnt trust this key.");
} }
} }
} catch (QueryException e) { } catch (QueryException e) {
Log.e(TAG, "Failed to query KeyServer", e); Log.e(TAG, "Failed to query KeyServer", e);
status.putString(Apg.EXTRA_ERROR, "Failed to query KeyServer"); status.putString(PGPHelper.EXTRA_ERROR, "Failed to query KeyServer");
status.putInt(Constants.extras.STATUS, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, "Failed to query KeyServer", e); Log.e(TAG, "Failed to query KeyServer", e);
status.putString(Apg.EXTRA_ERROR, "Failed to query KeyServer"); status.putString(PGPHelper.EXTRA_ERROR, "Failed to query KeyServer");
status.putInt(Constants.extras.STATUS, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
} }
} }
@ -140,7 +142,7 @@ public class ImportFromQRCodeActivity extends BaseActivity {
super.doneCallback(msg); super.doneCallback(msg);
Bundle data = msg.getData(); Bundle data = msg.getData();
String error = data.getString(Apg.EXTRA_ERROR); String error = data.getString(PGPHelper.EXTRA_ERROR);
if (error != null) { if (error != null) {
Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT).show(); Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT).show();
return; return;

View File

@ -19,14 +19,14 @@ package org.thialfihar.android.apg.ui;
import org.spongycastle.openpgp.PGPException; import org.spongycastle.openpgp.PGPException;
import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.FileDialog;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.InputData; import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.provider.KeyRings; import org.thialfihar.android.apg.provider.KeyRings;
import org.thialfihar.android.apg.provider.Keys; import org.thialfihar.android.apg.provider.Keys;
import org.thialfihar.android.apg.provider.UserIds; import org.thialfihar.android.apg.provider.UserIds;
import org.thialfihar.android.apg.ui.dialog.FileDialogFragment;
import org.thialfihar.android.apg.util.InputData;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.MenuItem;
@ -42,7 +42,10 @@ import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder; import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.os.Messenger;
import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
@ -83,6 +86,8 @@ public class KeyListActivity extends BaseActivity {
protected int mKeyType = Id.type.public_key; protected int mKeyType = Id.type.public_key;
FileDialogFragment mFileDialog;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -134,11 +139,11 @@ public class KeyListActivity extends BaseActivity {
mListAdapter = new KeyListAdapter(this, searchString); mListAdapter = new KeyListAdapter(this, searchString);
mList.setAdapter(mListAdapter); mList.setAdapter(mListAdapter);
if (Apg.Intent.IMPORT.equals(intent.getAction())) { if (PGPHelper.Intent.IMPORT.equals(intent.getAction())) {
if ("file".equals(intent.getScheme()) && intent.getDataString() != null) { if ("file".equals(intent.getScheme()) && intent.getDataString() != null) {
mImportFilename = Uri.decode(intent.getDataString().replace("file://", "")); mImportFilename = Uri.decode(intent.getDataString().replace("file://", ""));
} else { } else {
mImportData = intent.getStringExtra(Apg.EXTRA_TEXT); mImportData = intent.getStringExtra(PGPHelper.EXTRA_TEXT);
} }
importKeys(); importKeys();
} }
@ -148,12 +153,14 @@ public class KeyListActivity extends BaseActivity {
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case Id.menu.option.import_keys: { case Id.menu.option.import_keys: {
showDialog(Id.dialog.import_keys); // showDialog(Id.dialog.import_keys);
showImportKeysDialog();
return true; return true;
} }
case Id.menu.option.export_keys: { case Id.menu.option.export_keys: {
showDialog(Id.dialog.export_keys); // showDialog(Id.dialog.export_keys);
showExportKeysDialog(false);
return true; return true;
} }
@ -163,6 +170,59 @@ public class KeyListActivity extends BaseActivity {
} }
} }
private void showImportKeysDialog() {
// Message is received after file is selected
Handler returnHandler = new Handler() {
@Override
public void handleMessage(Message message) {
if (message.what == FileDialogFragment.MESSAGE_OKAY) {
Bundle data = message.getData();
mImportFilename = data.getString(FileDialogFragment.MESSAGE_DATA_FILENAME);
mDeleteAfterImport = data.getBoolean(FileDialogFragment.MESSAGE_DATA_CHECKED);
importKeys();
}
}
};
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(returnHandler);
mFileDialog = FileDialogFragment.newInstance(messenger,
getString(R.string.title_importKeys), getString(R.string.specifyFileToImportFrom),
mImportFilename, null, Id.request.filename);
mFileDialog.show(getSupportFragmentManager(), "fileDialog");
}
private void showExportKeysDialog(boolean singleKeyExport) {
String title = (singleKeyExport ? getString(R.string.title_exportKey)
: getString(R.string.title_exportKeys));
String message = getString(mKeyType == Id.type.public_key ? R.string.specifyFileToExportTo
: R.string.specifyFileToExportSecretKeysTo);
// Message is received after file is selected
Handler returnHandler = new Handler() {
@Override
public void handleMessage(Message message) {
if (message.what == FileDialogFragment.MESSAGE_OKAY) {
Bundle data = message.getData();
mExportFilename = data.getString(FileDialogFragment.MESSAGE_DATA_FILENAME);
exportKeys();
}
}
};
// Create a new Messenger for the communication back
Messenger messenger = new Messenger(returnHandler);
mFileDialog = FileDialogFragment.newInstance(messenger, title, message, mExportFilename,
null, Id.request.filename);
mFileDialog.show(getSupportFragmentManager(), "fileDialog");
}
@Override @Override
public boolean onContextItemSelected(android.view.MenuItem menuItem) { public boolean onContextItemSelected(android.view.MenuItem menuItem) {
ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuItem.getMenuInfo(); ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) menuItem.getMenuInfo();
@ -176,7 +236,7 @@ public class KeyListActivity extends BaseActivity {
switch (menuItem.getItemId()) { switch (menuItem.getItemId()) {
case Id.menu.export: { case Id.menu.export: {
mSelectedItem = groupPosition; mSelectedItem = groupPosition;
showDialog(Id.dialog.export_key); showExportKeysDialog(true);
return true; return true;
} }
@ -194,7 +254,6 @@ public class KeyListActivity extends BaseActivity {
@Override @Override
protected Dialog onCreateDialog(int id) { protected Dialog onCreateDialog(int id) {
boolean singleKeyExport = false;
switch (id) { switch (id) {
case Id.dialog.delete_key: { case Id.dialog.delete_key: {
@ -202,14 +261,14 @@ public class KeyListActivity extends BaseActivity {
mSelectedItem = -1; mSelectedItem = -1;
// TODO: better way to do this? // TODO: better way to do this?
String userId = "<unknown>"; String userId = "<unknown>";
Object keyRing = Apg.getKeyRing(keyRingId); Object keyRing = PGPHelper.getKeyRing(keyRingId);
if (keyRing != null) { if (keyRing != null) {
if (keyRing instanceof PGPPublicKeyRing) { if (keyRing instanceof PGPPublicKeyRing) {
userId = Apg.getMainUserIdSafe(this, userId = PGPHelper.getMainUserIdSafe(this,
Apg.getMasterKey((PGPPublicKeyRing) keyRing)); PGPHelper.getMasterKey((PGPPublicKeyRing) keyRing));
} else { } else {
userId = Apg.getMainUserIdSafe(this, userId = PGPHelper.getMainUserIdSafe(this,
Apg.getMasterKey((PGPSecretKeyRing) keyRing)); PGPHelper.getMasterKey((PGPSecretKeyRing) keyRing));
} }
} }
@ -234,54 +293,6 @@ public class KeyListActivity extends BaseActivity {
return builder.create(); return builder.create();
} }
case Id.dialog.import_keys: {
return FileDialog.build(this, getString(R.string.title_importKeys),
getString(R.string.specifyFileToImportFrom), mImportFilename,
new FileDialog.OnClickListener() {
public void onOkClick(String filename, boolean checked) {
removeDialog(Id.dialog.import_keys);
mDeleteAfterImport = checked;
mImportFilename = filename;
importKeys();
}
public void onCancelClick() {
removeDialog(Id.dialog.import_keys);
}
}, getString(R.string.filemanager_titleOpen),
getString(R.string.filemanager_btnOpen),
getString(R.string.label_deleteAfterImport), Id.request.filename);
}
case Id.dialog.export_key: {
singleKeyExport = true;
// break intentionally omitted, to use the Id.dialog.export_keys dialog
}
case Id.dialog.export_keys: {
String title = (singleKeyExport ? getString(R.string.title_exportKey)
: getString(R.string.title_exportKeys));
final int thisDialogId = (singleKeyExport ? Id.dialog.export_key
: Id.dialog.export_keys);
return FileDialog.build(this, title,
getString(mKeyType == Id.type.public_key ? R.string.specifyFileToExportTo
: R.string.specifyFileToExportSecretKeysTo), mExportFilename,
new FileDialog.OnClickListener() {
public void onOkClick(String filename, boolean checked) {
removeDialog(thisDialogId);
mExportFilename = filename;
exportKeys();
}
public void onCancelClick() {
removeDialog(thisDialogId);
}
}, getString(R.string.filemanager_titleSave),
getString(R.string.filemanager_btnSave), null, Id.request.filename);
}
default: { default: {
return super.onCreateDialog(id); return super.onCreateDialog(id);
} }
@ -325,12 +336,12 @@ public class KeyListActivity extends BaseActivity {
} }
if (mTask == Id.task.import_keys) { if (mTask == Id.task.import_keys) {
data = Apg.importKeyRings(this, mKeyType, new InputData(importInputStream, size), data = PGPHelper.importKeyRings(this, mKeyType, new InputData(importInputStream,
this); size), this);
} else { } else {
Vector<Integer> keyRingIds = new Vector<Integer>(); Vector<Integer> keyRingIds = new Vector<Integer>();
if (mSelectedItem == -1) { if (mSelectedItem == -1) {
keyRingIds = Apg keyRingIds = PGPHelper
.getKeyRingIds(mKeyType == Id.type.public_key ? Id.database.type_public .getKeyRingIds(mKeyType == Id.type.public_key ? Id.database.type_public
: Id.database.type_secret); : Id.database.type_secret);
} else { } else {
@ -338,7 +349,7 @@ public class KeyListActivity extends BaseActivity {
keyRingIds.add(keyRingId); keyRingIds.add(keyRingId);
mSelectedItem = -1; mSelectedItem = -1;
} }
data = Apg.exportKeyRings(this, keyRingIds, exportOutputStream, this); data = PGPHelper.exportKeyRings(this, keyRingIds, exportOutputStream, this);
} }
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
error = getString(R.string.error_fileNotFound); error = getString(R.string.error_fileNotFound);
@ -346,7 +357,7 @@ public class KeyListActivity extends BaseActivity {
error = "" + e; error = "" + e;
} catch (PGPException e) { } catch (PGPException e) {
error = "" + e; error = "" + e;
} catch (Apg.GeneralException e) { } catch (PGPHelper.GeneralException e) {
error = "" + e; error = "" + e;
} }
@ -359,7 +370,7 @@ public class KeyListActivity extends BaseActivity {
} }
if (error != null) { if (error != null) {
data.putString(Apg.EXTRA_ERROR, error); data.putString(PGPHelper.EXTRA_ERROR, error);
} }
msg.setData(data); msg.setData(data);
@ -367,7 +378,7 @@ public class KeyListActivity extends BaseActivity {
} }
protected void deleteKey(int keyRingId) { protected void deleteKey(int keyRingId) {
Apg.deleteKey(keyRingId); PGPHelper.deleteKey(keyRingId);
refreshList(); refreshList();
} }
@ -387,7 +398,7 @@ public class KeyListActivity extends BaseActivity {
case Id.message.import_done: { case Id.message.import_done: {
removeDialog(Id.dialog.importing); removeDialog(Id.dialog.importing);
String error = data.getString(Apg.EXTRA_ERROR); String error = data.getString(PGPHelper.EXTRA_ERROR);
if (error != null) { if (error != null) {
Toast.makeText(KeyListActivity.this, getString(R.string.errorMessage, error), Toast.makeText(KeyListActivity.this, getString(R.string.errorMessage, error),
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
@ -434,7 +445,7 @@ public class KeyListActivity extends BaseActivity {
case Id.message.export_done: { case Id.message.export_done: {
removeDialog(Id.dialog.exporting); removeDialog(Id.dialog.exporting);
String error = data.getString(Apg.EXTRA_ERROR); String error = data.getString(PGPHelper.EXTRA_ERROR);
if (error != null) { if (error != null) {
Toast.makeText(KeyListActivity.this, getString(R.string.errorMessage, error), Toast.makeText(KeyListActivity.this, getString(R.string.errorMessage, error),
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
@ -508,7 +519,7 @@ public class KeyListActivity extends BaseActivity {
mSearchString = searchString; mSearchString = searchString;
mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mDatabase = Apg.getDatabase().db(); mDatabase = PGPHelper.getDatabase().db();
SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(KeyRings.TABLE_NAME + " INNER JOIN " + Keys.TABLE_NAME + " ON " + "(" qb.setTables(KeyRings.TABLE_NAME + " INNER JOIN " + Keys.TABLE_NAME + " ON " + "("
+ KeyRings.TABLE_NAME + "." + KeyRings._ID + " = " + Keys.TABLE_NAME + "." + KeyRings.TABLE_NAME + "." + KeyRings._ID + " = " + Keys.TABLE_NAME + "."
@ -600,7 +611,8 @@ public class KeyListActivity extends BaseActivity {
c.close(); c.close();
if (masterKeyId != -1) { if (masterKeyId != -1) {
children.insertElementAt(new KeyChild(Apg.getFingerPrint(fingerPrintId), true), 0); children.insertElementAt(
new KeyChild(PGPHelper.getFingerPrint(fingerPrintId), true), 0);
c = mDatabase.query(UserIds.TABLE_NAME, new String[] { UserIds.USER_ID, // 0 c = mDatabase.query(UserIds.TABLE_NAME, new String[] { UserIds.USER_ID, // 0
}, UserIds.KEY_ID + " = ? AND " + UserIds.RANK + " > 0", new String[] { "" }, UserIds.KEY_ID + " = ? AND " + UserIds.RANK + " > 0", new String[] { ""
+ masterKeyId }, null, null, UserIds.RANK + " ASC"); + masterKeyId }, null, null, UserIds.RANK + " ASC");
@ -703,10 +715,10 @@ public class KeyListActivity extends BaseActivity {
} }
TextView keyId = (TextView) view.findViewById(R.id.keyId); TextView keyId = (TextView) view.findViewById(R.id.keyId);
String keyIdStr = Apg.getSmallFingerPrint(child.keyId); String keyIdStr = PGPHelper.getSmallFingerPrint(child.keyId);
keyId.setText(keyIdStr); keyId.setText(keyIdStr);
TextView keyDetails = (TextView) view.findViewById(R.id.keyDetails); TextView keyDetails = (TextView) view.findViewById(R.id.keyDetails);
String algorithmStr = Apg.getAlgorithmInfo(child.algorithm, child.keySize); String algorithmStr = PGPHelper.getAlgorithmInfo(child.algorithm, child.keySize);
keyDetails.setText("(" + algorithmStr + ")"); keyDetails.setText("(" + algorithmStr + ")");
ImageView encryptIcon = (ImageView) view.findViewById(R.id.ic_encryptKey); ImageView encryptIcon = (ImageView) view.findViewById(R.id.ic_encryptKey);
@ -745,16 +757,13 @@ public class KeyListActivity extends BaseActivity {
switch (requestCode) { switch (requestCode) {
case Id.request.filename: { case Id.request.filename: {
if (resultCode == RESULT_OK && data != null) { if (resultCode == RESULT_OK && data != null) {
String filename = data.getDataString(); try {
if (filename != null) { String path = data.getData().getPath();
// Get rid of URI prefix: Log.d(Constants.TAG, "path=" + path);
if (filename.startsWith("file://")) {
filename = filename.substring(7);
}
// replace %20 and so on
filename = Uri.decode(filename);
FileDialog.setFilename(filename); mFileDialog.setFilename(path);
} catch (NullPointerException e) {
Log.e(Constants.TAG, "Nullpointer while retrieving path!");
} }
} }
return; return;

View File

@ -1,4 +1,6 @@
/* /*
* Copyright (C) 2011 Senecaso
*
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -16,11 +18,11 @@ package org.thialfihar.android.apg.ui;
import org.spongycastle.openpgp.PGPKeyRing; import org.spongycastle.openpgp.PGPKeyRing;
import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.HkpKeyServer; import org.thialfihar.android.apg.HkpKeyServer;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.helper.PGPHelper;
import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.MenuItem;
@ -49,7 +51,10 @@ public class KeyServerExportActivity extends BaseActivity {
switch (item.getItemId()) { switch (item.getItemId()) {
case android.R.id.home: case android.R.id.home:
startActivity(new Intent(this, PublicKeyListActivity.class)); // app icon in Action Bar clicked; go home
Intent intent = new Intent(this, PublicKeyListActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true; return true;
default: default:
@ -94,11 +99,11 @@ public class KeyServerExportActivity extends BaseActivity {
HkpKeyServer server = new HkpKeyServer((String) keyServer.getSelectedItem()); HkpKeyServer server = new HkpKeyServer((String) keyServer.getSelectedItem());
int keyRingId = getIntent().getIntExtra(Apg.EXTRA_KEY_ID, -1); int keyRingId = getIntent().getIntExtra(PGPHelper.EXTRA_KEY_ID, -1);
PGPKeyRing keyring = Apg.getKeyRing(keyRingId); PGPKeyRing keyring = PGPHelper.getKeyRing(keyRingId);
if (keyring != null && keyring instanceof PGPPublicKeyRing) { if (keyring != null && keyring instanceof PGPPublicKeyRing) {
boolean uploaded = Apg.uploadKeyRingToServer(server, (PGPPublicKeyRing) keyring); boolean uploaded = PGPHelper.uploadKeyRingToServer(server, (PGPPublicKeyRing) keyring);
if (!uploaded) { if (!uploaded) {
error = "Unable to export key to selected server"; error = "Unable to export key to selected server";
} }
@ -107,7 +112,7 @@ public class KeyServerExportActivity extends BaseActivity {
data.putInt(Constants.extras.STATUS, Id.message.export_done); data.putInt(Constants.extras.STATUS, Id.message.export_done);
if (error != null) { if (error != null) {
data.putString(Apg.EXTRA_ERROR, error); data.putString(PGPHelper.EXTRA_ERROR, error);
} }
msg.setData(data); msg.setData(data);
@ -119,7 +124,7 @@ public class KeyServerExportActivity extends BaseActivity {
super.doneCallback(msg); super.doneCallback(msg);
Bundle data = msg.getData(); Bundle data = msg.getData();
String error = data.getString(Apg.EXTRA_ERROR); String error = data.getString(PGPHelper.EXTRA_ERROR);
if (error != null) { if (error != null) {
Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT) Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT)
.show(); .show();

View File

@ -18,7 +18,6 @@ import java.util.List;
import java.util.Vector; import java.util.Vector;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.HkpKeyServer; import org.thialfihar.android.apg.HkpKeyServer;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
@ -26,6 +25,7 @@ import org.thialfihar.android.apg.KeyServer.InsufficientQuery;
import org.thialfihar.android.apg.KeyServer.KeyInfo; import org.thialfihar.android.apg.KeyServer.KeyInfo;
import org.thialfihar.android.apg.KeyServer.QueryException; import org.thialfihar.android.apg.KeyServer.QueryException;
import org.thialfihar.android.apg.KeyServer.TooManyResponses; import org.thialfihar.android.apg.KeyServer.TooManyResponses;
import org.thialfihar.android.apg.helper.PGPHelper;
import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.MenuItem;
@ -71,7 +71,10 @@ public class KeyServerQueryActivity extends BaseActivity {
switch (item.getItemId()) { switch (item.getItemId()) {
case android.R.id.home: case android.R.id.home:
startActivity(new Intent(this, PublicKeyListActivity.class)); // app icon in Action Bar clicked; go home
Intent intent = new Intent(this, PublicKeyListActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true; return true;
default: default:
@ -118,11 +121,11 @@ public class KeyServerQueryActivity extends BaseActivity {
}); });
Intent intent = getIntent(); Intent intent = getIntent();
if (Apg.Intent.LOOK_UP_KEY_ID.equals(intent.getAction()) if (PGPHelper.Intent.LOOK_UP_KEY_ID.equals(intent.getAction())
|| Apg.Intent.LOOK_UP_KEY_ID_AND_RETURN.equals(intent.getAction())) { || PGPHelper.Intent.LOOK_UP_KEY_ID_AND_RETURN.equals(intent.getAction())) {
long keyId = intent.getLongExtra(Apg.EXTRA_KEY_ID, 0); long keyId = intent.getLongExtra(PGPHelper.EXTRA_KEY_ID, 0);
if (keyId != 0) { if (keyId != 0) {
String query = "0x" + Apg.keyToHex(keyId); String query = "0x" + PGPHelper.keyToHex(keyId);
mQuery.setText(query); mQuery.setText(query);
search(query); search(query);
} }
@ -176,7 +179,7 @@ public class KeyServerQueryActivity extends BaseActivity {
data.putInt(Constants.extras.STATUS, Id.message.done); data.putInt(Constants.extras.STATUS, Id.message.done);
if (error != null) { if (error != null) {
data.putString(Apg.EXTRA_ERROR, error); data.putString(PGPHelper.EXTRA_ERROR, error);
} }
msg.setData(data); msg.setData(data);
@ -190,7 +193,7 @@ public class KeyServerQueryActivity extends BaseActivity {
removeDialog(Id.dialog.querying); removeDialog(Id.dialog.querying);
Bundle data = msg.getData(); Bundle data = msg.getData();
String error = data.getString(Apg.EXTRA_ERROR); String error = data.getString(PGPHelper.EXTRA_ERROR);
if (error != null) { if (error != null) {
Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT) Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT)
.show(); .show();
@ -205,10 +208,10 @@ public class KeyServerQueryActivity extends BaseActivity {
} }
} else if (mQueryType == Id.keyserver.get) { } else if (mQueryType == Id.keyserver.get) {
Intent orgIntent = getIntent(); Intent orgIntent = getIntent();
if (Apg.Intent.LOOK_UP_KEY_ID_AND_RETURN.equals(orgIntent.getAction())) { if (PGPHelper.Intent.LOOK_UP_KEY_ID_AND_RETURN.equals(orgIntent.getAction())) {
if (mKeyData != null) { if (mKeyData != null) {
Intent intent = new Intent(); Intent intent = new Intent();
intent.putExtra(Apg.EXTRA_TEXT, mKeyData); intent.putExtra(PGPHelper.EXTRA_TEXT, mKeyData);
setResult(RESULT_OK, intent); setResult(RESULT_OK, intent);
} else { } else {
setResult(RESULT_CANCELED); setResult(RESULT_CANCELED);
@ -217,8 +220,8 @@ public class KeyServerQueryActivity extends BaseActivity {
} else { } else {
if (mKeyData != null) { if (mKeyData != null) {
Intent intent = new Intent(this, PublicKeyListActivity.class); Intent intent = new Intent(this, PublicKeyListActivity.class);
intent.setAction(Apg.Intent.IMPORT); intent.setAction(PGPHelper.Intent.IMPORT);
intent.putExtra(Apg.EXTRA_TEXT, mKeyData); intent.putExtra(PGPHelper.EXTRA_TEXT, mKeyData);
startActivity(intent); startActivity(intent);
} }
} }
@ -284,7 +287,7 @@ public class KeyServerQueryActivity extends BaseActivity {
mainUserId.setText(userId); mainUserId.setText(userId);
} }
keyId.setText(Apg.getSmallFingerPrint(keyInfo.keyId)); keyId.setText(PGPHelper.getSmallFingerPrint(keyInfo.keyId));
if (mainUserIdRest.getText().length() == 0) { if (mainUserIdRest.getText().length() == 0) {
mainUserIdRest.setVisibility(View.GONE); mainUserIdRest.setVisibility(View.GONE);

View File

@ -20,8 +20,8 @@ import java.util.Vector;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Preferences; import org.thialfihar.android.apg.Preferences;
import org.thialfihar.android.apg.helper.PGPHelper;
import android.app.ListActivity; import android.app.ListActivity;
import android.content.Context; import android.content.Context;
@ -121,11 +121,11 @@ public class MailListActivity extends ListActivity {
String data = messageCursor.getString(bodyIndex); String data = messageCursor.getString(bodyIndex);
data = Html.fromHtml(data).toString(); data = Html.fromHtml(data).toString();
boolean signedOnly = false; boolean signedOnly = false;
Matcher matcher = Apg.PGP_MESSAGE.matcher(data); Matcher matcher = PGPHelper.PGP_MESSAGE.matcher(data);
if (matcher.matches()) { if (matcher.matches()) {
data = matcher.group(1); data = matcher.group(1);
} else { } else {
matcher = Apg.PGP_SIGNED_MESSAGE.matcher(data); matcher = PGPHelper.PGP_SIGNED_MESSAGE.matcher(data);
if (matcher.matches()) { if (matcher.matches()) {
data = matcher.group(1); data = matcher.group(1);
signedOnly = true; signedOnly = true;
@ -149,11 +149,11 @@ public class MailListActivity extends ListActivity {
getListView().setOnItemClickListener(new OnItemClickListener() { getListView().setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> arg0, View v, int position, long id) { public void onItemClick(AdapterView<?> arg0, View v, int position, long id) {
Intent intent = new Intent(MailListActivity.this, DecryptActivity.class); Intent intent = new Intent(MailListActivity.this, DecryptActivity.class);
intent.setAction(Apg.Intent.DECRYPT); intent.setAction(PGPHelper.Intent.DECRYPT);
Message message = (Message) ((MailboxAdapter) getListAdapter()).getItem(position); Message message = (Message) ((MailboxAdapter) getListAdapter()).getItem(position);
intent.putExtra(Apg.EXTRA_TEXT, message.data); intent.putExtra(PGPHelper.EXTRA_TEXT, message.data);
intent.putExtra(Apg.EXTRA_SUBJECT, message.subject); intent.putExtra(PGPHelper.EXTRA_SUBJECT, message.subject);
intent.putExtra(Apg.EXTRA_REPLY_TO, message.replyTo); intent.putExtra(PGPHelper.EXTRA_REPLY_TO, message.replyTo);
startActivity(intent); startActivity(intent);
} }
}); });

View File

@ -20,9 +20,9 @@ package org.thialfihar.android.apg.ui;
import java.security.Security; import java.security.Security;
import org.spongycastle.jce.provider.BouncyCastleProvider; import org.spongycastle.jce.provider.BouncyCastleProvider;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.helper.PGPHelper;
import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.app.SherlockActivity;
@ -48,19 +48,19 @@ public class MainActivity extends SherlockActivity {
public void encryptOnClick(View view) { public void encryptOnClick(View view) {
Intent intent = new Intent(MainActivity.this, EncryptActivity.class); Intent intent = new Intent(MainActivity.this, EncryptActivity.class);
intent.setAction(Apg.Intent.ENCRYPT); intent.setAction(PGPHelper.Intent.ENCRYPT);
startActivityForResult(intent, 0); // used instead of startActivity to get callingPackage startActivityForResult(intent, 0); // used instead of startActivity to get callingPackage
} }
public void decryptOnClick(View view) { public void decryptOnClick(View view) {
Intent intent = new Intent(MainActivity.this, DecryptActivity.class); Intent intent = new Intent(MainActivity.this, DecryptActivity.class);
intent.setAction(Apg.Intent.DECRYPT); intent.setAction(PGPHelper.Intent.DECRYPT);
startActivityForResult(intent, 0); // used instead of startActivity to get callingPackage startActivityForResult(intent, 0); // used instead of startActivity to get callingPackage
} }
public void scanQrcodeOnClick(View view) { public void scanQrcodeOnClick(View view) {
Intent intent = new Intent(this, ImportFromQRCodeActivity.class); Intent intent = new Intent(this, ImportFromQRCodeActivity.class);
intent.setAction(Apg.Intent.IMPORT_FROM_QR_CODE); intent.setAction(PGPHelper.Intent.IMPORT_FROM_QR_CODE);
startActivityForResult(intent, Id.request.import_from_qr_code); startActivityForResult(intent, Id.request.import_from_qr_code);
} }

View File

@ -18,10 +18,10 @@ package org.thialfihar.android.apg.ui;
import org.spongycastle.bcpg.HashAlgorithmTags; import org.spongycastle.bcpg.HashAlgorithmTags;
import org.spongycastle.openpgp.PGPEncryptedData; import org.spongycastle.openpgp.PGPEncryptedData;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.Preferences; import org.thialfihar.android.apg.Preferences;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.passphrase.PassphraseCacheService; import org.thialfihar.android.apg.passphrase.PassphraseCacheService;
import org.thialfihar.android.apg.ui.widget.IntegerListPreference; import org.thialfihar.android.apg.ui.widget.IntegerListPreference;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
@ -36,7 +36,6 @@ import android.preference.CheckBoxPreference;
import android.preference.Preference; import android.preference.Preference;
import android.preference.PreferenceScreen; import android.preference.PreferenceScreen;
public class PreferencesActivity extends SherlockPreferenceActivity { public class PreferencesActivity extends SherlockPreferenceActivity {
private IntegerListPreference mPassPhraseCacheTtl = null; private IntegerListPreference mPassPhraseCacheTtl = null;
private IntegerListPreference mEncryptionAlgorithm = null; private IntegerListPreference mEncryptionAlgorithm = null;
@ -56,6 +55,7 @@ public class PreferencesActivity extends SherlockPreferenceActivity {
final ActionBar actionBar = getSupportActionBar(); final ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(true); actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true); actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
addPreferencesFromResource(R.xml.apg_preferences); addPreferencesFromResource(R.xml.apg_preferences);
@ -68,7 +68,7 @@ public class PreferencesActivity extends SherlockPreferenceActivity {
mPassPhraseCacheTtl.setValue(newValue.toString()); mPassPhraseCacheTtl.setValue(newValue.toString());
mPassPhraseCacheTtl.setSummary(mPassPhraseCacheTtl.getEntry()); mPassPhraseCacheTtl.setSummary(mPassPhraseCacheTtl.getEntry());
mPreferences.setPassPhraseCacheTtl(Integer.parseInt(newValue.toString())); mPreferences.setPassPhraseCacheTtl(Integer.parseInt(newValue.toString()));
// restart cache service with new ttl // restart cache service with new ttl
PassphraseCacheService.startCacheService(PreferencesActivity.this); PassphraseCacheService.startCacheService(PreferencesActivity.this);
return false; return false;
@ -194,8 +194,8 @@ public class PreferencesActivity extends SherlockPreferenceActivity {
.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { .setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) { public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(PreferencesActivity.this, Intent intent = new Intent(PreferencesActivity.this,
KeyServerPreferenceActivity.class); PreferencesKeyServerActivity.class);
intent.putExtra(Apg.EXTRA_KEY_SERVERS, mPreferences.getKeyServers()); intent.putExtra(PGPHelper.EXTRA_KEY_SERVERS, mPreferences.getKeyServers());
startActivityForResult(intent, Id.request.key_server_preference); startActivityForResult(intent, Id.request.key_server_preference);
return false; return false;
} }
@ -209,7 +209,7 @@ public class PreferencesActivity extends SherlockPreferenceActivity {
if (resultCode == RESULT_CANCELED || data == null) { if (resultCode == RESULT_CANCELED || data == null) {
return; return;
} }
String servers[] = data.getStringArrayExtra(Apg.EXTRA_KEY_SERVERS); String servers[] = data.getStringArrayExtra(PGPHelper.EXTRA_KEY_SERVERS);
mPreferences.setKeyServers(servers); mPreferences.setKeyServers(servers);
mKeyServerPreference.setSummary(getResources().getString(R.string.nKeyServers, mKeyServerPreference.setSummary(getResources().getString(R.string.nKeyServers,
servers.length)); servers.length));
@ -228,7 +228,10 @@ public class PreferencesActivity extends SherlockPreferenceActivity {
switch (item.getItemId()) { switch (item.getItemId()) {
case android.R.id.home: case android.R.id.home:
startActivity(new Intent(this, MainActivity.class)); // app icon in Action Bar clicked; go home
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true; return true;
default: default:

View File

@ -18,13 +18,17 @@ package org.thialfihar.android.apg.ui;
import java.util.Vector; import java.util.Vector;
import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.ui.widget.Editor; import org.thialfihar.android.apg.ui.widget.Editor;
import org.thialfihar.android.apg.ui.widget.KeyServerEditor; import org.thialfihar.android.apg.ui.widget.KeyServerEditor;
import org.thialfihar.android.apg.ui.widget.Editor.EditorListener; import org.thialfihar.android.apg.ui.widget.Editor.EditorListener;
import com.actionbarsherlock.app.ActionBar;
import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@ -33,10 +37,9 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView; import android.widget.TextView;
public class KeyServerPreferenceActivity extends BaseActivity implements OnClickListener, public class PreferencesKeyServerActivity extends SherlockActivity implements OnClickListener,
EditorListener { EditorListener {
private LayoutInflater mInflater; private LayoutInflater mInflater;
private ViewGroup mEditors; private ViewGroup mEditors;
@ -44,11 +47,61 @@ public class KeyServerPreferenceActivity extends BaseActivity implements OnClick
private TextView mTitle; private TextView mTitle;
private TextView mSummary; private TextView mSummary;
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
// app icon in Action Bar clicked; go home
Intent intent = new Intent(this, PreferencesActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
return true;
case Id.menu.option.okay:
okClicked();
return true;
case Id.menu.option.cancel:
cancelClicked();
return true;
default:
break;
}
return false;
}
/**
* ActionBar menu is created based on class variables to change it at runtime
*
*/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(1, Id.menu.option.cancel, 0, android.R.string.cancel).setShowAsAction(
MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
menu.add(1, Id.menu.option.okay, 1, android.R.string.ok).setShowAsAction(
MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
return true;
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.key_server_preference); setContentView(R.layout.key_server_preference);
final ActionBar actionBar = getSupportActionBar();
actionBar.setDisplayShowTitleEnabled(true);
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mTitle = (TextView) findViewById(R.id.title); mTitle = (TextView) findViewById(R.id.title);
@ -61,7 +114,7 @@ public class KeyServerPreferenceActivity extends BaseActivity implements OnClick
mAdd.setOnClickListener(this); mAdd.setOnClickListener(this);
Intent intent = getIntent(); Intent intent = getIntent();
String servers[] = intent.getStringArrayExtra(Apg.EXTRA_KEY_SERVERS); String servers[] = intent.getStringArrayExtra(PGPHelper.EXTRA_KEY_SERVERS);
if (servers != null) { if (servers != null) {
for (int i = 0; i < servers.length; ++i) { for (int i = 0; i < servers.length; ++i) {
KeyServerEditor view = (KeyServerEditor) mInflater.inflate( KeyServerEditor view = (KeyServerEditor) mInflater.inflate(
@ -71,20 +124,6 @@ public class KeyServerPreferenceActivity extends BaseActivity implements OnClick
mEditors.addView(view); mEditors.addView(view);
} }
} }
Button okButton = (Button) findViewById(R.id.btn_ok);
okButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
okClicked();
}
});
Button cancelButton = (Button) findViewById(R.id.btn_cancel);
cancelButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
cancelClicked();
}
});
} }
public void onDeleted(Editor editor) { public void onDeleted(Editor editor) {
@ -114,15 +153,8 @@ public class KeyServerPreferenceActivity extends BaseActivity implements OnClick
} }
} }
String[] dummy = new String[0]; String[] dummy = new String[0];
data.putExtra(Apg.EXTRA_KEY_SERVERS, servers.toArray(dummy)); data.putExtra(PGPHelper.EXTRA_KEY_SERVERS, servers.toArray(dummy));
setResult(RESULT_OK, data); setResult(RESULT_OK, data);
finish(); finish();
} }
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// override this, so no option menu is added (as would be in BaseActivity), since
// we're still in preferences
return true;
}
} }

View File

@ -17,10 +17,10 @@
package org.thialfihar.android.apg.ui; package org.thialfihar.android.apg.ui;
import org.spongycastle.openpgp.PGPPublicKeyRing; import org.spongycastle.openpgp.PGPPublicKeyRing;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.helper.PGPHelper;
import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.MenuItem;
@ -71,7 +71,7 @@ public class PublicKeyListActivity extends KeyListActivity {
} }
case Id.menu.option.scanQRCode: { case Id.menu.option.scanQRCode: {
Intent intent = new Intent(this, ImportFromQRCodeActivity.class); Intent intent = new Intent(this, ImportFromQRCodeActivity.class);
intent.setAction(Apg.Intent.IMPORT_FROM_QR_CODE); intent.setAction(PGPHelper.Intent.IMPORT_FROM_QR_CODE);
startActivityForResult(intent, Id.request.import_from_qr_code); startActivityForResult(intent, Id.request.import_from_qr_code);
return true; return true;
@ -114,9 +114,9 @@ public class PublicKeyListActivity extends KeyListActivity {
mSelectedItem = groupPosition; mSelectedItem = groupPosition;
final int keyRingId = mListAdapter.getKeyRingId(groupPosition); final int keyRingId = mListAdapter.getKeyRingId(groupPosition);
long keyId = 0; long keyId = 0;
Object keyRing = Apg.getKeyRing(keyRingId); Object keyRing = PGPHelper.getKeyRing(keyRingId);
if (keyRing != null && keyRing instanceof PGPPublicKeyRing) { if (keyRing != null && keyRing instanceof PGPPublicKeyRing) {
keyId = Apg.getMasterKey((PGPPublicKeyRing) keyRing).getKeyID(); keyId = PGPHelper.getMasterKey((PGPPublicKeyRing) keyRing).getKeyID();
} }
if (keyId == 0) { if (keyId == 0) {
// this shouldn't happen // this shouldn't happen
@ -124,8 +124,8 @@ public class PublicKeyListActivity extends KeyListActivity {
} }
Intent intent = new Intent(this, KeyServerQueryActivity.class); Intent intent = new Intent(this, KeyServerQueryActivity.class);
intent.setAction(Apg.Intent.LOOK_UP_KEY_ID_AND_RETURN); intent.setAction(PGPHelper.Intent.LOOK_UP_KEY_ID_AND_RETURN);
intent.putExtra(Apg.EXTRA_KEY_ID, keyId); intent.putExtra(PGPHelper.EXTRA_KEY_ID, keyId);
startActivityForResult(intent, Id.request.look_up_key_id); startActivityForResult(intent, Id.request.look_up_key_id);
return true; return true;
@ -136,8 +136,8 @@ public class PublicKeyListActivity extends KeyListActivity {
final int keyRingId = mListAdapter.getKeyRingId(groupPosition); final int keyRingId = mListAdapter.getKeyRingId(groupPosition);
Intent intent = new Intent(this, KeyServerExportActivity.class); Intent intent = new Intent(this, KeyServerExportActivity.class);
intent.setAction(Apg.Intent.EXPORT_KEY_TO_SERVER); intent.setAction(PGPHelper.Intent.EXPORT_KEY_TO_SERVER);
intent.putExtra(Apg.EXTRA_KEY_ID, keyRingId); intent.putExtra(PGPHelper.EXTRA_KEY_ID, keyRingId);
startActivityForResult(intent, Id.request.export_to_server); startActivityForResult(intent, Id.request.export_to_server);
return true; return true;
@ -147,9 +147,9 @@ public class PublicKeyListActivity extends KeyListActivity {
mSelectedItem = groupPosition; mSelectedItem = groupPosition;
final int keyRingId = mListAdapter.getKeyRingId(groupPosition); final int keyRingId = mListAdapter.getKeyRingId(groupPosition);
long keyId = 0; long keyId = 0;
Object keyRing = Apg.getKeyRing(keyRingId); Object keyRing = PGPHelper.getKeyRing(keyRingId);
if (keyRing != null && keyRing instanceof PGPPublicKeyRing) { if (keyRing != null && keyRing instanceof PGPPublicKeyRing) {
keyId = Apg.getMasterKey((PGPPublicKeyRing) keyRing).getKeyID(); keyId = PGPHelper.getMasterKey((PGPPublicKeyRing) keyRing).getKeyID();
} }
if (keyId == 0) { if (keyId == 0) {
@ -158,7 +158,7 @@ public class PublicKeyListActivity extends KeyListActivity {
} }
Intent intent = new Intent(this, SignKeyActivity.class); Intent intent = new Intent(this, SignKeyActivity.class);
intent.putExtra(Apg.EXTRA_KEY_ID, keyId); intent.putExtra(PGPHelper.EXTRA_KEY_ID, keyId);
startActivity(intent); startActivity(intent);
return true; return true;
@ -175,13 +175,13 @@ public class PublicKeyListActivity extends KeyListActivity {
switch (requestCode) { switch (requestCode) {
case Id.request.look_up_key_id: { case Id.request.look_up_key_id: {
if (resultCode == RESULT_CANCELED || data == null if (resultCode == RESULT_CANCELED || data == null
|| data.getStringExtra(Apg.EXTRA_TEXT) == null) { || data.getStringExtra(PGPHelper.EXTRA_TEXT) == null) {
return; return;
} }
Intent intent = new Intent(this, PublicKeyListActivity.class); Intent intent = new Intent(this, PublicKeyListActivity.class);
intent.setAction(Apg.Intent.IMPORT); intent.setAction(PGPHelper.Intent.IMPORT);
intent.putExtra(Apg.EXTRA_TEXT, data.getStringExtra(Apg.EXTRA_TEXT)); intent.putExtra(PGPHelper.EXTRA_TEXT, data.getStringExtra(PGPHelper.EXTRA_TEXT));
handleIntent(intent); handleIntent(intent);
break; break;
} }

View File

@ -17,9 +17,9 @@
package org.thialfihar.android.apg.ui; package org.thialfihar.android.apg.ui;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.passphrase.AskForPassphrase; import org.thialfihar.android.apg.passphrase.AskForPassphrase;
import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.Menu;
@ -111,7 +111,7 @@ public class SecretKeyListActivity extends KeyListActivity implements OnChildCli
long keyId = ((KeyListAdapter) mList.getExpandableListAdapter()) long keyId = ((KeyListAdapter) mList.getExpandableListAdapter())
.getGroupId(mSelectedItem); .getGroupId(mSelectedItem);
String msg = keyId + "," + Apg.getFingerPrint(keyId); String msg = keyId + "," + PGPHelper.getFingerPrint(keyId);
new IntentIntegrator(this).shareText(msg); new IntentIntegrator(this).shareText(msg);
} }
@ -146,11 +146,11 @@ public class SecretKeyListActivity extends KeyListActivity implements OnChildCli
public void checkPassPhraseAndEdit() { public void checkPassPhraseAndEdit() {
long keyId = ((KeyListAdapter) mList.getExpandableListAdapter()).getGroupId(mSelectedItem); long keyId = ((KeyListAdapter) mList.getExpandableListAdapter()).getGroupId(mSelectedItem);
String passPhrase = Apg.getCachedPassPhrase(keyId); String passPhrase = PGPHelper.getCachedPassPhrase(keyId);
if (passPhrase == null) { if (passPhrase == null) {
showDialog(Id.dialog.pass_phrase); showDialog(Id.dialog.pass_phrase);
} else { } else {
Apg.setEditPassPhrase(passPhrase); PGPHelper.setEditPassPhrase(passPhrase);
editKey(); editKey();
} }
} }
@ -158,20 +158,20 @@ public class SecretKeyListActivity extends KeyListActivity implements OnChildCli
@Override @Override
public void passPhraseCallback(long keyId, String passPhrase) { public void passPhraseCallback(long keyId, String passPhrase) {
super.passPhraseCallback(keyId, passPhrase); super.passPhraseCallback(keyId, passPhrase);
Apg.setEditPassPhrase(passPhrase); PGPHelper.setEditPassPhrase(passPhrase);
editKey(); editKey();
} }
private void createKey() { private void createKey() {
Apg.setEditPassPhrase(""); PGPHelper.setEditPassPhrase("");
Intent intent = new Intent(Apg.Intent.CREATE_KEY); Intent intent = new Intent(PGPHelper.Intent.CREATE_KEY);
startActivityForResult(intent, Id.message.create_key); startActivityForResult(intent, Id.message.create_key);
} }
private void editKey() { private void editKey() {
long keyId = ((KeyListAdapter) mList.getExpandableListAdapter()).getGroupId(mSelectedItem); long keyId = ((KeyListAdapter) mList.getExpandableListAdapter()).getGroupId(mSelectedItem);
Intent intent = new Intent(Apg.Intent.EDIT_KEY); Intent intent = new Intent(PGPHelper.Intent.EDIT_KEY);
intent.putExtra(Apg.EXTRA_KEY_ID, keyId); intent.putExtra(PGPHelper.EXTRA_KEY_ID, keyId);
startActivityForResult(intent, Id.message.edit_key); startActivityForResult(intent, Id.message.edit_key);
} }

View File

@ -19,8 +19,8 @@ package org.thialfihar.android.apg.ui;
import java.util.Vector; import java.util.Vector;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.ui.widget.SelectPublicKeyListAdapter; import org.thialfihar.android.apg.ui.widget.SelectPublicKeyListAdapter;
import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar;
@ -89,7 +89,7 @@ public class SelectPublicKeyListActivity extends BaseActivity {
} }
long selectedKeyIds[] = null; long selectedKeyIds[] = null;
selectedKeyIds = intent.getLongArrayExtra(Apg.EXTRA_SELECTION); selectedKeyIds = intent.getLongArrayExtra(PGPHelper.EXTRA_SELECTION);
if (selectedKeyIds == null) { if (selectedKeyIds == null) {
Vector<Long> vector = new Vector<Long>(); Vector<Long> vector = new Vector<Long>();
@ -151,8 +151,8 @@ public class SelectPublicKeyListActivity extends BaseActivity {
selectedKeyIds[i] = keys.get(i); selectedKeyIds[i] = keys.get(i);
} }
String userIdArray[] = new String[0]; String userIdArray[] = new String[0];
data.putExtra(Apg.EXTRA_SELECTION, selectedKeyIds); data.putExtra(PGPHelper.EXTRA_SELECTION, selectedKeyIds);
data.putExtra(Apg.EXTRA_USER_IDS, userIds.toArray(userIdArray)); data.putExtra(PGPHelper.EXTRA_USER_IDS, userIds.toArray(userIdArray));
setResult(RESULT_OK, data); setResult(RESULT_OK, data);
finish(); finish();
} }

View File

@ -17,8 +17,8 @@
package org.thialfihar.android.apg.ui; package org.thialfihar.android.apg.ui;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.ui.widget.SelectSecretKeyListAdapter; import org.thialfihar.android.apg.ui.widget.SelectSecretKeyListAdapter;
import com.actionbarsherlock.app.ActionBar; import com.actionbarsherlock.app.ActionBar;
@ -62,8 +62,8 @@ public class SelectSecretKeyListActivity extends BaseActivity {
mList.setOnItemClickListener(new OnItemClickListener() { mList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
Intent data = new Intent(); Intent data = new Intent();
data.putExtra(Apg.EXTRA_KEY_ID, id); data.putExtra(PGPHelper.EXTRA_KEY_ID, id);
data.putExtra(Apg.EXTRA_USER_ID, (String) mList.getItemAtPosition(position)); data.putExtra(PGPHelper.EXTRA_USER_ID, (String) mList.getItemAtPosition(position));
setResult(RESULT_OK, data); setResult(RESULT_OK, data);
finish(); finish();
} }

View File

@ -1,4 +1,6 @@
/* /*
* Copyright (C) 2011 Senecaso
*
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
* You may obtain a copy of the License at * You may obtain a copy of the License at
@ -30,11 +32,11 @@ import org.spongycastle.openpgp.PGPSignatureGenerator;
import org.spongycastle.openpgp.PGPSignatureSubpacketGenerator; import org.spongycastle.openpgp.PGPSignatureSubpacketGenerator;
import org.spongycastle.openpgp.PGPSignatureSubpacketVector; import org.spongycastle.openpgp.PGPSignatureSubpacketVector;
import org.spongycastle.openpgp.PGPUtil; import org.spongycastle.openpgp.PGPUtil;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.HkpKeyServer; import org.thialfihar.android.apg.HkpKeyServer;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.helper.PGPHelper;
import com.actionbarsherlock.view.MenuItem; import com.actionbarsherlock.view.MenuItem;
@ -122,7 +124,7 @@ public class SignKeyActivity extends BaseActivity {
} }
}); });
pubKeyId = getIntent().getLongExtra(Apg.EXTRA_KEY_ID, 0); pubKeyId = getIntent().getLongExtra(PGPHelper.EXTRA_KEY_ID, 0);
if (pubKeyId == 0) { if (pubKeyId == 0) {
finish(); // nothing to do if we dont know what key to sign finish(); // nothing to do if we dont know what key to sign
} else { } else {
@ -137,7 +139,7 @@ public class SignKeyActivity extends BaseActivity {
* handles the UI bits of the signing process on the UI thread * handles the UI bits of the signing process on the UI thread
*/ */
private void initiateSigning() { private void initiateSigning() {
PGPPublicKeyRing pubring = Apg.getPublicKeyRing(pubKeyId); PGPPublicKeyRing pubring = PGPHelper.getPublicKeyRing(pubKeyId);
if (pubring != null) { if (pubring != null) {
// if we have already signed this key, dont bother doing it again // if we have already signed this key, dont bother doing it again
boolean alreadySigned = false; boolean alreadySigned = false;
@ -156,7 +158,7 @@ public class SignKeyActivity extends BaseActivity {
/* /*
* get the user's passphrase for this key (if required) * get the user's passphrase for this key (if required)
*/ */
String passphrase = Apg.getCachedPassPhrase(masterKeyId); String passphrase = PGPHelper.getCachedPassPhrase(masterKeyId);
if (passphrase == null) { if (passphrase == null) {
showDialog(Id.dialog.pass_phrase); showDialog(Id.dialog.pass_phrase);
return; // bail out; need to wait until the user has entered the passphrase return; // bail out; need to wait until the user has entered the passphrase
@ -168,7 +170,7 @@ public class SignKeyActivity extends BaseActivity {
final Bundle status = new Bundle(); final Bundle status = new Bundle();
Message msg = new Message(); Message msg = new Message();
status.putString(Apg.EXTRA_ERROR, "Key has already been signed"); status.putString(PGPHelper.EXTRA_ERROR, "Key has already been signed");
status.putInt(Constants.extras.STATUS, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
@ -206,16 +208,16 @@ public class SignKeyActivity extends BaseActivity {
Message msg = new Message(); Message msg = new Message();
try { try {
String passphrase = Apg.getCachedPassPhrase(masterKeyId); String passphrase = PGPHelper.getCachedPassPhrase(masterKeyId);
if (passphrase == null || passphrase.length() <= 0) { if (passphrase == null || passphrase.length() <= 0) {
status.putString(Apg.EXTRA_ERROR, "Unable to obtain passphrase"); status.putString(PGPHelper.EXTRA_ERROR, "Unable to obtain passphrase");
} else { } else {
PGPPublicKeyRing pubring = Apg.getPublicKeyRing(pubKeyId); PGPPublicKeyRing pubring = PGPHelper.getPublicKeyRing(pubKeyId);
/* /*
* sign the incoming key * sign the incoming key
*/ */
PGPSecretKey secretKey = Apg.getSecretKey(masterKeyId); PGPSecretKey secretKey = PGPHelper.getSecretKey(masterKeyId);
PGPPrivateKey signingKey = secretKey.extractPrivateKey(passphrase.toCharArray(), PGPPrivateKey signingKey = secretKey.extractPrivateKey(passphrase.toCharArray(),
BouncyCastleProvider.PROVIDER_NAME); BouncyCastleProvider.PROVIDER_NAME);
PGPSignatureGenerator sGen = new PGPSignatureGenerator(secretKey.getPublicKey() PGPSignatureGenerator sGen = new PGPSignatureGenerator(secretKey.getPublicKey()
@ -241,33 +243,33 @@ public class SignKeyActivity extends BaseActivity {
* upload the newly signed key to the key server * upload the newly signed key to the key server
*/ */
Apg.uploadKeyRingToServer(server, pubring); PGPHelper.uploadKeyRingToServer(server, pubring);
} }
// store the signed key in our local cache // store the signed key in our local cache
int retval = Apg.storeKeyRingInCache(pubring); int retval = PGPHelper.storeKeyRingInCache(pubring);
if (retval != Id.return_value.ok && retval != Id.return_value.updated) { if (retval != Id.return_value.ok && retval != Id.return_value.updated) {
status.putString(Apg.EXTRA_ERROR, "Failed to store signed key in local cache"); status.putString(PGPHelper.EXTRA_ERROR, "Failed to store signed key in local cache");
} }
} }
} catch (PGPException e) { } catch (PGPException e) {
Log.e(TAG, "Failed to sign key", e); Log.e(TAG, "Failed to sign key", e);
status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); status.putString(PGPHelper.EXTRA_ERROR, "Failed to sign key");
status.putInt(Constants.extras.STATUS, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
return; return;
} catch (NoSuchAlgorithmException e) { } catch (NoSuchAlgorithmException e) {
Log.e(TAG, "Failed to sign key", e); Log.e(TAG, "Failed to sign key", e);
status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); status.putString(PGPHelper.EXTRA_ERROR, "Failed to sign key");
status.putInt(Constants.extras.STATUS, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
return; return;
} catch (NoSuchProviderException e) { } catch (NoSuchProviderException e) {
Log.e(TAG, "Failed to sign key", e); Log.e(TAG, "Failed to sign key", e);
status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); status.putString(PGPHelper.EXTRA_ERROR, "Failed to sign key");
status.putInt(Constants.extras.STATUS, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
return; return;
} catch (SignatureException e) { } catch (SignatureException e) {
Log.e(TAG, "Failed to sign key", e); Log.e(TAG, "Failed to sign key", e);
status.putString(Apg.EXTRA_ERROR, "Failed to sign key"); status.putString(PGPHelper.EXTRA_ERROR, "Failed to sign key");
status.putInt(Constants.extras.STATUS, Id.message.done); status.putInt(Constants.extras.STATUS, Id.message.done);
return; return;
} }
@ -277,7 +279,7 @@ public class SignKeyActivity extends BaseActivity {
msg.setData(status); msg.setData(status);
sendMessage(msg); sendMessage(msg);
if (status.containsKey(Apg.EXTRA_ERROR)) { if (status.containsKey(PGPHelper.EXTRA_ERROR)) {
setResult(Id.return_value.error); setResult(Id.return_value.error);
} else { } else {
setResult(Id.return_value.ok); setResult(Id.return_value.ok);
@ -291,7 +293,7 @@ public class SignKeyActivity extends BaseActivity {
switch (requestCode) { switch (requestCode) {
case Id.request.secret_keys: { case Id.request.secret_keys: {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
masterKeyId = data.getLongExtra(Apg.EXTRA_KEY_ID, 0); masterKeyId = data.getLongExtra(PGPHelper.EXTRA_KEY_ID, 0);
// re-enable the sign button so the user can initiate the sign process // re-enable the sign button so the user can initiate the sign process
Button sign = (Button) findViewById(R.id.sign); Button sign = (Button) findViewById(R.id.sign);
@ -314,7 +316,7 @@ public class SignKeyActivity extends BaseActivity {
removeDialog(Id.dialog.signing); removeDialog(Id.dialog.signing);
Bundle data = msg.getData(); Bundle data = msg.getData();
String error = data.getString(Apg.EXTRA_ERROR); String error = data.getString(PGPHelper.EXTRA_ERROR);
if (error != null) { if (error != null) {
Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT) Toast.makeText(this, getString(R.string.errorMessage, error), Toast.LENGTH_SHORT)
.show(); .show();

View File

@ -18,7 +18,8 @@ package org.thialfihar.android.apg.ui.dialog;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.util.Utils; import org.thialfihar.android.apg.helper.FileHelper;
import org.thialfihar.android.apg.helper.OtherHelper;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog; import android.app.AlertDialog;
@ -51,7 +52,7 @@ public class FileDialogFragment extends DialogFragment {
public static final int MESSAGE_OKAY = 1; public static final int MESSAGE_OKAY = 1;
public static final String MESSAGE_DATA_FILENAME = "filename"; public static final String MESSAGE_DATA_FILENAME = "filename";
public static final String MESSAGE_CHECKED = "checked"; public static final String MESSAGE_DATA_CHECKED = "checked";
/** /**
* Creates new instance of this file dialog fragment * Creates new instance of this file dialog fragment
@ -107,7 +108,7 @@ public class FileDialogFragment extends DialogFragment {
mBrowse.setOnClickListener(new View.OnClickListener() { mBrowse.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { public void onClick(View v) {
// only .asc or .gpg files // only .asc or .gpg files
Utils.openFile(activity, mFilename.getText().toString(), "text/plain", requestCode); FileHelper.openFile(activity, mFilename.getText().toString(), "text/plain", requestCode);
} }
}); });
@ -135,7 +136,7 @@ public class FileDialogFragment extends DialogFragment {
// return resulting data back to activity // return resulting data back to activity
Bundle data = new Bundle(); Bundle data = new Bundle();
data.putString(MESSAGE_DATA_FILENAME, mFilename.getText().toString()); data.putString(MESSAGE_DATA_FILENAME, mFilename.getText().toString());
data.putBoolean(MESSAGE_CHECKED, checked); data.putBoolean(MESSAGE_DATA_CHECKED, checked);
sendMessageToHandler(MESSAGE_OKAY, data); sendMessageToHandler(MESSAGE_OKAY, data);

View File

@ -21,8 +21,8 @@ import org.spongycastle.openpgp.PGPPrivateKey;
import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor; import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor;
import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder;
import org.thialfihar.android.apg.Apg; import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.Apg.GeneralException; import org.thialfihar.android.apg.helper.PGPHelper.GeneralException;
import org.thialfihar.android.apg.Constants; import org.thialfihar.android.apg.Constants;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
@ -68,7 +68,7 @@ public class PassphraseDialogFragment extends DialogFragment {
// check if secret key has a passphrase // check if secret key has a passphrase
if (!(secretKeyId == Id.key.symmetric || secretKeyId == Id.key.none)) { if (!(secretKeyId == Id.key.symmetric || secretKeyId == Id.key.none)) {
if (!hasPassphrase(secretKeyId)) { if (!hasPassphrase(secretKeyId)) {
throw new Apg.GeneralException("No passphrase! No passphrase dialog needed!"); throw new PGPHelper.GeneralException("No passphrase! No passphrase dialog needed!");
} }
} }
@ -91,7 +91,7 @@ public class PassphraseDialogFragment extends DialogFragment {
private static boolean hasPassphrase(long secretKeyId) { private static boolean hasPassphrase(long secretKeyId) {
// check if the key has no passphrase // check if the key has no passphrase
try { try {
PGPSecretKey secretKey = Apg.getMasterKey(Apg.getSecretKeyRing(secretKeyId)); PGPSecretKey secretKey = PGPHelper.getMasterKey(PGPHelper.getSecretKeyRing(secretKeyId));
Log.d(Constants.TAG, "Check if key has no passphrase..."); Log.d(Constants.TAG, "Check if key has no passphrase...");
PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider(
@ -101,7 +101,7 @@ public class PassphraseDialogFragment extends DialogFragment {
Log.d(Constants.TAG, "Key has no passphrase! Caches empty passphrase!"); Log.d(Constants.TAG, "Key has no passphrase! Caches empty passphrase!");
// cache empty passphrase // cache empty passphrase
Apg.setCachedPassPhrase(secretKey.getKeyID(), ""); PGPHelper.setCachedPassPhrase(secretKey.getKeyID(), "");
return false; return false;
} }
@ -132,7 +132,7 @@ public class PassphraseDialogFragment extends DialogFragment {
secretKey = null; secretKey = null;
alert.setMessage(getString(R.string.passPhraseForSymmetricEncryption)); alert.setMessage(getString(R.string.passPhraseForSymmetricEncryption));
} else { } else {
secretKey = Apg.getMasterKey(Apg.getSecretKeyRing(secretKeyId)); secretKey = PGPHelper.getMasterKey(PGPHelper.getSecretKeyRing(secretKeyId));
if (secretKey == null) { if (secretKey == null) {
alert.setTitle(R.string.title_keyNotFound); alert.setTitle(R.string.title_keyNotFound);
alert.setMessage(getString(R.string.keyNotFound, secretKeyId)); alert.setMessage(getString(R.string.keyNotFound, secretKeyId));
@ -144,7 +144,7 @@ public class PassphraseDialogFragment extends DialogFragment {
alert.setCancelable(false); alert.setCancelable(false);
return alert.create(); return alert.create();
} }
String userId = Apg.getMainUserIdSafe(activity, secretKey); String userId = PGPHelper.getMainUserIdSafe(activity, secretKey);
alert.setMessage(getString(R.string.passPhraseFor, userId)); alert.setMessage(getString(R.string.passPhraseFor, userId));
} }
@ -189,7 +189,7 @@ public class PassphraseDialogFragment extends DialogFragment {
// cache the new passphrase // cache the new passphrase
Log.d(Constants.TAG, "Everything okay! Caching entered passphrase"); Log.d(Constants.TAG, "Everything okay! Caching entered passphrase");
Apg.setCachedPassPhrase(keyId, passPhrase); PGPHelper.setCachedPassPhrase(keyId, passPhrase);
sendMessageToHandler(MESSAGE_OKAY); sendMessageToHandler(MESSAGE_OKAY);
} }

View File

@ -18,8 +18,8 @@ package org.thialfihar.android.apg.ui.widget;
import org.spongycastle.openpgp.PGPPublicKey; import org.spongycastle.openpgp.PGPPublicKey;
import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKey;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.util.Choice; import org.thialfihar.android.apg.util.Choice;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
@ -133,9 +133,9 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener {
mDeleteButton.setVisibility(View.INVISIBLE); mDeleteButton.setVisibility(View.INVISIBLE);
} }
mAlgorithm.setText(Apg.getAlgorithmInfo(key)); mAlgorithm.setText(PGPHelper.getAlgorithmInfo(key));
String keyId1Str = Apg.getSmallFingerPrint(key.getKeyID()); String keyId1Str = PGPHelper.getSmallFingerPrint(key.getKeyID());
String keyId2Str = Apg.getSmallFingerPrint(key.getKeyID() >> 32); String keyId2Str = PGPHelper.getSmallFingerPrint(key.getKeyID() >> 32);
mKeyId.setText(keyId1Str + " " + keyId2Str); mKeyId.setText(keyId1Str + " " + keyId2Str);
Vector<Choice> choices = new Vector<Choice>(); Vector<Choice> choices = new Vector<Choice>();
@ -160,8 +160,8 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener {
// Set value in choice dropdown to key // Set value in choice dropdown to key
int selectId = 0; int selectId = 0;
if (Apg.isEncryptionKey(key)) { if (PGPHelper.isEncryptionKey(key)) {
if (Apg.isSigningKey(key)) { if (PGPHelper.isSigningKey(key)) {
selectId = Id.choice.usage.sign_and_encrypt; selectId = Id.choice.usage.sign_and_encrypt;
} else { } else {
selectId = Id.choice.usage.encrypt_only; selectId = Id.choice.usage.encrypt_only;
@ -184,14 +184,14 @@ public class KeyEditor extends LinearLayout implements Editor, OnClickListener {
} }
GregorianCalendar cal = new GregorianCalendar(); GregorianCalendar cal = new GregorianCalendar();
cal.setTime(Apg.getCreationDate(key)); cal.setTime(PGPHelper.getCreationDate(key));
mCreationDate.setText(DateFormat.getDateInstance().format(cal.getTime())); mCreationDate.setText(DateFormat.getDateInstance().format(cal.getTime()));
cal = new GregorianCalendar(); cal = new GregorianCalendar();
Date date = Apg.getExpiryDate(key); Date date = PGPHelper.getExpiryDate(key);
if (date == null) { if (date == null) {
setExpiryDate(null); setExpiryDate(null);
} else { } else {
cal.setTime(Apg.getExpiryDate(key)); cal.setTime(PGPHelper.getExpiryDate(key));
setExpiryDate(cal); setExpiryDate(cal);
} }

View File

@ -18,14 +18,14 @@ package org.thialfihar.android.apg.ui.widget;
import org.spongycastle.openpgp.PGPSecretKey; import org.spongycastle.openpgp.PGPSecretKey;
import org.spongycastle.openpgp.PGPSecretKeyRing; import org.spongycastle.openpgp.PGPSecretKeyRing;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.helper.PGPConversionHelper;
import org.thialfihar.android.apg.service.ApgHandler; import org.thialfihar.android.apg.service.ApgHandler;
import org.thialfihar.android.apg.service.ApgService; import org.thialfihar.android.apg.service.ApgService;
import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment; import org.thialfihar.android.apg.ui.dialog.ProgressDialogFragment;
import org.thialfihar.android.apg.ui.widget.Editor.EditorListener; import org.thialfihar.android.apg.ui.widget.Editor.EditorListener;
import org.thialfihar.android.apg.util.Choice; import org.thialfihar.android.apg.util.Choice;
import org.thialfihar.android.apg.util.Utils;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import com.actionbarsherlock.app.SherlockFragmentActivity; import com.actionbarsherlock.app.SherlockFragmentActivity;
@ -259,9 +259,10 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor
String passPhrase; String passPhrase;
if (mEditors.getChildCount() > 0) { if (mEditors.getChildCount() > 0) {
PGPSecretKey masterKey = ((KeyEditor) mEditors.getChildAt(0)).getValue(); PGPSecretKey masterKey = ((KeyEditor) mEditors.getChildAt(0)).getValue();
passPhrase = Apg.getCachedPassPhrase(masterKey.getKeyID()); passPhrase = PGPHelper.getCachedPassPhrase(masterKey.getKeyID());
data.putByteArray(ApgService.MASTER_KEY, Utils.PGPSecretKeyToBytes(masterKey)); data.putByteArray(ApgService.MASTER_KEY,
PGPConversionHelper.PGPSecretKeyToBytes(masterKey));
} else { } else {
passPhrase = ""; passPhrase = "";
} }
@ -284,7 +285,7 @@ public class SectionView extends LinearLayout implements OnClickListener, Editor
if (message.arg1 == ApgHandler.MESSAGE_OKAY) { if (message.arg1 == ApgHandler.MESSAGE_OKAY) {
// get new key from data bundle returned from service // get new key from data bundle returned from service
Bundle data = message.getData(); Bundle data = message.getData();
PGPSecretKeyRing newKeyRing = Utils.BytesToPGPSecretKeyRing(data PGPSecretKeyRing newKeyRing = PGPConversionHelper.BytesToPGPSecretKeyRing(data
.getByteArray(ApgService.RESULT_NEW_KEY)); .getByteArray(ApgService.RESULT_NEW_KEY));
boolean isMasterKey = (mEditors.getChildCount() == 0); boolean isMasterKey = (mEditors.getChildCount() == 0);

View File

@ -19,8 +19,8 @@ package org.thialfihar.android.apg.ui.widget;
import java.util.Date; import java.util.Date;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.provider.KeyRings; import org.thialfihar.android.apg.provider.KeyRings;
import org.thialfihar.android.apg.provider.Keys; import org.thialfihar.android.apg.provider.Keys;
import org.thialfihar.android.apg.provider.UserIds; import org.thialfihar.android.apg.provider.UserIds;
@ -53,7 +53,7 @@ public class SelectPublicKeyListAdapter extends BaseAdapter {
mActivity = activity; mActivity = activity;
mParent = parent; mParent = parent;
mDatabase = Apg.getDatabase().db(); mDatabase = PGPHelper.getDatabase().db();
mInflater = (LayoutInflater) parent.getContext().getSystemService( mInflater = (LayoutInflater) parent.getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE); Context.LAYOUT_INFLATER_SERVICE);
long now = new Date().getTime() / 1000; long now = new Date().getTime() / 1000;
@ -177,7 +177,7 @@ public class SelectPublicKeyListAdapter extends BaseAdapter {
} }
long masterKeyId = mCursor.getLong(1); // MASTER_KEY_ID long masterKeyId = mCursor.getLong(1); // MASTER_KEY_ID
keyId.setText(Apg.getSmallFingerPrint(masterKeyId)); keyId.setText(PGPHelper.getSmallFingerPrint(masterKeyId));
if (mainUserIdRest.getText().length() == 0) { if (mainUserIdRest.getText().length() == 0) {
mainUserIdRest.setVisibility(View.GONE); mainUserIdRest.setVisibility(View.GONE);

View File

@ -17,8 +17,8 @@ package org.thialfihar.android.apg.ui.widget;
import java.util.Date; import java.util.Date;
import org.thialfihar.android.apg.R; import org.thialfihar.android.apg.R;
import org.thialfihar.android.apg.Apg;
import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.Id;
import org.thialfihar.android.apg.helper.PGPHelper;
import org.thialfihar.android.apg.provider.KeyRings; import org.thialfihar.android.apg.provider.KeyRings;
import org.thialfihar.android.apg.provider.Keys; import org.thialfihar.android.apg.provider.Keys;
import org.thialfihar.android.apg.provider.UserIds; import org.thialfihar.android.apg.provider.UserIds;
@ -48,7 +48,7 @@ public class SelectSecretKeyListAdapter extends BaseAdapter {
mActivity = activity; mActivity = activity;
mParent = parent; mParent = parent;
mDatabase = Apg.getDatabase().db(); mDatabase = PGPHelper.getDatabase().db();
mInflater = (LayoutInflater) parent.getContext().getSystemService( mInflater = (LayoutInflater) parent.getContext().getSystemService(
Context.LAYOUT_INFLATER_SERVICE); Context.LAYOUT_INFLATER_SERVICE);
long now = new Date().getTime() / 1000; long now = new Date().getTime() / 1000;
@ -151,7 +151,7 @@ public class SelectSecretKeyListAdapter extends BaseAdapter {
} }
long masterKeyId = mCursor.getLong(1); // MASTER_KEY_ID long masterKeyId = mCursor.getLong(1); // MASTER_KEY_ID
keyId.setText(Apg.getSmallFingerPrint(masterKeyId)); keyId.setText(PGPHelper.getSmallFingerPrint(masterKeyId));
if (mainUserIdRest.getText().length() == 0) { if (mainUserIdRest.getText().length() == 0) {
mainUserIdRest.setVisibility(View.GONE); mainUserIdRest.setVisibility(View.GONE);

View File

@ -1,6 +0,0 @@
package org.thialfihar.android.apg.util;
public class Constants {
public static final String TAG = "APG";
}

View File

@ -12,10 +12,11 @@
* limitations under the License. * limitations under the License.
*/ */
package org.thialfihar.android.apg; package org.thialfihar.android.apg.util;
import java.io.InputStream; import java.io.InputStream;
public class InputData { public class InputData {
private PositionAwareInputStream mInputStream; private PositionAwareInputStream mInputStream;
private long mSize; private long mSize;

View File

@ -12,7 +12,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.thialfihar.android.apg; package org.thialfihar.android.apg.util;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;

View File

@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package org.thialfihar.android.apg; package org.thialfihar.android.apg.util;
import java.math.BigInteger; import java.math.BigInteger;