Force all LDAP fields to be filled, added verbose mode toggle

This commit is contained in:
Sylvain Berfini 2025-10-15 12:10:28 +02:00
parent e8c642b9c6
commit e2c9e1196f
4 changed files with 86 additions and 28 deletions

View file

@ -65,6 +65,8 @@ class LdapViewModel : GenericViewModel() {
val sipDomain = MutableLiveData<String>()
val verboseMode = MutableLiveData<Boolean>()
val ldapServerOperationSuccessfulEvent: MutableLiveData<Event<Boolean>> by lazy {
MutableLiveData<Event<Boolean>>()
}
@ -80,6 +82,7 @@ class LdapViewModel : GenericViewModel() {
minCharacters.value = "3"
requestTimeout.value = "5"
requestDelay.value = "2000"
verboseMode.value = true
}
@UiThread
@ -110,6 +113,7 @@ class LdapViewModel : GenericViewModel() {
nameAttributes.postValue(ldapParams.nameAttribute.orEmpty())
sipAttributes.postValue(ldapParams.sipAttribute.orEmpty())
sipDomain.postValue(ldapParams.sipDomain.orEmpty())
verboseMode.postValue(ldapParams.debugLevel == Ldap.DebugLevel.Verbose)
Log.i("$TAG Existing LDAP server values loaded")
}
}
@ -141,36 +145,59 @@ class LdapViewModel : GenericViewModel() {
useTls.value = useTls.value == false
}
@UiThread
fun toggleDebug() {
verboseMode.value = verboseMode.value == false
}
@UiThread
fun addServer() {
coreContext.postOnCoreThread { core ->
try {
val server = serverUrl.value.orEmpty().trim()
if (server.isEmpty()) {
Log.e("$TAG Server field can't be empty!")
showRedToast(R.string.settings_contacts_ldap_empty_server_error_toast, R.drawable.warning_circle)
val bindDn = bindDn.value.orEmpty().trim()
val base = searchBase.value.orEmpty().trim()
val filter = searchFilter.value.orEmpty().trim()
val maxResults = maxResults.value.orEmpty().trim()
val timeout = requestTimeout.value.orEmpty().trim()
val delay = requestDelay.value.orEmpty().trim()
val minChars = minCharacters.value.orEmpty().trim()
val nameAttrs = nameAttributes.value.orEmpty().trim()
val sipAttrs = sipAttributes.value.orEmpty().trim()
val sipDomain = sipDomain.value.orEmpty().trim()
if (
server.isEmpty() || bindDn.isEmpty() || base.isEmpty() || filter.isEmpty() ||
maxResults.isEmpty() || timeout.isEmpty() || delay.isEmpty() ||
minChars.isEmpty() || nameAttrs.isEmpty() || sipAttrs.isEmpty() ||
sipDomain.isEmpty()
) {
Log.e("$TAG All fields must be filled!")
showRedToast(R.string.settings_contacts_ldap_empty_field_error_toast, R.drawable.warning_circle)
return@postOnCoreThread
}
val ldapParams = core.createLdapParams()
ldapParams.enabled = isEnabled.value == true
ldapParams.server = server
ldapParams.bindDn = bindDn.value.orEmpty().trim()
ldapParams.bindDn = bindDn
ldapParams.password = password.value.orEmpty().trim()
ldapParams.authMethod = Ldap.AuthMethod.Simple
ldapParams.isTlsEnabled = useTls.value == true
ldapParams.serverCertificatesVerificationMode = Ldap.CertVerificationMode.Default
ldapParams.baseObject = searchBase.value.orEmpty().trim()
ldapParams.filter = searchFilter.value.orEmpty().trim()
ldapParams.maxResults = maxResults.value.orEmpty().trim().toInt()
ldapParams.timeout = requestTimeout.value.orEmpty().trim().toInt()
ldapParams.delay = requestDelay.value.orEmpty().trim().toInt()
ldapParams.minChars = minCharacters.value.orEmpty().trim().toInt()
ldapParams.nameAttribute = nameAttributes.value.orEmpty().trim()
ldapParams.sipAttribute = sipAttributes.value.orEmpty().trim()
ldapParams.sipDomain = sipDomain.value.orEmpty().trim()
ldapParams.debugLevel = Ldap.DebugLevel.Verbose
ldapParams.baseObject = base
ldapParams.filter = filter
ldapParams.maxResults = maxResults.toInt()
ldapParams.timeout = timeout.toInt()
ldapParams.delay = delay.toInt()
ldapParams.minChars = minChars.toInt()
ldapParams.nameAttribute = nameAttrs
ldapParams.sipAttribute = sipAttrs
ldapParams.sipDomain = sipDomain
ldapParams.debugLevel = if (verboseMode.value == true) {
Ldap.DebugLevel.Verbose
} else {
Ldap.DebugLevel.Off
}
if (isEdit.value == true && ::ldapToEdit.isInitialized) {
ldapToEdit.params = ldapParams

View file

@ -162,7 +162,7 @@
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.bindDn}"
android:inputType="text"
android:inputType="text|textNoSuggestions"
android:hint="@string/settings_contacts_ldap_bind_dn_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@ -244,6 +244,35 @@
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/password" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_style"
android:onClick="@{() -> viewModel.toggleDebug()}"
android:id="@+id/debug_title"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="10dp"
android:text="@string/settings_contacts_ldap_verbose_mode_title"
android:maxLines="2"
android:ellipsize="end"
android:labelFor="@id/tls_switch"
app:layout_constraintTop_toTopOf="@id/debug_switch"
app:layout_constraintBottom_toBottomOf="@id/debug_switch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/debug_switch"/>
<com.google.android.material.materialswitch.MaterialSwitch
style="@style/material_switch_style"
android:id="@+id/debug_switch"
android:onClick="@{() -> viewModel.toggleDebug()}"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginEnd="16dp"
android:checked="@{viewModel.verboseMode}"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@id/tls_switch" />
<androidx.appcompat.widget.AppCompatTextView
style="@style/settings_title_padding_style"
android:id="@+id/search_base_title"
@ -256,7 +285,7 @@
android:maxLines="2"
android:ellipsize="end"
android:labelFor="@id/search_base"
app:layout_constraintTop_toBottomOf="@id/tls_switch"
app:layout_constraintTop_toBottomOf="@id/debug_switch"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"/>
@ -271,7 +300,7 @@
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.searchBase}"
android:inputType="text"
android:inputType="text|textNoSuggestions"
android:hint="@string/settings_contacts_ldap_search_base_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@ -304,7 +333,7 @@
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.searchFilter}"
android:inputType="text"
android:inputType="text|textNoSuggestions"
android:hint="@string/settings_contacts_ldap_search_filter_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@ -337,7 +366,7 @@
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.maxResults}"
android:inputType="numberSigned"
android:inputType="number|numberSigned"
android:hint="@string/settings_contacts_ldap_max_results_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@ -370,7 +399,7 @@
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.requestTimeout}"
android:inputType="numberSigned"
android:inputType="number|numberSigned"
android:hint="@string/settings_contacts_ldap_request_timeout_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@ -403,7 +432,7 @@
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.requestDelay}"
android:inputType="numberSigned"
android:inputType="number|numberSigned"
android:hint="@string/settings_contacts_ldap_request_delay_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@ -436,7 +465,7 @@
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.minCharacters}"
android:inputType="numberSigned"
android:inputType="number|numberSigned"
android:hint="@string/settings_contacts_ldap_min_characters_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@ -469,7 +498,7 @@
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.nameAttributes}"
android:inputType="text"
android:inputType="text|textNoSuggestions"
android:hint="@string/settings_contacts_ldap_name_attributes_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@ -502,7 +531,7 @@
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.sipAttributes}"
android:inputType="text"
android:inputType="text|textNoSuggestions"
android:hint="@string/settings_contacts_ldap_sip_attributes_title"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
@ -536,7 +565,7 @@
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:text="@={viewModel.sipDomain}"
android:inputType="text"
android:inputType="text|textNoSuggestions"
android:hint="@string/settings_contacts_ldap_sip_domain_title"
app:layout_constraintVertical_bias="0"
app:layout_constraintStart_toStartOf="parent"

