db.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. package db
  2. import (
  3. "notabug.org/apiote/amuse/utils"
  4. "database/sql"
  5. "errors"
  6. "fmt"
  7. "os"
  8. "time"
  9. _ "github.com/mattn/go-sqlite3"
  10. )
  11. type EmptyError struct {
  12. message string
  13. }
  14. func (e EmptyError) Error() string {
  15. return e.message
  16. }
  17. type User struct {
  18. Username string
  19. PasswordHash string
  20. Sfa string
  21. Avatar []byte
  22. AvatarSmall []byte
  23. IsAdmin bool
  24. RecoveryCodes string
  25. }
  26. type Session struct {
  27. Id string
  28. Username string
  29. Expiry time.Time
  30. }
  31. func Migrate() error {
  32. // todo migrations
  33. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  34. if err != nil {
  35. return err
  36. }
  37. defer db.Close()
  38. _, err = db.Exec(`create table cache(uri text primary key, etag text, date date, response blob, last_hit date)`)
  39. if err != nil {
  40. return err
  41. }
  42. _, 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)`)
  43. if err != nil {
  44. return err
  45. }
  46. _, err = db.Exec(`create table sessions(id text primary key, username text, expiry datetime, foreign key(username) references users(username))`)
  47. if err != nil {
  48. return err
  49. }
  50. return nil
  51. }
  52. func MakeAdmin(username string) error {
  53. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  54. if err != nil {
  55. fmt.Fprintf(os.Stderr, "DB open err\n")
  56. return err
  57. }
  58. defer db.Close()
  59. _, err = db.Exec("update users set is_admin = 1 where username = ?", username)
  60. if err != nil {
  61. fmt.Fprintf(os.Stderr, "Update err %v\n", err)
  62. return err
  63. }
  64. rows, err := db.Query(`select is_admin from users where username = ?`, username)
  65. if err != nil {
  66. fmt.Fprintf(os.Stderr, "Select err %v\n", err)
  67. return err
  68. }
  69. defer rows.Close()
  70. if !rows.Next() {
  71. fmt.Fprintf(os.Stderr, "User %s does not exist\n", username)
  72. return errors.New("User does not exist")
  73. }
  74. var isAdmin bool
  75. err = rows.Scan(&isAdmin)
  76. if err != nil {
  77. fmt.Fprintf(os.Stderr, "Scan err %v\n", err)
  78. return err
  79. }
  80. fmt.Println(isAdmin)
  81. return nil
  82. }
  83. func GetUser(username string) (*User, error) {
  84. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  85. if err != nil {
  86. fmt.Fprintf(os.Stderr, "DB open err\n")
  87. return nil, err
  88. }
  89. defer db.Close()
  90. rows, err := db.Query(`select password, sfa, recovery_codes, is_admin, avatar, avatar_small from users where username = ?`, username)
  91. if err != nil {
  92. fmt.Fprintf(os.Stderr, "Select err %v\n", err)
  93. return nil, err
  94. }
  95. defer rows.Close()
  96. if !rows.Next() {
  97. return nil, EmptyError{message: "User does not exist"}
  98. }
  99. user := User{Username: username}
  100. err = rows.Scan(&user.PasswordHash, &user.Sfa, &user.RecoveryCodes, &user.IsAdmin, &user.Avatar, &user.AvatarSmall)
  101. if err != nil {
  102. fmt.Fprintf(os.Stderr, "Scan err %v\n", err)
  103. return nil, err
  104. }
  105. return &user, nil
  106. }
  107. func UpdateRecoveryCodes(username, recoveryCodes string) error {
  108. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  109. if err != nil {
  110. fmt.Fprintf(os.Stderr, "DB open err\n")
  111. return err
  112. }
  113. defer db.Close()
  114. _, err = db.Exec(`update users set recovery_codes = ? where username = ?`, recoveryCodes, username)
  115. if err != nil {
  116. return err
  117. }
  118. return nil
  119. }
  120. func CreateSession(username, sessionId string, long bool) error {
  121. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  122. if err != nil {
  123. fmt.Fprintf(os.Stderr, "DB open err\n")
  124. return err
  125. }
  126. defer db.Close()
  127. var length string
  128. if long {
  129. length = "30 days"
  130. } else {
  131. length = "1 hour"
  132. }
  133. _, err = db.Exec(`insert into sessions values(?, ?, datetime('now', '`+length+`'))`, sessionId, username)
  134. if err != nil {
  135. return err
  136. }
  137. return nil
  138. }
  139. func GetSession(token string) (*Session, error) {
  140. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  141. if err != nil {
  142. fmt.Fprintf(os.Stderr, "DB open err\n")
  143. return nil, err
  144. }
  145. defer db.Close()
  146. rows, err := db.Query(`select username, expiry from sessions where id = ?`, token)
  147. if err != nil {
  148. fmt.Fprintf(os.Stderr, "Select err %v\n", err)
  149. return nil, err
  150. }
  151. defer rows.Close()
  152. if !rows.Next() {
  153. return nil, EmptyError{message: "Session does not exist"}
  154. }
  155. session := Session{Id: token}
  156. err = rows.Scan(&session.Username, &session.Expiry)
  157. if err != nil {
  158. fmt.Fprintf(os.Stderr, "Scan err %v\n", err)
  159. return nil, err
  160. }
  161. return &session, nil
  162. }