1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: Apache-2.0
4
5package db
6
7import (
8 "database/sql"
9 "time"
10)
11
12// DeleteUser deletes specific user from the database and returns an error if it
13// fails.
14func DeleteUser(db *sql.DB, user string) error {
15 mutex.Lock()
16 defer mutex.Unlock()
17
18 _, err := db.Exec("DELETE FROM users WHERE username = ?", user)
19
20 return err
21}
22
23// CreateUser creates a new user in the database and returns an error if it fails.
24func CreateUser(db *sql.DB, username, hash, salt string) error {
25 mutex.Lock()
26 defer mutex.Unlock()
27
28 _, err := db.Exec("INSERT INTO users (username, hash, salt) VALUES (?, ?, ?)", username, hash, salt)
29
30 return err
31}
32
33// GetUser returns a user's hash and salt from the database as strings and
34// returns an error if it fails.
35func GetUser(db *sql.DB, username string) (string, string, error) {
36 var hash, salt string
37
38 err := db.QueryRow("SELECT hash, salt FROM users WHERE username = ?", username).Scan(&hash, &salt)
39
40 return hash, salt, err
41}
42
43// GetUsers returns a list of all users in the database as a slice of strings
44// and returns an error if it fails.
45func GetUsers(db *sql.DB) ([]string, error) {
46 rows, err := db.Query("SELECT username FROM users")
47 if err != nil {
48 return nil, err
49 }
50 defer rows.Close()
51
52 var users []string
53 for rows.Next() {
54 var user string
55
56 err = rows.Scan(&user)
57 if err != nil {
58 return nil, err
59 }
60
61 users = append(users, user)
62 }
63
64 return users, nil
65}
66
67// GetSession accepts a session ID and returns the username associated with it
68// and an error.
69func GetSession(db *sql.DB, session string) (string, time.Time, error) {
70 var (
71 username string
72 expiresString string
73 )
74
75 err := db.QueryRow("SELECT username, expires FROM sessions WHERE token = ?", session).Scan(&username, &expiresString)
76 if err != nil {
77 return "", time.Time{}, err
78 }
79
80 expires, err := time.Parse(time.RFC3339, expiresString)
81 if err != nil {
82 return "", time.Time{}, err
83 }
84
85 return username, expires, nil
86}
87
88// InvalidateSession invalidates a session by setting the expiration date to the
89// provided time.
90func InvalidateSession(db *sql.DB, session string, expiry time.Time) error {
91 mutex.Lock()
92 defer mutex.Unlock()
93
94 _, err := db.Exec("UPDATE sessions SET expires = ? WHERE token = ?", expiry.Format(time.RFC3339), session)
95
96 return err
97}
98
99// CreateSession creates a new session in the database and returns an error if
100// it fails.
101func CreateSession(db *sql.DB, username, token string, expiry time.Time) error {
102 mutex.Lock()
103 defer mutex.Unlock()
104
105 _, err := db.Exec("INSERT INTO sessions (token, username, expires) VALUES (?, ?, ?)", token, username, expiry.Format(time.RFC3339))
106
107 return err
108}