Added a list of banned members server-side

This commit is contained in:
2025-01-25 16:30:50 +02:00
parent 0da7603a41
commit 02e55d769d
5 changed files with 122 additions and 7 deletions

View File

@@ -56,6 +56,58 @@ func (q *Queries) FilterUsersInNetwork(ctx context.Context, arg FilterUsersInNet
return items, nil
}
const getBannedMembers = `-- name: GetBannedMembers :many
SELECT
users.id, users.name, users.public_key, users.description, users.is_public_dm, users.is_deleted,
members.user_id, members.network_id, members.joined_at, members.is_member, members.is_admin, members.is_muted, members.is_banned, members.ban_reason
FROM members
JOIN users ON users.id = members.user_id
WHERE network_id = ? AND is_banned = true
`
type GetBannedMembersRow struct {
User User
Member Member
}
func (q *Queries) GetBannedMembers(ctx context.Context, networkID snowflake.ID) ([]GetBannedMembersRow, error) {
rows, err := q.db.QueryContext(ctx, getBannedMembers, networkID)
if err != nil {
return nil, err
}
defer rows.Close()
var items []GetBannedMembersRow
for rows.Next() {
var i GetBannedMembersRow
if err := rows.Scan(
&i.User.ID,
&i.User.Name,
&i.User.PublicKey,
&i.User.Description,
&i.User.IsPublicDM,
&i.User.IsDeleted,
&i.Member.UserID,
&i.Member.NetworkID,
&i.Member.JoinedAt,
&i.Member.IsMember,
&i.Member.IsAdmin,
&i.Member.IsMuted,
&i.Member.IsBanned,
&i.Member.BanReason,
); err != nil {
return nil, err
}
items = append(items, i)
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}
const getMemberById = `-- name: GetMemberById :one
SELECT user_id, network_id, joined_at, is_member, is_admin, is_muted, is_banned, ban_reason FROM members
WHERE network_id = ? AND user_id = ?

View File

@@ -73,6 +73,7 @@ const (
PacketRequestMessages
PacketMessagesInfo
PacketGetBannedMembers
PacketSetMember
PacketMembersInfo

View File

@@ -224,3 +224,11 @@ type TrustInfo struct {
func (m *TrustInfo) Type() PacketType {
return PacketTrustInfo
}
type GetBannedMembers struct {
Network snowflake.ID
}
func (m *GetBannedMembers) Type() PacketType {
return PacketGetBannedMembers
}

View File

@@ -21,6 +21,8 @@ var (
ErrInternalError = packet.Error{Error: "internal server error"}
ErrPermissionDenied = packet.Error{Error: "permission denied"}
ErrNotImplemented = packet.Error{Error: "not implemented yet"}
DefaultBanReason = ""
)
func SendMessage(ctx context.Context, sess *session.Session, request *packet.SendMessage) packet.Payload {
@@ -567,10 +569,10 @@ func SetMember(ctx context.Context, sess *session.Session, request *packet.SetMe
isMember := member.IsMember
isAdmin := member.IsAdmin
isMuted := member.IsMuted
IsBanned := member.IsBanned
isBanned := member.IsBanned
banReason := member.BanReason
if request.Member != nil && !IsBanned {
if request.Member != nil && !isBanned {
isLeave := !*request.Member && request.User == sess.ID()
isKick := !*request.Member && isSessAdmin && (!isAdmin || isSessOwner)
if request.User != network.OwnerID && (isLeave || isKick) {
@@ -593,11 +595,16 @@ func SetMember(ctx context.Context, sess *session.Session, request *packet.SetMe
} else if request.Banned != nil {
notSelf := request.User != sess.ID()
if isSessAdmin && notSelf && (!isAdmin || isSessOwner) {
IsBanned = *request.Banned
banReason = request.BanReason
isAdmin = false // Important for security
if IsBanned {
isBanned = *request.Banned
if isBanned {
isMember = false // kick if user got banned
banReason = request.BanReason
isAdmin = false // Important for security
if banReason == nil {
banReason = &DefaultBanReason
}
} else {
banReason = nil
}
}
}
@@ -608,7 +615,7 @@ func SetMember(ctx context.Context, sess *session.Session, request *packet.SetMe
IsMember: isMember,
IsAdmin: isAdmin,
IsMuted: isMuted,
IsBanned: IsBanned,
IsBanned: isBanned,
BanReason: banReason,
})
if err != nil {
@@ -1116,3 +1123,42 @@ func GetUserTrusteds(ctx context.Context, sess *session.Session) packet.Payload
RemovedTrusteds: nil,
}
}
func GetBannedMembers(ctx context.Context, sess *session.Session, request *packet.GetBannedMembers) packet.Payload {
queries := data.New(db)
member, err := queries.GetMemberById(ctx, data.GetMemberByIdParams{
NetworkID: request.Network,
UserID: sess.ID(),
})
if err == sql.ErrNoRows {
return &packet.Error{Error: "network doesn't exist"}
}
if err != nil {
log.Println("database error 0:", err)
return &ErrInternalError
}
if !member.IsAdmin {
return &ErrPermissionDenied
}
bannedMembersRow, err := queries.GetBannedMembers(ctx, request.Network)
if err != nil {
log.Println("database error 1:", err)
return &ErrInternalError
}
members := make([]data.Member, 0, len(bannedMembersRow))
users := make([]data.User, 0, len(bannedMembersRow))
for _, memberAndUser := range bannedMembersRow {
members = append(members, memberAndUser.Member)
users = append(users, memberAndUser.User)
}
return &packet.MembersInfo{
RemovedMembers: nil,
Members: members,
Users: users,
Network: request.Network,
}
}

View File

@@ -6,6 +6,14 @@ FROM members
JOIN users ON users.id = members.user_id
WHERE network_id = ? AND is_member = true;
-- name: GetBannedMembers :many
SELECT
sqlc.embed(users),
sqlc.embed(members)
FROM members
JOIN users ON users.id = members.user_id
WHERE network_id = ? AND is_banned = true;
-- name: GetMemberById :one
SELECT * FROM members
WHERE network_id = ? AND user_id = ?;