Fix: Ban/Unban

This commit is contained in:
kayos@tcp.direct 2021-09-29 08:23:10 -07:00
parent bac6cae764
commit 2194d1e3a3
3 changed files with 29 additions and 27 deletions

View File

@ -142,7 +142,11 @@ func (users *UserDB) AssignPublicKeyToUser(user *RegisteredUser, key ssh.PublicK
users.mu.Lock()
defer users.mu.Unlock()
user.PublicKey = key.Marshal()
return users.Sync(user)
userJSON, err := json.Marshal(user)
if err != nil {
return err
}
return users.DB.Put(uint32ToBytes(user.ID), userJSON)
}
// Delete removes a user from our database.
@ -203,18 +207,6 @@ func (users *UserDB) UserExists(user string) bool {
return err == nil
}
// Sync synchronizes the in-memory admin map into our bitcask database.
func (users *UserDB) Sync(user *RegisteredUser) error {
newuser, err := json.Marshal(user)
if err != nil {
return err
}
buf := make([]byte, 4)
binary.LittleEndian.PutUint32(buf, user.ID)
return users.DB.Put(buf, newuser)
}
// GetUser iterates through all RegisteredUser instances in the database and returns a pointer to the one that matches the requested username.
func (users *UserDB) GetUser(targetUser string) (*RegisteredUser, error) {
var (

View File

@ -39,12 +39,13 @@ func init() {
func parseBanQuery(s string) (string, BanType, error) {
query := strings.TrimSpace(s)
request := strings.Split(query, "=")
bantype, err := StringToBanType(request[1])
bantype, err := StringToBanType(request[0])
if err != nil {
return "", 100, errors.New("unknown key")
log.Debug().Err(err).Str("caller", s).
Str("request[0]", request[0]).
Str("request[1]", request[1]).Msg("unknown key")
return "", 100, errors.New("unknown key")
}
return request[1], bantype, nil
}
@ -170,29 +171,38 @@ func (users *UserDB) CheckBans(user string, addr net.Addr, key ssh.PublicKey, s
}
// BanOther creates a ban on various types of client attributes, or unbans them if banunban is false.
func (users *UserDB) BanOther(target string, bantype BanType, banunban bool) error {
func (users *UserDB) BanOther(target string, bantype BanType, banUnban bool) error {
bans := uint32ToBytes(uint32(bantype))
bad := &BanList{Items: []string{}}
var contains = false
if users.DB.Has(bans) {
badBytes, err := users.DB.Get(bans)
banJSON, err := users.DB.Get(bans)
if err != nil {
return err
}
if err := json.Unmarshal(badBytes, &bad); err != nil {
if err := json.Unmarshal(banJSON, &bad); err != nil {
return err
}
for _, b := range bad.Items {
print(".")
if b == target {
return errors.New("already banned: " + target)
contains = true
}
}
}
if contains && banUnban {
return errors.New("item is already banned: " + target)
}
if !contains && !banUnban {
return errors.New("ban does not exist")
}
var newbans []string
if banunban {
if banUnban {
bad.Items = append(bad.Items, target)
} else {
for _, item := range bad.Items {
@ -200,9 +210,6 @@ func (users *UserDB) BanOther(target string, bantype BanType, banunban bool) err
newbans = append(bad.Items, item)
}
}
if len(bad.Items) == len(newbans) {
return errors.New("ban does not exist")
}
bad.Items = newbans
}
@ -285,7 +292,7 @@ func (users *UserDB) UnBan(username string) error {
if err != nil {
return err
}
if err := users.SetPrivLevel(user, LevelBanned); err != nil {
if err := users.SetPrivLevel(user, Chatter); err != nil {
return err
}
return nil

View File

@ -1,5 +1,7 @@
package auth
import "encoding/json"
// PrivLevel represents a user account's privilege level.
type PrivLevel uint32
@ -19,10 +21,11 @@ func (users *UserDB) SetPrivLevel(user *RegisteredUser, level PrivLevel) error {
users.mu.Lock()
defer users.mu.Unlock()
user.Privs = level
if err := users.Sync(user); err != nil {
userJSON, err := json.Marshal(user)
if err != nil {
return err
}
return nil
return users.DB.Put(uint32ToBytes(user.ID), userJSON)
}
// GetPrivs retrieves the privilege level of the given user