diff options
| author | Kyren223 <Kyren223@proton.me> | 2025-01-25 16:30:50 +0200 |
|---|---|---|
| committer | Kyren223 <Kyren223@proton.me> | 2025-01-25 16:30:50 +0200 |
| commit | 02e55d769d89ac0847d42c792c72b115ce003715 (patch) | |
| tree | bfcf253ffd4e85be709f5605c2a2ecc1194a0eb5 | |
| parent | 0da7603a41c48c84324d32a1957de34533171c30 (diff) | |
Added a list of banned members server-side
| -rw-r--r-- | internal/data/members.sql.go | 52 | ||||
| -rw-r--r-- | internal/packet/packet.go | 1 | ||||
| -rw-r--r-- | internal/packet/types.go | 8 | ||||
| -rw-r--r-- | internal/server/api/api.go | 60 | ||||
| -rw-r--r-- | query/members.sql | 8 |
5 files changed, 122 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, + } +} diff --git a/query/members.sql b/query/members.sql index 3d20b01..9110759 100644 --- a/query/members.sql +++ b/query/members.sql @@ -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 = ?; |
