mirror of
https://github.com/chrislusf/seaweedfs
synced 2025-06-29 16:22:46 +02:00
* improve perfs & fix rclone & refactoring Signed-off-by: Mohamed Sekour <mohamed.sekour@exfo.com> * improve perfs on download + add seaweedfs all-in-one deployment Signed-off-by: Mohamed Sekour <mohamed.sekour@exfo.com> * use helper for topologySpreadConstraints and fix create home dir of sftp users Signed-off-by: Mohamed Sekour <mohamed.sekour@exfo.com> * fix helm lint Signed-off-by: Mohamed Sekour <mohamed.sekour@exfo.com> * add missing ctx param Signed-off-by: Mohamed Sekour <mohamed.sekour@exfo.com> --------- Signed-off-by: Mohamed Sekour <mohamed.sekour@exfo.com>
77 lines
2.3 KiB
Go
77 lines
2.3 KiB
Go
// Package user provides user management functionality for the SFTP server
|
|
package user
|
|
|
|
import (
|
|
"math/rand"
|
|
"path/filepath"
|
|
)
|
|
|
|
// User represents an SFTP user with authentication and permission details
|
|
type User struct {
|
|
Username string // Username for authentication
|
|
Password string // Plaintext password
|
|
PublicKeys []string // Authorized public keys
|
|
HomeDir string // User's home directory
|
|
Permissions map[string][]string // path -> permissions (read, write, list, etc.)
|
|
Uid uint32 // User ID for file ownership
|
|
Gid uint32 // Group ID for file ownership
|
|
}
|
|
|
|
// NewUser creates a new user with default settings
|
|
func NewUser(username string) *User {
|
|
// Generate a random UID/GID between 1000 and 60000
|
|
// This range is typically safe for regular users in most systems
|
|
// 0-999 are often reserved for system users
|
|
randomId := 1000 + rand.Intn(59000)
|
|
|
|
return &User{
|
|
Username: username,
|
|
Permissions: make(map[string][]string),
|
|
HomeDir: filepath.Join("/home", username),
|
|
Uid: uint32(randomId),
|
|
Gid: uint32(randomId),
|
|
}
|
|
}
|
|
|
|
// SetPassword sets a plaintext password for the user
|
|
func (u *User) SetPassword(password string) {
|
|
u.Password = password
|
|
}
|
|
|
|
// AddPublicKey adds a public key to the user
|
|
func (u *User) AddPublicKey(key string) {
|
|
// Check if key already exists
|
|
for _, existingKey := range u.PublicKeys {
|
|
if existingKey == key {
|
|
return
|
|
}
|
|
}
|
|
u.PublicKeys = append(u.PublicKeys, key)
|
|
}
|
|
|
|
// RemovePublicKey removes a public key from the user
|
|
func (u *User) RemovePublicKey(key string) bool {
|
|
for i, existingKey := range u.PublicKeys {
|
|
if existingKey == key {
|
|
// Remove the key by replacing it with the last element and truncating
|
|
u.PublicKeys[i] = u.PublicKeys[len(u.PublicKeys)-1]
|
|
u.PublicKeys = u.PublicKeys[:len(u.PublicKeys)-1]
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// SetPermission sets permissions for a specific path
|
|
func (u *User) SetPermission(path string, permissions []string) {
|
|
u.Permissions[path] = permissions
|
|
}
|
|
|
|
// RemovePermission removes permissions for a specific path
|
|
func (u *User) RemovePermission(path string) bool {
|
|
if _, exists := u.Permissions[path]; exists {
|
|
delete(u.Permissions, path)
|
|
return true
|
|
}
|
|
return false
|
|
}
|