Skip to content

Commit 8ec73e1

Browse files
authored
Merge pull request #56726 from nextcloud/artonge/fix/user_ldap/deleting_and_initial_config
fix(user_ldap): Improve case where selected config is undefined
2 parents 842df49 + 5e5ed7d commit 8ec73e1

File tree

9 files changed

+45
-17
lines changed

9 files changed

+45
-17
lines changed

apps/user_ldap/lib/Controller/ConfigAPIController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ public function testConfiguration(string $configID) {
250250
$this->ensureConfigIDExists($configID);
251251
$connection = $this->connectionFactory->get($configID);
252252
$conf = $connection->getConfiguration();
253-
if ($conf['ldap_configuration_active'] === '0') {
253+
if ($conf['ldap_configuration_active'] !== '1') {
254254
//needs to be true, otherwise it will also fail with an irritating message
255255
$conf['ldap_configuration_active'] = '1';
256256
}

apps/user_ldap/src/components/SettingsTabs/ServerTab.vue

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
type="number"
4848
autocomplete="off"
4949
@change="(event) => ldapConfigProxy.ldapPort = event.target.value" />
50-
<NcButton :disabled="loadingGuessPortAndTLS" @click="guessPortAndTLS">
50+
<NcButton :disabled="loadingGuessPortAndTLS || ldapConfigProxy.ldapHost === ''" @click="guessPortAndTLS">
5151
{{ t('user_ldap', 'Detect Port') }}
5252
</NcButton>
5353
</div>
@@ -83,7 +83,7 @@
8383
:helper-text="t('user_ldap', 'You can specify Base DN for users and groups in the Advanced tab')"
8484
@change="(event) => ldapConfigProxy.ldapBase = event.target.value" />
8585

86-
<NcButton :disabled="loadingGuessBaseDN" @click="guessBaseDN">
86+
<NcButton :disabled="loadingGuessBaseDN || needsToSaveCredentials" @click="guessBaseDN">
8787
{{ t('user_ldap', 'Detect Base DN') }}
8888
</NcButton>
8989
<NcButton :disabled="loadingCountInBaseDN || ldapConfigProxy.ldapBase === ''" @click="countInBaseDN">
@@ -98,7 +98,7 @@ import { showInfo } from '@nextcloud/dialogs'
9898
import { n, t } from '@nextcloud/l10n'
9999
import { NcButton, NcCheckboxRadioSwitch, NcTextArea, NcTextField } from '@nextcloud/vue'
100100
import { storeToRefs } from 'pinia'
101-
import { computed, ref } from 'vue'
101+
import { computed, ref, watch } from 'vue'
102102
import ContentCopy from 'vue-material-design-icons/ContentCopy.vue'
103103
import Delete from 'vue-material-design-icons/Delete.vue'
104104
import { callWizard } from '../../services/ldapConfigService.ts'
@@ -120,6 +120,18 @@ const needsToSaveCredentials = computed(() => {
120120
return ldapConfigProxy.value.ldapAgentName !== localLdapAgentName.value || ldapConfigProxy.value.ldapAgentPassword !== localLdapAgentPassword.value
121121
})
122122
123+
watch(
124+
ldapConfigProxy,
125+
(newVal) => {
126+
localLdapAgentName.value = newVal.ldapAgentName
127+
if (newVal.ldapAgentPassword === '***') {
128+
localLdapAgentPassword.value = ''
129+
} else {
130+
localLdapAgentPassword.value = newVal.ldapAgentPassword
131+
}
132+
},
133+
)
134+
123135
/**
124136
*
125137
*/
@@ -136,7 +148,7 @@ async function guessPortAndTLS() {
136148
loadingGuessPortAndTLS.value = true
137149
const { changes } = await callWizard('guessPortAndTLS', props.configId)
138150
// Not using ldapConfigProxy to avoid triggering the save logic.
139-
ldapConfigs.value[props.configId].ldapPort = (changes!.ldap_port as string) ?? ''
151+
ldapConfigs.value[props.configId]!.ldapPort = (changes!.ldap_port as string) ?? ''
140152
} finally {
141153
loadingGuessPortAndTLS.value = false
142154
}

apps/user_ldap/src/services/ldapConfigService.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,11 +174,16 @@ export async function callWizard(action: WizardAction, configId: string, extraPa
174174

175175
return response.data.ocs.data
176176
} catch (error) {
177+
let message = t('user_ldap', 'An error occurred')
178+
177179
if (isAxiosError(error) && error.response?.data.ocs.meta.status === 'failure') {
178-
const message = error.response.data.ocs.meta.message ?? t('user_ldap', 'An error occurred')
179-
showError(message)
180+
if (error.response.data.ocs.meta.message !== '' && error.response.data.ocs.meta.message !== undefined) {
181+
message = error.response.data.ocs.meta.message
182+
}
180183
}
181184

185+
showError(message)
186+
182187
throw error
183188
}
184189
}

apps/user_ldap/src/store/configs.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,11 +80,21 @@ export const useLDAPConfigsStore = defineStore('ldap-configs', () => {
8080
*/
8181
async function removeConfig(configId: string) {
8282
const result = await deleteConfig(configId)
83+
8384
if (result === true) {
84-
delete ldapConfigs.value[configId]
85+
if (Object.keys(ldapConfigs.value).length === 1) {
86+
// Ensure at least one config exists before deleting the last one
87+
selectedConfigId.value = await create()
88+
// The new config id could be the same as the deleted one, so only delete if different
89+
if (selectedConfigId.value !== configId) {
90+
delete ldapConfigs.value[configId]
91+
}
92+
} else {
93+
// Select the first config that is not the deleted one
94+
selectedConfigId.value = Object.keys(ldapConfigs.value).filter((_configId) => configId !== _configId)[0]
95+
delete ldapConfigs.value[configId]
96+
}
8597
}
86-
87-
selectedConfigId.value = Object.keys(ldapConfigs.value)[0] ?? await create()
8898
}
8999

90100
return {

apps/user_ldap/src/views/Settings.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
:options="Object.keys(ldapConfigs)"
2020
:input-label="t('user_ldap', 'Select LDAP Config')">
2121
<template #option="{ label: configId }">
22-
{{ `${configId}: ${ldapConfigs[configId].ldapHost}` }}
22+
{{ `${configId}: ${ldapConfigs[configId]?.ldapHost ?? ''}` }}
2323
</template>
2424
<template #selected-option="{ label: configId }">
25-
{{ `${configId}: ${ldapConfigs[configId].ldapHost}` }}
25+
{{ `${configId}: ${ldapConfigs[configId]?.ldapHost ?? ''}` }}
2626
</template>
2727
</NcSelect>
2828
<NcButton
@@ -123,7 +123,8 @@ const selectedTab = ref('server')
123123
const clearMappingLoading = ref(false)
124124
125125
const selectedConfigHasServerInfo = computed(() => {
126-
return selectedConfig.value.ldapHost !== ''
126+
return selectedConfig.value !== undefined
127+
&& selectedConfig.value.ldapHost !== ''
127128
&& selectedConfig.value.ldapPort !== ''
128129
&& selectedConfig.value.ldapBase !== ''
129130
&& selectedConfig.value.ldapAgentName !== ''

dist/user_ldap-settings-admin.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
/* extracted by css-entry-points-plugin */
2-
@import './user_ldap-user_ldap-settings-admin-1lfli3rS.chunk.css';
2+
@import './user_ldap-user_ldap-settings-admin-BM0QsD47.chunk.css';
33
@import './TrashCanOutline-BE4hS1RR.chunk.css';
44
@import './Plus-BhZ0LWiU.chunk.css';

dist/user_ldap-settings-admin.mjs

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

dist/user_ldap-settings-admin.mjs.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/user_ldap-user_ldap-settings-admin-1lfli3rS.chunk.css renamed to dist/user_ldap-user_ldap-settings-admin-BM0QsD47.chunk.css

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)