Fix: Ban/Unban
This commit is contained in:
parent
bac6cae764
commit
2194d1e3a3
18
auth/auth.go
18
auth/auth.go
|
@ -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 (
|
||||
|
|
31
auth/bans.go
31
auth/bans.go
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue