aboutsummaryrefslogtreecommitdiff
path: root/userapi/storage/postgres/openid_table.go
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2022-02-18 11:31:05 +0000
committerGitHub <noreply@github.com>2022-02-18 11:31:05 +0000
commit153bfbbea579dfa10e8e804036f17c1a33b6fe80 (patch)
treee135dcefc59618d7b86cd8687c1a2a304385ce45 /userapi/storage/postgres/openid_table.go
parent0a7dea44505f703af1e7e069602ca95aa5a83700 (diff)
Merge both user API databases into one (#2186)
* Merge user API databases into one * Remove DeviceDatabase from config * Fix tests * Try that again * Clean up keyserver device keys when the devices no longer exist in the user API * Tweak ordering * Fix UserExists flag, device check * Allow including empty entries so we can clean them up * Remove logging
Diffstat (limited to 'userapi/storage/postgres/openid_table.go')
-rw-r--r--userapi/storage/postgres/openid_table.go81
1 files changed, 81 insertions, 0 deletions
diff --git a/userapi/storage/postgres/openid_table.go b/userapi/storage/postgres/openid_table.go
new file mode 100644
index 00000000..190d141b
--- /dev/null
+++ b/userapi/storage/postgres/openid_table.go
@@ -0,0 +1,81 @@
+package postgres
+
+import (
+ "context"
+ "database/sql"
+
+ "github.com/matrix-org/dendrite/internal/sqlutil"
+ "github.com/matrix-org/dendrite/userapi/api"
+ "github.com/matrix-org/gomatrixserverlib"
+ log "github.com/sirupsen/logrus"
+)
+
+const openIDTokenSchema = `
+-- Stores data about openid tokens issued for accounts.
+CREATE TABLE IF NOT EXISTS open_id_tokens (
+ -- The value of the token issued to a user
+ token TEXT NOT NULL PRIMARY KEY,
+ -- The Matrix user ID for this account
+ localpart TEXT NOT NULL,
+ -- When the token expires, as a unix timestamp (ms resolution).
+ token_expires_at_ms BIGINT NOT NULL
+);
+`
+
+const insertTokenSQL = "" +
+ "INSERT INTO open_id_tokens(token, localpart, token_expires_at_ms) VALUES ($1, $2, $3)"
+
+const selectTokenSQL = "" +
+ "SELECT localpart, token_expires_at_ms FROM open_id_tokens WHERE token = $1"
+
+type tokenStatements struct {
+ insertTokenStmt *sql.Stmt
+ selectTokenStmt *sql.Stmt
+ serverName gomatrixserverlib.ServerName
+}
+
+func (s *tokenStatements) prepare(db *sql.DB, server gomatrixserverlib.ServerName) (err error) {
+ _, err = db.Exec(openIDTokenSchema)
+ if err != nil {
+ return
+ }
+ s.serverName = server
+ return sqlutil.StatementList{
+ {&s.insertTokenStmt, insertTokenSQL},
+ {&s.selectTokenStmt, selectTokenSQL},
+ }.Prepare(db)
+}
+
+// insertToken inserts a new OpenID Connect token to the DB.
+// Returns new token, otherwise returns error if the token already exists.
+func (s *tokenStatements) insertToken(
+ ctx context.Context,
+ txn *sql.Tx,
+ token, localpart string,
+ expiresAtMS int64,
+) (err error) {
+ stmt := sqlutil.TxStmt(txn, s.insertTokenStmt)
+ _, err = stmt.ExecContext(ctx, token, localpart, expiresAtMS)
+ return
+}
+
+// selectOpenIDTokenAtrributes gets the attributes associated with an OpenID token from the DB
+// Returns the existing token's attributes, or err if no token is found
+func (s *tokenStatements) selectOpenIDTokenAtrributes(
+ ctx context.Context,
+ token string,
+) (*api.OpenIDTokenAttributes, error) {
+ var openIDTokenAttrs api.OpenIDTokenAttributes
+ err := s.selectTokenStmt.QueryRowContext(ctx, token).Scan(
+ &openIDTokenAttrs.UserID,
+ &openIDTokenAttrs.ExpiresAtMS,
+ )
+ if err != nil {
+ if err != sql.ErrNoRows {
+ log.WithError(err).Error("Unable to retrieve token from the db")
+ }
+ return nil, err
+ }
+
+ return &openIDTokenAttrs, nil
+}