auth.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package auth
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "fmt"
  6. "github.com/gravitl/netmaker/logger"
  7. "github.com/gravitl/netmaker/logic"
  8. "github.com/gravitl/netmaker/models"
  9. "golang.org/x/crypto/bcrypt"
  10. "golang.org/x/exp/slog"
  11. "golang.org/x/oauth2"
  12. )
  13. // == consts ==
  14. const (
  15. node_signin_length = 64
  16. )
  17. var (
  18. auth_provider *oauth2.Config
  19. )
  20. // IsOauthUser - returns
  21. func IsOauthUser(user *models.User) error {
  22. var currentValue, err = FetchPassValue("")
  23. if err != nil {
  24. return err
  25. }
  26. var bCryptErr = bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(currentValue))
  27. return bCryptErr
  28. }
  29. func FetchPassValue(newValue string) (string, error) {
  30. type valueHolder struct {
  31. Value string `json:"value" bson:"value"`
  32. }
  33. newValueHolder := valueHolder{}
  34. var currentValue, err = logic.FetchAuthSecret()
  35. if err != nil {
  36. return "", err
  37. }
  38. var unmarshErr = json.Unmarshal([]byte(currentValue), &newValueHolder)
  39. if unmarshErr != nil {
  40. return "", unmarshErr
  41. }
  42. var b64CurrentValue, b64Err = base64.StdEncoding.DecodeString(newValueHolder.Value)
  43. if b64Err != nil {
  44. logger.Log(0, "could not decode pass")
  45. return "", nil
  46. }
  47. return string(b64CurrentValue), nil
  48. }
  49. // == private ==
  50. func addUser(email string) error {
  51. var hasSuperAdmin, err = logic.HasSuperAdmin()
  52. if err != nil {
  53. slog.Error("error checking for existence of admin user during OAuth login for", "email", email, "error", err)
  54. return err
  55. } // generate random password to adapt to current model
  56. var newPass, fetchErr = FetchPassValue("")
  57. if fetchErr != nil {
  58. slog.Error("failed to get password", "error", fetchErr.Error())
  59. return fetchErr
  60. }
  61. var newUser = models.User{
  62. UserName: email,
  63. Password: newPass,
  64. }
  65. if !hasSuperAdmin { // must be first attempt, create a superadmin
  66. logger.Log(0, "creating superadmin")
  67. if err = logic.CreateSuperAdmin(&newUser); err != nil {
  68. slog.Error("error creating super admin from user", "email", email, "error", err)
  69. } else {
  70. slog.Info("superadmin created from user", "email", email)
  71. }
  72. } else { // otherwise add to db as admin..?
  73. // TODO: add ability to add users with preemptive permissions
  74. newUser.IsAdmin = false
  75. if err = logic.CreateUser(&newUser); err != nil {
  76. logger.Log(0, "error creating user,", email, "; user not added", "error", err.Error())
  77. } else {
  78. logger.Log(0, "user created from ", email)
  79. }
  80. }
  81. return nil
  82. }
  83. func isUserIsAllowed(username, network string, shouldAddUser bool) (*models.User, error) {
  84. user, err := logic.GetUser(username)
  85. if err != nil && shouldAddUser { // user must not exist, so try to make one
  86. if err = addUser(username); err != nil {
  87. logger.Log(0, "failed to add user", username, "during a node SSO network join on network", network)
  88. // response := returnErrTemplate(user.UserName, "failed to add user", state, reqKeyIf)
  89. // w.WriteHeader(http.StatusInternalServerError)
  90. // w.Write(response)
  91. return nil, fmt.Errorf("failed to add user to system")
  92. }
  93. logger.Log(0, "user", username, "was added during a node SSO network join on network", network)
  94. user, _ = logic.GetUser(username)
  95. }
  96. return user, nil
  97. }