import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '@/components/ui/select'; import { ChevronDown, Users, Key, RefreshCw, Plus, UserPlus, Download, Edit, Trash2, Loader2, } from 'lucide-react'; interface LdapManagementSectionProps { ldapConfig: any; ldapMgmtOpen: boolean; setLdapMgmtOpen: (v: boolean) => void; ldapOUs: any[]; selectedOUDN: string; setSelectedOUDN: (v: string) => void; ldapUsers: any[]; selectedLDAPUsers: string[]; setSelectedLDAPUsers: (v: string[]) => void; loadLdapOUs: () => void; loadLdapOUUsers: (ouDn?: string) => void; handleLdapImport: () => void; importing: boolean; importFeedback: string | null; importResultOpen: boolean; setImportResultOpen: (v: boolean) => void; // Create OU createOUOpen: boolean; setCreateOUOpen: (v: boolean) => void; ouForm: { ou_name: string; parent_dn: string; description: string }; setOuForm: React.Dispatch>; handleCreateOU: () => void; ldapSaving: boolean; // Create LDAP user createUserOpen: boolean; setCreateUserOpen: (v: boolean) => void; newUser: { username: string; password: string; display_name: string; email: string; ou_dn: string }; setNewUser: React.Dispatch>; handleCreateLDAPUser: () => void; // LDAP user test ldapUserTestOpen: boolean; setLdapUserTestOpen: (v: boolean) => void; ldapTestUser: string; setLdapTestUser: (v: string) => void; ldapTestPass: string; setLdapTestPass: (v: string) => void; ldapUserTesting: boolean; ldapUserTestResult: any; handleLdapUserTest: () => void; // Edit LDAP user editLdapUser: any | null; setEditLdapUser: (u: any | null) => void; editLdapForm: { cn: string; mail: string; phone: string; title: string }; setEditLdapForm: React.Dispatch>; handleUpdateLdapUser: () => void; handleDeleteLDAPEntry: (dn: string, silent?: boolean) => void; openEditLdapUser: (user: any) => void; } export function LdapManagementSection(props: LdapManagementSectionProps) { const { ldapConfig, ldapMgmtOpen, setLdapMgmtOpen, ldapOUs, selectedOUDN, setSelectedOUDN, ldapUsers, selectedLDAPUsers, setSelectedLDAPUsers, loadLdapOUs, loadLdapOUUsers, handleLdapImport, importing, importFeedback, importResultOpen, setImportResultOpen, createOUOpen, setCreateOUOpen, ouForm, setOuForm, handleCreateOU, ldapSaving, createUserOpen, setCreateUserOpen, newUser, setNewUser, handleCreateLDAPUser, ldapUserTestOpen, setLdapUserTestOpen, ldapTestUser, setLdapTestUser, ldapTestPass, setLdapTestPass, ldapUserTesting, ldapUserTestResult, handleLdapUserTest, editLdapUser, setEditLdapUser, editLdapForm, setEditLdapForm, handleUpdateLdapUser, handleDeleteLDAPEntry, openEditLdapUser, } = props; return ( <> {/* 折叠/展开按钮 */} {ldapMgmtOpen && (
{/* 账号验证测试 */} LDAP 账号验证测试 输入 LDAP 用户凭据进行认证测试
setLdapTestUser(e.target.value)} placeholder="zhangsan" className="bg-slate-800/50 border-slate-700 text-slate-200 placeholder:text-slate-600" />
setLdapTestPass(e.target.value)} onKeyDown={(e) => e.key === 'Enter' && handleLdapUserTest()} placeholder="••••••" className="bg-slate-800/50 border-slate-700 text-slate-200 placeholder:text-slate-600" />
{ldapUserTestResult && (
{ldapUserTestResult.message} {ldapUserTestResult.user_info && (
{JSON.stringify(ldapUserTestResult.user_info, null, 2)}
)}
)}
{/* OU 选择 */} {/* 新建 OU */} 新建组织单元 在 LDAP 目录中创建新的组织单元 (OU)
setOuForm({ ...ouForm, ou_name: e.target.value })} placeholder="dev" className="bg-slate-800/50 border-slate-700 text-slate-200" />
setOuForm({ ...ouForm, parent_dn: e.target.value })} placeholder={ldapConfig.base_dn} className="bg-slate-800/50 border-slate-700 text-slate-200" />
setOuForm({ ...ouForm, description: e.target.value })} placeholder="开发团队" className="bg-slate-800/50 border-slate-700 text-slate-200" />
{/* 添加用户 */} 添加 LDAP 用户 在 LDAP 目录中创建新的用户账号
setNewUser({ ...newUser, username: e.target.value })} placeholder="zhangsan" className="bg-slate-800/50 border-slate-700 text-slate-200" />
setNewUser({ ...newUser, password: e.target.value })} placeholder="••••••" className="bg-slate-800/50 border-slate-700 text-slate-200" />
setNewUser({ ...newUser, display_name: e.target.value })} placeholder="张三" className="bg-slate-800/50 border-slate-700 text-slate-200" />
setNewUser({ ...newUser, email: e.target.value })} placeholder="zs@example.com" className="bg-slate-800/50 border-slate-700 text-slate-200" />
setNewUser({ ...newUser, ou_dn: e.target.value })} className="bg-slate-800/50 border-slate-700 text-slate-200" />
{/* 导入到本地 */}
{importFeedback && ( 导入结果 LDAP 用户导入到本地用户库的执行结果
{importFeedback}
)} {/* 用户表格 */}
0 && selectedLDAPUsers.length === ldapUsers.length} onChange={(e) => setSelectedLDAPUsers(e.target.checked ? ldapUsers.map((u: any) => u.dn) : [])} /> 用户名 显示名称 邮箱 DN 操作 {ldapUsers.length === 0 ? ( 点击「刷新」加载 LDAP 用户 ) : ( ldapUsers.map((user: any) => ( { if (e.target.checked) setSelectedLDAPUsers([...selectedLDAPUsers, user.dn]); else setSelectedLDAPUsers(selectedLDAPUsers.filter((d: string) => d !== user.dn)); }} /> {user.uid} {user.cn} {user.mail || '-'} {user.dn}
)) )}
)} {/* 编辑 LDAP 用户 Dialog */} !v && setEditLdapUser(null)}> 编辑 LDAP 用户 修改 {editLdapUser?.uid} 的属性 {editLdapUser && (
setEditLdapForm({ ...editLdapForm, cn: e.target.value })} className="bg-slate-800/50 border-slate-700 text-slate-200" />
setEditLdapForm({ ...editLdapForm, mail: e.target.value })} placeholder="user@example.com" className="bg-slate-800/50 border-slate-700 text-slate-200" />
setEditLdapForm({ ...editLdapForm, phone: e.target.value })} placeholder="13800138000" className="bg-slate-800/50 border-slate-700 text-slate-200" />
setEditLdapForm({ ...editLdapForm, title: e.target.value })} placeholder="运维工程师" className="bg-slate-800/50 border-slate-700 text-slate-200" />
)}
); }