users.go

 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	_, err := db.Exec("DELETE FROM users WHERE username = ?", user)
18	return err
19}
20
21// CreateUser creates a new user in the database and returns an error if it fails.
22func CreateUser(db *sql.DB, username, hash, salt string) error {
23	mutex.Lock()
24	defer mutex.Unlock()
25	_, err := db.Exec("INSERT INTO users (username, hash, salt) VALUES (?, ?, ?)", username, hash, salt)
26	return err
27}
28
29// GetUser returns a user's hash and salt from the database as strings and
30// returns an error if it fails.
31func GetUser(db *sql.DB, username string) (string, string, error) {
32	var hash, salt string
33	err := db.QueryRow("SELECT hash, salt FROM users WHERE username = ?", username).Scan(&hash, &salt)
34	return hash, salt, err
35}
36
37// GetUsers returns a list of all users in the database as a slice of strings
38// and returns an error if it fails.
39func GetUsers(db *sql.DB) ([]string, error) {
40	rows, err := db.Query("SELECT username FROM users")
41	if err != nil {
42		return nil, err
43	}
44	defer rows.Close()
45
46	var users []string
47	for rows.Next() {
48		var user string
49		err = rows.Scan(&user)
50		if err != nil {
51			return nil, err
52		}
53		users = append(users, user)
54	}
55
56	if err := rows.Err(); err != nil {
57		return nil, err
58	}
59	return users, nil
60}
61
62// GetSession accepts a session ID and returns the username associated with it
63// and an error.
64func GetSession(db *sql.DB, session string) (string, time.Time, error) {
65	var username string
66	var expiresString string
67	err := db.QueryRow("SELECT username, expires FROM sessions WHERE token = ?", session).Scan(&username, &expiresString)
68	if err != nil {
69		return "", time.Time{}, err
70	}
71
72	expires, err := time.Parse(time.RFC3339, expiresString)
73	if err != nil {
74		return "", time.Time{}, err
75	}
76	return username, expires, nil
77}
78
79// InvalidateSession invalidates a session by setting the expiration date to the
80// provided time.
81func InvalidateSession(db *sql.DB, session string, expiry time.Time) error {
82	mutex.Lock()
83	defer mutex.Unlock()
84	_, err := db.Exec("UPDATE sessions SET expires = ? WHERE token = ?", expiry.Format(time.RFC3339), session)
85	return err
86}
87
88// CreateSession creates a new session in the database and returns an error if
89// it fails.
90func CreateSession(db *sql.DB, username, token string, expiry time.Time) error {
91	mutex.Lock()
92	defer mutex.Unlock()
93	_, err := db.Exec("INSERT INTO sessions (token, username, expires) VALUES (?, ?, ?)", token, username, expiry.Format(time.RFC3339))
94	return err
95}