server.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package controller
  2. import (
  3. "crypto/ed25519"
  4. "crypto/rand"
  5. "encoding/json"
  6. "net/http"
  7. "strings"
  8. "github.com/gorilla/mux"
  9. "github.com/gravitl/netmaker/logger"
  10. "github.com/gravitl/netmaker/logic"
  11. "github.com/gravitl/netmaker/models"
  12. "github.com/gravitl/netmaker/netclient/config"
  13. "github.com/gravitl/netmaker/servercfg"
  14. "github.com/gravitl/netmaker/tls"
  15. )
  16. func serverHandlers(r *mux.Router) {
  17. // r.HandleFunc("/api/server/addnetwork/{network}", securityCheckServer(true, http.HandlerFunc(addNetwork))).Methods("POST")
  18. r.HandleFunc("/api/server/getconfig", securityCheckServer(false, http.HandlerFunc(getConfig))).Methods("GET")
  19. r.HandleFunc("/api/server/removenetwork/{network}", securityCheckServer(true, http.HandlerFunc(removeNetwork))).Methods("DELETE")
  20. r.HandleFunc("/api/server/register", http.HandlerFunc(register)).Methods("POST")
  21. }
  22. //Security check is middleware for every function and just checks to make sure that its the master calling
  23. //Only admin should have access to all these network-level actions
  24. //or maybe some Users once implemented
  25. func securityCheckServer(adminonly bool, next http.Handler) http.HandlerFunc {
  26. return func(w http.ResponseWriter, r *http.Request) {
  27. var errorResponse = models.ErrorResponse{
  28. Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
  29. }
  30. bearerToken := r.Header.Get("Authorization")
  31. var tokenSplit = strings.Split(bearerToken, " ")
  32. var authToken = ""
  33. if len(tokenSplit) < 2 {
  34. errorResponse = models.ErrorResponse{
  35. Code: http.StatusUnauthorized, Message: "W1R3: You are unauthorized to access this endpoint.",
  36. }
  37. returnErrorResponse(w, r, errorResponse)
  38. return
  39. } else {
  40. authToken = tokenSplit[1]
  41. }
  42. //all endpoints here require master so not as complicated
  43. //still might not be a good way of doing this
  44. user, _, isadmin, err := logic.VerifyUserToken(authToken)
  45. errorResponse = models.ErrorResponse{
  46. Code: http.StatusUnauthorized, Message: "W1R3: You are unauthorized to access this endpoint.",
  47. }
  48. if !adminonly && (err != nil || user == "") {
  49. returnErrorResponse(w, r, errorResponse)
  50. return
  51. }
  52. if adminonly && !isadmin && !authenticateMaster(authToken) {
  53. returnErrorResponse(w, r, errorResponse)
  54. return
  55. }
  56. next.ServeHTTP(w, r)
  57. }
  58. }
  59. func removeNetwork(w http.ResponseWriter, r *http.Request) {
  60. // Set header
  61. w.Header().Set("Content-Type", "application/json")
  62. // get params
  63. var params = mux.Vars(r)
  64. err := logic.DeleteNetwork(params["network"])
  65. if err != nil {
  66. json.NewEncoder(w).Encode("Could not remove server from network " + params["network"])
  67. return
  68. }
  69. json.NewEncoder(w).Encode("Server removed from network " + params["network"])
  70. }
  71. func getConfig(w http.ResponseWriter, r *http.Request) {
  72. // Set header
  73. w.Header().Set("Content-Type", "application/json")
  74. // get params
  75. scfg := servercfg.GetServerConfig()
  76. json.NewEncoder(w).Encode(scfg)
  77. //w.WriteHeader(http.StatusOK)
  78. }
  79. // func addNetwork(w http.ResponseWriter, r *http.Request) {
  80. // // Set header
  81. // w.Header().Set("Content-Type", "application/json")
  82. // // get params
  83. // var params = mux.Vars(r)
  84. // var networkName = params["network"]
  85. // var networkSettings, err := logic.GetNetwork(netwnetworkName)
  86. // success, err := serverctl.AddNetwork(params["network"])
  87. // if err != nil || !success {
  88. // json.NewEncoder(w).Encode("Could not add server to network " + params["network"])
  89. // return
  90. // }
  91. // json.NewEncoder(w).Encode("Server added to network " + params["network"])
  92. // }
  93. // register - registers a client with the server and return the CA cert
  94. func register(w http.ResponseWriter, r *http.Request) {
  95. w.Header().Set("Content-Type", "application/json")
  96. bearerToken := r.Header.Get("Authorization")
  97. var tokenSplit = strings.Split(bearerToken, " ")
  98. var token = ""
  99. if len(tokenSplit) < 2 {
  100. errorResponse := models.ErrorResponse{
  101. Code: http.StatusUnauthorized, Message: "W1R3: You are unauthorized to access this endpoint.",
  102. }
  103. returnErrorResponse(w, r, errorResponse)
  104. return
  105. } else {
  106. token = tokenSplit[1]
  107. }
  108. //decode body
  109. var request config.RegisterRequest
  110. if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
  111. logger.Log(3, "error decoding request")
  112. errorResponse := models.ErrorResponse{
  113. Code: http.StatusBadRequest, Message: "invalid request",
  114. }
  115. returnErrorResponse(w, r, errorResponse)
  116. }
  117. found := false
  118. networks, err := logic.GetNetworks()
  119. if err != nil {
  120. logger.Log(3, "no networks")
  121. errorResponse := models.ErrorResponse{
  122. Code: http.StatusNotFound, Message: "no networks",
  123. }
  124. returnErrorResponse(w, r, errorResponse)
  125. }
  126. for _, network := range networks {
  127. for _, key := range network.AccessKeys {
  128. if key.Value == token {
  129. found = true
  130. break
  131. }
  132. }
  133. }
  134. if !found {
  135. logger.Log(2, "valid access key not found")
  136. errorResponse := models.ErrorResponse{
  137. Code: http.StatusUnauthorized, Message: "You are unauthorized to access this endpoint.",
  138. }
  139. returnErrorResponse(w, r, errorResponse)
  140. return
  141. }
  142. ca, err := tls.ReadCert("/etc/netmaker/root.pem")
  143. if err != nil {
  144. logger.Log(2, "root ca not found ", err.Error())
  145. errorResponse := models.ErrorResponse{
  146. Code: http.StatusNotFound, Message: "root ca not found",
  147. }
  148. returnErrorResponse(w, r, errorResponse)
  149. return
  150. }
  151. key, err := tls.ReadKey("/etc/netmaker/root.key")
  152. if err != nil {
  153. logger.Log(2, "root key not found ", err.Error())
  154. errorResponse := models.ErrorResponse{
  155. Code: http.StatusNotFound, Message: "root key not found",
  156. }
  157. returnErrorResponse(w, r, errorResponse)
  158. return
  159. }
  160. _, privKey, err := ed25519.GenerateKey(rand.Reader)
  161. if err != nil {
  162. logger.Log(2, "failed to generate client key", err.Error())
  163. errorResponse := models.ErrorResponse{
  164. Code: http.StatusInternalServerError, Message: err.Error(),
  165. }
  166. returnErrorResponse(w, r, errorResponse)
  167. return
  168. }
  169. csr, err := tls.NewCSR(privKey, request.Name)
  170. if err != nil {
  171. logger.Log(2, "failed to generate client key", err.Error())
  172. errorResponse := models.ErrorResponse{
  173. Code: http.StatusInternalServerError, Message: err.Error(),
  174. }
  175. returnErrorResponse(w, r, errorResponse)
  176. return
  177. }
  178. cert, err := tls.NewEndEntityCert(*key, csr, ca, tls.CERTIFICATE_VALIDITY)
  179. if err != nil {
  180. logger.Log(2, "unable to generate client certificate", err.Error())
  181. errorResponse := models.ErrorResponse{
  182. Code: http.StatusInternalServerError, Message: err.Error(),
  183. }
  184. returnErrorResponse(w, r, errorResponse)
  185. return
  186. }
  187. response := config.RegisterResponse{
  188. CA: *ca,
  189. Cert: *cert,
  190. Key: privKey,
  191. }
  192. w.WriteHeader(http.StatusOK)
  193. json.NewEncoder(w).Encode(response)
  194. }