0
0
mirror of https://github.com/schwabe/ics-openvpn.git synced 2024-09-19 19:42:29 +02:00

Fix summary of Auth settings dialog and add TLS Profile setting

This commit is contained in:
Arne Schwabe 2021-10-13 19:24:42 +02:00
parent 893ce60f73
commit 9ca366fb2d
8 changed files with 103 additions and 79 deletions

View File

@ -170,6 +170,7 @@ public class VpnProfile implements Serializable, Cloneable {
public String mPeerFingerPrints = "";
public int mCompatMode = 0;
public boolean mUseLegacyProvider = false;
public String mTlSCertProfile = "";
private transient PrivateKey mPrivateKey;
// Public attributes, since I got mad with getter/setter

View File

@ -42,4 +42,10 @@
<item>OpenVPN 2.4.x peers</item>
<item>OpenVPN 2.3.x and older peers</item>
</string-array>
<string-array name="tls_profile_entries">
<item>insecure (not recommend, allows insecure crypto)</item>
<item>legacy (default)</item>
<item>preferred (recommended but limited compabbility)</item>
<item>Suite B</item>
</string-array>
</resources>

View File

@ -508,5 +508,6 @@
<string name="bf_cbc_requires_legacy">Profiles uses BF-CBC which depends on OpenSSL legacy provider (not enabled).</string>
<string name="allow_translations_title">Allow community contributed translations</string>
<string name="allow_translations_summary">Allows the app to be translated with translations contributed by the community. Requires a restart of the app to activate.</string>
<string name="tls_profile">TLS Security Profile</string>
</resources>

View File

@ -83,4 +83,10 @@
<string name="faq_title_ncp">Failed to negotiate cipher with server</string>
<string name="import_from_URL">URL</string>
<string-array name="tls_profile_values" translatable="false">
<item>insecure</item>
<item>legacy</item>
<item>preferred</item>
<item>suiteb</item>
</string-array>
</resources>

View File

@ -24,8 +24,7 @@ import de.blinkt.openvpn.views.RemoteCNPreference
import de.blinkt.openvpn.views.RemoteCNPreferenceDialog
import java.io.IOException
class Settings_Authentication : OpenVpnPreferencesFragment(), Preference.OnPreferenceChangeListener,
Preference.OnPreferenceClickListener {
class Settings_Authentication : OpenVpnPreferencesFragment(), Preference.OnPreferenceClickListener {
private lateinit var mExpectTLSCert: CheckBoxPreference
private lateinit var mCheckRemoteCN: CheckBoxPreference
private lateinit var mRemoteCN: RemoteCNPreference
@ -36,6 +35,7 @@ class Settings_Authentication : OpenVpnPreferencesFragment(), Preference.OnPrefe
private var mTlsAuthFileData: String? = null
private lateinit var mAuth: EditTextPreference
private lateinit var mRemoteX509Name: EditTextPreference
private lateinit var mTLSProfile: ListPreference
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
}
@ -48,17 +48,17 @@ class Settings_Authentication : OpenVpnPreferencesFragment(), Preference.OnPrefe
mExpectTLSCert = findPreference("remoteServerTLS")!!
mCheckRemoteCN = findPreference("checkRemoteCN")!!
mRemoteCN = findPreference("remotecn")!!
mRemoteCN.onPreferenceChangeListener = this
setRemoteCNSummaryProvider()
mRemoteX509Name = findPreference("remotex509name")!!
mRemoteX509Name.onPreferenceChangeListener = this
mRemoteX509Name.setSummaryProvider { pref ->
if ((pref as EditTextPreference).text.isEmpty()) "CN (default)" else pref.text
}
mUseTLSAuth = findPreference("useTLSAuth")!!
mTLSAuthFile = findPreference("tlsAuthFile")!!
mTLSAuthDirection = findPreference("tls_direction")!!
mTLSAuthFile.onPreferenceClickListener = this
mDataCiphers = findPreference("dataciphers")!!
mDataCiphers.onPreferenceChangeListener = this
mAuth = findPreference("auth")!!
mAuth.onPreferenceChangeListener = this
mTLSProfile = findPreference("tls_profile")!!
loadSettings()
}
@ -67,20 +67,17 @@ class Settings_Authentication : OpenVpnPreferencesFragment(), Preference.OnPrefe
mCheckRemoteCN.isChecked = mProfile.mCheckRemoteCN
mRemoteCN.setDN(mProfile.mRemoteCN)
mRemoteCN.setAuthType(mProfile.mX509AuthType)
onPreferenceChange(
mRemoteCN,
Pair(mProfile.mX509AuthType, mProfile.mRemoteCN)
)
mRemoteX509Name.text = mProfile.mx509UsernameField ?: ""
onPreferenceChange(mRemoteX509Name, mProfile.mx509UsernameField ?: "")
mUseTLSAuth.isChecked = mProfile.mUseTLSAuth
mTlsAuthFileData = mProfile.mTLSAuthFilename
setTlsAuthSummary(mTlsAuthFileData)
mTLSAuthDirection.value = mProfile.mTLSAuthDirection
mDataCiphers.text = mProfile.mDataCiphers
onPreferenceChange(mDataCiphers, mProfile.mDataCiphers)
mAuth.text = mProfile.mAuth
onPreferenceChange(mAuth, mProfile.mAuth)
if (mProfile.mAuthenticationType == VpnProfile.TYPE_STATICKEYS) {
mExpectTLSCert.isEnabled = false
mCheckRemoteCN.isEnabled = false
@ -89,6 +86,10 @@ class Settings_Authentication : OpenVpnPreferencesFragment(), Preference.OnPrefe
mExpectTLSCert.isEnabled = true
mCheckRemoteCN.isEnabled = true
}
if (mProfile.mTlSCertProfile.isNullOrBlank())
mTLSProfile.value = "legacy"
else
mTLSProfile.value = mProfile.mTlSCertProfile
}
override fun saveSettings() {
@ -99,36 +100,30 @@ class Settings_Authentication : OpenVpnPreferencesFragment(), Preference.OnPrefe
mProfile.mUseTLSAuth = mUseTLSAuth.isChecked
mProfile.mTLSAuthFilename = mTlsAuthFileData
mProfile.mx509UsernameField = mRemoteX509Name.text
if (mTLSAuthDirection.value == null) mProfile.mTLSAuthDirection =
null else mProfile.mTLSAuthDirection = mTLSAuthDirection.value
if (mDataCiphers.text == null) mProfile.mDataCiphers = null else mProfile.mDataCiphers =
mDataCiphers.text
if (mAuth.text == null) mProfile.mAuth = null else mProfile.mAuth = mAuth.text
mProfile.mTLSAuthDirection = mTLSAuthDirection.value
mProfile.mDataCiphers = mDataCiphers.text
mProfile.mAuth = mAuth.text
mProfile.mTlSCertProfile = mTLSProfile.value
}
override fun onPreferenceChange(preference: Preference, newValue: Any): Boolean {
if (preference === mRemoteCN && newValue is Pair<*, *>) {
val authtype = newValue.first as Int
val dn = newValue.second
if ("" == dn) {
private fun setRemoteCNSummaryProvider()
{
mRemoteCN.setSummaryProvider {
pref ->
pref as RemoteCNPreference;
if ("" == pref.cnText) {
if (mProfile.mConnections.size > 0) {
preference.summary = getX509String(
VpnProfile.X509_VERIFY_TLSREMOTE_RDN,
return@setSummaryProvider getX509String(VpnProfile.X509_VERIFY_TLSREMOTE_RDN,
mProfile.mConnections[0].mServerName
)
} else {
preference.setSummary(R.string.no_remote_defined)
return@setSummaryProvider getString(R.string.no_remote_defined)
}
} else {
preference.summary = getX509String(authtype, dn as String)
return@setSummaryProvider getX509String(pref.authtype, pref.cnText)
}
} else if (preference === mDataCiphers || preference === mAuth) {
preference.summary = (newValue as CharSequence)
} else if (preference === mRemoteX509Name) {
preference.summary =
(if (newValue.toString().isEmpty()) "CN (default)" else newValue as CharSequence)
}
return true
}
private fun getX509String(authtype: Int, dn: String): CharSequence {

View File

@ -39,11 +39,13 @@ public class RemoteCNPreference extends DialogPreference {
public void setDN(String dn) {
mDn = dn;
notifyChanged();
}
public void setAuthType(int x509authtype) {
mDNType = x509authtype;
notifyChanged();
}
public String getCNText() {

View File

@ -107,17 +107,14 @@ public class RemoteCNPreferenceDialog extends PreferenceDialogFragmentCompat {
@Override
public void onDialogClosed(boolean positiveResult) {
if (positiveResult) {
RemoteCNPreference pref = ((RemoteCNPreference) getPreference());
String dn = mEditText.getText().toString();
int authtype = getAuthTypeFromSpinner();
if (pref.callChangeListener(new Pair<>(authtype, dn))) {
pref.setDN(dn);
pref.setAuthType(authtype);
}
}
pref.setDN(dn);
pref.setAuthType(authtype);
}
}

View File

@ -3,64 +3,80 @@
~ Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory android:title="@string/tls_settings">
<ListPreference
android:entries="@array/tls_profile_entries"
android:entryValues="@array/tls_profile_values"
android:key="tls_profile"
android:persistent="false"
android:title="@string/tls_profile"
app:useSimpleSummaryProvider="true" />
<CheckBoxPreference
android:key="remoteServerTLS"
android:summary="@string/check_remote_tlscert"
android:title="@string/check_remote_tlscert_title" />
android:key="remoteServerTLS"
android:summary="@string/check_remote_tlscert"
android:title="@string/check_remote_tlscert_title" />
<CheckBoxPreference
android:key="checkRemoteCN"
android:summary="@string/remote_tlscn_check_summary"
android:title="@string/remote_tlscn_check_title" />
android:key="checkRemoteCN"
android:summary="@string/remote_tlscn_check_summary"
android:title="@string/remote_tlscn_check_title" />
<de.blinkt.openvpn.views.RemoteCNPreference
android:dependency="checkRemoteCN"
android:positiveButtonText="@android:string/ok"
android:negativeButtonText="@string/cancel"
android:key="remotecn"
android:title="@string/enter_tlscn_title" />
android:dependency="checkRemoteCN"
android:key="remotecn"
android:negativeButtonText="@string/cancel"
android:positiveButtonText="@android:string/ok"
android:title="@string/enter_tlscn_title" />
<EditTextPreference
android:dependency="checkRemoteCN"
android:dialogMessage="Field in the X.509 certificate subject to be used as the username (default=CN)."
android:key="remotex509name"
android:persistent="false"
android:title="X509 Username Field" />
android:dependency="checkRemoteCN"
android:dialogMessage="Field in the X.509 certificate subject to be used as the username (default=CN)."
android:key="remotex509name"
android:persistent="false"
android:title="X509 Username Field" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/tls_authentication">
<SwitchPreference
android:key="useTLSAuth"
android:summary="@string/tls_key_auth"
android:title="@string/useTLSAuth" />
android:key="useTLSAuth"
android:summary="@string/tls_key_auth"
android:title="@string/useTLSAuth" />
<Preference
android:dependency="useTLSAuth"
android:key="tlsAuthFile"
android:title="@string/tls_auth_file" />
android:dependency="useTLSAuth"
android:key="tlsAuthFile"
android:title="@string/tls_auth_file"
app:useSimpleSummaryProvider="true" />
<ListPreference
android:dependency="useTLSAuth"
android:entries="@array/tls_directions_entries"
android:entryValues="@array/tls_directions_values"
android:key="tls_direction"
android:persistent="false"
android:title="@string/tls_direction" />
android:dependency="useTLSAuth"
android:entries="@array/tls_directions_entries"
android:entryValues="@array/tls_directions_values"
android:key="tls_direction"
android:persistent="false"
android:title="@string/tls_direction"
app:useSimpleSummaryProvider="true" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/encryption">
<EditTextPreference
android:dialogMessage="@string/chipher_dialog_message"
android:dialogTitle="@string/cipher_dialog_title"
android:key="dataciphers"
android:persistent="false"
android:title="@string/encryption_cipher" />
android:dialogMessage="@string/chipher_dialog_message"
android:dialogTitle="@string/cipher_dialog_title"
android:key="dataciphers"
android:persistent="false"
android:title="@string/encryption_cipher"
app:useSimpleSummaryProvider="true" />
<EditTextPreference
android:dialogMessage="@string/auth_dialog_message"
android:dialogTitle="@string/auth_dialog_title"
android:key="auth"
android:persistent="false"
android:title="@string/packet_auth" />
android:dialogMessage="@string/auth_dialog_message"
android:dialogTitle="@string/auth_dialog_title"
android:key="auth"
android:persistent="false"
android:title="@string/packet_auth"
app:useSimpleSummaryProvider="true" />
</PreferenceCategory>
</PreferenceScreen>