diff options
| -rw-r--r-- | internal/client/ui/core/core.go | 8 | ||||
| -rw-r--r-- | internal/client/ui/core/networklist/networklist.go | 16 | ||||
| -rw-r--r-- | internal/data/members.sql.go | 8 | ||||
| -rw-r--r-- | internal/packet/types.go | 2 | ||||
| -rw-r--r-- | internal/server/api/api.go | 38 | ||||
| -rw-r--r-- | internal/server/api/helpers.go | 3 | ||||
| -rw-r--r-- | query/members.sql | 4 |
7 files changed, 54 insertions, 25 deletions
diff --git a/internal/client/ui/core/core.go b/internal/client/ui/core/core.go index 16ad7cd..bd6dab2 100644 --- a/internal/client/ui/core/core.go +++ b/internal/client/ui/core/core.go @@ -185,9 +185,17 @@ func (m *Model) updateConnected(msg tea.Msg) tea.Cmd { case *packet.NetworksInfo: state.UpdateNetworks(msg) + networkId := state.NetworkId(m.networkList.Index()) + if networkId == nil && m.networkList.Index() != networklist.PeersIndex { + m.networkList.SetIndex(m.networkList.Index() - 1) + m.frequencyList.SetNetworkIndex(m.networkList.Index()) + } case *packet.MembersInfo: state.UpdateMembers(msg) + log.Println("updated members") + log.Println(state.State.Members) + log.Println(state.State.Users) case *packet.FrequenciesInfo: state.UpdateFrequencies(msg) diff --git a/internal/client/ui/core/networklist/networklist.go b/internal/client/ui/core/networklist/networklist.go index ac1460c..00d5d12 100644 --- a/internal/client/ui/core/networklist/networklist.go +++ b/internal/client/ui/core/networklist/networklist.go @@ -129,12 +129,6 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { if state.State.UserID == nil || m.index == PeersIndex { return m, nil } - - // Set back to peers icon bcz that's always valid - // Where if u were on the network u just left - // it'd be an issue (or if u left all networks) - m.index = PeersIndex - no := false return m, gateway.Send(&packet.SetMember{ Member: &no, @@ -150,12 +144,6 @@ func (m Model) Update(msg tea.Msg) (Model, tea.Cmd) { if state.State.UserID == nil || m.index == PeersIndex { return m, nil } - - // Set back to peers icon bcz that's always valid - // Where if u were on the network u just left - // it'd be an issue (or if u left all networks) - m.index = PeersIndex - return m, gateway.Send(&packet.DeleteNetwork{ Network: *state.NetworkId(m.index), }) @@ -186,3 +174,7 @@ func (m Model) Swap(dir int) (Model, tea.Cmd) { func (m Model) Index() int { return m.index } + +func (m *Model) SetIndex(index int) { + m.index = index +} diff --git a/internal/data/members.sql.go b/internal/data/members.sql.go index 8d90512..29c0f58 100644 --- a/internal/data/members.sql.go +++ b/internal/data/members.sql.go @@ -134,14 +134,14 @@ func (q *Queries) GetNetworkMembers(ctx context.Context, networkID snowflake.ID) return items, nil } -const getNetworksOfUser = `-- name: GetNetworksOfUser :many +const getUserNetworks = `-- name: GetUserNetworks :many SELECT networks.id, networks.owner_id, networks.name, networks.icon, networks.bg_hex_color, networks.fg_hex_color, networks.is_public FROM networks JOIN members ON networks.id = members.network_id -WHERE members.user_id = ? +WHERE members.user_id = ? AND members.is_member = true ` -func (q *Queries) GetNetworksOfUser(ctx context.Context, userID snowflake.ID) ([]Network, error) { - rows, err := q.db.QueryContext(ctx, getNetworksOfUser, userID) +func (q *Queries) GetUserNetworks(ctx context.Context, userID snowflake.ID) ([]Network, error) { + rows, err := q.db.QueryContext(ctx, getUserNetworks, userID) if err != nil { return nil, err } diff --git a/internal/packet/types.go b/internal/packet/types.go index 6bb8856..93de24a 100644 --- a/internal/packet/types.go +++ b/internal/packet/types.go @@ -185,7 +185,7 @@ type MembersInfo struct { } func (m *MembersInfo) Type() PacketType { - return PacketMessagesInfo + return PacketMembersInfo } type SetUserData struct { diff --git a/internal/server/api/api.go b/internal/server/api/api.go index ef04347..fffb2cd 100644 --- a/internal/server/api/api.go +++ b/internal/server/api/api.go @@ -50,13 +50,23 @@ func SendMessage(ctx context.Context, sess *session.Session, request *packet.Sen return &ErrInternalError } - isAdmin, err := IsNetworkAdmin(ctx, queries, sess.ID(), frequency.NetworkID) + member, err := queries.GetMemberById(ctx, data.GetMemberByIdParams{ + NetworkID: frequency.NetworkID, + UserID: sess.ID(), + }) + if err == sql.ErrNoRows { + return &ErrPermissionDenied // Not a member + } if err != nil { log.Println("database error 1:", err) return &ErrInternalError } + if !member.IsMember { + return &ErrPermissionDenied + } - if frequency.Perms != packet.PermReadWrite && !isAdmin { + if frequency.Perms != packet.PermReadWrite && !member.IsAdmin { + log.Println("No perms") return &ErrPermissionDenied } @@ -99,13 +109,23 @@ func RequestMessages(ctx context.Context, sess *session.Session, request *packet return &ErrInternalError } - isAdmin, err := IsNetworkAdmin(ctx, queries, sess.ID(), frequency.NetworkID) + member, err := queries.GetMemberById(ctx, data.GetMemberByIdParams{ + NetworkID: frequency.NetworkID, + UserID: sess.ID(), + }) + if err == sql.ErrNoRows { + return &ErrPermissionDenied // Not a member + } if err != nil { log.Println("database error 1:", err) return &ErrInternalError } + if !member.IsMember { + return &ErrPermissionDenied + } - if frequency.Perms == packet.PermNoAccess && !isAdmin { + if frequency.Perms == packet.PermNoAccess && !member.IsMember { + log.Println("No perms") return &ErrPermissionDenied } @@ -247,7 +267,7 @@ func GetNetworksInfo(ctx context.Context, sess *session.Session) (packet.Payload queries := data.New(db) qtx := queries.WithTx(tx) - networks, err := qtx.GetNetworksOfUser(ctx, sess.ID()) + networks, err := qtx.GetUserNetworks(ctx, sess.ID()) if err != nil { return nil, err } @@ -574,12 +594,17 @@ func SetMember(ctx context.Context, sess *session.Session, request *packet.SetMe } if !newMember.IsMember { - return NetworkPropagate(ctx, sess, request.Network, &packet.MembersInfo{ + NetworkPropagate(ctx, sess, request.Network, &packet.MembersInfo{ RemovedMembers: []snowflake.ID{newMember.UserID}, Members: nil, Users: nil, Network: request.Network, }) + + return &packet.NetworksInfo{ + Networks: nil, + RemovedNetworks: []snowflake.ID{request.Network}, + } } user, err := queries.GetUserById(ctx, newMember.UserID) @@ -594,6 +619,7 @@ func SetMember(ctx context.Context, sess *session.Session, request *packet.SetMe Users: []data.User{user}, Network: request.Network, }) + log.Println("propagated member") // Joined if !member.IsMember && newMember.IsMember { diff --git a/internal/server/api/helpers.go b/internal/server/api/helpers.go index f98e2ad..a886199 100644 --- a/internal/server/api/helpers.go +++ b/internal/server/api/helpers.go @@ -81,6 +81,9 @@ func NetworkPropagate( pkt := packet.NewPacket(packet.NewMsgPackEncoder(payload)) if ok := session.Write(context, pkt); !ok { log.Println(sess.Addr(), "propagation to", session.Addr(), "failed") + } else { + log.Println(session.Addr(), "sent: ", pkt.String()) + log.Println(sess.Addr(), "propagation to", session.Addr(), "succeeded") } }() } diff --git a/query/members.sql b/query/members.sql index 65d3600..3d20b01 100644 --- a/query/members.sql +++ b/query/members.sql @@ -10,10 +10,10 @@ WHERE network_id = ? AND is_member = true; SELECT * FROM members WHERE network_id = ? AND user_id = ?; --- name: GetNetworksOfUser :many +-- name: GetUserNetworks :many SELECT networks.* FROM networks JOIN members ON networks.id = members.network_id -WHERE members.user_id = ?; +WHERE members.user_id = ? AND members.is_member = true; -- name: SetMember :one INSERT INTO members ( |
