import { useState, useEffect } from 'react'; import SubCard from 'ui-component/cards/SubCard'; import { Stack, FormControl, InputLabel, OutlinedInput, Checkbox, Button, FormControlLabel, Dialog, DialogTitle, DialogContent, DialogActions, Divider, Alert, Autocomplete, TextField } from '@mui/material'; import Grid from '@mui/material/Unstable_Grid2'; import { showError, showSuccess, removeTrailingSlash } from 'utils/common'; //, import { API } from 'utils/api'; import { createFilterOptions } from '@mui/material/Autocomplete'; const filter = createFilterOptions(); const SystemSetting = () => { let [inputs, setInputs] = useState({ PasswordLoginEnabled: '', PasswordRegisterEnabled: '', EmailVerificationEnabled: '', GitHubOAuthEnabled: '', GitHubClientId: '', GitHubClientSecret: '', LarkClientId: '', LarkClientSecret: '', OAuth2Enabled: '', OAuth2AppId: '', OAuth2AppSecret: '', OAuth2AuthorizationEndpoint: '', OAuth2TokenEndpoint: '', OAuth2UserinfoEndpoint: '', Notice: '', SMTPServer: '', SMTPPort: '', SMTPAccount: '', SMTPFrom: '', SMTPToken: '', ServerAddress: '', Footer: '', WeChatAuthEnabled: '', WeChatServerAddress: '', WeChatServerToken: '', WeChatAccountQRCodeImageURL: '', TurnstileCheckEnabled: '', TurnstileSiteKey: '', TurnstileSecretKey: '', RegisterEnabled: '', EmailDomainRestrictionEnabled: '', EmailDomainWhitelist: [], MessagePusherAddress: '', MessagePusherToken: '' }); const [originInputs, setOriginInputs] = useState({}); let [loading, setLoading] = useState(false); const [EmailDomainWhitelist, setEmailDomainWhitelist] = useState([]); const [showPasswordWarningModal, setShowPasswordWarningModal] = useState(false); const getOptions = async () => { const res = await API.get('/api/option/'); const { success, message, data } = res.data; if (success) { let newInputs = {}; data.forEach((item) => { newInputs[item.key] = item.value; }); setInputs({ ...newInputs, EmailDomainWhitelist: newInputs.EmailDomainWhitelist.split(',') }); setOriginInputs(newInputs); setEmailDomainWhitelist(newInputs.EmailDomainWhitelist.split(',')); } else { showError(message); } }; useEffect(() => { getOptions().then(); }, []); const updateOption = async (key, value) => { setLoading(true); switch (key) { case 'PasswordLoginEnabled': case 'PasswordRegisterEnabled': case 'EmailVerificationEnabled': case 'GitHubOAuthEnabled': case 'WeChatAuthEnabled': case 'TurnstileCheckEnabled': case 'EmailDomainRestrictionEnabled': case 'RegisterEnabled': case 'OAuth2Enabled': value = inputs[key] === 'true' ? 'false' : 'true'; break; default: break; } const res = await API.put('/api/option/', { key, value }); const { success, message } = res.data; if (success) { if (key === 'EmailDomainWhitelist') { value = value.split(','); } setInputs((inputs) => ({ ...inputs, [key]: value })); showSuccess('设置成功!'); } else { showError(message); } setLoading(false); }; const handleInputChange = async (event) => { let { name, value } = event.target; if (name === 'PasswordLoginEnabled' && inputs[name] === 'true') { // block disabling password login setShowPasswordWarningModal(true); return; } if ( name === 'Notice' || name.startsWith('SMTP') || name === 'ServerAddress' || name === 'GitHubClientId' || name === 'GitHubClientSecret' || name === 'WeChatServerAddress' || name === 'WeChatServerToken' || name === 'WeChatAccountQRCodeImageURL' || name === 'TurnstileSiteKey' || name === 'TurnstileSecretKey' || name === 'EmailDomainWhitelist' || name === 'MessagePusherAddress' || name === 'MessagePusherToken' || name === 'LarkClientId' || name === 'LarkClientSecret' || name === 'OAuth2AppId' || name === 'OAuth2AppSecret' || name === 'OAuth2AuthorizationEndpoint' || name === 'OAuth2TokenEndpoint' || name === 'OAuth2UserinfoEndpoint' ) { setInputs((inputs) => ({ ...inputs, [name]: value })); } else { await updateOption(name, value); } }; const submitServerAddress = async () => { let ServerAddress = removeTrailingSlash(inputs.ServerAddress); await updateOption('ServerAddress', ServerAddress); }; const submitSMTP = async () => { if (originInputs['SMTPServer'] !== inputs.SMTPServer) { await updateOption('SMTPServer', inputs.SMTPServer); } if (originInputs['SMTPAccount'] !== inputs.SMTPAccount) { await updateOption('SMTPAccount', inputs.SMTPAccount); } if (originInputs['SMTPFrom'] !== inputs.SMTPFrom) { await updateOption('SMTPFrom', inputs.SMTPFrom); } if (originInputs['SMTPPort'] !== inputs.SMTPPort && inputs.SMTPPort !== '') { await updateOption('SMTPPort', inputs.SMTPPort); } if (originInputs['SMTPToken'] !== inputs.SMTPToken && inputs.SMTPToken !== '') { await updateOption('SMTPToken', inputs.SMTPToken); } }; const submitEmailDomainWhitelist = async () => { await updateOption('EmailDomainWhitelist', inputs.EmailDomainWhitelist.join(',')); }; const submitWeChat = async () => { if (originInputs['WeChatServerAddress'] !== inputs.WeChatServerAddress) { await updateOption('WeChatServerAddress', removeTrailingSlash(inputs.WeChatServerAddress)); } if (originInputs['WeChatAccountQRCodeImageURL'] !== inputs.WeChatAccountQRCodeImageURL) { await updateOption('WeChatAccountQRCodeImageURL', inputs.WeChatAccountQRCodeImageURL); } if (originInputs['WeChatServerToken'] !== inputs.WeChatServerToken && inputs.WeChatServerToken !== '') { await updateOption('WeChatServerToken', inputs.WeChatServerToken); } }; const submitGitHubOAuth = async () => { if (originInputs['GitHubClientId'] !== inputs.GitHubClientId) { await updateOption('GitHubClientId', inputs.GitHubClientId); } if (originInputs['GitHubClientSecret'] !== inputs.GitHubClientSecret && inputs.GitHubClientSecret !== '') { await updateOption('GitHubClientSecret', inputs.GitHubClientSecret); } }; const submitTurnstile = async () => { if (originInputs['TurnstileSiteKey'] !== inputs.TurnstileSiteKey) { await updateOption('TurnstileSiteKey', inputs.TurnstileSiteKey); } if (originInputs['TurnstileSecretKey'] !== inputs.TurnstileSecretKey && inputs.TurnstileSecretKey !== '') { await updateOption('TurnstileSecretKey', inputs.TurnstileSecretKey); } }; const submitMessagePusher = async () => { if (originInputs['MessagePusherAddress'] !== inputs.MessagePusherAddress) { await updateOption('MessagePusherAddress', removeTrailingSlash(inputs.MessagePusherAddress)); } if (originInputs['MessagePusherToken'] !== inputs.MessagePusherToken && inputs.MessagePusherToken !== '') { await updateOption('MessagePusherToken', inputs.MessagePusherToken); } }; const submitLarkOAuth = async () => { if (originInputs['LarkClientId'] !== inputs.LarkClientId) { await updateOption('LarkClientId', inputs.LarkClientId); } if (originInputs['LarkClientSecret'] !== inputs.LarkClientSecret && inputs.LarkClientSecret !== '') { await updateOption('LarkClientSecret', inputs.LarkClientSecret); } }; const submitOAuth2 = async () => { const OAuth2Config = { OAuth2AppId: inputs.OAuth2AppId, OAuth2AppSecret: inputs.OAuth2AppSecret, OAuth2AuthorizationEndpoint: inputs.OAuth2AuthorizationEndpoint, OAuth2TokenEndpoint: inputs.OAuth2TokenEndpoint, OAuth2UserinfoEndpoint: inputs.OAuth2UserinfoEndpoint }; console.log(OAuth2Config); if (originInputs['OAuth2AppId'] !== inputs.OAuth2AppId) { await updateOption('OAuth2AppId', inputs.OAuth2AppId); } if (originInputs['OAuth2AppSecret'] !== inputs.OAuth2AppSecret && inputs.OAuth2AppSecret !== '') { await updateOption('OAuth2AppSecret', inputs.OAuth2AppSecret); } if (originInputs['OAuth2AuthorizationEndpoint'] !== inputs.OAuth2AuthorizationEndpoint) { await updateOption('OAuth2AuthorizationEndpoint', inputs.OAuth2AuthorizationEndpoint); } if (originInputs['OAuth2TokenEndpoint'] !== inputs.OAuth2TokenEndpoint) { await updateOption('OAuth2TokenEndpoint', inputs.OAuth2TokenEndpoint); } if (originInputs['OAuth2UserinfoEndpoint'] !== inputs.OAuth2UserinfoEndpoint) { await updateOption('OAuth2UserinfoEndpoint', inputs.OAuth2UserinfoEndpoint); } }; return ( <> 服务器地址 } /> } /> } /> } /> } /> } /> } /> } /> } /> { const event = { target: { name: 'EmailDomainWhitelist', value: value } }; handleInputChange(event); }} filterSelectedOptions renderInput={(params) => } filterOptions={(options, params) => { const filtered = filter(options, params); const { inputValue } = params; const isExisting = options.some((option) => inputValue === option); if (inputValue !== '' && !isExisting) { filtered.push(inputValue); } return filtered; }} /> SMTP 服务器地址 SMTP 端口 SMTP 账户 SMTP 发送者邮箱 SMTP 访问凭证 {' '} 用以支持通过 GitHub 进行登录注册, 点击此处 管理你的 GitHub OAuth App } > Homepage URL 填 {inputs.ServerAddress} ,Authorization callback URL 填 {`${inputs.ServerAddress}/oauth/github`} GitHub Client ID GitHub Client Secret {' '} 用以支持通过飞书进行登录注册, 点击此处 管理你的飞书应用 } > 主页链接填 {inputs.ServerAddress} ,重定向 URL 填 {`${inputs.ServerAddress}/oauth/lark`} App ID App Secret 用以支持通过微信进行登录注册, 点击此处 了解 WeChat Server } > WeChat Server 服务器地址 WeChat Server 访问凭证 微信公众号二维码图片链接 用以支持通过第三方 OAuth2 登录,例如 Okta、Auth0 或自建的兼容 OAuth2.0 协议的 IdP 等 } > 主页链接填 { inputs.ServerAddress } ,重定向 URL 填 { `${ inputs.ServerAddress }/oauth/oidc` } App ID App Secret 授权地址 认证地址 用户地址 用以推送报警信息, 点击此处 了解 Message Pusher } > Message Pusher 推送地址 Message Pusher 访问凭证 用以支持用户校验, 点击此处 管理你的 Turnstile Sites,推荐选择 Invisible Widget Type } > Turnstile Site Key Turnstile Secret Key setShowPasswordWarningModal(false)} maxWidth={'md'}> 警告 取消密码登录将导致所有未绑定其他登录方式的用户(包括管理员)无法通过密码登录,确认取消? ); }; export default SystemSetting;