config.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "golang.org/x/crypto/bcrypt"
  6. "io/ioutil"
  7. "os"
  8. "time"
  9. )
  10. var configFile = "config.json"
  11. var defaultAdmin = &configAdmin{
  12. "admin", []byte("$2a$14$iAOnPBQp6rlPIMGmTzH8qef1pK6tgl9yIfSLlZ2Z9IzIYn6hQPawi"),
  13. }
  14. var config = &configMain{
  15. Admins: map[string]*configAdmin{
  16. "admin": defaultAdmin,
  17. },
  18. Boards: map[uint16]*configBoard{},
  19. Secret: RandString(24),
  20. Influx: nil,
  21. }
  22. type configInflux struct {
  23. Domain string `json:"domain"`
  24. Database string `json:"database"`
  25. Username string `json:"username"`
  26. Password string `json:"password"`
  27. }
  28. type configMain struct{
  29. Admins map[string]*configAdmin `json:"admins"`
  30. Boards map[uint16]*configBoard `json:"boards"`
  31. Secret string `json:"secret"`
  32. Influx *configInflux `json:"influx"`
  33. }
  34. type configAdmin struct{
  35. Username string `json:"user"`
  36. Hash []byte `json:"hash"`
  37. }
  38. func (a *configAdmin) newPassword(pass string) error {
  39. var err error
  40. a.Hash, err = bcrypt.GenerateFromPassword([]byte(pass), 14)
  41. return err
  42. }
  43. func (a *configAdmin) checkPassword(pass string) bool {
  44. err := bcrypt.CompareHashAndPassword(a.Hash, []byte(pass))
  45. return err == nil
  46. }
  47. type configBoard struct{
  48. ID uint16 `json:"ID"`
  49. KEY []byte `json:"KEY"`
  50. KEY16 string `json:"KEY16"`
  51. LastSeen time.Time `json:"LastSeen"`
  52. }
  53. func loadConfig() {
  54. if _, err := os.Stat(configFile); os.IsNotExist(err) {
  55. fmt.Println("No config file. Creating a new one.")
  56. saveConfig()
  57. return
  58. }
  59. jsonFile, err := os.Open(configFile)
  60. errCheckExit(err, "Unable to open config file")
  61. defer jsonFile.Close()
  62. byteValue, _ := ioutil.ReadAll(jsonFile)
  63. err = json.Unmarshal(byteValue, config)
  64. errCheck(err, "Failed to unmarshal config")
  65. }
  66. func saveConfig() {
  67. jsonValue, _ := json.Marshal(config)
  68. err := ioutil.WriteFile(configFile, jsonValue, 0644)
  69. errCheck(err, "Failed to write config")
  70. }