diff --git a/LICENSE b/LICENSE index 703673a2a..bbf4af663 100644 --- a/LICENSE +++ b/LICENSE @@ -12,7 +12,6 @@ Images: * icon.svg modified version of kgpg_key2_kopete.svgz - GPL * dashboard_manage_keys.svg, dashboard_my_keys.svg, key.svg http://rrze-icon-set.berlios.de/ @@ -23,4 +22,5 @@ Images: Public Domain * dashboard_scan_qrcode.svg - Barcode Scanner App \ No newline at end of file + New creation for APG + Apache License v2 \ No newline at end of file diff --git a/Resources/barcode scanner icon.png b/Resources/barcode scanner icon.png deleted file mode 100644 index 5932aadea..000000000 Binary files a/Resources/barcode scanner icon.png and /dev/null differ diff --git a/Resources/dashboard_scan_qrcode_default.svg b/Resources/dashboard_scan_qrcode_default.svg index 035fcde9a..bc49aa6a6 100644 --- a/Resources/dashboard_scan_qrcode_default.svg +++ b/Resources/dashboard_scan_qrcode_default.svg @@ -10,17 +10,17 @@ xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - width="144" - height="96" - id="svg97" - sodipodi:version="0.32" - inkscape:version="0.48.1 r9760" - sodipodi:docname="dashboard_scan_qrcode_default.svg" - inkscape:export-filename="/home/ds1/Projekte/APG Plus/org_apg/res/drawable-hdpi/dashboard_encrypt_decrypt_file.png" - inkscape:export-xdpi="90.000000" - inkscape:export-ydpi="90.000000" + version="1.1" inkscape:output_extension="org.inkscape.output.svg.inkscape" - version="1.1"> + inkscape:export-ydpi="90.000000" + inkscape:export-xdpi="90.000000" + inkscape:export-filename="/home/ds1/Projekte/APG Plus/org_apg/res/drawable-hdpi/dashboard_encrypt_decrypt_file.png" + sodipodi:docname="dashboard_scan_qrcode_default.svg" + inkscape:version="0.48.3.1 r9886" + sodipodi:version="0.32" + id="svg97" + height="96" + width="144"> - - + inkscape:collect="always" + id="linearGradient5562"> + id="stop5564" /> + id="stop5566" /> + + + + + + + id="radialGradient5029" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)" + cx="605.71429" + cy="486.64789" + fx="605.71429" + fy="486.64789" + r="117.14286" /> + id="stop5050" /> + style="stop-color:#000000;stop-opacity:1;" /> + id="stop5052" /> + id="linearGradient5027" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.774389,0,0,1.969706,-1892.179,-872.8854)" + x1="302.85715" + y1="366.64789" + x2="302.85715" + y2="609.50507" /> + style="stop-color:#777777;stop-opacity:1.0000000;" /> + style="stop-color:#373737;stop-opacity:1.0000000;" /> + id="radialGradient8234" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(1.9757092,0,0,2.1357067,113.40468,-78.777288)" + cx="8.824419" + cy="3.7561285" + fx="8.824419" + fy="3.7561285" + r="37.751713" /> + style="stop-color:#b7b7b7;stop-opacity:1.0000000;" /> + id="stop8238" /> + style="stop-color:#969696;stop-opacity:1;" /> + id="linearGradient8236" + x1="25.875" + y1="10.625" + x2="25.25" + y2="30.875" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.0404464,0,0,2.5277172,22.881231,-60.155005)" /> + inkscape:collect="always" + id="linearGradient13842"> + id="stop13844" /> + id="stop13846" /> + id="stop9768" /> + id="stop9770" /> + id="stop149" /> + id="stop150" /> + id="stop336" /> + id="stop337" /> + id="stop1790" /> + id="stop1791" /> + id="stop138" /> + id="stop139" /> - + - + + id="linearGradient158" + gradientUnits="userSpaceOnUse" + gradientTransform="matrix(2.9845528,0,0.14095216,1.39499,22.881231,-44.07507)" + x1="5.2657914" + y1="18.725863" + x2="8.212224" + y2="52.625851" /> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -322,26 +1643,30 @@ - + - + inkscape:groupmode="layer" + transform="translate(0,48)"> + + + inkscape:label="pattern" + transform="translate(0,48)" /> diff --git a/Resources/dashboard_scan_qrcode_pressed.svg b/Resources/dashboard_scan_qrcode_pressed.svg new file mode 100644 index 000000000..c1bd869ac --- /dev/null +++ b/Resources/dashboard_scan_qrcode_pressed.svg @@ -0,0 +1,1698 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + 2005-01-31 + + + Jakub Steiner + + + + http://jimmac.musichall.cz + Active state - when files are being dragged to. + + + Novell, Inc. + + + + + + + + + + + + + + + + + diff --git a/org_apg/res/drawable-hdpi/dashboard_scan_qrcode_default.png b/org_apg/res/drawable-hdpi/dashboard_scan_qrcode_default.png index 65323e3d0..632a8ce62 100644 Binary files a/org_apg/res/drawable-hdpi/dashboard_scan_qrcode_default.png and b/org_apg/res/drawable-hdpi/dashboard_scan_qrcode_default.png differ diff --git a/org_apg/res/drawable-hdpi/dashboard_scan_qrcode_pressed.png b/org_apg/res/drawable-hdpi/dashboard_scan_qrcode_pressed.png index 65323e3d0..62a7a05ab 100644 Binary files a/org_apg/res/drawable-hdpi/dashboard_scan_qrcode_pressed.png and b/org_apg/res/drawable-hdpi/dashboard_scan_qrcode_pressed.png differ diff --git a/org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.java index 2b179d0bc..b4a9d6943 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/EncryptActivity.java @@ -747,7 +747,6 @@ public class EncryptActivity extends SherlockFragmentActivity { // choose default settings, action and data bundle by target if (mContentUri != null) { - // mDataSource.setUri(mContentUri); intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_ENCRYPT_SIGN_STREAM); @@ -769,14 +768,12 @@ public class EncryptActivity extends SherlockFragmentActivity { intent.putExtra(ApgService.EXTRA_ACTION, ApgService.ACTION_ENCRYPT_SIGN_BYTES); if (mData != null) { - // mDataSource.setData(mData); data.putByteArray(ApgService.BYTES, mData); } else { String message = mMessage.getText().toString(); if (signOnly && !mReturnResult) { fixBadCharactersForGmail(message); } - // mDataSource.setText(message); data.putByteArray(ApgService.BYTES, message.getBytes()); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/MailListActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/MailListActivity.java index 07e7196d5..639aab6eb 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/MailListActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/MailListActivity.java @@ -65,9 +65,8 @@ public class MailListActivity extends ListActivity { public String replyTo; public boolean signedOnly; - public Message(Conversation parent, long id, String subject, - String fromAddress, String replyTo, - String data, boolean signedOnly) { + public Message(Conversation parent, long id, String subject, String fromAddress, + String replyTo, String data, boolean signedOnly) { this.parent = parent; this.id = id; this.subject = subject; @@ -98,24 +97,19 @@ public class MailListActivity extends ListActivity { String account = getIntent().getExtras().getString(EXTRA_ACCOUNT); // TODO: what if account is null? Uri uri = Uri.parse("content://gmail-ls/conversations/" + account); - Cursor cursor = - managedQuery(uri, new String[] { "conversation_id", "subject" }, null, null, null); + Cursor cursor = managedQuery(uri, new String[] { "conversation_id", "subject" }, null, + null, null); for (int i = 0; i < cursor.getCount(); ++i) { cursor.moveToPosition(i); int idIndex = cursor.getColumnIndex("conversation_id"); int subjectIndex = cursor.getColumnIndex("subject"); long conversationId = cursor.getLong(idIndex); - Conversation conversation = - new Conversation(conversationId, cursor.getString(subjectIndex)); + Conversation conversation = new Conversation(conversationId, + cursor.getString(subjectIndex)); Uri messageUri = Uri.withAppendedPath(uri, "" + conversationId + "/messages"); - Cursor messageCursor = - managedQuery(messageUri, new String[] { - "messageId", - "subject", - "fromAddress", - "replyToAddresses", - "body" }, null, null, null); + Cursor messageCursor = managedQuery(messageUri, new String[] { "messageId", "subject", + "fromAddress", "replyToAddresses", "body" }, null, null, null); Vector messages = new Vector(); for (int j = 0; j < messageCursor.getCount(); ++j) { messageCursor.moveToPosition(j); @@ -139,13 +133,10 @@ public class MailListActivity extends ListActivity { data = null; } } - Message message = - new Message(conversation, - messageCursor.getLong(idIndex), - messageCursor.getString(subjectIndex), - messageCursor.getString(fromAddressIndex), - messageCursor.getString(replyToIndex), - data, signedOnly); + Message message = new Message(conversation, messageCursor.getLong(idIndex), + messageCursor.getString(subjectIndex), + messageCursor.getString(fromAddressIndex), + messageCursor.getString(replyToIndex), data, signedOnly); messages.add(message); mMessages.add(message); diff --git a/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java b/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java index ff888cd81..51cba35db 100644 --- a/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java +++ b/org_apg/src/org/thialfihar/android/apg/ui/MainActivity.java @@ -24,6 +24,7 @@ import org.thialfihar.android.apg.Id; import org.thialfihar.android.apg.R; import com.actionbarsherlock.app.ActionBar; +import com.actionbarsherlock.app.SherlockActivity; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuItem; @@ -35,7 +36,7 @@ import android.view.ContextMenu.ContextMenuInfo; import android.view.View; import android.widget.TextView; -public class MainActivity extends BaseActivity { +public class MainActivity extends SherlockActivity { static { Security.addProvider(new BouncyCastleProvider()); } diff --git a/org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java b/org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java new file mode 100644 index 000000000..ff4052257 --- /dev/null +++ b/org_apg/src/org/thialfihar/android/apg/ui/dialog/FileDialogFragment.java @@ -0,0 +1,211 @@ +/* + * Copyright (C) 2012 Dominik Schürmann + * + * 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.ui.dialog; + +import org.spongycastle.openpgp.PGPException; +import org.spongycastle.openpgp.PGPPrivateKey; +import org.spongycastle.openpgp.PGPSecretKey; +import org.spongycastle.openpgp.operator.PBESecretKeyDecryptor; +import org.spongycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder; +import org.thialfihar.android.apg.Apg; +import org.thialfihar.android.apg.Apg.GeneralException; +import org.thialfihar.android.apg.Constants; +import org.thialfihar.android.apg.Id; +import org.thialfihar.android.apg.R; + +import android.app.Activity; +import android.app.AlertDialog; +import android.app.Dialog; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; +import android.os.Bundle; +import android.os.Message; +import android.os.Messenger; +import android.os.RemoteException; +import android.support.v4.app.DialogFragment; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.EditText; +import android.widget.TextView; +import android.widget.Toast; + +public class FileDialogFragment extends DialogFragment { + + private Messenger mMessenger; + + private static final String ARG_MESSENGER = "messenger"; + private static final String ARG_SECRET_KEY_ID = "secret_key_id"; + + public static final int MESSAGE_OKAY = 1; + + /** + * Instantiates new instance of this dialog fragment + * + */ + public static FileDialogFragment newInstance(long secretKeyId, Messenger messenger){ + FileDialogFragment frag = new FileDialogFragment(); + Bundle args = new Bundle(); + args.putLong(ARG_SECRET_KEY_ID, secretKeyId); + args.putParcelable(ARG_MESSENGER, messenger); + + frag.setArguments(args); + + return frag; + } + + /** + * Checks if key has a passphrase + * + * @param secretKeyId + * @return true if it has a passphrase + */ + private static boolean hasPassphrase(long secretKeyId) { + // check if the key has no passphrase + try { + PGPSecretKey secretKey = Apg.getMasterKey(Apg.getSecretKeyRing(secretKeyId)); + + Log.d(Constants.TAG, "Check if key has no passphrase..."); + PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder().setProvider( + "SC").build("".toCharArray()); + PGPPrivateKey testKey = secretKey.extractPrivateKey(keyDecryptor); + if (testKey != null) { + Log.d(Constants.TAG, "Key has no passphrase! Caches empty passphrase!"); + + // cache empty passphrase + Apg.setCachedPassPhrase(secretKey.getKeyID(), ""); + + return false; + } + } catch (PGPException e) { + // silently catch + } + + return true; + } + + /** + * Creates dialog + */ + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Activity activity = getActivity(); + + long secretKeyId = getArguments().getLong(ARG_SECRET_KEY_ID); + mMessenger = getArguments().getParcelable(ARG_MESSENGER); + + AlertDialog.Builder alert = new AlertDialog.Builder(activity); + + alert.setTitle(R.string.title_authentication); + + final PGPSecretKey secretKey; + + if (secretKeyId == Id.key.symmetric || secretKeyId == Id.key.none) { + secretKey = null; + alert.setMessage(getString(R.string.passPhraseForSymmetricEncryption)); + } else { + secretKey = Apg.getMasterKey(Apg.getSecretKeyRing(secretKeyId)); + if (secretKey == null) { + alert.setTitle(R.string.title_keyNotFound); + alert.setMessage(getString(R.string.keyNotFound, secretKeyId)); + alert.setPositiveButton(android.R.string.ok, new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dismiss(); + } + }); + alert.setCancelable(false); + return alert.create(); + } + String userId = Apg.getMainUserIdSafe(activity, secretKey); + alert.setMessage(getString(R.string.passPhraseFor, userId)); + } + + LayoutInflater inflater = activity.getLayoutInflater(); + View view = inflater.inflate(R.layout.passphrase, null); + final EditText input = (EditText) view.findViewById(R.id.passphrase_passphrase); + + final TextView labelNotUsed = (TextView) view + .findViewById(R.id.passphrase_label_passphrase_again); + labelNotUsed.setVisibility(View.GONE); + final EditText inputNotUsed = (EditText) view + .findViewById(R.id.passphrase_passphrase_again); + inputNotUsed.setVisibility(View.GONE); + + alert.setView(view); + + alert.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dismiss(); + + String passPhrase = input.getText().toString(); + long keyId; + if (secretKey != null) { + try { + PBESecretKeyDecryptor keyDecryptor = new JcePBESecretKeyDecryptorBuilder() + .setProvider("SC").build(passPhrase.toCharArray()); + PGPPrivateKey testKey = secretKey.extractPrivateKey(keyDecryptor); + if (testKey == null) { + Toast.makeText(activity, R.string.error_couldNotExtractPrivateKey, + Toast.LENGTH_SHORT).show(); + return; + } + } catch (PGPException e) { + Toast.makeText(activity, R.string.wrongPassPhrase, Toast.LENGTH_SHORT) + .show(); + return; + } + keyId = secretKey.getKeyID(); + } else { + keyId = Id.key.symmetric; + } + + // cache the new passphrase + Log.d(Constants.TAG, "Everything okay! Caching entered passphrase"); + Apg.setCachedPassPhrase(keyId, passPhrase); + + sendMessageToHandler(MESSAGE_OKAY); + } + }); + + alert.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dismiss(); + } + }); + + return alert.create(); + } + + /** + * Send message back to handler which is initialized in a activity + * + * @param what + * Message integer you want to send + */ + private void sendMessageToHandler(Integer what) { + Message msg = Message.obtain(); + msg.what = what; + + try { + mMessenger.send(msg); + } catch (RemoteException e) { + Log.w(Constants.TAG, "Exception sending message, Is handler present?", e); + } catch (NullPointerException e) { + Log.w(Constants.TAG, "Messenger is null!", e); + } + } +} \ No newline at end of file