From eeab9c8d331a4227f3997a12a8da08cad2c54814 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 19 Feb 2024 14:22:39 +0100 Subject: [PATCH] Add list of registered clients References: https://todo.sr.ht/~emersion/sinwon/15 --- db.go | 37 ++++++++++++++++++++++++++++++++++++- entity.go | 5 +++++ template/index.html | 35 ++++++++++++++++++++++++++++++++++- user.go | 20 ++++++++++++++------ diff --git a/db.go b/db.go index 6d7e2a447703f9c83719f9bbb6bf4971e6a735f1..29f264d1090ce57cb3c3abfe380b342756db216d 100644 --- a/db.go +++ b/db.go @@ -7,7 +7,7 @@ _ "embed" "fmt" "time" - _ "github.com/mattn/go-sqlite3" + "github.com/mattn/go-sqlite3" ) //go:embed schema.sql @@ -159,6 +159,41 @@ if err := scan(&client, rows); err != nil { return nil, err } l = append(l, client) + } + + return l, rows.Close() +} + +func (db *DB) ListAuthorizedClients(ctx context.Context, user ID[*User]) ([]AuthorizedClient, error) { + rows, err := db.db.QueryContext(ctx, ` + SELECT client_id, client_name, client_uri, token.expires_at + FROM Client, + ( + SELECT client, MAX(expires_at) as expires_at + FROM AccessToken + WHERE user = ? + GROUP BY client + ) AS token + WHERE Client.id = token.client + `, user) + if err != nil { + return nil, err + } + + var l []AuthorizedClient + for rows.Next() { + var authClient AuthorizedClient + columns := authClient.Client.columns() + var expiresAt string + err := rows.Scan(columns["client_id"], columns["client_name"], columns["client_uri"], &expiresAt) + if err != nil { + return nil, err + } + authClient.ExpiresAt, err = time.Parse(sqlite3.SQLiteTimestampFormats[0], expiresAt) + if err != nil { + return nil, err + } + l = append(l, authClient) } return l, rows.Close() diff --git a/entity.go b/entity.go index 4955fd6871a769d279a9ef0a1a1b223d18551a76..84ac2b723a74ce0ebbbfb6182cd6bac5f04136bd 100644 --- a/entity.go +++ b/entity.go @@ -226,6 +226,11 @@ func (token *AccessToken) VerifySecret(secret string) bool { return verifyHash(token.Hash, secret) && verifyExpiration(token.ExpiresAt) } +type AuthorizedClient struct { + Client Client + ExpiresAt time.Time +} + type AuthCode struct { ID ID[*AuthCode] Hash []byte diff --git a/template/index.html b/template/index.html index d4c6d5daaa6f05a35fe0b850f68270cc6b2a308b..0e2a7845706d40048386a4dd3f65dff87f41f583 100644 --- a/template/index.html +++ b/template/index.html @@ -11,8 +11,41 @@ +

Authorized clients

+ +{{ with .AuthorizedClients }} + + + + + + {{ range . }} + + + + + {{ end }} +
ClientAuthorized until
+ {{ with .Client }} + {{ if .ClientURI }} + + {{ end }} + {{ if .ClientName }} + {{ .ClientName }} + {{ else }} + {{ .ClientID }} + {{ end }} + {{ if .ClientURI }} + + {{ end }} + {{ end }} + {{ .ExpiresAt }}
+{{ else }} +

No client authorized yet.

+{{ end }} + {{ if .Me.Admin }} -

Clients

+

Registered clients

{{ with .Clients }}

diff --git a/user.go b/user.go index e59dac355f0bb2fbd2fb75edae8c8c55bfae6616..509955bc2ef9bccf6eee1b88a54fe8a1a0a8599b 100644 --- a/user.go +++ b/user.go @@ -26,6 +26,12 @@ httpError(w, err) return } + authorizedClients, err := db.ListAuthorizedClients(ctx, loginToken.User) + if err != nil { + httpError(w, err) + return + } + clients, err := db.ListClients(ctx, loginToken.User) if err != nil { httpError(w, err) @@ -42,13 +48,15 @@ } } data := struct { - Me *User - Clients []Client - Users []User + Me *User + AuthorizedClients []AuthorizedClient + Clients []Client + Users []User }{ - Me: me, - Clients: clients, - Users: users, + Me: me, + AuthorizedClients: authorizedClients, + Clients: clients, + Users: users, } if err := tpl.ExecuteTemplate(w, "index.html", &data); err != nil { panic(err) -- 2.48.1