this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

at main 87 lines 2.7 kB view raw
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}