irc working

This commit is contained in:
2026-03-11 20:08:33 +01:00
parent 58fc553f04
commit afdc3f96a0
4 changed files with 47 additions and 32 deletions
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -27,7 +27,7 @@ func main() {
log.Printf("received: %v\n", msg) log.Printf("received: %v\n", msg)
authConnOrNil := getConnectionDataIfAuth(conn) authConnOrNil := getConnectionDataIfAuth(conn)
if authConnOrNil == nil { if authConnOrNil == nil {
handleUnauthenticatedMessage(ctx, conn, msg) handleUnauthenticatedMessage(conn, msg)
} else { } else {
handleAuthenticatedMessage(conn, msg) handleAuthenticatedMessage(conn, msg)
} }
+26 -7
View File
@@ -12,32 +12,51 @@ import (
var secretKey = []byte("replace-with-env-variable") var secretKey = []byte("replace-with-env-variable")
type UserClaims struct {
Name string `json:"name"`
Color string `json:"color"`
jwt.RegisteredClaims
}
func GetToken(user *User) (string, error) { func GetToken(user *User) (string, error) {
token := jwt.NewWithClaims(jwt.SigningMethodHS256, token := jwt.NewWithClaims(jwt.SigningMethodHS256,
jwt.RegisteredClaims{ UserClaims{
Name: user.Name,
Color: user.Color,
RegisteredClaims: jwt.RegisteredClaims{
Subject: strconv.Itoa(int(user.Id)), Subject: strconv.Itoa(int(user.Id)),
ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour)), ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Hour)),
IssuedAt: jwt.NewNumericDate(time.Now()), IssuedAt: jwt.NewNumericDate(time.Now()),
}, },
},
) )
return token.SignedString(secretKey) return token.SignedString(secretKey)
} }
func GetSubject(tokenString string) (string, error) { func GetUserFromToken(tokenString string) (User, error) {
token, err := jwt.ParseWithClaims(tokenString, &jwt.RegisteredClaims{}, func(t *jwt.Token) (interface{}, error) { token, err := jwt.ParseWithClaims(tokenString, &UserClaims{}, func(t *jwt.Token) (interface{}, error) {
if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok { if _, ok := t.Method.(*jwt.SigningMethodHMAC); !ok {
return nil, fmt.Errorf("unexpected signing method: %v", t.Header["alg"]) return nil, fmt.Errorf("unexpected signing method: %v", t.Header["alg"])
} }
return secretKey, nil return secretKey, nil
}) })
if err != nil { if err != nil {
return "", err return User{}, err
} }
claims, ok := token.Claims.(*jwt.RegisteredClaims) claims, ok := token.Claims.(*UserClaims)
if !ok || !token.Valid { if !ok || !token.Valid {
return "", errors.New("invalid token") return User{}, errors.New("invalid token")
} }
return claims.Subject, nil id, err := strconv.ParseUint(claims.Subject, 10, 32)
if err != nil {
return User{}, fmt.Errorf("invalid subject: %w", err)
}
return User{
Id: uint32(id),
Name: claims.Name,
Color: claims.Color,
}, nil
} }
+14 -18
View File
@@ -4,7 +4,6 @@ import (
"context" "context"
"log" "log"
"net/http" "net/http"
"strconv"
"sync" "sync"
"time" "time"
@@ -112,30 +111,19 @@ func sendToAllExceptAndCloseIfFails(conn *websocket.Conn, message map[string]any
} }
} }
func handleUnauthenticatedMessage(ctx context.Context, conn *websocket.Conn, msg map[string]any) { func handleUnauthenticatedMessage(conn *websocket.Conn, msg map[string]any) {
token := msg["token"].(string) token := msg["token"].(string)
subject, err := GetSubject(token) user, err := GetUserFromToken(token)
if err != nil { if err != nil {
log.Println("invalid or expired token:", err) log.Println("invalid or expired token:", err)
conn.Close(websocket.StatusPolicyViolation, "invalid token") err := conn.Close(websocket.StatusPolicyViolation, "invalid token")
if err != nil {
return return
} }
var subjectId uint32
parsed, err := strconv.ParseUint(subject, 10, 32)
subjectId = uint32(parsed)
if err != nil {
conn.Close(websocket.StatusPolicyViolation, "invalid token")
return
}
user, err := GetUserDataById(ctx, subjectId)
if err != nil {
conn.Close(websocket.StatusPolicyViolation, "invalid token")
return return
} }
mu.Lock() mu.Lock()
authenticatedConnections = append(authenticatedConnections, AuthConnection{connection: conn, user: *user}) authenticatedConnections = append(authenticatedConnections, AuthConnection{connection: conn, user: user})
mu.Unlock() mu.Unlock()
sendAndCloseIfFails(conn, map[string]any{ sendAndCloseIfFails(conn, map[string]any{
"authAs": user.Name, "authAs": user.Name,
@@ -151,8 +139,16 @@ func handleAuthenticatedMessage(conn *websocket.Conn, msg map[string]any) {
return return
} }
auth := getConnectionDataIfAuth(conn)
if auth == nil {
sendAndCloseIfFails(conn, map[string]any{
"error": "no auth",
})
return
}
sendToAllExceptAndCloseIfFails(conn, map[string]any{ sendToAllExceptAndCloseIfFails(conn, map[string]any{
"username": , "username": auth.user.Name,
"message": message, "message": message,
}) })
} }