diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c494c360..b685943d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ * add mute option "8 hours" * add menu option to easily save/unsave selected message * improve deletion confirmation for "Device Messages" +* remove dangerous encryption options * always paste as plain text in message draft area * some small bug fixes and updated translations * update to core 1.157.2 diff --git a/src/main/java/com/b44t/messenger/DcMsg.java b/src/main/java/com/b44t/messenger/DcMsg.java index d1828b495..fc9996f1b 100644 --- a/src/main/java/com/b44t/messenger/DcMsg.java +++ b/src/main/java/com/b44t/messenger/DcMsg.java @@ -150,7 +150,6 @@ public class DcMsg { public native String getWebxdcHref (); public native boolean isForwarded (); public native boolean isInfo (); - public native boolean isSetupMessage (); public native boolean hasHtml (); public native String getSetupCodeBegin (); public native String getVideochatUrl (); diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationAdapter.java b/src/main/java/org/thoughtcrime/securesms/ConversationAdapter.java index 156496854..c2e805af4 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationAdapter.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationAdapter.java @@ -294,7 +294,7 @@ public class ConversationAdapter else if (type==DcMsg.DC_MSG_AUDIO || type==DcMsg.DC_MSG_VOICE) { return dcMsg.isOutgoing()? MESSAGE_TYPE_AUDIO_OUTGOING : MESSAGE_TYPE_AUDIO_INCOMING; } - else if (type==DcMsg.DC_MSG_FILE && !dcMsg.isSetupMessage()) { + else if (type==DcMsg.DC_MSG_FILE) { return dcMsg.isOutgoing()? MESSAGE_TYPE_DOCUMENT_OUTGOING : MESSAGE_TYPE_DOCUMENT_INCOMING; } else if (type==DcMsg.DC_MSG_IMAGE || type==DcMsg.DC_MSG_GIF || type==DcMsg.DC_MSG_VIDEO) { diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java index 09e4f5360..2d995b519 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationFragment.java @@ -25,8 +25,6 @@ import android.content.Context; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; -import android.text.Editable; -import android.text.TextWatcher; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; @@ -37,12 +35,10 @@ import android.view.ViewGroup; import android.view.Window; import android.view.animation.Animation; import android.view.animation.AnimationUtils; -import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.view.ActionMode; import androidx.recyclerview.widget.LinearLayoutManager; @@ -725,80 +721,6 @@ public class ConversationFragment extends MessageSelectorFragment Util.runOnAnyBackgroundThread(() -> dcContext.markseenMsgs(ids)); } - - void querySetupCode(final DcMsg dcMsg, String[] preload) - { - if( !dcMsg.isSetupMessage()) { - return; - } - - View gl = View.inflate(getActivity(), R.layout.setup_code_grid, null); - final EditText[] editTexts = { - gl.findViewById(R.id.setupCode0), gl.findViewById(R.id.setupCode1), gl.findViewById(R.id.setupCode2), - gl.findViewById(R.id.setupCode3), gl.findViewById(R.id.setupCode4), gl.findViewById(R.id.setupCode5), - gl.findViewById(R.id.setupCode6), gl.findViewById(R.id.setupCode7), gl.findViewById(R.id.setupCode8) - }; - AlertDialog.Builder builder1 = new AlertDialog.Builder(getActivity()); - builder1.setView(gl); - editTexts[0].setText(dcMsg.getSetupCodeBegin()); - editTexts[0].setSelection(editTexts[0].getText().length()); - - for( int i = 0; i < 9; i++ ) { - if( preload != null && i < preload.length ) { - editTexts[i].setText(preload[i]); - editTexts[i].setSelection(editTexts[i].getText().length()); - } - editTexts[i].addTextChangedListener(new TextWatcher() { - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - if( s.length()==4 ) { - for ( int i = 0; i < 8; i++ ) { - if( editTexts[i].hasFocus() && editTexts[i+1].getText().length()<4 ) { - editTexts[i+1].requestFocus(); - break; - } - } - } - } - - @Override - public void afterTextChanged(Editable s) { - } - }); - } - - builder1.setTitle(getActivity().getString(R.string.autocrypt_continue_transfer_title)); - builder1.setMessage(getActivity().getString(R.string.autocrypt_continue_transfer_please_enter_code)); - builder1.setNegativeButton(android.R.string.cancel, null); - builder1.setCancelable(false); // prevent the dialog from being dismissed accidentally (when the dialog is closed, the setup code is gone forever and the user has to create a new setup message) - builder1.setPositiveButton(android.R.string.ok, (dialog, which) -> { - String setup_code = ""; - final String[] preload1 = new String[9]; - for ( int i = 0; i < 9; i++ ) { - preload1[i] = editTexts[i].getText().toString(); - setup_code += preload1[i]; - } - boolean success = dcContext.continueKeyTransfer(dcMsg.getId(), setup_code); - - AlertDialog.Builder builder2 = new AlertDialog.Builder(getActivity()); - builder2.setTitle(getActivity().getString(R.string.autocrypt_continue_transfer_title)); - builder2.setMessage(getActivity().getString(success? R.string.autocrypt_continue_transfer_succeeded : R.string.autocrypt_bad_setup_code)); - if( success ) { - builder2.setPositiveButton(android.R.string.ok, null); - } - else { - builder2.setNegativeButton(android.R.string.cancel, null); - builder2.setPositiveButton(R.string.autocrypt_continue_transfer_retry, (dialog1, which1) -> querySetupCode(dcMsg, preload1)); - } - builder2.show(); - }); - builder1.show(); - } - private class ConversationFragmentItemClickListener implements ItemClickListener { @Override @@ -818,9 +740,6 @@ public class ConversationFragment extends MessageSelectorFragment actionMode.setTitleOptionalHint(false); // the title represents important information, also indicating implicitly, more items can be selected } } - else if(messageRecord.isSetupMessage()) { - querySetupCode(messageRecord,null); - } else if (messageRecord.getType()==DcMsg.DC_MSG_VIDEOCHAT_INVITATION) { new VideochatUtil().join(getActivity(), messageRecord.getId()); } diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java index e8835f3e2..9686528df 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationItem.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationItem.java @@ -390,7 +390,7 @@ public class ConversationItem extends BaseConversationItem } private boolean hasDocument(DcMsg dcMsg) { - return dcMsg.getType()==DcMsg.DC_MSG_FILE && !dcMsg.isSetupMessage(); + return dcMsg.getType()==DcMsg.DC_MSG_FILE; } private void setBodyText(DcMsg messageRecord) { @@ -399,11 +399,7 @@ public class ConversationItem extends BaseConversationItem String text = messageRecord.getText(); - if (messageRecord.isSetupMessage()) { - bodyText.setText(context.getString(R.string.autocrypt_asm_click_body)); - bodyText.setVisibility(View.VISIBLE); - } - else if (text.isEmpty()) { + if (text.isEmpty()) { bodyText.setVisibility(View.GONE); } else { diff --git a/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java index fba404de7..493ab595a 100644 --- a/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java +++ b/src/main/java/org/thoughtcrime/securesms/connect/DcHelper.java @@ -61,7 +61,6 @@ public class DcHelper { public static final String CONFIG_DISPLAY_NAME = "displayname"; public static final String CONFIG_SELF_STATUS = "selfstatus"; public static final String CONFIG_SELF_AVATAR = "selfavatar"; - public static final String CONFIG_E2EE_ENABLED = "e2ee_enabled"; public static final String CONFIG_SENTBOX_WATCH = "sentbox_watch"; public static final String CONFIG_MVBOX_MOVE = "mvbox_move"; public static final String CONFIG_ONLY_FETCH_MVBOX = "only_fetch_mvbox"; diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index 6546d33f5..12a523425 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.preferences; import static android.app.Activity.RESULT_OK; import static android.text.InputType.TYPE_TEXT_VARIATION_URI; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_BCC_SELF; -import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_E2EE_ENABLED; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_MVBOX_MOVE; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_ONLY_FETCH_MVBOX; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SENTBOX_WATCH; @@ -11,13 +10,11 @@ import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SHOW_EMAILS; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_WEBXDC_REALTIME_ENABLED; import static org.thoughtcrime.securesms.connect.DcHelper.getRpc; -import android.Manifest; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.util.Log; import android.view.View; @@ -32,7 +29,6 @@ import androidx.preference.CheckBoxPreference; import androidx.preference.ListPreference; import androidx.preference.Preference; -import com.b44t.messenger.DcContext; import com.b44t.messenger.rpc.RpcException; import org.thoughtcrime.securesms.ApplicationPreferencesActivity; @@ -42,12 +38,9 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.RegistrationActivity; import org.thoughtcrime.securesms.connect.DcEventCenter; import org.thoughtcrime.securesms.connect.DcHelper; -import org.thoughtcrime.securesms.mms.AttachmentManager; -import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.proxy.ProxySettingsActivity; import org.thoughtcrime.securesms.util.Prefs; import org.thoughtcrime.securesms.util.ScreenLockUtil; -import org.thoughtcrime.securesms.util.StorageUtil; import org.thoughtcrime.securesms.util.StreamUtil; import org.thoughtcrime.securesms.util.Util; @@ -63,10 +56,8 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment implements DcEventCenter.DcEventDelegate { private static final String TAG = AdvancedPreferenceFragment.class.getSimpleName(); - public static final int PICK_SELF_KEYS = 29923; private ListPreference showEmails; - CheckBoxPreference preferE2eeCheckbox; CheckBoxPreference sentboxWatchCheckbox; CheckBoxPreference bccSelfCheckbox; CheckBoxPreference mvboxMoveCheckbox; @@ -92,11 +83,6 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment sendAsm.setOnPreferenceClickListener(new SendAsmListener()); } - preferE2eeCheckbox = (CheckBoxPreference) this.findPreference("pref_prefer_e2ee"); - if (preferE2eeCheckbox != null) { - preferE2eeCheckbox.setOnPreferenceChangeListener(new PreferE2eeListener()); - } - sentboxWatchCheckbox = (CheckBoxPreference) this.findPreference("pref_sentbox_watch"); if (sentboxWatchCheckbox != null) { sentboxWatchCheckbox.setOnPreferenceChangeListener((preference, newValue) -> { @@ -163,11 +149,6 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment }); } - Preference manageKeys = this.findPreference("pref_manage_keys"); - if (manageKeys != null) { - manageKeys.setOnPreferenceClickListener(new ManageKeysListener()); - } - Preference screenSecurity = this.findPreference(Prefs.SCREEN_SECURITY_PREF); if (screenSecurity != null) { screenSecurity.setOnPreferenceChangeListener(new ScreenShotSecurityListener()); @@ -269,7 +250,6 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment } if (dcContext.isChatmail()) { - preferE2eeCheckbox.setVisible(false); showSystemContacts.setVisible(false); sentboxWatchCheckbox.setVisible(false); bccSelfCheckbox.setVisible(false); @@ -292,7 +272,6 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment showEmails.setValue(value); updateListSummary(showEmails, value); - preferE2eeCheckbox.setChecked(0!=dcContext.getConfigInt(CONFIG_E2EE_ENABLED)); sentboxWatchCheckbox.setChecked(0!=dcContext.getConfigInt(CONFIG_SENTBOX_WATCH)); bccSelfCheckbox.setChecked(0!=dcContext.getConfigInt(CONFIG_BCC_SELF)); mvboxMoveCheckbox.setChecked(0!=dcContext.getConfigInt(CONFIG_MVBOX_MOVE)); @@ -304,24 +283,7 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (resultCode != RESULT_OK) return; - if (requestCode == REQUEST_CODE_CONFIRM_CREDENTIALS_KEYS) { - manageKeys(); - } else if (requestCode == PICK_SELF_KEYS) { - Uri uri = (data != null ? data.getData() : null); - if (uri == null) { - Log.e(TAG, " Can't import null URI"); - return; - } - try { - String name = AttachmentManager.getFileName(getContext(), uri); - if (name == null || name.isEmpty()) name = "FILE"; - File file = copyToCacheDir(uri); - showImportKeysDialog(file.getAbsolutePath(), name); - } catch (IOException e) { - Log.e(TAG, "Error calling copyToCacheDir()", e); - } - } else if (requestCode == REQUEST_CODE_CONFIRM_CREDENTIALS_ACCOUNT) { + if (resultCode == RESULT_OK && requestCode == REQUEST_CODE_CONFIRM_CREDENTIALS_ACCOUNT) { openRegistrationActivity(); } } @@ -470,76 +432,4 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment return true; } } - - private class PreferE2eeListener implements Preference.OnPreferenceChangeListener { - @Override - public boolean onPreferenceChange(@NonNull final Preference preference, Object newValue) { - boolean enabled = (Boolean) newValue; - dcContext.setConfigInt(CONFIG_E2EE_ENABLED, enabled? 1 : 0); - return true; - } - } - - /*********************************************************************************************** - * Key Import/Export - **********************************************************************************************/ - protected void showImportKeysDialog(String imexPath, String pathAsDisplayedToUser) { - new AlertDialog.Builder(requireActivity()) - .setTitle(R.string.pref_managekeys_import_secret_keys) - .setMessage(requireActivity().getString(R.string.pref_managekeys_import_explain, pathAsDisplayedToUser)) - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(android.R.string.ok, (dialogInterface2, i2) -> startImexOne(DcContext.DC_IMEX_IMPORT_SELF_KEYS, imexPath, pathAsDisplayedToUser)) - .show(); - } - - private class ManageKeysListener implements Preference.OnPreferenceClickListener { - @Override - public boolean onPreferenceClick(@NonNull Preference preference) { - boolean result = ScreenLockUtil.applyScreenLock(requireActivity(), getString(R.string.pref_manage_keys), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_KEYS); - if (!result) { - manageKeys(); - } - return true; - } - } - - private void manageKeys() { - Activity activity = requireActivity(); - Permissions.with(activity) - .request(Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE) - .alwaysGrantOnSdk30() - .ifNecessary() - .withPermanentDenialDialog(getString(R.string.perm_explain_access_to_storage_denied)) - .onAllGranted(() -> { - new AlertDialog.Builder(activity) - .setTitle(R.string.pref_managekeys_menu_title) - .setItems(new CharSequence[]{ - activity.getString(R.string.pref_managekeys_export_secret_keys), - activity.getString(R.string.pref_managekeys_import_secret_keys) - }, - (dialogInterface, i) -> { - if (i==0) { - new AlertDialog.Builder(activity) - .setTitle(R.string.pref_managekeys_export_secret_keys) - .setMessage(activity.getString(R.string.pref_managekeys_export_explain, DcHelper.getImexDir().getAbsolutePath())) - .setNegativeButton(android.R.string.cancel, null) - .setPositiveButton(android.R.string.ok, (dialogInterface2, i2) -> startImexOne(DcContext.DC_IMEX_EXPORT_SELF_KEYS)) - .show(); - } - else { - if (Build.VERSION.SDK_INT >= 30) { - AttachmentManager.selectMediaType(activity, "*/*", null, PICK_SELF_KEYS, StorageUtil.getDownloadUri()); - } else { - String path = DcHelper.getImexDir().getAbsolutePath(); - showImportKeysDialog(path, path); - } - } - } - ) - .setNegativeButton(R.string.cancel, null) - .setNeutralButton(R.string.learn_more, (d, w) -> DcHelper.openHelp(activity, "#importkey")) - .show(); - }) - .execute(); - } } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 3d9324804..67b212e16 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -879,6 +879,7 @@ Prefer End-To-End Encryption Autocrypt Setup Message This is the Autocrypt Setup Message used to transfer your end-to-end setup between clients.\n\nTo decrypt and use your setup, open the message in an Autocrypt-compliant client and enter the setup code presented on the generating device. + This is the Autocrypt Setup Message used to transfer your end-to-end setup between clients.\n\nTo decrypt and use your setup, tap or click on this message. Autocrypt Setup Message Please enter the setup code displayed on the other device. diff --git a/src/main/res/xml/preferences_advanced.xml b/src/main/res/xml/preferences_advanced.xml index 3de6b403f..f106c7246 100644 --- a/src/main/res/xml/preferences_advanced.xml +++ b/src/main/res/xml/preferences_advanced.xml @@ -70,16 +70,9 @@ - - - - - - +