View file

@ -248,6 +248,7 @@
<string name="settings_contacts_ldap_bind_dn_title">Bind DN</string>
<string name="settings_contacts_ldap_password_title">Mot de passe</string>
<string name="settings_contacts_ldap_use_tls_title">Utiliser TLS</string>
<string name="settings_contacts_ldap_verbose_mode_title">Ajouter les logs LDAP à ceux de &appName;</string>
<string name="settings_contacts_ldap_search_base_title">Base de recherche (ne peut être vide)</string>
<string name="settings_contacts_ldap_search_filter_title">Filtre</string>
<string name="settings_contacts_ldap_max_results_title">Nombre de résultats maximum</string>
@ -258,7 +259,7 @@
<string name="settings_contacts_ldap_sip_attributes_title">Attributs SIP</string>
<string name="settings_contacts_ldap_sip_domain_title">Domaine SIP</string>
<string name="settings_contacts_ldap_error_toast">Une erreur s\'est produite, la configuration LDAP n\'a pas été sauvegardée !</string>
<string name="settings_contacts_ldap_empty_server_error_toast">L\'URL du serveur ne peut être vide</string>
<string name="settings_contacts_ldap_empty_field_error_toast">Tous les champs doivent être remplis</string>
<string name="settings_meetings_title">Réunions</string>
<string name="settings_meetings_default_layout_title">Disposition par défaut</string>
<string name="settings_meetings_layout_active_speaker_label">Intervenant actif</string>

View file

@ -290,6 +290,7 @@
<string name="settings_contacts_ldap_bind_dn_title">Bind DN</string>
<string name="settings_contacts_ldap_password_title">Password</string>
<string name="settings_contacts_ldap_use_tls_title">Use TLS</string>
<string name="settings_contacts_ldap_verbose_mode_title">Add LDAP logs to &appName; ones</string>
<string name="settings_contacts_ldap_search_base_title">Search base (can\'t be empty)</string>
<string name="settings_contacts_ldap_search_filter_title">Filter</string>
<string name="settings_contacts_ldap_max_results_title">Max results</string>
@ -300,7 +301,7 @@
<string name="settings_contacts_ldap_sip_attributes_title">SIP attributes</string>
<string name="settings_contacts_ldap_sip_domain_title">SIP domain</string>
<string name="settings_contacts_ldap_error_toast">A error occurred, LDAP server not saved!</string>
<string name="settings_contacts_ldap_empty_server_error_toast">Server URL can\'t be empty</string>
<string name="settings_contacts_ldap_empty_field_error_toast">All fields must be filled</string>
<string name="settings_meetings_title">Meetings</string>
<string name="settings_meetings_default_layout_title">Default layout</string>
<string name="settings_meetings_layout_active_speaker_label">Active speaker</string>