summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--internal/client/ui/core/core.go8
-rw-r--r--internal/client/ui/core/networklist/networklist.go16
-rw-r--r--internal/data/members.sql.go8
-rw-r--r--internal/packet/types.go2
-rw-r--r--internal/server/api/api.go38
-rw-r--r--internal/server/api/helpers.go3
-rw-r--r--query/members.sql4
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 (