blob: 37258489adff84537cdd0fd5d1b0ac0b45487d85 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
/*
* Copyright (c) 2012-2019 Arne Schwabe
* Distributed under the GNU GPL v2 with additional terms. For full terms see the file doc/LICENSE.txt
*/
package de.blinkt.openvpn.views;
import android.os.Bundle;
import android.util.Pair;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import androidx.preference.PreferenceDialogFragmentCompat;
import de.blinkt.openvpn.R;
import de.blinkt.openvpn.VpnProfile;
import static de.blinkt.openvpn.VpnProfile.X509_VERIFY_TLSREMOTE_COMPAT_NOREMAPPING;
public class RemoteCNPreferenceDialog extends PreferenceDialogFragmentCompat {
private Spinner mSpinner;
private EditText mEditText;
private TextView mRemoteTLSNote;
public static RemoteCNPreferenceDialog newInstance(String key) {
RemoteCNPreferenceDialog f = new RemoteCNPreferenceDialog();
Bundle args = new Bundle();
args.putString(ARG_KEY, key);
f.setArguments(args);
return f;
}
@Override
public void onBindDialogView(View view) {
String mDn = ((RemoteCNPreference) getPreference()).getCNText();
int mDNType = ((RemoteCNPreference) getPreference()).getAuthtype();
mEditText = view.findViewById(R.id.tlsremotecn);
mSpinner = view.findViewById(R.id.x509verifytype);
mRemoteTLSNote = view.findViewById(R.id.tlsremotenote);
mEditText.setText(mDn);
populateSpinner(mDn, mDNType);
}
private void populateSpinner(String mDn, int mDNType) {
ArrayAdapter<String> authtypes = new ArrayAdapter<>(requireContext(), android.R.layout.simple_spinner_item);
authtypes.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
authtypes.add(requireContext().getString(R.string.complete_dn));
authtypes.add(requireContext().getString(R.string.rdn));
authtypes.add(requireContext().getString(R.string.rdn_prefix));
if ((mDNType == VpnProfile.X509_VERIFY_TLSREMOTE || mDNType == X509_VERIFY_TLSREMOTE_COMPAT_NOREMAPPING)
&& !(mDn == null || "".equals(mDn))) {
authtypes.add(requireContext().getString(R.string.tls_remote_deprecated));
mRemoteTLSNote.setVisibility(View.VISIBLE);
} else {
mRemoteTLSNote.setVisibility(View.GONE);
}
mSpinner.setAdapter(authtypes);
mSpinner.setSelection(getSpinnerPositionFromAuthTYPE(mDNType, mDn));
}
private int getSpinnerPositionFromAuthTYPE(int mDNType, String mDn) {
switch (mDNType) {
case VpnProfile.X509_VERIFY_TLSREMOTE_DN:
return 0;
case VpnProfile.X509_VERIFY_TLSREMOTE_RDN:
return 1;
case VpnProfile.X509_VERIFY_TLSREMOTE_RDN_PREFIX:
return 2;
case X509_VERIFY_TLSREMOTE_COMPAT_NOREMAPPING:
case VpnProfile.X509_VERIFY_TLSREMOTE:
if (mDn == null || "".equals(mDn))
return 1;
else
return 3;
default:
return 0;
}
}
private int getAuthTypeFromSpinner() {
int pos = mSpinner.getSelectedItemPosition();
switch (pos) {
case 0:
return VpnProfile.X509_VERIFY_TLSREMOTE_DN;
case 1:
return VpnProfile.X509_VERIFY_TLSREMOTE_RDN;
case 2:
return VpnProfile.X509_VERIFY_TLSREMOTE_RDN_PREFIX;
case 3:
// This is the tls-remote entry, only visible if mDntype is a
// tls-remote type
return X509_VERIFY_TLSREMOTE_COMPAT_NOREMAPPING;
default:
return VpnProfile.X509_VERIFY_TLSREMOTE;
}
}
@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);
}
}
}
}
|