From e2c9e1196f0ca240cc4640cb5469606e50f86c2a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 15 Oct 2025 12:10:28 +0200 Subject: [PATCH] Force all LDAP fields to be filled, added verbose mode toggle --- .../main/settings/viewmodel/LdapViewModel.kt | 57 ++++++++++++++----- .../res/layout/settings_contacts_ldap.xml | 51 +++++++++++++---- app/src/main/res/values-fr/strings.xml | 3 +- app/src/main/res/values/strings.xml | 3 +- 4 files changed, 86 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt index 407522b03..11bc1b22b 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/LdapViewModel.kt @@ -65,6 +65,8 @@ class LdapViewModel : GenericViewModel() { val sipDomain = MutableLiveData() + val verboseMode = MutableLiveData() + val ldapServerOperationSuccessfulEvent: MutableLiveData> by lazy { MutableLiveData>() } @@ -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 diff --git a/app/src/main/res/layout/settings_contacts_ldap.xml b/app/src/main/res/layout/settings_contacts_ldap.xml index 139a45524..5fcad6d62 100644 --- a/app/src/main/res/layout/settings_contacts_ldap.xml +++ b/app/src/main/res/layout/settings_contacts_ldap.xml @@ -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" /> + + + + @@ -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" diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index ad5d197fe..835d8c85f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -248,6 +248,7 @@ Bind DN Mot de passe Utiliser TLS + Ajouter les logs LDAP à ceux de &appName; Base de recherche (ne peut être vide) Filtre Nombre de résultats maximum @@ -258,7 +259,7 @@ Attributs SIP Domaine SIP Une erreur s\'est produite, la configuration LDAP n\'a pas été sauvegardée ! - L\'URL du serveur ne peut être vide + Tous les champs doivent être remplis Réunions Disposition par défaut Intervenant actif diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2349d7657..2794485d6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -290,6 +290,7 @@ Bind DN Password Use TLS + Add LDAP logs to &appName; ones Search base (can\'t be empty) Filter Max results @@ -300,7 +301,7 @@ SIP attributes SIP domain A error occurred, LDAP server not saved! - Server URL can\'t be empty + All fields must be filled Meetings Default layout Active speaker