db.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package db
  2. import (
  3. "notabug.org/apiote/amuse/utils"
  4. "database/sql"
  5. "errors"
  6. "fmt"
  7. "os"
  8. _ "github.com/mattn/go-sqlite3"
  9. )
  10. type EmptyError struct {
  11. message string
  12. }
  13. func (e EmptyError) Error() string {
  14. return e.message
  15. }
  16. func Migrate() error {
  17. // todo migrations
  18. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  19. if err != nil {
  20. return err
  21. }
  22. defer db.Close()
  23. _, err = db.Exec(`create table cache(uri text primary key, etag text, date date, response blob, last_hit date)`)
  24. if err != nil {
  25. return err
  26. }
  27. _, err = db.Exec(`create table users(username text primary key, password text, sfa text, avatar blob, is_admin bool, recovery_codes text)`)
  28. if err != nil {
  29. return err
  30. }
  31. _, err = db.Exec(`create table sessions(id text primary key, username text, created datetime, foreign key(username) references users(username))`)
  32. if err != nil {
  33. return err
  34. }
  35. return nil
  36. }
  37. func MakeAdmin(username string) error {
  38. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  39. if err != nil {
  40. fmt.Fprintf(os.Stderr, "DB open err\n")
  41. return err
  42. }
  43. defer db.Close()
  44. _, err = db.Exec("update users set is_admin = 1 where username = ?", username)
  45. if err != nil {
  46. fmt.Fprintf(os.Stderr, "Update err %v\n", err)
  47. return err
  48. }
  49. rows, err := db.Query(`select is_admin from users where username = ?`, username)
  50. if err != nil {
  51. fmt.Fprintf(os.Stderr, "Select err %v\n", err)
  52. return err
  53. }
  54. defer rows.Close()
  55. if !rows.Next() {
  56. fmt.Fprintf(os.Stderr, "User %s does not exist\n", username)
  57. return errors.New("User does not exist")
  58. }
  59. var isAdmin bool
  60. err = rows.Scan(&isAdmin)
  61. if err != nil {
  62. fmt.Fprintf(os.Stderr, "Scan err %v\n", err)
  63. return err
  64. }
  65. fmt.Println(isAdmin)
  66. return nil
  67. }
  68. func GetUser(username string) (*sql.Rows, error) {
  69. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  70. if err != nil {
  71. fmt.Fprintf(os.Stderr, "DB open err\n")
  72. return nil, err
  73. }
  74. defer db.Close()
  75. rows, err := db.Query(`select password, sfa, recovery_codes from users where username = ?`, username)
  76. if err != nil {
  77. fmt.Fprintf(os.Stderr, "Select err %v\n", err)
  78. return nil, err
  79. }
  80. if !rows.Next() {
  81. return nil, EmptyError{message: "User does not exist"}
  82. }
  83. return rows, nil
  84. }
  85. func UpdateRecoveryCodes(username, recoveryCodes string) error {
  86. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  87. if err != nil {
  88. fmt.Fprintf(os.Stderr, "DB open err\n")
  89. return err
  90. }
  91. defer db.Close()
  92. _, err = db.Exec(`update users set recovery_codes = ? where username = ?`, recoveryCodes, username)
  93. if err != nil {
  94. return err
  95. }
  96. return nil
  97. }
  98. func CreateSession(username, sessionId string) error {
  99. db, err := sql.Open("sqlite3", utils.DataHome+"/amuse.db")
  100. if err != nil {
  101. fmt.Fprintf(os.Stderr, "DB open err\n")
  102. return err
  103. }
  104. defer db.Close()
  105. _, err = db.Exec(`insert into sessions values(?, ?, datetime('now'))`, sessionId, username)
  106. if err != nil {
  107. return err
  108. }
  109. return nil
  110. }