Update OpenPGP API lib to newest version
@ -13,20 +13,7 @@ apply plugin: 'com.android.library'
|
|||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 21
|
compileSdkVersion 21
|
||||||
buildToolsVersion '21.1.2'
|
buildToolsVersion '21.1.1'
|
||||||
|
|
||||||
// NOTE: We are using the old folder structure to also support Eclipse
|
|
||||||
sourceSets {
|
|
||||||
main {
|
|
||||||
manifest.srcFile 'AndroidManifest.xml'
|
|
||||||
java.srcDirs = ['src']
|
|
||||||
resources.srcDirs = ['src']
|
|
||||||
aidl.srcDirs = ['src']
|
|
||||||
renderscript.srcDirs = ['src']
|
|
||||||
res.srcDirs = ['res']
|
|
||||||
assets.srcDirs = ['assets']
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do not abort build if lint finds errors
|
// Do not abort build if lint finds errors
|
||||||
lintOptions {
|
lintOptions {
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
# This file is automatically generated by Android Tools.
|
|
||||||
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
|
|
||||||
#
|
|
||||||
# This file must be checked in Version Control Systems.
|
|
||||||
#
|
|
||||||
# To customize properties used by the Ant build system edit
|
|
||||||
# "ant.properties", and override values to adapt the script to your
|
|
||||||
# project structure.
|
|
||||||
#
|
|
||||||
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
|
|
||||||
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
|
|
||||||
|
|
||||||
# Project target.
|
|
||||||
target=android-19
|
|
||||||
android.library=true
|
|
@ -27,6 +27,7 @@ import android.util.Log;
|
|||||||
import org.openintents.openpgp.IOpenPgpService;
|
import org.openintents.openpgp.IOpenPgpService;
|
||||||
import org.openintents.openpgp.OpenPgpError;
|
import org.openintents.openpgp.OpenPgpError;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
@ -290,14 +291,24 @@ public class OpenPgpApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* InputStream and OutputStreams are always closed after operating on them!
|
||||||
|
*
|
||||||
|
* @param data
|
||||||
|
* @param is
|
||||||
|
* @param os
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
public Intent executeApi(Intent data, InputStream is, OutputStream os) {
|
public Intent executeApi(Intent data, InputStream is, OutputStream os) {
|
||||||
|
ParcelFileDescriptor input = null;
|
||||||
|
ParcelFileDescriptor output = null;
|
||||||
try {
|
try {
|
||||||
|
// always send version from client
|
||||||
data.putExtra(EXTRA_API_VERSION, OpenPgpApi.API_VERSION);
|
data.putExtra(EXTRA_API_VERSION, OpenPgpApi.API_VERSION);
|
||||||
|
|
||||||
Intent result;
|
Intent result;
|
||||||
|
|
||||||
// pipe the input and output
|
// pipe the input and output
|
||||||
ParcelFileDescriptor input = null;
|
|
||||||
if (is != null) {
|
if (is != null) {
|
||||||
input = ParcelFileDescriptorUtil.pipeFrom(is,
|
input = ParcelFileDescriptorUtil.pipeFrom(is,
|
||||||
new ParcelFileDescriptorUtil.IThreadListener() {
|
new ParcelFileDescriptorUtil.IThreadListener() {
|
||||||
@ -309,7 +320,6 @@ public class OpenPgpApi {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
ParcelFileDescriptor output = null;
|
|
||||||
if (os != null) {
|
if (os != null) {
|
||||||
output = ParcelFileDescriptorUtil.pipeTo(os,
|
output = ParcelFileDescriptorUtil.pipeTo(os,
|
||||||
new ParcelFileDescriptorUtil.IThreadListener() {
|
new ParcelFileDescriptorUtil.IThreadListener() {
|
||||||
@ -324,11 +334,6 @@ public class OpenPgpApi {
|
|||||||
|
|
||||||
// blocks until result is ready
|
// blocks until result is ready
|
||||||
result = mService.execute(data, input, output);
|
result = mService.execute(data, input, output);
|
||||||
// close() is required to halt the TransferThread
|
|
||||||
if (output != null) {
|
|
||||||
output.close();
|
|
||||||
}
|
|
||||||
// TODO: close input?
|
|
||||||
|
|
||||||
// set class loader to current context to allow unparcelling
|
// set class loader to current context to allow unparcelling
|
||||||
// of OpenPgpError and OpenPgpSignatureResult
|
// of OpenPgpError and OpenPgpSignatureResult
|
||||||
@ -343,6 +348,22 @@ public class OpenPgpApi {
|
|||||||
result.putExtra(RESULT_ERROR,
|
result.putExtra(RESULT_ERROR,
|
||||||
new OpenPgpError(OpenPgpError.CLIENT_SIDE_ERROR, e.getMessage()));
|
new OpenPgpError(OpenPgpError.CLIENT_SIDE_ERROR, e.getMessage()));
|
||||||
return result;
|
return result;
|
||||||
|
} finally {
|
||||||
|
// close() is required to halt the TransferThread
|
||||||
|
if (output != null) {
|
||||||
|
try {
|
||||||
|
output.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(OpenPgpApi.TAG, "IOException when closing ParcelFileDescriptor!", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (input != null) {
|
||||||
|
try {
|
||||||
|
input.close();
|
||||||
|
} catch (IOException e) {
|
||||||
|
Log.e(OpenPgpApi.TAG, "IOException when closing ParcelFileDescriptor!", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -46,6 +46,13 @@ public class OpenPgpListPreference extends DialogPreference {
|
|||||||
private static final Intent MARKET_INTENT = new Intent(Intent.ACTION_VIEW, Uri.parse(
|
private static final Intent MARKET_INTENT = new Intent(Intent.ACTION_VIEW, Uri.parse(
|
||||||
String.format(MARKET_INTENT_URI_BASE, OPENKEYCHAIN_PACKAGE)));
|
String.format(MARKET_INTENT_URI_BASE, OPENKEYCHAIN_PACKAGE)));
|
||||||
|
|
||||||
|
private static final ArrayList<String> PROVIDER_BLACKLIST = new ArrayList<String>();
|
||||||
|
|
||||||
|
static {
|
||||||
|
// Unfortunately, the current released version of APG includes a broken version of the API
|
||||||
|
PROVIDER_BLACKLIST.add("org.thialfihar.android.apg");
|
||||||
|
}
|
||||||
|
|
||||||
private ArrayList<OpenPgpProviderEntry> mLegacyList = new ArrayList<OpenPgpProviderEntry>();
|
private ArrayList<OpenPgpProviderEntry> mLegacyList = new ArrayList<OpenPgpProviderEntry>();
|
||||||
private ArrayList<OpenPgpProviderEntry> mList = new ArrayList<OpenPgpProviderEntry>();
|
private ArrayList<OpenPgpProviderEntry> mList = new ArrayList<OpenPgpProviderEntry>();
|
||||||
|
|
||||||
@ -96,9 +103,11 @@ public class OpenPgpListPreference extends DialogPreference {
|
|||||||
.getPackageManager()));
|
.getPackageManager()));
|
||||||
Drawable icon = resolveInfo.serviceInfo.loadIcon(getContext().getPackageManager());
|
Drawable icon = resolveInfo.serviceInfo.loadIcon(getContext().getPackageManager());
|
||||||
|
|
||||||
|
if (!PROVIDER_BLACKLIST.contains(packageName)) {
|
||||||
providerList.add(new OpenPgpProviderEntry(packageName, simpleName, icon));
|
providerList.add(new OpenPgpProviderEntry(packageName, simpleName, icon));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (providerList.isEmpty()) {
|
if (providerList.isEmpty()) {
|
||||||
// add install links if provider list is empty
|
// add install links if provider list is empty
|
@ -16,16 +16,16 @@
|
|||||||
|
|
||||||
package org.openintents.openpgp.util;
|
package org.openintents.openpgp.util;
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.content.pm.ResolveInfo;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.ResolveInfo;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
public class OpenPgpUtils {
|
public class OpenPgpUtils {
|
||||||
|
|
||||||
public static final Pattern PGP_MESSAGE = Pattern.compile(
|
public static final Pattern PGP_MESSAGE = Pattern.compile(
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
@ -0,0 +1,50 @@
|
|||||||
|
package test.org.openintents.openpgp;
|
||||||
|
|
||||||
|
import org.openintents.openpgp.util.OpenPgpUtils;
|
||||||
|
|
||||||
|
import static junit.framework.Assert.assertEquals;
|
||||||
|
import static junit.framework.Assert.assertNull;
|
||||||
|
|
||||||
|
import android.support.test.runner.AndroidJUnit4;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.openintents.openpgp.util.OpenPgpUtils;
|
||||||
|
|
||||||
|
import static junit.framework.Assert.assertEquals;
|
||||||
|
import static junit.framework.Assert.assertNull;
|
||||||
|
|
||||||
|
@RunWith(AndroidJUnit4.class)
|
||||||
|
public class OpenPgpUtilsTest {
|
||||||
|
@Test
|
||||||
|
public void splitCompleteUserIdShouldReturnAll3Components() throws Exception {
|
||||||
|
OpenPgpUtils.UserInfo info = OpenPgpUtils.splitUserId("Max Mustermann (this is a comment) <max@example.com>");
|
||||||
|
assertEquals("Max Mustermann", info.name);
|
||||||
|
assertEquals("this is a comment", info.comment);
|
||||||
|
assertEquals("max@example.com", info.email);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void splitUserIdWithAllButCommentShouldReturnNameAndEmail() throws Exception {
|
||||||
|
OpenPgpUtils.UserInfo info = OpenPgpUtils.splitUserId("Max Mustermann <max@example.com>");
|
||||||
|
assertEquals("Max Mustermann", info.name);
|
||||||
|
assertNull(info.comment);
|
||||||
|
assertEquals("max@example.com", info.email);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void splitUserIdWithAllButEmailShouldReturnNameAndComment() throws Exception {
|
||||||
|
OpenPgpUtils.UserInfo info = OpenPgpUtils.splitUserId("Max Mustermann (this is a comment)");
|
||||||
|
assertEquals(info.name, "Max Mustermann");
|
||||||
|
assertEquals(info.comment, "this is a comment");
|
||||||
|
assertNull(info.email);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void splitUserIdWithOnlyNameShouldReturnNameOnly() throws Exception {
|
||||||
|
OpenPgpUtils.UserInfo info = OpenPgpUtils.splitUserId("Max Mustermann [this is a nothing]");
|
||||||
|
assertEquals("Max Mustermann", info.name);
|
||||||
|
assertNull(info.comment);
|
||||||
|
assertNull(info.email);
|
||||||
|
}
|
||||||
|
}
|