aboutsummaryrefslogtreecommitdiff
path: root/hotline
diff options
context:
space:
mode:
authorJeff Halter <868228+jhalter@users.noreply.github.com>2024-06-08 10:54:16 -0700
committerJeff Halter <868228+jhalter@users.noreply.github.com>2024-06-08 10:54:51 -0700
commitb8b0a6c9cb43d52aece4020163b612cfe87de898 (patch)
tree991da47db3a976686a29f510b1421c33067fd911 /hotline
parent5d87f76eeb76e4e67e5dabb2c835a640a7ab7652 (diff)
Add support for account login rename
Diffstat (limited to 'hotline')
-rw-r--r--hotline/server.go5
-rw-r--r--hotline/transaction_handlers.go38
2 files changed, 31 insertions, 12 deletions
diff --git a/hotline/server.go b/hotline/server.go
index a77e792..aca2221 100644
--- a/hotline/server.go
+++ b/hotline/server.go
@@ -447,11 +447,12 @@ func (s *Server) UpdateUser(login, newLogin, name, password string, access acces
// update renames the user login
if login != newLogin {
- err := os.Rename(filepath.Join(s.ConfigDir, "Users", login+".yaml"), filepath.Join(s.ConfigDir, "Users", newLogin+".yaml"))
+ 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 err
+ return fmt.Errorf("unable to rename account: %w", err)
}
s.Accounts[newLogin] = s.Accounts[login]
+ s.Accounts[newLogin].Login = newLogin
delete(s.Accounts, login)
}
diff --git a/hotline/transaction_handlers.go b/hotline/transaction_handlers.go
index d065122..d4269af 100644
--- a/hotline/transaction_handlers.go
+++ b/hotline/transaction_handlers.go
@@ -776,26 +776,44 @@ func HandleUpdateUser(cc *ClientConn, t *Transaction) (res []Transaction, err er
return res, err
}
+ // If there's only one subfield, that indicates this is a delete operation for the login in FieldData
if len(subFields) == 1 {
- login := decodeString(getField(FieldData, &subFields).Data)
- cc.logger.Infow("DeleteUser", "login", login)
-
if !cc.Authorize(accessDeleteUser) {
res = append(res, cc.NewErrReply(t, "You are not allowed to delete accounts."))
return res, err
}
+ login := decodeString(getField(FieldData, &subFields).Data)
+ cc.logger.Infow("DeleteUser", "login", login)
+
if err := cc.Server.DeleteUser(login); err != nil {
return res, err
}
continue
}
- login := decodeString(getField(FieldUserLogin, &subFields).Data)
+ // login of the account to update
+ var accountToUpdate, loginToRename string
+
+ // If FieldData is included, this is a rename operation where FieldData contains the login of the existing
+ // account and FieldUserLogin contains the new login.
+ if getField(FieldData, &subFields) != nil {
+ loginToRename = decodeString(getField(FieldData, &subFields).Data)
+ }
+ userLogin := decodeString(getField(FieldUserLogin, &subFields).Data)
+ if loginToRename != "" {
+ accountToUpdate = loginToRename
+ } else {
+ accountToUpdate = userLogin
+ }
- // check if the login dataFile; if so, we know we are updating an existing user
- if acc, ok := cc.Server.Accounts[login]; ok {
- cc.logger.Infow("UpdateUser", "login", login)
+ // Check if accountToUpdate has an existing account. If so, we know we are updating an existing user.
+ if acc, ok := cc.Server.Accounts[accountToUpdate]; ok {
+ if loginToRename != "" {
+ cc.logger.Infow("RenameUser", "prevLogin", accountToUpdate, "newLogin", userLogin)
+ } else {
+ cc.logger.Infow("UpdateUser", "login", accountToUpdate)
+ }
// account exists, so this is an update action
if !cc.Authorize(accessModifyUser) {
@@ -834,13 +852,13 @@ func HandleUpdateUser(cc *ClientConn, t *Transaction) (res []Transaction, err er
return res, err
}
} else {
- cc.logger.Infow("CreateUser", "login", login)
-
if !cc.Authorize(accessCreateUser) {
res = append(res, cc.NewErrReply(t, "You are not allowed to create new accounts."))
return res, nil
}
+ cc.logger.Infow("CreateUser", "login", userLogin)
+
newAccess := accessBitmap{}
copy(newAccess[:], getField(FieldUserAccess, &subFields).Data)
@@ -853,7 +871,7 @@ func HandleUpdateUser(cc *ClientConn, t *Transaction) (res []Transaction, err er
}
}
- err = cc.Server.NewUser(login, string(getField(FieldUserName, &subFields).Data), string(getField(FieldUserPassword, &subFields).Data), newAccess)
+ err = cc.Server.NewUser(userLogin, string(getField(FieldUserName, &subFields).Data), string(getField(FieldUserPassword, &subFields).Data), newAccess)
if err != nil {
return append(res, cc.NewErrReply(t, "Cannot create account because there is already an account with that login.")), nil
}