Add an admin-only LDAP configuration UI with an enable toggle and full sign-in integration. Backend: - ldapSettings model + migration (single-row config) - GET/PUT/test routes under /ldap (admin-gated; bind password masked) - shared ldapClient with RFC 4515 filter escaping and empty-password guard - signin tries local auth first, then LDAP when enabled (find-or-create local user) so the bootstrap admin is never locked out Frontend: - LDAP settings page (Switch + form + test connection) under /admin/ldap - AdminNav tabs between user management and LDAP - ldapControl util, types, and Ldap i18n namespace for all 6 locales Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import { LdapSettingsType } from '@/types/ldap';
|
|
import Config from '@/config/config';
|
|
import { logError } from '@/utils/errorHandler';
|
|
const apiServer = Config.apiServer;
|
|
|
|
async function fetchLdapSettings(jwt: string): Promise<LdapSettingsType> {
|
|
const response = await fetch(`${apiServer}/ldap`, {
|
|
method: 'GET',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: `Bearer ${jwt}`,
|
|
},
|
|
});
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
}
|
|
return response.json();
|
|
}
|
|
|
|
async function updateLdapSettings(jwt: string, settings: LdapSettingsType): Promise<LdapSettingsType> {
|
|
const response = await fetch(`${apiServer}/ldap`, {
|
|
method: 'PUT',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: `Bearer ${jwt}`,
|
|
},
|
|
body: JSON.stringify(settings),
|
|
});
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! Status: ${response.status}`);
|
|
}
|
|
return response.json();
|
|
}
|
|
|
|
async function testLdapConnection(
|
|
jwt: string,
|
|
settings: LdapSettingsType,
|
|
testUsername: string,
|
|
testPassword: string
|
|
): Promise<{ ok: boolean; message?: string }> {
|
|
try {
|
|
const response = await fetch(`${apiServer}/ldap/test`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Authorization: `Bearer ${jwt}`,
|
|
},
|
|
body: JSON.stringify({ ...settings, testUsername, testPassword }),
|
|
});
|
|
return response.json();
|
|
} catch (error: unknown) {
|
|
logError('Error testing LDAP connection:', error);
|
|
return { ok: false, message: 'Request failed' };
|
|
}
|
|
}
|
|
|
|
export { fetchLdapSettings, updateLdapSettings, testLdapConnection };
|