summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-01-25 16:30:50 +0200
committerKyren223 <Kyren223@proton.me>2025-01-25 16:30:50 +0200
commit02e55d769d89ac0847d42c792c72b115ce003715 (patch)
treebfcf253ffd4e85be709f5605c2a2ecc1194a0eb5 /internal
parent0da7603a41c48c84324d32a1957de34533171c30 (diff)
Added a list of banned members server-side
Diffstat (limited to 'internal')
-rw-r--r--internal/data/members.sql.go52
-rw-r--r--internal/packet/packet.go1
-rw-r--r--internal/packet/types.go8
-rw-r--r--internal/server/api/api.go60
4 files changed, 114 insertions, 7 deletions
diff --git a/internal/data/members.sql.go b/internal/data/members.sql.go
index 29c0f58..98a6a1e 100644
--- a/internal/data/members.sql.go
+++ b/internal/data/members.sql.go
@@ -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 = ?
diff --git a/internal/packet/packet.go b/internal/packet/packet.go
index e629f32..1af2f86 100644
--- a/internal/packet/packet.go
+++ b/internal/packet/packet.go
@@ -73,6 +73,7 @@ const (
PacketRequestMessages
PacketMessagesInfo
+ PacketGetBannedMembers
PacketSetMember
PacketMembersInfo
diff --git a/internal/packet/types.go b/internal/packet/types.go
index 5dba38b..f8e164c 100644
--- a/internal/packet/types.go
+++ b/internal/packet/types.go
@@ -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
+}
diff --git a/internal/server/api/api.go b/internal/server/api/api.go
index 90794c0..1c18ea9 100644
--- a/internal/server/api/api.go
+++ b/internal/server/api/api.go
@@ -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,
+ }
+}