- transfers: map[int]map[[4]byte]*FileTransfer{
- FileDownload: {},
- FileUpload: {},
- FolderDownload: {},
- FolderUpload: {},
- bannerDownload: {},
- },
- }
-
- s.nextClientID.Add(1)
-
- binary.BigEndian.PutUint16(clientConn.ID[:], uint16(s.nextClientID.Load()))
- s.Clients[clientConn.ID] = clientConn
-
- return clientConn
-}
-
-// NewUser creates a new user account entry in the server map and config file
-func (s *Server) NewUser(login, name, password string, access accessBitmap) error {
- s.mux.Lock()
- defer s.mux.Unlock()
-
- account := NewAccount(login, name, password, access)
-
- // Create account file, returning an error if one already exists.
- file, err := os.OpenFile(
- filepath.Join(s.ConfigDir, "Users", path.Join("/", login)+".yaml"),
- os.O_CREATE|os.O_EXCL|os.O_WRONLY, 0644,
- )
- if err != nil {
- return fmt.Errorf("error creating account file: %w", err)
- }
- defer file.Close()
-
- b, err := yaml.Marshal(account)
- if err != nil {
- return err
- }
-
- _, err = file.Write(b)
- if err != nil {
- return fmt.Errorf("error writing account file: %w", err)
- }
-
- s.Accounts[login] = account
-
- return nil
-}
-
-func (s *Server) UpdateUser(login, newLogin, name, password string, access accessBitmap) error {
- s.mux.Lock()
- defer s.mux.Unlock()
-
- // If the login has changed, rename the account file.
- if login != newLogin {
- err := os.Rename(
- filepath.Join(s.ConfigDir, "Users", path.Join("/", login)+".yaml"),
- filepath.Join(s.ConfigDir, "Users", path.Join("/", newLogin)+".yaml"),
- )
- if err != nil {
- return fmt.Errorf("error renaming account file: %w", err)
- }
- s.Accounts[newLogin] = s.Accounts[login]
- s.Accounts[newLogin].Login = newLogin
- delete(s.Accounts, login)
- }
-
- account := s.Accounts[newLogin]
- account.Access = access
- account.Name = name
- account.Password = password
-
- out, err := yaml.Marshal(&account)
- if err != nil {
- return err
- }
-
- if err := os.WriteFile(filepath.Join(s.ConfigDir, "Users", newLogin+".yaml"), out, 0666); err != nil {
- return fmt.Errorf("error writing account file: %w", err)
- }
-
- return nil
-}
-
-// DeleteUser deletes the user account
-func (s *Server) DeleteUser(login string) error {
- s.mux.Lock()
- defer s.mux.Unlock()
-
- err := s.FS.Remove(filepath.Join(s.ConfigDir, "Users", path.Join("/", login)+".yaml"))
- if err != nil {
- return err
- }
-
- delete(s.Accounts, login)
-
- return nil
-}
-
-func (s *Server) connectedUsers() []Field {
- //s.mux.Lock()
- //defer s.mux.Unlock()
-
- var connectedUsers []Field
- for _, c := range sortedClients(s.Clients) {
- b, err := io.ReadAll(&User{
- ID: c.ID,
- Icon: c.Icon,
- Flags: c.Flags[:],
- Name: string(c.UserName),
- })
- if err != nil {
- return nil
- }
- connectedUsers = append(connectedUsers, NewField(FieldUsernameWithInfo, b))
- }
- return connectedUsers
-}
-
-// loadFromYAMLFile loads data from a YAML file into the provided data structure.
-func loadFromYAMLFile(path string, data interface{}) error {
- fh, err := os.Open(path)
- if err != nil {
- return err
- }
- defer fh.Close()
-
- decoder := yaml.NewDecoder(fh)
- return decoder.Decode(data)
-}
-
-// loadAccounts loads account data from disk
-func (s *Server) loadAccounts(userDir string) error {
- matches, err := filepath.Glob(filepath.Join(userDir, "*.yaml"))
- if err != nil {
- return err
- }