@@ -32,18 +32,19 @@ type OAuthProvidersView struct {
|
||||
GithubDisabled bool `json:"githubDisabled"`
|
||||
}
|
||||
|
||||
// UpdateOAuthInput 是保存 provider 配置的输入;
|
||||
// secret 为 nil 沿用已存值,非 nil 覆盖(空串清除)。
|
||||
// UpdateOAuthInput 是 provider 配置的部分更新:所有字段 nil=沿用已存值,
|
||||
// 只落库出现的字段;并发编辑不同 provider 因此互不回滚(2026-07-22 审查 #18)。
|
||||
// secret 非 nil 覆盖(空串清除),绝不回读。
|
||||
type UpdateOAuthInput struct {
|
||||
OidcIssuer string `json:"oidcIssuer"`
|
||||
OidcClientID string `json:"oidcClientId"`
|
||||
OidcIssuer *string `json:"oidcIssuer"`
|
||||
OidcClientID *string `json:"oidcClientId"`
|
||||
OidcClientSecret *string `json:"oidcClientSecret"`
|
||||
OidcDisplayName string `json:"oidcDisplayName"`
|
||||
OidcDisabled bool `json:"oidcDisabled"`
|
||||
GithubClientID string `json:"githubClientId"`
|
||||
OidcDisplayName *string `json:"oidcDisplayName"`
|
||||
OidcDisabled *bool `json:"oidcDisabled"`
|
||||
GithubClientID *string `json:"githubClientId"`
|
||||
GithubClientSecret *string `json:"githubClientSecret"`
|
||||
GithubDisplayName string `json:"githubDisplayName"`
|
||||
GithubDisabled bool `json:"githubDisabled"`
|
||||
GithubDisplayName *string `json:"githubDisplayName"`
|
||||
GithubDisabled *bool `json:"githubDisabled"`
|
||||
}
|
||||
|
||||
// OAuthView 返回脱敏后的 provider 配置。
|
||||
@@ -77,19 +78,51 @@ func boolFlag(on bool) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
// UpdateOAuth 保存 provider 配置;issuer 规范化去尾斜杠,secret 加密落库。
|
||||
func (s *SettingService) UpdateOAuth(ctx context.Context, in UpdateOAuthInput) error {
|
||||
plain := map[string]string{
|
||||
settingOauthOidcIssuer: strings.TrimRight(strings.TrimSpace(in.OidcIssuer), "/"),
|
||||
settingOauthOidcClientID: strings.TrimSpace(in.OidcClientID),
|
||||
settingOauthOidcDisplayName: strings.TrimSpace(in.OidcDisplayName),
|
||||
settingOauthOidcDisabled: boolFlag(in.OidcDisabled),
|
||||
settingOauthGithubClientID: strings.TrimSpace(in.GithubClientID),
|
||||
settingOauthGithubDisplayName: strings.TrimSpace(in.GithubDisplayName),
|
||||
settingOauthGithubDisabled: boolFlag(in.GithubDisabled),
|
||||
// trimPtr / issuerPtr / flagPtr 把补丁字段规范化为存储值;nil 表示未出现不写。
|
||||
func trimPtr(p *string) *string {
|
||||
if p == nil {
|
||||
return nil
|
||||
}
|
||||
for key, value := range plain {
|
||||
if err := s.set(ctx, key, value); err != nil {
|
||||
v := strings.TrimSpace(*p)
|
||||
return &v
|
||||
}
|
||||
|
||||
func issuerPtr(p *string) *string {
|
||||
if p == nil {
|
||||
return nil
|
||||
}
|
||||
v := strings.TrimRight(strings.TrimSpace(*p), "/")
|
||||
return &v
|
||||
}
|
||||
|
||||
func flagPtr(p *bool) *string {
|
||||
if p == nil {
|
||||
return nil
|
||||
}
|
||||
v := boolFlag(*p)
|
||||
return &v
|
||||
}
|
||||
|
||||
// UpdateOAuth 部分更新 provider 配置:只落库非 nil 字段;
|
||||
// issuer 规范化去尾斜杠,secret 加密落库(空串清除)。
|
||||
func (s *SettingService) UpdateOAuth(ctx context.Context, in UpdateOAuthInput) error {
|
||||
writes := []struct {
|
||||
key string
|
||||
val *string
|
||||
}{
|
||||
{settingOauthOidcIssuer, issuerPtr(in.OidcIssuer)},
|
||||
{settingOauthOidcClientID, trimPtr(in.OidcClientID)},
|
||||
{settingOauthOidcDisplayName, trimPtr(in.OidcDisplayName)},
|
||||
{settingOauthOidcDisabled, flagPtr(in.OidcDisabled)},
|
||||
{settingOauthGithubClientID, trimPtr(in.GithubClientID)},
|
||||
{settingOauthGithubDisplayName, trimPtr(in.GithubDisplayName)},
|
||||
{settingOauthGithubDisabled, flagPtr(in.GithubDisabled)},
|
||||
}
|
||||
for _, w := range writes {
|
||||
if w.val == nil {
|
||||
continue
|
||||
}
|
||||
if err := s.set(ctx, w.key, *w.val); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user