Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions cmd/server/openapi/docs.go
Original file line number Diff line number Diff line change
Expand Up @@ -5765,6 +5765,9 @@ const docTemplate = `{
"description": "Admin indicates the user is a system administrator.\n\nNOTE: If the username is part of the WOODPECKER_ADMIN\nenvironment variable, this value will be set to true on login.",
"type": "boolean"
},
"admin_env": {
"type": "boolean"
},
"avatar_url": {
"description": "the avatar url for this user.",
"type": "string"
Expand Down
4 changes: 4 additions & 0 deletions server/api/users.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"github.com/gin-gonic/gin"
"github.com/tink-crypto/tink-go/v2/subtle/random"

"go.woodpecker-ci.org/woodpecker/v3/server"
"go.woodpecker-ci.org/woodpecker/v3/server/model"
"go.woodpecker-ci.org/woodpecker/v3/server/router/middleware/session"
"go.woodpecker-ci.org/woodpecker/v3/server/store"
Expand All @@ -49,6 +50,9 @@ func GetUsers(c *gin.Context) {
c.String(http.StatusInternalServerError, "Error getting user list. %s", err)
return
}
for _, user := range users {
user.AdminEnv = server.Config.Permissions.Admins.IsAdmin(user)
}
c.JSON(http.StatusOK, users)
}

Expand Down
2 changes: 2 additions & 0 deletions server/model/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@ type User struct {
// environment variable, this value will be set to true on login.
Admin bool `json:"admin,omitempty" xorm:"admin"`

AdminEnv bool `json:"admin_env,omitempty" xorm:"-"`

// Hash is a unique token used to sign tokens.
Hash string `json:"-" xorm:"UNIQUE varchar(500) 'hash'"`

Expand Down
3 changes: 2 additions & 1 deletion web/src/assets/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -416,7 +416,8 @@
"saved": "User saved",
"admin": {
"admin": "Admin",
"placeholder": "User is an admin"
"placeholder": "User is an admin",
"admin_warning": "This user has admin permissions because of your environment configuration. If you revoke the permission here, the user will regain them when they sign in next time."
},
"delete_user": "Delete user",
"edit_user": "Edit user"
Expand Down
3 changes: 3 additions & 0 deletions web/src/lib/api/types/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@ export interface User {
admin: boolean;
// Whether the account has administrative privileges.

admin_env: boolean;
// Whether the administrative privileges are defined at env var level.

active: boolean;
// Whether the account is currently active.

Expand Down
7 changes: 7 additions & 0 deletions web/src/views/admin/AdminUsers.vue
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@
</InputField>

<InputField :label="$t('admin.settings.users.admin.admin')">
<Warning
v-if="selectedUser.admin_env"
class="mb-4 text-sm"
:text="$t('admin.settings.users.admin.admin_warning')"
/>

<Checkbox
:model-value="selectedUser.admin || false"
:label="$t('admin.settings.users.admin.placeholder')"
Expand Down Expand Up @@ -99,6 +105,7 @@ import Button from '~/components/atomic/Button.vue';
import Icon from '~/components/atomic/Icon.vue';
import IconButton from '~/components/atomic/IconButton.vue';
import ListItem from '~/components/atomic/ListItem.vue';
import Warning from '~/components/atomic/Warning.vue';
import Checkbox from '~/components/form/Checkbox.vue';
import InputField from '~/components/form/InputField.vue';
import TextField from '~/components/form/TextField.vue';
Expand Down