server.go 6.6 KB

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