You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							77 lines
						
					
					
						
							2.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							77 lines
						
					
					
						
							2.3 KiB
						
					
					
				
								// 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
							 | 
						|
								}
							 |