mirror of
https://github.com/h44z/wg-portal
synced 2025-02-26 05:49:14 +00:00
fix disabling of missing ldap users (#344) and allow deletion of all user types
This commit is contained in:
parent
31c0daeba8
commit
c73ce0288e
@ -165,7 +165,7 @@ async function del() {
|
|||||||
</template>
|
</template>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div class="flex-fill text-start">
|
<div class="flex-fill text-start">
|
||||||
<button v-if="props.userId!=='#NEW#'&&formData.Source==='db'" class="btn btn-danger me-1" type="button" @click.prevent="del">{{ $t('general.delete') }}</button>
|
<button v-if="props.userId!=='#NEW#'" class="btn btn-danger me-1" type="button" @click.prevent="del">{{ $t('general.delete') }}</button>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn btn-primary me-1" type="button" @click.prevent="save">{{ $t('general.save') }}</button>
|
<button class="btn btn-primary me-1" type="button" @click.prevent="save">{{ $t('general.save') }}</button>
|
||||||
<button class="btn btn-secondary" type="button" @click.prevent="close">{{ $t('general.close') }}</button>
|
<button class="btn btn-secondary" type="button" @click.prevent="close">{{ $t('general.close') }}</button>
|
||||||
|
@ -373,7 +373,7 @@ func (a *Authenticator) processUserInfo(
|
|||||||
case err != nil:
|
case err != nil:
|
||||||
return nil, fmt.Errorf("registration disabled, cannot create missing user: %w", err)
|
return nil, fmt.Errorf("registration disabled, cannot create missing user: %w", err)
|
||||||
default:
|
default:
|
||||||
err = a.updateExternalUser(ctx, user, userInfo)
|
err = a.updateExternalUser(ctx, user, userInfo, source, provider)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("failed to update user: %w", err)
|
return nil, fmt.Errorf("failed to update user: %w", err)
|
||||||
}
|
}
|
||||||
@ -432,6 +432,8 @@ func (a *Authenticator) updateExternalUser(
|
|||||||
ctx context.Context,
|
ctx context.Context,
|
||||||
existingUser *domain.User,
|
existingUser *domain.User,
|
||||||
userInfo *domain.AuthenticatorUserInfo,
|
userInfo *domain.AuthenticatorUserInfo,
|
||||||
|
source domain.UserSource,
|
||||||
|
provider string,
|
||||||
) error {
|
) error {
|
||||||
if existingUser.IsLocked() || existingUser.IsDisabled() {
|
if existingUser.IsLocked() || existingUser.IsDisabled() {
|
||||||
return nil // user is locked or disabled, do not update
|
return nil // user is locked or disabled, do not update
|
||||||
@ -462,6 +464,14 @@ func (a *Authenticator) updateExternalUser(
|
|||||||
existingUser.IsAdmin = userInfo.IsAdmin
|
existingUser.IsAdmin = userInfo.IsAdmin
|
||||||
isChanged = true
|
isChanged = true
|
||||||
}
|
}
|
||||||
|
if existingUser.Source != source {
|
||||||
|
existingUser.Source = source
|
||||||
|
isChanged = true
|
||||||
|
}
|
||||||
|
if existingUser.ProviderName != provider {
|
||||||
|
existingUser.ProviderName = provider
|
||||||
|
isChanged = true
|
||||||
|
}
|
||||||
|
|
||||||
if !isChanged {
|
if !isChanged {
|
||||||
return nil // nothing to update
|
return nil // nothing to update
|
||||||
|
@ -73,11 +73,16 @@ func (m Manager) NewUser(ctx context.Context, user *domain.User) error {
|
|||||||
u.Identifier = user.Identifier
|
u.Identifier = user.Identifier
|
||||||
u.Email = user.Email
|
u.Email = user.Email
|
||||||
u.Source = user.Source
|
u.Source = user.Source
|
||||||
|
u.ProviderName = user.ProviderName
|
||||||
u.IsAdmin = user.IsAdmin
|
u.IsAdmin = user.IsAdmin
|
||||||
u.Firstname = user.Firstname
|
u.Firstname = user.Firstname
|
||||||
u.Lastname = user.Lastname
|
u.Lastname = user.Lastname
|
||||||
u.Phone = user.Phone
|
u.Phone = user.Phone
|
||||||
u.Department = user.Department
|
u.Department = user.Department
|
||||||
|
u.Notes = user.Notes
|
||||||
|
u.ApiToken = user.ApiToken
|
||||||
|
u.ApiTokenCreated = user.ApiTokenCreated
|
||||||
|
|
||||||
return u, nil
|
return u, nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -421,13 +426,14 @@ func (m Manager) runLdapSynchronizationService(ctx context.Context) {
|
|||||||
logrus.Debugf("sync disabled for LDAP server: %s", cfg.ProviderName)
|
logrus.Debugf("sync disabled for LDAP server: %s", cfg.ProviderName)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
running := true
|
running := true
|
||||||
for running {
|
for running {
|
||||||
select {
|
select {
|
||||||
case <-ctx.Done():
|
case <-ctx.Done():
|
||||||
running = false
|
running = false
|
||||||
continue
|
continue
|
||||||
case <-time.After(syncInterval * time.Second):
|
case <-time.After(syncInterval):
|
||||||
// select blocks until one of the cases evaluate to true
|
// select blocks until one of the cases evaluate to true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -460,7 +466,7 @@ func (m Manager) synchronizeLdapUsers(ctx context.Context, provider *config.Ldap
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
logrus.Tracef("fetched %d raw ldap users...", len(rawUsers))
|
logrus.Tracef("fetched %d raw ldap users from provider %s...", len(rawUsers), provider.ProviderName)
|
||||||
|
|
||||||
// Update existing LDAP users
|
// Update existing LDAP users
|
||||||
err = m.updateLdapUsers(ctx, provider.ProviderName, rawUsers, &provider.FieldMap, provider.ParsedAdminGroupDN)
|
err = m.updateLdapUsers(ctx, provider.ProviderName, rawUsers, &provider.FieldMap, provider.ParsedAdminGroupDN)
|
||||||
@ -497,13 +503,13 @@ func (m Manager) updateLdapUsers(
|
|||||||
return fmt.Errorf("find error for user id %s: %w", user.Identifier, err)
|
return fmt.Errorf("find error for user id %s: %w", user.Identifier, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
tctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
tctx, cancel := context.WithTimeout(ctx, 30*time.Second)
|
||||||
defer cancel()
|
|
||||||
tctx = domain.SetUserInfo(tctx, domain.SystemAdminContextUserInfo())
|
tctx = domain.SetUserInfo(tctx, domain.SystemAdminContextUserInfo())
|
||||||
|
|
||||||
if existingUser == nil {
|
if existingUser == nil {
|
||||||
err := m.NewUser(tctx, user)
|
err := m.NewUser(tctx, user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
cancel()
|
||||||
return fmt.Errorf("create error for user id %s: %w", user.Identifier, err)
|
return fmt.Errorf("create error for user id %s: %w", user.Identifier, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -514,6 +520,8 @@ func (m Manager) updateLdapUsers(
|
|||||||
err := m.users.SaveUser(tctx, user.Identifier, func(u *domain.User) (*domain.User, error) {
|
err := m.users.SaveUser(tctx, user.Identifier, func(u *domain.User) (*domain.User, error) {
|
||||||
u.UpdatedAt = time.Now()
|
u.UpdatedAt = time.Now()
|
||||||
u.UpdatedBy = domain.CtxSystemLdapSyncer
|
u.UpdatedBy = domain.CtxSystemLdapSyncer
|
||||||
|
u.Source = user.Source
|
||||||
|
u.ProviderName = user.ProviderName
|
||||||
u.Email = user.Email
|
u.Email = user.Email
|
||||||
u.Firstname = user.Firstname
|
u.Firstname = user.Firstname
|
||||||
u.Lastname = user.Lastname
|
u.Lastname = user.Lastname
|
||||||
@ -525,9 +533,12 @@ func (m Manager) updateLdapUsers(
|
|||||||
return u, nil
|
return u, nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
cancel()
|
||||||
return fmt.Errorf("update error for user id %s: %w", user.Identifier, err)
|
return fmt.Errorf("update error for user id %s: %w", user.Identifier, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cancel()
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@ -567,6 +578,8 @@ func (m Manager) disableMissingLdapUsers(
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logrus.Tracef("user %s is missing in ldap provider %s, disabling", user.Identifier, providerName)
|
||||||
|
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
user.Disabled = &now
|
user.Disabled = &now
|
||||||
user.DisabledReason = domain.DisabledReasonLdapMissing
|
user.DisabledReason = domain.DisabledReasonLdapMissing
|
||||||
|
@ -101,11 +101,7 @@ func (u *User) EditAllowed(new *User) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (u *User) DeleteAllowed() error {
|
func (u *User) DeleteAllowed() error {
|
||||||
if u.Source == UserSourceDatabase {
|
return nil // all users can be deleted, OAuth and LDAP users might still be recreated
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return errors.New("delete only allowed for database source")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *User) CheckPassword(password string) error {
|
func (u *User) CheckPassword(password string) error {
|
||||||
|
Loading…
Reference in New Issue
Block a user