summaryrefslogtreecommitdiff
path: root/internal/server/api
diff options
context:
space:
mode:
authorKyren223 <Kyren223@proton.me>2025-01-22 17:23:18 +0200
committerKyren223 <Kyren223@proton.me>2025-01-22 17:23:18 +0200
commita6ea05146050a8b2ae5963d4ea96434dc3005f37 (patch)
tree09128a6f90a0aae8159e0575e11562409f525a1d /internal/server/api
parent645247f4ef489c9084a7d8d30db89b083287f0c6 (diff)
Added the ability to trust/untrust users
Diffstat (limited to 'internal/server/api')
-rw-r--r--internal/server/api/api.go97
1 files changed, 97 insertions, 0 deletions
diff --git a/internal/server/api/api.go b/internal/server/api/api.go
index bddc43d..2fa013a 100644
--- a/internal/server/api/api.go
+++ b/internal/server/api/api.go
@@ -1016,3 +1016,100 @@ func EditMessage(ctx context.Context, sess *session.Session, request *packet.Edi
assert.Never("unreachable")
return nil
}
+
+func TrustUser(ctx context.Context, sess *session.Session, request *packet.TrustUser) packet.Payload {
+ if sess.ID() == request.User {
+ return &packet.Error{Error: "you cannot trust yourself"}
+ }
+
+ queries := data.New(db)
+
+ user, err := queries.GetUserById(ctx, request.User)
+ if err == sql.ErrNoRows {
+ return &packet.Error{Error: "requested user doesn't exist"}
+ }
+ if err != nil {
+ log.Println("database error 0:", err)
+ return &ErrInternalError
+ }
+
+ if request.Trust {
+ publicKey, err := queries.GetTrustedPublicKey(ctx, data.GetTrustedPublicKeyParams{
+ TrustingUserID: sess.ID(),
+ TrustedUserID: user.ID,
+ })
+ if err == nil {
+ return &packet.TrustInfo{
+ Trusteds: []snowflake.ID{user.ID},
+ TrustedPublicKeys: []ed25519.PublicKey{publicKey},
+ RemovedTrusteds: nil,
+ }
+ }
+ if err != nil && err != sql.ErrNoRows {
+ log.Println("database error 1:", err)
+ return &ErrInternalError
+ }
+
+ err = queries.TrustUser(ctx, data.TrustUserParams{
+ TrustingUserID: sess.ID(),
+ TrustedUserID: user.ID,
+ TrustedPublicKey: user.PublicKey,
+ })
+ if err != nil && err != sql.ErrNoRows {
+ log.Println("database error 2:", err)
+ return &ErrInternalError
+ }
+
+ return &packet.TrustInfo{
+ Trusteds: []snowflake.ID{user.ID},
+ TrustedPublicKeys: []ed25519.PublicKey{user.PublicKey},
+ RemovedTrusteds: nil,
+ }
+ } else {
+ err = queries.UntrustUser(ctx, data.UntrustUserParams{
+ TrustingUserID: sess.ID(),
+ TrustedUserID: user.ID,
+ })
+ if err == sql.ErrNoRows {
+ return &packet.TrustInfo{
+ Trusteds: nil,
+ TrustedPublicKeys: nil,
+ RemovedTrusteds: []snowflake.ID{user.ID},
+ }
+ }
+ if err != nil {
+ log.Println("database error 3:", err)
+ return &ErrInternalError
+ }
+
+ return &packet.TrustInfo{
+ Trusteds: nil,
+ TrustedPublicKeys: nil,
+ RemovedTrusteds: []snowflake.ID{user.ID},
+ }
+ }
+}
+
+func GetUserTrusteds(ctx context.Context, sess *session.Session) packet.Payload {
+ queries := data.New(db)
+
+ trustedRows, err := queries.GetUserTrusteds(ctx, sess.ID())
+ if err != nil && err != sql.ErrNoRows {
+ log.Println("database error 0:", err)
+ return &ErrInternalError
+ }
+
+ trusteds := make([]snowflake.ID, 0, len(trustedRows))
+ trustedPublicKeys := make([]ed25519.PublicKey, 0, len(trustedRows))
+
+ for _, row := range trustedRows {
+ trusteds = append(trusteds, row.TrustedUserID)
+ trustedPublicKeys = append(trustedPublicKeys, row.TrustedPublicKey)
+ }
+
+ return &packet.TrustInfo{
+ Trusteds: trusteds,
+ TrustedPublicKeys: trustedPublicKeys,
+ RemovedTrusteds: nil,
+ }
+}