mirror of
https://github.com/moparisthebest/k-9
synced 2024-12-25 09:08:49 -05:00
added comments, reworked a bit, and created warning dialog if some recipients don't have keys saved.
This commit is contained in:
parent
18ad12eda7
commit
94ba9bf71f
@ -61,6 +61,7 @@
|
|||||||
<string name="forward_action">Forward</string>
|
<string name="forward_action">Forward</string>
|
||||||
<string name="move_action">Move</string>
|
<string name="move_action">Move</string>
|
||||||
<string name="continue_action">Continue</string>
|
<string name="continue_action">Continue</string>
|
||||||
|
<string name="back_action">Back</string>
|
||||||
<string name="done_action">Done</string> <!-- Used to complete a multi-step process -->
|
<string name="done_action">Done</string> <!-- Used to complete a multi-step process -->
|
||||||
<string name="remove_action">Remove</string>
|
<string name="remove_action">Remove</string>
|
||||||
<string name="discard_action">Discard</string>
|
<string name="discard_action">Discard</string>
|
||||||
@ -1026,6 +1027,9 @@ Welcome to K-9 Mail setup. K-9 is an open source mail client for Android origin
|
|||||||
<string name="refuse_to_save_draft_marked_encrypted_dlg_title">Refuse to save draft message.</string>
|
<string name="refuse_to_save_draft_marked_encrypted_dlg_title">Refuse to save draft message.</string>
|
||||||
<string name="refuse_to_save_draft_marked_encrypted_instructions_fmt">Refuse to save draft message marked encrypted.</string>
|
<string name="refuse_to_save_draft_marked_encrypted_instructions_fmt">Refuse to save draft message marked encrypted.</string>
|
||||||
|
|
||||||
|
<string name="continue_without_public_key_dlg_title">Continue without public key?</string>
|
||||||
|
<string name="continue_without_public_key_instructions_fmt">One or more recipients do not have a saved public key. Continue?</string>
|
||||||
|
|
||||||
<string name="charset_not_found">This message can\'t be displayed because the charset \"<xliff:g id="charset">%s</xliff:g>\" wasn\'t found.</string>
|
<string name="charset_not_found">This message can\'t be displayed because the charset \"<xliff:g id="charset">%s</xliff:g>\" wasn\'t found.</string>
|
||||||
|
|
||||||
<string name="select_text_now">Select text to copy.</string>
|
<string name="select_text_now">Select text to copy.</string>
|
||||||
|
@ -81,6 +81,7 @@ import com.fsck.k9.mail.store.LocalStore.LocalAttachmentBody;
|
|||||||
public class MessageCompose extends K9Activity implements OnClickListener, OnFocusChangeListener {
|
public class MessageCompose extends K9Activity implements OnClickListener, OnFocusChangeListener {
|
||||||
private static final int DIALOG_SAVE_OR_DISCARD_DRAFT_MESSAGE = 1;
|
private static final int DIALOG_SAVE_OR_DISCARD_DRAFT_MESSAGE = 1;
|
||||||
private static final int DIALOG_REFUSE_TO_SAVE_DRAFT_MARKED_ENCRYPTED = 2;
|
private static final int DIALOG_REFUSE_TO_SAVE_DRAFT_MARKED_ENCRYPTED = 2;
|
||||||
|
private static final int DIALOG_CONTINUE_WITHOUT_PUBLIC_KEY = 3;
|
||||||
|
|
||||||
private static final String ACTION_COMPOSE = "com.fsck.k9.intent.action.COMPOSE";
|
private static final String ACTION_COMPOSE = "com.fsck.k9.intent.action.COMPOSE";
|
||||||
private static final String ACTION_REPLY = "com.fsck.k9.intent.action.REPLY";
|
private static final String ACTION_REPLY = "com.fsck.k9.intent.action.REPLY";
|
||||||
@ -210,6 +211,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
|
|||||||
|
|
||||||
private PgpData mPgpData = null;
|
private PgpData mPgpData = null;
|
||||||
private boolean mAutoEncrypt = false;
|
private boolean mAutoEncrypt = false;
|
||||||
|
private boolean mContinueWithoutPublicKey = false;
|
||||||
|
|
||||||
private String mReferences;
|
private String mReferences;
|
||||||
private String mInReplyTo;
|
private String mInReplyTo;
|
||||||
@ -444,6 +446,8 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
|
|||||||
public void afterTextChanged(android.text.Editable s) { }
|
public void afterTextChanged(android.text.Editable s) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// For watching changes to the To:, Cc:, and Bcc: fields for auto-encryption on a matching
|
||||||
|
// address.
|
||||||
TextWatcher recipientWatcher = new TextWatcher() {
|
TextWatcher recipientWatcher = new TextWatcher() {
|
||||||
public void beforeTextChanged(CharSequence s, int start, int before, int after) { }
|
public void beforeTextChanged(CharSequence s, int start, int before, int after) { }
|
||||||
|
|
||||||
@ -455,10 +459,10 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
|
|||||||
final CryptoProvider crypto = mAccount.getCryptoProvider();
|
final CryptoProvider crypto = mAccount.getCryptoProvider();
|
||||||
if (mAutoEncrypt && crypto.isAvailable(getApplicationContext())) {
|
if (mAutoEncrypt && crypto.isAvailable(getApplicationContext())) {
|
||||||
for (Address address : getRecipientAddresses()) {
|
for (Address address : getRecipientAddresses()) {
|
||||||
long ids[] = crypto.getPublicKeyIdsFromEmail(getApplicationContext(),
|
if (crypto.hasPublicKeyForEmail(getApplicationContext(),
|
||||||
address.getAddress());
|
address.getAddress())) {
|
||||||
if (ids != null && ids.length > 0) {
|
|
||||||
mEncryptCheckbox.setChecked(true);
|
mEncryptCheckbox.setChecked(true);
|
||||||
|
mContinueWithoutPublicKey = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -950,6 +954,10 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
|
|||||||
return Address.parseUnencoded(view.getText().toString().trim());
|
return Address.parseUnencoded(view.getText().toString().trim());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns an Address array of recipients this email will be sent to.
|
||||||
|
* @return Address array of recipients this email will be sent to.
|
||||||
|
*/
|
||||||
private Address[] getRecipientAddresses() {
|
private Address[] getRecipientAddresses() {
|
||||||
String addresses = mToView.getText().toString() + mCcView.getText().toString()
|
String addresses = mToView.getText().toString() + mCcView.getText().toString()
|
||||||
+ mBccView.getText().toString();
|
+ mBccView.getText().toString();
|
||||||
@ -1497,20 +1505,20 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
|
|||||||
Toast.makeText(this, getString(R.string.message_compose_error_no_recipients), Toast.LENGTH_LONG).show();
|
Toast.makeText(this, getString(R.string.message_compose_error_no_recipients), Toast.LENGTH_LONG).show();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
final CryptoProvider crypto = mAccount.getCryptoProvider();
|
||||||
if (mEncryptCheckbox.isChecked() && !mPgpData.hasEncryptionKeys()) {
|
if (mEncryptCheckbox.isChecked() && !mPgpData.hasEncryptionKeys()) {
|
||||||
mMessageFormat = MessageFormat.TEXT;
|
mMessageFormat = MessageFormat.TEXT;
|
||||||
// key selection before encryption
|
// key selection before encryption
|
||||||
StringBuilder emails = new StringBuilder();
|
StringBuilder emails = new StringBuilder();
|
||||||
Address[][] addresses = new Address[][] { getAddresses(mToView),
|
for (Address address : getRecipientAddresses()) {
|
||||||
getAddresses(mCcView),
|
if (emails.length() != 0) {
|
||||||
getAddresses(mBccView)
|
emails.append(',');
|
||||||
};
|
}
|
||||||
for (Address[] addressArray : addresses) {
|
emails.append(address.getAddress());
|
||||||
for (Address address : addressArray) {
|
if (!mContinueWithoutPublicKey &&
|
||||||
if (emails.length() != 0) {
|
!crypto.hasPublicKeyForEmail(this, address.getAddress())) {
|
||||||
emails.append(',');
|
showDialog(DIALOG_CONTINUE_WITHOUT_PUBLIC_KEY);
|
||||||
}
|
return;
|
||||||
emails.append(address.getAddress());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (emails.length() != 0) {
|
if (emails.length() != 0) {
|
||||||
@ -1519,7 +1527,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
|
|||||||
emails.append(mIdentity.getEmail());
|
emails.append(mIdentity.getEmail());
|
||||||
|
|
||||||
mPreventDraftSaving = true;
|
mPreventDraftSaving = true;
|
||||||
if (!mAccount.getCryptoProvider().selectEncryptionKeys(MessageCompose.this, emails.toString(), mPgpData)) {
|
if (!crypto.selectEncryptionKeys(MessageCompose.this, emails.toString(), mPgpData)) {
|
||||||
mPreventDraftSaving = false;
|
mPreventDraftSaving = false;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@ -1528,7 +1536,7 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
|
|||||||
if (mPgpData.getEncryptedData() == null) {
|
if (mPgpData.getEncryptedData() == null) {
|
||||||
String text = buildText(false).getText();
|
String text = buildText(false).getText();
|
||||||
mPreventDraftSaving = true;
|
mPreventDraftSaving = true;
|
||||||
if (!mAccount.getCryptoProvider().encrypt(this, text, mPgpData)) {
|
if (!crypto.encrypt(this, text, mPgpData)) {
|
||||||
mPreventDraftSaving = false;
|
mPreventDraftSaving = false;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@ -2015,6 +2023,24 @@ public class MessageCompose extends K9Activity implements OnClickListener, OnFoc
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
.create();
|
.create();
|
||||||
|
case DIALOG_CONTINUE_WITHOUT_PUBLIC_KEY:
|
||||||
|
return new AlertDialog.Builder(this)
|
||||||
|
.setTitle(R.string.continue_without_public_key_dlg_title)
|
||||||
|
.setMessage(R.string.continue_without_public_key_instructions_fmt)
|
||||||
|
.setPositiveButton(R.string.continue_action, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int whichButton) {
|
||||||
|
dismissDialog(DIALOG_CONTINUE_WITHOUT_PUBLIC_KEY);
|
||||||
|
mContinueWithoutPublicKey = true;
|
||||||
|
onSend();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.setNegativeButton(R.string.back_action, new DialogInterface.OnClickListener() {
|
||||||
|
public void onClick(DialogInterface dialog, int whichButton) {
|
||||||
|
dismissDialog(DIALOG_CONTINUE_WITHOUT_PUBLIC_KEY);
|
||||||
|
mContinueWithoutPublicKey = false;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.create();
|
||||||
}
|
}
|
||||||
return super.onCreateDialog(id);
|
return super.onCreateDialog(id);
|
||||||
}
|
}
|
||||||
|
@ -243,11 +243,9 @@ public class Apg extends CryptoProvider {
|
|||||||
public long[] getPublicKeyIdsFromEmail(Context context, String email) {
|
public long[] getPublicKeyIdsFromEmail(Context context, String email) {
|
||||||
long ids[] = null;
|
long ids[] = null;
|
||||||
try {
|
try {
|
||||||
Uri contentUri = Uri.withAppendedPath(Apg.CONTENT_URI_PUBLIC_KEY_RING_BY_EMAILS,
|
Uri contentUri = Uri.withAppendedPath(Apg.CONTENT_URI_PUBLIC_KEY_RING_BY_EMAILS, email);
|
||||||
email);
|
|
||||||
Cursor c = context.getContentResolver().query(contentUri,
|
Cursor c = context.getContentResolver().query(contentUri,
|
||||||
new String[] { "master_key_id" },
|
new String[] { "master_key_id" }, null, null, null);
|
||||||
null, null, null);
|
|
||||||
if (c != null && c.getCount() > 0) {
|
if (c != null && c.getCount() > 0) {
|
||||||
ids = new long[c.getCount()];
|
ids = new long[c.getCount()];
|
||||||
while (c.moveToNext()) {
|
while (c.moveToNext()) {
|
||||||
@ -267,6 +265,62 @@ public class Apg extends CryptoProvider {
|
|||||||
return ids;
|
return ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find out if a given email has a secret key.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* @param email The email in question.
|
||||||
|
* @return true if there is a secret key for this email.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean hasSecretKeyForEmail(Context context, String email) {
|
||||||
|
try {
|
||||||
|
Uri contentUri = Uri.withAppendedPath(Apg.CONTENT_URI_SECRET_KEY_RING_BY_EMAILS, email);
|
||||||
|
Cursor c = context.getContentResolver().query(contentUri,
|
||||||
|
new String[] { "master_key_id" }, null, null, null);
|
||||||
|
if (c != null && c.getCount() > 0) {
|
||||||
|
c.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (c != null) {
|
||||||
|
c.close();
|
||||||
|
}
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
Toast.makeText(context,
|
||||||
|
context.getResources().getString(R.string.insufficient_apg_permissions),
|
||||||
|
Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find out if a given email has a public key.
|
||||||
|
*
|
||||||
|
* @param context
|
||||||
|
* @param email The email in question.
|
||||||
|
* @return true if there is a public key for this email.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean hasPublicKeyForEmail(Context context, String email) {
|
||||||
|
try {
|
||||||
|
Uri contentUri = Uri.withAppendedPath(Apg.CONTENT_URI_PUBLIC_KEY_RING_BY_EMAILS, email);
|
||||||
|
Cursor c = context.getContentResolver().query(contentUri,
|
||||||
|
new String[] { "master_key_id" }, null, null, null);
|
||||||
|
if (c != null && c.getCount() > 0) {
|
||||||
|
c.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (c != null) {
|
||||||
|
c.close();
|
||||||
|
}
|
||||||
|
} catch (SecurityException e) {
|
||||||
|
Toast.makeText(context,
|
||||||
|
context.getResources().getString(R.string.insufficient_apg_permissions),
|
||||||
|
Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the user id based on the key id.
|
* Get the user id based on the key id.
|
||||||
*
|
*
|
||||||
|
@ -25,6 +25,8 @@ abstract public class CryptoProvider {
|
|||||||
abstract public boolean decrypt(Activity activity, String data, PgpData pgpData);
|
abstract public boolean decrypt(Activity activity, String data, PgpData pgpData);
|
||||||
abstract public long[] getSecretKeyIdsFromEmail(Context context, String email);
|
abstract public long[] getSecretKeyIdsFromEmail(Context context, String email);
|
||||||
abstract public long[] getPublicKeyIdsFromEmail(Context context, String email);
|
abstract public long[] getPublicKeyIdsFromEmail(Context context, String email);
|
||||||
|
abstract public boolean hasSecretKeyForEmail(Context context, String email);
|
||||||
|
abstract public boolean hasPublicKeyForEmail(Context context, String email);
|
||||||
abstract public String getUserId(Context context, long keyId);
|
abstract public String getUserId(Context context, long keyId);
|
||||||
abstract public String getName();
|
abstract public String getName();
|
||||||
abstract public boolean test(Context context);
|
abstract public boolean test(Context context);
|
||||||
|
@ -42,6 +42,16 @@ public class None extends CryptoProvider {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasSecretKeyForEmail(Context context, String email) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasPublicKeyForEmail(Context context, String email) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getUserId(Context context, long keyId) {
|
public String getUserId(Context context, long keyId) {
|
||||||
return null;
|
return null;
|
||||||
|
Loading…
Reference in New Issue
Block a user