From e666bbf610907e19db79cc29592badeb1d04f6d8 Mon Sep 17 00:00:00 2001 From: adbenitez Date: Thu, 5 Sep 2024 21:14:58 +0200 Subject: [PATCH 1/5] allow to set proxy in InstantOnboardingActivity --- src/main/AndroidManifest.xml | 5 + .../securesms/InstantOnboardingActivity.java | 19 ++- .../securesms/ProxySettingsActivity.java | 150 ++++++++++++++++++ .../res/layout/proxy_settings_activity.xml | 128 +++++++++++++++ src/main/res/menu/instant_onboarding_menu.xml | 15 ++ src/main/res/values/strings.xml | 2 + 6 files changed, 318 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java create mode 100644 src/main/res/layout/proxy_settings_activity.xml create mode 100644 src/main/res/menu/instant_onboarding_menu.xml diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index 3b2ee429f..ec201402c 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -249,6 +249,11 @@ + + { + proxyGroup.setVisibility(isChecked? View.VISIBLE : View.GONE); + }); + proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED) == 1); + + TextInputEditText proxyHostInput = findViewById(R.id.proxy_host_text); + proxyHostInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.SERVER)); + proxyHostInput.setText(DcHelper.get(this, CONFIG_SOCKS5_HOST)); + + TextInputEditText proxyPortInput = findViewById(R.id.proxy_port_text); + proxyPortInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.PORT)); + proxyPortInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PORT)); + + TextInputEditText proxyUserInput = findViewById(R.id.proxy_user_text); + proxyUserInput.setText(DcHelper.get(this, CONFIG_SOCKS5_USER)); + + TextInputEditText proxyPasswordInput = findViewById(R.id.proxy_password_text); + proxyPasswordInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PASSWORD)); + } + + @Override + public void onResume() { + super.onResume(); + dynamicTheme.onResume(this); + } + + public boolean onOptionsItemSelected(MenuItem item) { + int id = item.getItemId(); + if (id == android.R.id.home) { + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + + @Override + public void onDestroy() { + super.onDestroy(); + saveConfig(); + } + + private void focusListener(View view, boolean focused, VerificationType type) { + + if (!focused) { + TextInputEditText inputEditText = (TextInputEditText) view; + switch (type) { + case SERVER: + verifyServer(inputEditText); + break; + case PORT: + verifyPort(inputEditText); + break; + } + } + } + + private void verifyServer(TextInputEditText view) { + String server = view.getText().toString(); + if (!TextUtils.isEmpty(server) && !Patterns.DOMAIN_NAME.matcher(server).matches() + && !Patterns.IP_ADDRESS.matcher(server).matches() + && !Patterns.WEB_URL.matcher(server).matches() + && !"localhost".equals(server)) { + view.setError(getString(R.string.login_error_server)); + } + } + + private void verifyPort(TextInputEditText view) { + String portString = view.getText().toString(); + if (!portString.isEmpty()) { + String error = getString(R.string.login_error_port); + try { + int port = Integer.valueOf(portString); + if (port < 1 || port > 65535) { + view.setError(error); + } + } catch (NumberFormatException exception) { + view.setError(error); + } + } + } + + private void saveConfig() { + DcHelper.getContext(this).setConfigInt(CONFIG_SOCKS5_ENABLED, proxySwitch.isChecked()? 1 : 0); + setConfig(R.id.proxy_host_text, CONFIG_SOCKS5_HOST, true); + setConfig(R.id.proxy_port_text, CONFIG_SOCKS5_PORT, true); + setConfig(R.id.proxy_user_text, CONFIG_SOCKS5_USER, true); + setConfig(R.id.proxy_password_text, CONFIG_SOCKS5_PASSWORD, false); + } + + private void setConfig(@IdRes int viewId, String configTarget, boolean doTrim) { + TextInputEditText view = findViewById(viewId); + String value = view.getText().toString(); + if(doTrim) { + value = value.trim(); + } + DcHelper.getContext(this).setConfig(configTarget, value.isEmpty()? null : value); + } + +} diff --git a/src/main/res/layout/proxy_settings_activity.xml b/src/main/res/layout/proxy_settings_activity.xml new file mode 100644 index 000000000..d3660855e --- /dev/null +++ b/src/main/res/layout/proxy_settings_activity.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/res/menu/instant_onboarding_menu.xml b/src/main/res/menu/instant_onboarding_menu.xml new file mode 100644 index 000000000..c30ec587c --- /dev/null +++ b/src/main/res/menu/instant_onboarding_menu.xml @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 17bc0caff..9ae997edb 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -604,6 +604,8 @@ SMTP Port SMTP Security Authorization Method + Proxy Settings + Use Proxy SOCKS5 Use SOCKS5 From 18974ff0232ea2044480cd82c48894f52069534e Mon Sep 17 00:00:00 2001 From: adbenitez Date: Mon, 9 Sep 2024 19:32:41 +0200 Subject: [PATCH 2/5] use new proxy screen in RegistrationActivity --- .../securesms/ProxySettingsActivity.java | 6 + .../securesms/RegistrationActivity.java | 52 +++----- src/main/res/layout/registration_activity.xml | 121 ++---------------- 3 files changed, 35 insertions(+), 144 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java b/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java index 8471e84cb..0c049172a 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java @@ -90,6 +90,12 @@ public class ProxySettingsActivity extends BaseActionBarActivity { saveConfig(); } + @Override + public void onPause() { + super.onPause(); + saveConfig(); + } + private void focusListener(View view, boolean focused, VerificationType type) { if (!focused) { diff --git a/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java b/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java index f41c22896..8a5eb6f9e 100644 --- a/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/RegistrationActivity.java @@ -96,7 +96,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve Spinner certCheck; private SwitchCompat proxySwitch; - private Group proxyGroup; @Override public void onCreate(Bundle bundle) { @@ -127,15 +126,11 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve authMethod = findViewById(R.id.auth_method); certCheck = findViewById(R.id.cert_check); - proxyGroup = findViewById(R.id.socks5_group); - proxySwitch = findViewById(R.id.socks5_switch); - proxySwitch.setOnCheckedChangeListener((buttonView, isChecked) -> { - proxyGroup.setVisibility(isChecked? advancedGroup.getVisibility() : View.GONE); + proxySwitch = findViewById(R.id.proxy_settings); + proxySwitch.setOnClickListener(l -> { + proxySwitch.setChecked(!proxySwitch.isChecked()); // revert toggle + startActivity(new Intent(this, ProxySettingsActivity.class)); }); - TextInputEditText proxyHostInput = findViewById(R.id.socks5_host_text); - TextInputEditText proxyPortInput = findViewById(R.id.socks5_port_text); - proxyHostInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.SERVER)); - proxyPortInput.setOnFocusChangeListener((view, focused) -> focusListener(view, focused, VerificationType.PORT)); ActionBar actionBar = getSupportActionBar(); if (actionBar != null) { @@ -161,7 +156,16 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve advancedIcon.setOnClickListener(l -> onAdvancedSettings()); advancedIcon.setRotation(45); viewLogText.setOnClickListener((view) -> showLog()); + boolean isConfigured = DcHelper.isConfigured(getApplicationContext()); + boolean expandAdvanced = false; + String strVal; + int intVal; + + intVal = DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED); + proxySwitch.setChecked(intVal == 1); + expandAdvanced = expandAdvanced || intVal == 1; + if (isConfigured) { String email = DcHelper.get(this, CONFIG_ADDRESS); emailInput.setText(email); @@ -170,10 +174,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve } passwordInput.setText(DcHelper.get(this, CONFIG_MAIL_PASSWORD)); - boolean expandAdvanced = false; - String strVal; - int intVal; - TextInputEditText imapLoginInput = findViewById(R.id.imap_login_text); strVal = DcHelper.get(this, CONFIG_MAIL_USER); imapLoginInput.setText(strVal); @@ -213,17 +213,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve smtpSecurity.setSelection(intVal); expandAdvanced = expandAdvanced || intVal != 0; - intVal = DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED); - proxySwitch.setChecked(intVal == 1); - expandAdvanced = expandAdvanced || intVal == 1; - - proxyHostInput.setText(DcHelper.get(this, CONFIG_SOCKS5_HOST)); - proxyPortInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PORT)); - TextInputEditText proxyUserInput = findViewById(R.id.socks5_user_text); - TextInputEditText proxyPasswordInput = findViewById(R.id.socks5_password_text); - proxyUserInput.setText(DcHelper.get(this, CONFIG_SOCKS5_USER)); - proxyPasswordInput.setText(DcHelper.get(this, CONFIG_SOCKS5_PASSWORD)); - int serverFlags = DcHelper.getInt(this, CONFIG_SERVER_FLAGS); int sel = 0; if((serverFlags&DcContext.DC_LP_AUTH_OAUTH2)!=0) { @@ -242,8 +231,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve int certCheckFlags = DcHelper.getInt(this, "imap_certificate_checks"); certCheck.setSelection(certCheckFlags); expandAdvanced = expandAdvanced || certCheckFlags != 0; - - if (expandAdvanced) { onAdvancedSettings(); } } else if (getIntent() != null && getIntent().getBundleExtra(ACCOUNT_DATA) != null) { // Companion app might have sent account data Bundle b = getIntent().getBundleExtra(ACCOUNT_DATA); @@ -261,6 +248,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve } } + if (expandAdvanced) { onAdvancedSettings(); } registerForEvents(); } @@ -272,6 +260,7 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve public void onResume() { super.onResume(); dynamicTheme.onResume(this); + proxySwitch.setChecked(DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED) == 1); } private void showLog() { @@ -574,12 +563,10 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve private void onAdvancedSettings() { boolean advancedViewVisible = advancedGroup.getVisibility() == View.VISIBLE; if (advancedViewVisible) { - proxyGroup.setVisibility(View.GONE); advancedGroup.setVisibility(View.GONE); advancedIcon.setRotation(45); } else { advancedGroup.setVisibility(View.VISIBLE); - if (proxySwitch.isChecked()) proxyGroup.setVisibility(View.VISIBLE); advancedIcon.setRotation(0); } } @@ -621,15 +608,6 @@ public class RegistrationActivity extends BaseActionBarActivity implements DcEve setConfig(R.id.smtp_port_text, CONFIG_SEND_PORT, true); setConfig(R.id.smtp_login_text, CONFIG_SEND_USER, false); setConfig(R.id.smtp_password_text, CONFIG_SEND_PASSWORD, false); - if (proxySwitch.isChecked()) { - DcHelper.getContext(this).setConfigInt(CONFIG_SOCKS5_ENABLED, 1); - setConfig(R.id.socks5_host_text, CONFIG_SOCKS5_HOST, true); - setConfig(R.id.socks5_port_text, CONFIG_SOCKS5_PORT, true); - setConfig(R.id.socks5_user_text, CONFIG_SOCKS5_USER, true); - setConfig(R.id.socks5_password_text, CONFIG_SOCKS5_PASSWORD, false); - } else { - DcHelper.getContext(this).setConfigInt(CONFIG_SOCKS5_ENABLED, 0); - } DcHelper.getContext(this).setConfigInt(CONFIG_MAIL_SECURITY, imapSecurity.getSelectedItemPosition()); DcHelper.getContext(this).setConfigInt(CONFIG_SEND_SECURITY, smtpSecurity.getSelectedItemPosition()); diff --git a/src/main/res/layout/registration_activity.xml b/src/main/res/layout/registration_activity.xml index eae1b7be8..0a8007c83 100644 --- a/src/main/res/layout/registration_activity.xml +++ b/src/main/res/layout/registration_activity.xml @@ -123,7 +123,7 @@ android:visibility="gone" tools:visibility="visible" app:constraint_referenced_ids="inbox, imap_login, imap_server, imap_port, imap_security_label, imap_security, outbox_view_spacer_top, - outbox, smtp_login, smtp_password, smtp_server, smtp_port, smtp_security_label, smtp_security, auth_method_label, auth_method, cert_check_label, cert_check, view_log_button, socks5_switch" /> + outbox, smtp_login, smtp_password, smtp_server, smtp_port, smtp_security_label, smtp_security, auth_method_label, auth_method, cert_check_label, cert_check, view_log_button, proxy_settings" /> + + + app:layout_constraintTop_toBottomOf="@id/proxy_settings" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + app:layout_constraintTop_toBottomOf="@id/cert_check" /> Date: Mon, 9 Sep 2024 19:52:05 +0200 Subject: [PATCH 3/5] add proxy settings outside in advanced settings --- .../securesms/preferences/AdvancedPreferenceFragment.java | 6 ++++++ src/main/res/xml/preferences_advanced.xml | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java index ed633a70a..fbcf11397 100644 --- a/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java +++ b/src/main/java/org/thoughtcrime/securesms/preferences/AdvancedPreferenceFragment.java @@ -37,6 +37,7 @@ import com.b44t.messenger.rpc.RpcException; import org.thoughtcrime.securesms.ApplicationPreferencesActivity; import org.thoughtcrime.securesms.ConversationActivity; import org.thoughtcrime.securesms.LogViewActivity; +import org.thoughtcrime.securesms.ProxySettingsActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.RegistrationActivity; import org.thoughtcrime.securesms.connect.DcEventCenter; @@ -208,6 +209,11 @@ public class AdvancedPreferenceFragment extends ListSummaryPreferenceFragment return true; })); + this.findPreference("proxy_settings_button").setOnPreferenceClickListener((preference) -> { + startActivity(new Intent(getActivity(), ProxySettingsActivity.class)); + return true; + }); + Preference passwordAndAccount = this.findPreference("password_account_settings_button"); passwordAndAccount.setOnPreferenceClickListener(((preference) -> { boolean result = ScreenLockUtil.applyScreenLock(getActivity(), getString(R.string.pref_password_and_account_settings), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_ACCOUNT); diff --git a/src/main/res/xml/preferences_advanced.xml b/src/main/res/xml/preferences_advanced.xml index 9098d943d..0c90f637d 100644 --- a/src/main/res/xml/preferences_advanced.xml +++ b/src/main/res/xml/preferences_advanced.xml @@ -90,6 +90,9 @@ + + From ef8838cbe326b986db54c23f30e89b1b872a3d2e Mon Sep 17 00:00:00 2001 From: adbenitez Date: Mon, 9 Sep 2024 20:13:11 +0200 Subject: [PATCH 4/5] add proxy settings to main menu if it is enabled --- .../securesms/ConversationListActivity.java | 14 ++++++-------- src/main/res/menu/text_secure_normal.xml | 5 +++++ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java index 7ba3876cd..606a57906 100644 --- a/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ConversationListActivity.java @@ -20,6 +20,7 @@ import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA; import static org.thoughtcrime.securesms.ConversationActivity.STARTING_POSITION_EXTRA; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_ADDRESS; import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SERVER_FLAGS; +import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_SOCKS5_ENABLED; import static org.thoughtcrime.securesms.util.RelayUtil.acquireRelayMessageContent; import static org.thoughtcrime.securesms.util.RelayUtil.getDirectSharingChatId; import static org.thoughtcrime.securesms.util.RelayUtil.getSharedTitle; @@ -357,14 +358,8 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit if (!isRelayingMessageContent(this)) { inflater.inflate(R.menu.text_secure_normal, menu); - MenuItem item = menu.findItem(R.id.menu_global_map); - if (Prefs.isLocationStreamingEnabled(this)) { - item.setVisible(true); - } - - if (!Prefs.isLocationStreamingEnabled(this)) { - menu.findItem(R.id.menu_global_map).setVisible(false); - } + menu.findItem(R.id.menu_global_map).setVisible(Prefs.isLocationStreamingEnabled(this)); + menu.findItem(R.id.menu_proxy_settings).setVisible(DcHelper.getInt(this, CONFIG_SOCKS5_ENABLED) == 1); } super.onPrepareOptionsMenu(menu); @@ -430,6 +425,9 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit case R.id.menu_global_map: WebxdcActivity.openMaps(this, 0); return true; + case R.id.menu_proxy_settings: + startActivity(new Intent(this, ProxySettingsActivity.class)); + return true; case android.R.id.home: onBackPressed(); return true; diff --git a/src/main/res/menu/text_secure_normal.xml b/src/main/res/menu/text_secure_normal.xml index 84f738ddc..66d0a9e7f 100644 --- a/src/main/res/menu/text_secure_normal.xml +++ b/src/main/res/menu/text_secure_normal.xml @@ -7,6 +7,11 @@ android:icon="@drawable/baseline_qr_code_24" app:showAsAction="always"/> + + From 295e1b50d296841bfe0029f2c10e4957f94047dc Mon Sep 17 00:00:00 2001 From: adbenitez Date: Tue, 10 Sep 2024 13:22:34 +0200 Subject: [PATCH 5/5] restart IO on proxy changes --- .../org/thoughtcrime/securesms/ProxySettingsActivity.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java b/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java index 0c049172a..d88f66073 100644 --- a/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java +++ b/src/main/java/org/thoughtcrime/securesms/ProxySettingsActivity.java @@ -17,6 +17,7 @@ import androidx.appcompat.app.ActionBar; import androidx.appcompat.widget.SwitchCompat; import androidx.constraintlayout.widget.Group; +import com.b44t.messenger.DcContext; import com.google.android.material.textfield.TextInputEditText; import org.thoughtcrime.securesms.connect.DcHelper; @@ -137,11 +138,14 @@ public class ProxySettingsActivity extends BaseActionBarActivity { } private void saveConfig() { - DcHelper.getContext(this).setConfigInt(CONFIG_SOCKS5_ENABLED, proxySwitch.isChecked()? 1 : 0); + DcContext dcContext = DcHelper.getContext(this); + dcContext.setConfigInt(CONFIG_SOCKS5_ENABLED, proxySwitch.isChecked()? 1 : 0); setConfig(R.id.proxy_host_text, CONFIG_SOCKS5_HOST, true); setConfig(R.id.proxy_port_text, CONFIG_SOCKS5_PORT, true); setConfig(R.id.proxy_user_text, CONFIG_SOCKS5_USER, true); setConfig(R.id.proxy_password_text, CONFIG_SOCKS5_PASSWORD, false); + dcContext.stopIo(); + dcContext.startIo(); } private void setConfig(@IdRes int viewId, String configTarget, boolean doTrim) {