this repo has no description
1package store
2
3import (
4 "database/sql"
5 "errors"
6 "fmt"
7 "log/slog"
8)
9
10var ErrOauthRequestAlreadyExists = errors.New("oauth request already exists")
11
12func createOauthRequestsTable(db *sql.DB) error {
13 createOauthRequestsTableSQL := `CREATE TABLE IF NOT EXISTS oauthrequests (
14 "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
15 "authserverIss" TEXT,
16 "state" TEXT,
17 "did" TEXT,
18 "pkceVerifier" TEXT,
19 "dpopAuthserverNonce" TEXT,
20 "dpopPrivateJwk" TEXT,
21 UNIQUE(did,state)
22 );`
23
24 slog.Info("Create oauthrequests table...")
25 statement, err := db.Prepare(createOauthRequestsTableSQL)
26 if err != nil {
27 return fmt.Errorf("prepare DB statement to create oauthrequests table: %w", err)
28 }
29 _, err = statement.Exec()
30 if err != nil {
31 return fmt.Errorf("exec sql statement to create oauthrequests table: %w", err)
32 }
33 slog.Info("oauthrequests table created")
34
35 return nil
36}
37
38type OauthRequest struct {
39 ID uint
40 AuthserverIss string
41 State string
42 Did string
43 PkceVerifier string
44 DpopAuthserverNonce string
45 DpopPrivateJwk string
46}
47
48func (s *Store) CreateOauthRequest(request OauthRequest) error {
49 sql := `INSERT INTO oauthrequests (authserverIss, state, did, pkceVerifier, dpopAuthServerNonce, dpopPrivateJwk) VALUES (?, ?, ?, ?, ?, ?) ON CONFLICT(did,state) DO NOTHING;`
50 res, err := s.db.Exec(sql, request.AuthserverIss, request.State, request.Did, request.PkceVerifier, request.DpopAuthserverNonce, request.DpopPrivateJwk)
51 if err != nil {
52 return fmt.Errorf("exec insert oauth request: %w", err)
53 }
54
55 if x, _ := res.RowsAffected(); x == 0 {
56 return ErrOauthRequestAlreadyExists
57 }
58 return nil
59}
60
61func (s *Store) GetOauthRequest(state string) (OauthRequest, error) {
62 var oauthRequest OauthRequest
63 sql := "SELECT authserverIss, state, did, pkceVerifier, dpopAuthServerNonce, dpopPrivateJwk FROM oauthrequests WHERE state = ?;"
64 rows, err := s.db.Query(sql, state)
65 if err != nil {
66 return oauthRequest, fmt.Errorf("run query to get oauth request: %w", err)
67 }
68 defer rows.Close()
69
70 for rows.Next() {
71 if err := rows.Scan(&oauthRequest.AuthserverIss, &oauthRequest.State, &oauthRequest.Did, &oauthRequest.PkceVerifier, &oauthRequest.DpopAuthserverNonce, &oauthRequest.DpopPrivateJwk); err != nil {
72 return oauthRequest, fmt.Errorf("scan row: %w", err)
73 }
74
75 return oauthRequest, nil
76 }
77 return oauthRequest, fmt.Errorf("not found")
78}
79
80func (s *Store) DeleteOauthRequest(state string) error {
81 sql := "DELETE FROM oauthrequests WHERE state = ?;"
82 _, err := s.db.Exec(sql, state)
83 if err != nil {
84 return fmt.Errorf("exec delete oauth request: %w", err)
85 }
86 return nil
87}