diff options
Diffstat (limited to 'internal')
| -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 |
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, + } +} |
