security.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. package controller
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "net/http"
  6. "strings"
  7. "github.com/gorilla/mux"
  8. "github.com/gravitl/netmaker/database"
  9. "github.com/gravitl/netmaker/functions"
  10. "github.com/gravitl/netmaker/logic"
  11. "github.com/gravitl/netmaker/models"
  12. "github.com/gravitl/netmaker/servercfg"
  13. )
  14. //Security check DNS is middleware for every DNS function and just checks to make sure that its the master or dns token calling
  15. //Only admin should have access to all these network-level actions
  16. //DNS token should have access to only read functions
  17. func securityCheck(reqAdmin bool, allowDNSToken bool, next http.Handler) http.HandlerFunc {
  18. return func(w http.ResponseWriter, r *http.Request) {
  19. var errorResponse = models.ErrorResponse{
  20. Code: http.StatusUnauthorized, Message: "W1R3: It's not you it's me.",
  21. }
  22. var params = mux.Vars(r)
  23. bearerToken := r.Header.Get("Authorization")
  24. if allowDNSToken && authenticateDNSToken(bearerToken) {
  25. r.Header.Set("user", "nameserver")
  26. networks, _ := json.Marshal([]string{ALL_NETWORK_ACCESS})
  27. r.Header.Set("networks", string(networks))
  28. next.ServeHTTP(w, r)
  29. } else {
  30. err, networks, username := SecurityCheck(reqAdmin, params["networkname"], bearerToken)
  31. if err != nil {
  32. if strings.Contains(err.Error(), "does not exist") {
  33. errorResponse.Code = http.StatusNotFound
  34. }
  35. errorResponse.Message = err.Error()
  36. returnErrorResponse(w, r, errorResponse)
  37. return
  38. }
  39. networksJson, err := json.Marshal(&networks)
  40. if err != nil {
  41. errorResponse.Message = err.Error()
  42. returnErrorResponse(w, r, errorResponse)
  43. return
  44. }
  45. r.Header.Set("user", username)
  46. r.Header.Set("networks", string(networksJson))
  47. next.ServeHTTP(w, r)
  48. }
  49. }
  50. }
  51. func securityCheck(reqAdmin bool, next http.Handler) http.HandlerFunc {
  52. return func(w http.ResponseWriter, r *http.Request) {
  53. var errorResponse = models.ErrorResponse{
  54. Code: http.StatusUnauthorized, Message: "W1R3: It's not you it's me.",
  55. }
  56. var params = mux.Vars(r)
  57. bearerToken := r.Header.Get("Authorization")
  58. err, networks, username := SecurityCheck(reqAdmin, params["networkname"], bearerToken)
  59. if err != nil {
  60. if strings.Contains(err.Error(), "does not exist") {
  61. errorResponse.Code = http.StatusNotFound
  62. }
  63. errorResponse.Message = err.Error()
  64. returnErrorResponse(w, r, errorResponse)
  65. return
  66. }
  67. networksJson, err := json.Marshal(&networks)
  68. if err != nil {
  69. errorResponse.Message = err.Error()
  70. returnErrorResponse(w, r, errorResponse)
  71. return
  72. }
  73. r.Header.Set("user", username)
  74. r.Header.Set("networks", string(networksJson))
  75. next.ServeHTTP(w, r)
  76. }
  77. }
  78. // SecurityCheck - checks token stuff
  79. func SecurityCheck(reqAdmin bool, netname string, token string) (error, []string, string) {
  80. var hasBearer = true
  81. var tokenSplit = strings.Split(token, " ")
  82. var authToken = ""
  83. if len(tokenSplit) < 2 {
  84. hasBearer = false
  85. } else {
  86. authToken = tokenSplit[1]
  87. }
  88. userNetworks := []string{}
  89. //all endpoints here require master so not as complicated
  90. isMasterAuthenticated := authenticateMaster(authToken)
  91. username := ""
  92. if !hasBearer || !isMasterAuthenticated {
  93. userName, networks, isadmin, err := logic.VerifyUserToken(authToken)
  94. username = userName
  95. if err != nil {
  96. return errors.New("error verifying user token"), nil, username
  97. }
  98. if !isadmin && reqAdmin {
  99. return errors.New("you are unauthorized to access this endpoint"), nil, username
  100. }
  101. userNetworks = networks
  102. if isadmin {
  103. userNetworks = []string{ALL_NETWORK_ACCESS}
  104. } else {
  105. networkexists, err := functions.NetworkExists(netname)
  106. if err != nil && !database.IsEmptyRecord(err) {
  107. return err, nil, ""
  108. }
  109. if netname != "" && !networkexists {
  110. return errors.New("this network does not exist"), nil, ""
  111. }
  112. }
  113. } else if isMasterAuthenticated {
  114. userNetworks = []string{ALL_NETWORK_ACCESS}
  115. }
  116. if len(userNetworks) == 0 {
  117. userNetworks = append(userNetworks, NO_NETWORKS_PRESENT)
  118. }
  119. return nil, userNetworks, username
  120. }
  121. //Consider a more secure way of setting master key
  122. func authenticateMaster(tokenString string) bool {
  123. return tokenString == servercfg.GetMasterKey()
  124. }
  125. //Consider a more secure way of setting master key
  126. func authenticateDNSToken(tokenString string) bool {
  127. tokens := strings.Split(tokenString, " ")
  128. if len(tokens) < 2 {
  129. return false
  130. }
  131. return tokens[1] == servercfg.GetDNSKey()
  132. }