mirror of
https://github.com/Forceu/Gokapi.git
synced 2026-01-23 17:38:28 -06:00
* Require 1.9.6 for upgrade, add function to get userID from request * Automatically add user when successfully authenticated with headers / oauth, disallow modifing own user permissions * Dont show user/pw page when using header authentication * Only display redacted versions of API keys #228, fixed deployment password * Added animation for deleting API key * Only create salt once * Disable elements on upload UI if insufficient permissions * BREAKING: User field must be email for OAUTH2, added warning in setup when changing database * BREAKING: Added option to restrict to only registered users * Fixed crash due to concurrent map iteration * Replace /uploadComplete with API call, BREAKING API is now in headers * BREAKING: require true|false instead of only checking for true * BREAKING API: Renamed apiKeyToModify parameter to targetKey
281 lines
8.5 KiB
Go
281 lines
8.5 KiB
Go
package models
|
|
|
|
import (
|
|
"github.com/forceu/gokapi/internal/test"
|
|
"os"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestUser_GetReadableDate(t *testing.T) {
|
|
u := User{
|
|
Id: 50,
|
|
Name: "Admin",
|
|
Permissions: UserPermissionAll,
|
|
UserLevel: UserLevelSuperAdmin,
|
|
LastOnline: 0,
|
|
Password: "1234",
|
|
ResetPassword: false,
|
|
}
|
|
date := u.GetReadableDate()
|
|
test.IsEqualString(t, date, "Never")
|
|
u.LastOnline = time.Now().Unix() - 10
|
|
date = u.GetReadableDate()
|
|
test.IsEqualString(t, date, "Online")
|
|
u.LastOnline = 1736276120
|
|
|
|
lastTz := os.Getenv("TZ")
|
|
err := os.Setenv("TZ", "Europe/Berlin")
|
|
test.IsNil(t, err)
|
|
date = u.GetReadableDate()
|
|
test.IsEqualString(t, date, "2025-01-07 19:55")
|
|
err = os.Setenv("TZ", lastTz)
|
|
test.IsNil(t, err)
|
|
}
|
|
|
|
func TestUserPermAll(t *testing.T) {
|
|
user := &User{}
|
|
user.GrantPermission(UserPermissionAll)
|
|
if !user.HasPermission(UserPermReplaceUploads) ||
|
|
!user.HasPermission(UserPermListOtherUploads) ||
|
|
!user.HasPermission(UserPermEditOtherUploads) ||
|
|
!user.HasPermission(UserPermDeleteOtherUploads) ||
|
|
!user.HasPermission(UserPermReplaceOtherUploads) ||
|
|
!user.HasPermission(UserPermManageLogs) ||
|
|
!user.HasPermission(UserPermManageApiKeys) ||
|
|
!user.HasPermission(UserPermManageUsers) {
|
|
t.Errorf("expected all permissions to be set")
|
|
}
|
|
}
|
|
|
|
// Helper function to check only one permission is set
|
|
func checkOnlyUserPermissionSet(t *testing.T, user *User, perm UserPermission) {
|
|
allPermissions := []struct {
|
|
perm UserPermission
|
|
permName string
|
|
}{
|
|
{UserPermReplaceUploads, "UserPermReplaceUploads"},
|
|
{UserPermListOtherUploads, "UserPermListOtherUploads"},
|
|
{UserPermEditOtherUploads, "UserPermEditOtherUploads"},
|
|
{UserPermDeleteOtherUploads, "UserPermDeleteOtherUploads"},
|
|
{UserPermReplaceOtherUploads, "UserPermReplaceOtherUploads"},
|
|
{UserPermManageLogs, "UserPermManageLogs"},
|
|
{UserPermManageApiKeys, "UserPermManageApiKeys"},
|
|
{UserPermManageUsers, "UserPermManageUsers"},
|
|
}
|
|
|
|
for _, p := range allPermissions {
|
|
if p.perm == perm {
|
|
if !user.HasPermission(p.perm) {
|
|
t.Errorf("expected permission %s to be set", p.permName)
|
|
}
|
|
} else {
|
|
if user.HasPermission(p.perm) {
|
|
t.Errorf("expected permission %s not to be set", p.permName)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSetIndividualUserPermissions(t *testing.T) {
|
|
user := &User{}
|
|
|
|
// Test each individual permission
|
|
permissions := []struct {
|
|
perm UserPermission
|
|
permName string
|
|
}{
|
|
{UserPermReplaceUploads, "UserPermReplaceUploads"},
|
|
{UserPermListOtherUploads, "UserPermListOtherUploads"},
|
|
{UserPermEditOtherUploads, "UserPermEditOtherUploads"},
|
|
{UserPermDeleteOtherUploads, "UserPermDeleteOtherUploads"},
|
|
{UserPermReplaceOtherUploads, "UserPermReplaceOtherUploads"},
|
|
{UserPermManageLogs, "UserPermManageLogs"},
|
|
{UserPermManageApiKeys, "UserPermManageApiKeys"},
|
|
{UserPermManageUsers, "UserPermManageUsers"},
|
|
}
|
|
|
|
for _, p := range permissions {
|
|
user.Permissions = UserPermissionNone // reset permissions
|
|
user.GrantPermission(p.perm)
|
|
checkOnlyUserPermissionSet(t, user, p.perm)
|
|
}
|
|
}
|
|
|
|
// Helper function to check combined permissions are set
|
|
func checkCombinedUserPermissions(t *testing.T, user *User, perms []UserPermission) {
|
|
for _, perm := range perms {
|
|
if !user.HasPermission(perm) {
|
|
t.Errorf("expected permission %d to be set", perm)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestSetCombinedUserPermissions(t *testing.T) {
|
|
user := &User{}
|
|
allPermissions := []UserPermission{
|
|
UserPermReplaceUploads,
|
|
UserPermListOtherUploads,
|
|
UserPermEditOtherUploads,
|
|
UserPermDeleteOtherUploads,
|
|
UserPermReplaceOtherUploads,
|
|
UserPermManageLogs,
|
|
UserPermManageApiKeys,
|
|
UserPermManageUsers,
|
|
}
|
|
|
|
// Test setting permissions in combination
|
|
for i := 0; i < len(allPermissions); i++ {
|
|
user.Permissions = UserPermissionNone // reset permissions
|
|
for j := 0; j <= i; j++ {
|
|
user.GrantPermission(allPermissions[j])
|
|
}
|
|
checkCombinedUserPermissions(t, user, allPermissions[:i+1])
|
|
}
|
|
}
|
|
|
|
func TestUser_GetReadableUserLevel(t *testing.T) {
|
|
user := &User{
|
|
UserLevel: UserLevelSuperAdmin,
|
|
}
|
|
test.IsEqualString(t, user.GetReadableUserLevel(), "Super Admin")
|
|
user.UserLevel = UserLevelAdmin
|
|
test.IsEqualString(t, user.GetReadableUserLevel(), "Admin")
|
|
user.UserLevel = UserLevelUser
|
|
test.IsEqualString(t, user.GetReadableUserLevel(), "User")
|
|
user.UserLevel = 4
|
|
test.IsEqualString(t, user.GetReadableUserLevel(), "Invalid")
|
|
}
|
|
|
|
func TestUser_IsSuperAdmin(t *testing.T) {
|
|
user := &User{
|
|
UserLevel: UserLevelSuperAdmin,
|
|
}
|
|
test.IsEqualBool(t, user.IsSuperAdmin(), true)
|
|
user.UserLevel = UserLevelAdmin
|
|
test.IsEqualBool(t, user.IsSuperAdmin(), false)
|
|
user.UserLevel = UserLevelUser
|
|
test.IsEqualBool(t, user.IsSuperAdmin(), false)
|
|
user.UserLevel = 4
|
|
test.IsEqualBool(t, user.IsSuperAdmin(), false)
|
|
}
|
|
|
|
func TestUser_IsSameUser(t *testing.T) {
|
|
user := &User{
|
|
Id: 5,
|
|
}
|
|
test.IsEqualBool(t, user.IsSameUser(5), true)
|
|
test.IsEqualBool(t, user.IsSameUser(0), false)
|
|
}
|
|
|
|
func TestSetUserPermission(t *testing.T) {
|
|
user := &User{}
|
|
user.GrantPermission(UserPermListOtherUploads)
|
|
if !user.HasPermission(UserPermListOtherUploads) {
|
|
t.Errorf("expected permission %d to be set", UserPermListOtherUploads)
|
|
}
|
|
if user.HasPermission(UserPermReplaceOtherUploads) {
|
|
t.Errorf("expected permission %d to be not set", UserPermReplaceOtherUploads)
|
|
}
|
|
}
|
|
|
|
func TestRemoveUserPermission(t *testing.T) {
|
|
user := &User{}
|
|
user.GrantPermission(UserPermManageUsers)
|
|
if !user.HasPermission(UserPermManageUsers) {
|
|
t.Errorf("expected permission %d to be set", UserPermManageUsers)
|
|
}
|
|
user.RemovePermission(UserPermManageUsers)
|
|
if user.HasPermission(UserPermManageUsers) {
|
|
t.Errorf("expected permission %d to be removed", UserPermManageUsers)
|
|
}
|
|
}
|
|
|
|
func TestHasUserPermission(t *testing.T) {
|
|
user := &User{}
|
|
if !user.HasPermission(UserPermissionNone) {
|
|
t.Errorf("expected ApiPermNone to always return true")
|
|
}
|
|
if user.HasPermission(UserPermManageUsers) {
|
|
t.Errorf("expected permission %d not to be set", UserPermManageUsers)
|
|
}
|
|
user.GrantPermission(UserPermManageUsers)
|
|
if !user.HasPermission(UserPermManageUsers) {
|
|
t.Errorf("expected permission %d to be set", UserPermManageUsers)
|
|
}
|
|
if user.HasPermission(UserPermReplaceOtherUploads) {
|
|
t.Errorf("expected permission %d not to be set", UserPermReplaceOtherUploads)
|
|
}
|
|
}
|
|
|
|
func TestUser_HasPermissionReplace(t *testing.T) {
|
|
user := &User{}
|
|
if user.HasPermissionReplace() {
|
|
t.Errorf("expected replace permission to be not set")
|
|
}
|
|
user.GrantPermission(UserPermReplaceUploads)
|
|
if !user.HasPermissionReplace() {
|
|
t.Errorf("expected replace permission to be set")
|
|
}
|
|
}
|
|
|
|
func TestUser_HasPermissionListOtherUploads(t *testing.T) {
|
|
user := &User{}
|
|
test.IsEqualBool(t, user.HasPermissionListOtherUploads(), false)
|
|
user.GrantPermission(UserPermListOtherUploads)
|
|
test.IsEqualBool(t, user.HasPermissionListOtherUploads(), true)
|
|
}
|
|
|
|
func TestUser_HasPermissionEditOtherUploads(t *testing.T) {
|
|
user := &User{}
|
|
test.IsEqualBool(t, user.HasPermissionEditOtherUploads(), false)
|
|
user.GrantPermission(UserPermEditOtherUploads)
|
|
test.IsEqualBool(t, user.HasPermissionEditOtherUploads(), true)
|
|
}
|
|
|
|
func TestUser_HasPermissionDeleteOtherUploads(t *testing.T) {
|
|
user := &User{}
|
|
test.IsEqualBool(t, user.HasPermissionDeleteOtherUploads(), false)
|
|
user.GrantPermission(UserPermDeleteOtherUploads)
|
|
test.IsEqualBool(t, user.HasPermissionDeleteOtherUploads(), true)
|
|
}
|
|
|
|
func TestUser_HasPermissionReplaceOtherUploads(t *testing.T) {
|
|
user := &User{}
|
|
test.IsEqualBool(t, user.HasPermissionReplaceOtherUploads(), false)
|
|
user.GrantPermission(UserPermReplaceOtherUploads)
|
|
test.IsEqualBool(t, user.HasPermissionReplaceOtherUploads(), true)
|
|
}
|
|
func TestUser_HasPermissionManageLogs(t *testing.T) {
|
|
user := &User{}
|
|
test.IsEqualBool(t, user.HasPermissionManageLogs(), false)
|
|
user.GrantPermission(UserPermManageLogs)
|
|
test.IsEqualBool(t, user.HasPermissionManageLogs(), true)
|
|
}
|
|
|
|
func TestUser_HasPermissionManageApi(t *testing.T) {
|
|
user := &User{}
|
|
test.IsEqualBool(t, user.HasPermissionManageApi(), false)
|
|
user.GrantPermission(UserPermManageApiKeys)
|
|
test.IsEqualBool(t, user.HasPermissionManageApi(), true)
|
|
}
|
|
func TestUser_HasPermissionManageUsers(t *testing.T) {
|
|
user := &User{}
|
|
test.IsEqualBool(t, user.HasPermissionManageUsers(), false)
|
|
user.GrantPermission(UserPermManageUsers)
|
|
test.IsEqualBool(t, user.HasPermissionManageUsers(), true)
|
|
}
|
|
|
|
func TestUser_ToJson(t *testing.T) {
|
|
user := &User{
|
|
Id: 4,
|
|
Name: "Test User",
|
|
Permissions: UserPermissionAll,
|
|
UserLevel: UserLevelAdmin,
|
|
LastOnline: 1337,
|
|
Password: "1234",
|
|
ResetPassword: true,
|
|
}
|
|
test.IsEqualString(t, user.ToJson(), `{"id":4,"name":"Test User","permissions":255,"userLevel":1,"lastOnline":1337,"resetPassword":true}`)
|
|
}
|