|
@@ -7,6 +7,7 @@ import (
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
"os"
|
|
|
+ "time"
|
|
|
|
|
|
_ "github.com/mattn/go-sqlite3"
|
|
|
)
|
|
@@ -19,6 +20,22 @@ func (e EmptyError) Error() string {
|
|
|
return e.message
|
|
|
}
|
|
|
|
|
|
+type User struct {
|
|
|
+ Username string
|
|
|
+ PasswordHash string
|
|
|
+ Sfa string
|
|
|
+ Avatar []byte
|
|
|
+ AvatarSmall []byte
|
|
|
+ IsAdmin bool
|
|
|
+ RecoveryCodes string
|
|
|
+}
|
|
|
+
|
|
|
+type Session struct {
|
|
|
+ Id string
|
|
|
+ Username string
|
|
|
+ Expiry time.Time
|
|
|
+}
|
|
|
+
|
|
|
func Migrate() error {
|
|
|
// todo migrations
|
|
|
db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
|
|
@@ -31,11 +48,11 @@ func Migrate() error {
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- _, err = db.Exec(`create table users(username text primary key, password text, sfa text, avatar blob, is_admin bool, recovery_codes text)`)
|
|
|
+ _, err = db.Exec(`create table users(username text primary key, password text, sfa text, avatar blob, avatar_small blob, is_admin bool, recovery_codes text)`)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- _, err = db.Exec(`create table sessions(id text primary key, username text, created datetime, foreign key(username) references users(username))`)
|
|
|
+ _, err = db.Exec(`create table sessions(id text primary key, username text, expiry datetime, foreign key(username) references users(username))`)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
@@ -76,22 +93,29 @@ func MakeAdmin(username string) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func GetUser(username string) (*sql.Rows, error) {
|
|
|
+func GetUser(username string) (*User, error) {
|
|
|
db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
|
|
|
if err != nil {
|
|
|
fmt.Fprintf(os.Stderr, "DB open err\n")
|
|
|
return nil, err
|
|
|
}
|
|
|
defer db.Close()
|
|
|
- rows, err := db.Query(`select password, sfa, recovery_codes from users where username = ?`, username)
|
|
|
+ rows, err := db.Query(`select password, sfa, recovery_codes, is_admin, avatar, avatar_small from users where username = ?`, username)
|
|
|
if err != nil {
|
|
|
fmt.Fprintf(os.Stderr, "Select err %v\n", err)
|
|
|
return nil, err
|
|
|
}
|
|
|
+ defer rows.Close()
|
|
|
if !rows.Next() {
|
|
|
return nil, EmptyError{message: "User does not exist"}
|
|
|
}
|
|
|
- return rows, nil
|
|
|
+ user := User{Username: username}
|
|
|
+ err = rows.Scan(&user.PasswordHash, &user.Sfa, &user.RecoveryCodes, &user.IsAdmin, &user.Avatar, &user.AvatarSmall)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Fprintf(os.Stderr, "Scan err %v\n", err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ return &user, nil
|
|
|
}
|
|
|
|
|
|
func UpdateRecoveryCodes(username, recoveryCodes string) error {
|
|
@@ -101,7 +125,7 @@ func UpdateRecoveryCodes(username, recoveryCodes string) error {
|
|
|
return err
|
|
|
}
|
|
|
defer db.Close()
|
|
|
-
|
|
|
+
|
|
|
_, err = db.Exec(`update users set recovery_codes = ? where username = ?`, recoveryCodes, username)
|
|
|
if err != nil {
|
|
|
return err
|
|
@@ -110,18 +134,50 @@ func UpdateRecoveryCodes(username, recoveryCodes string) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func CreateSession(username, sessionId string) error {
|
|
|
+func CreateSession(username, sessionId string, long bool) error {
|
|
|
db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
|
|
|
if err != nil {
|
|
|
fmt.Fprintf(os.Stderr, "DB open err\n")
|
|
|
return err
|
|
|
}
|
|
|
defer db.Close()
|
|
|
-
|
|
|
- _, err = db.Exec(`insert into sessions values(?, ?, datetime('now'))`, sessionId, username)
|
|
|
+
|
|
|
+ var length string
|
|
|
+ if long {
|
|
|
+ length = "30 days"
|
|
|
+ } else {
|
|
|
+ length = "1 hour"
|
|
|
+ }
|
|
|
+ _, err = db.Exec(`insert into sessions values(?, ?, datetime('now', '`+length+`'))`, sessionId, username)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
+
|
|
|
+func GetSession(token string) (*Session, error) {
|
|
|
+ db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
|
|
|
+ if err != nil {
|
|
|
+ fmt.Fprintf(os.Stderr, "DB open err\n")
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ defer db.Close()
|
|
|
+
|
|
|
+ rows, err := db.Query(`select username, expiry from sessions where id = ?`, token)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Fprintf(os.Stderr, "Select err %v\n", err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ defer rows.Close()
|
|
|
+ if !rows.Next() {
|
|
|
+ return nil, EmptyError{message: "Session does not exist"}
|
|
|
+ }
|
|
|
+ session := Session{Id: token}
|
|
|
+ err = rows.Scan(&session.Username, &session.Expiry)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Fprintf(os.Stderr, "Scan err %v\n", err)
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ return &session, nil
|
|
|
+}
|