node.go 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060
  1. package controller
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "net/http"
  7. "strings"
  8. "github.com/gorilla/mux"
  9. "github.com/gravitl/netmaker/database"
  10. "github.com/gravitl/netmaker/logger"
  11. "github.com/gravitl/netmaker/logic"
  12. "github.com/gravitl/netmaker/logic/pro"
  13. "github.com/gravitl/netmaker/models"
  14. "github.com/gravitl/netmaker/models/promodels"
  15. "github.com/gravitl/netmaker/mq"
  16. "github.com/gravitl/netmaker/servercfg"
  17. "golang.org/x/crypto/bcrypt"
  18. )
  19. func nodeHandlers(r *mux.Router) {
  20. r.HandleFunc("/api/nodes", authorize(false, false, "user", http.HandlerFunc(getAllNodes))).Methods(http.MethodGet)
  21. r.HandleFunc("/api/nodes/{network}", authorize(false, true, "network", http.HandlerFunc(getNetworkNodes))).Methods(http.MethodGet)
  22. r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(true, true, "node", http.HandlerFunc(getNode))).Methods(http.MethodGet)
  23. r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(false, true, "node", http.HandlerFunc(updateNode))).Methods(http.MethodPut)
  24. r.HandleFunc("/api/nodes/{network}/{nodeid}/migrate", authorize(true, true, "node", http.HandlerFunc(nodeNodeUpdate))).Methods(http.MethodPut)
  25. r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(true, true, "node", http.HandlerFunc(deleteNode))).Methods(http.MethodDelete)
  26. r.HandleFunc("/api/nodes/{network}/{nodeid}/creategateway", authorize(false, true, "user", http.HandlerFunc(createEgressGateway))).Methods(http.MethodPost)
  27. r.HandleFunc("/api/nodes/{network}/{nodeid}/deletegateway", authorize(false, true, "user", http.HandlerFunc(deleteEgressGateway))).Methods(http.MethodDelete)
  28. r.HandleFunc("/api/nodes/{network}/{nodeid}/createingress", logic.SecurityCheck(false, http.HandlerFunc(createIngressGateway))).Methods(http.MethodPost)
  29. r.HandleFunc("/api/nodes/{network}/{nodeid}/deleteingress", logic.SecurityCheck(false, http.HandlerFunc(deleteIngressGateway))).Methods(http.MethodDelete)
  30. r.HandleFunc("/api/nodes/{network}/{nodeid}", authorize(true, true, "node", http.HandlerFunc(updateNode))).Methods(http.MethodPost)
  31. r.HandleFunc("/api/nodes/{network}", nodeauth(checkFreeTierLimits(node_l, http.HandlerFunc(createNode)))).Methods(http.MethodPost)
  32. r.HandleFunc("/api/nodes/adm/{network}/authenticate", authenticate).Methods(http.MethodPost)
  33. }
  34. // swagger:route POST /api/nodes/adm/{network}/authenticate nodes authenticate
  35. //
  36. // Authenticate to make further API calls related to a network.
  37. //
  38. // Schemes: https
  39. //
  40. // Security:
  41. // oauth
  42. //
  43. // Responses:
  44. // 200: successResponse
  45. func authenticate(response http.ResponseWriter, request *http.Request) {
  46. var authRequest models.AuthParams
  47. var result models.Node
  48. var errorResponse = models.ErrorResponse{
  49. Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
  50. }
  51. decoder := json.NewDecoder(request.Body)
  52. decoderErr := decoder.Decode(&authRequest)
  53. defer request.Body.Close()
  54. if decoderErr != nil {
  55. errorResponse.Code = http.StatusBadRequest
  56. errorResponse.Message = decoderErr.Error()
  57. logger.Log(0, request.Header.Get("user"), "error decoding request body: ",
  58. decoderErr.Error())
  59. logic.ReturnErrorResponse(response, request, errorResponse)
  60. return
  61. }
  62. errorResponse.Code = http.StatusBadRequest
  63. if authRequest.ID == "" {
  64. errorResponse.Message = "W1R3: ID can't be empty"
  65. logger.Log(0, request.Header.Get("user"), errorResponse.Message)
  66. logic.ReturnErrorResponse(response, request, errorResponse)
  67. return
  68. } else if authRequest.Password == "" {
  69. errorResponse.Message = "W1R3: Password can't be empty"
  70. logger.Log(0, request.Header.Get("user"), errorResponse.Message)
  71. logic.ReturnErrorResponse(response, request, errorResponse)
  72. return
  73. }
  74. var err error
  75. result, err = logic.GetNodeByID(authRequest.ID)
  76. if err != nil {
  77. result, err = logic.GetDeletedNodeByID(authRequest.ID)
  78. if err != nil {
  79. errorResponse.Code = http.StatusBadRequest
  80. errorResponse.Message = err.Error()
  81. logger.Log(0, request.Header.Get("user"),
  82. fmt.Sprintf("failed to get node info [%s]: %v", authRequest.ID, err))
  83. logic.ReturnErrorResponse(response, request, errorResponse)
  84. return
  85. }
  86. }
  87. host, err := logic.GetHost(result.HostID.String())
  88. if err != nil {
  89. errorResponse.Code = http.StatusBadRequest
  90. errorResponse.Message = err.Error()
  91. logger.Log(0, request.Header.Get("user"),
  92. "error retrieving host: ", err.Error())
  93. logic.ReturnErrorResponse(response, request, errorResponse)
  94. return
  95. }
  96. err = bcrypt.CompareHashAndPassword([]byte(host.HostPass), []byte(authRequest.Password))
  97. if err != nil {
  98. errorResponse.Code = http.StatusBadRequest
  99. errorResponse.Message = err.Error()
  100. logger.Log(0, request.Header.Get("user"),
  101. "error validating user password: ", err.Error())
  102. logic.ReturnErrorResponse(response, request, errorResponse)
  103. return
  104. }
  105. tokenString, err := logic.CreateJWT(authRequest.ID, authRequest.MacAddress, result.Network)
  106. if tokenString == "" {
  107. errorResponse.Code = http.StatusBadRequest
  108. errorResponse.Message = "Could not create Token"
  109. logger.Log(0, request.Header.Get("user"),
  110. fmt.Sprintf("%s: %v", errorResponse.Message, err))
  111. logic.ReturnErrorResponse(response, request, errorResponse)
  112. return
  113. }
  114. var successResponse = models.SuccessResponse{
  115. Code: http.StatusOK,
  116. Message: "W1R3: Device " + authRequest.ID + " Authorized",
  117. Response: models.SuccessfulLoginResponse{
  118. AuthToken: tokenString,
  119. ID: authRequest.ID,
  120. },
  121. }
  122. successJSONResponse, jsonError := json.Marshal(successResponse)
  123. if jsonError != nil {
  124. errorResponse.Code = http.StatusBadRequest
  125. errorResponse.Message = err.Error()
  126. logger.Log(0, request.Header.Get("user"),
  127. "error marshalling resp: ", err.Error())
  128. logic.ReturnErrorResponse(response, request, errorResponse)
  129. return
  130. }
  131. response.WriteHeader(http.StatusOK)
  132. response.Header().Set("Content-Type", "application/json")
  133. response.Write(successJSONResponse)
  134. }
  135. // auth middleware for api calls from nodes where node is has not yet joined the server (register, join)
  136. func nodeauth(next http.Handler) http.HandlerFunc {
  137. return func(w http.ResponseWriter, r *http.Request) {
  138. bearerToken := r.Header.Get("Authorization")
  139. var tokenSplit = strings.Split(bearerToken, " ")
  140. var token = ""
  141. if len(tokenSplit) < 2 {
  142. errorResponse := models.ErrorResponse{
  143. Code: http.StatusUnauthorized, Message: "W1R3: You are unauthorized to access this endpoint.",
  144. }
  145. logic.ReturnErrorResponse(w, r, errorResponse)
  146. return
  147. } else {
  148. token = tokenSplit[1]
  149. }
  150. found := false
  151. networks, err := logic.GetNetworks()
  152. if err != nil {
  153. logger.Log(0, "no networks", err.Error())
  154. errorResponse := models.ErrorResponse{
  155. Code: http.StatusNotFound, Message: "no networks",
  156. }
  157. logic.ReturnErrorResponse(w, r, errorResponse)
  158. return
  159. }
  160. for _, network := range networks {
  161. for _, key := range network.AccessKeys {
  162. if key.Value == token {
  163. found = true
  164. break
  165. }
  166. }
  167. }
  168. if !found {
  169. logger.Log(0, "valid access key not found")
  170. errorResponse := models.ErrorResponse{
  171. Code: http.StatusUnauthorized, Message: "You are unauthorized to access this endpoint.",
  172. }
  173. logic.ReturnErrorResponse(w, r, errorResponse)
  174. return
  175. }
  176. next.ServeHTTP(w, r)
  177. }
  178. }
  179. // The middleware for most requests to the API
  180. // They all pass through here first
  181. // This will validate the JWT (or check for master token)
  182. // This will also check against the authNetwork and make sure the node should be accessing that endpoint,
  183. // even if it's technically ok
  184. // This is kind of a poor man's RBAC. There's probably a better/smarter way.
  185. // TODO: Consider better RBAC implementations
  186. func authorize(nodesAllowed, networkCheck bool, authNetwork string, next http.Handler) http.HandlerFunc {
  187. return func(w http.ResponseWriter, r *http.Request) {
  188. var errorResponse = models.ErrorResponse{
  189. Code: http.StatusUnauthorized, Message: logic.Unauthorized_Msg,
  190. }
  191. var params = mux.Vars(r)
  192. networkexists, _ := logic.NetworkExists(params["network"])
  193. //check that the request is for a valid network
  194. //if (networkCheck && !networkexists) || err != nil {
  195. if networkCheck && !networkexists {
  196. logic.ReturnErrorResponse(w, r, errorResponse)
  197. return
  198. } else {
  199. w.Header().Set("Content-Type", "application/json")
  200. //get the auth token
  201. bearerToken := r.Header.Get("Authorization")
  202. var tokenSplit = strings.Split(bearerToken, " ")
  203. //I put this in in case the user doesn't put in a token at all (in which case it's empty)
  204. //There's probably a smarter way of handling this.
  205. var authToken = "928rt238tghgwe@TY@$Y@#WQAEGB2FC#@HG#@$Hddd"
  206. if len(tokenSplit) > 1 {
  207. authToken = tokenSplit[1]
  208. } else {
  209. logic.ReturnErrorResponse(w, r, errorResponse)
  210. return
  211. }
  212. //check if node instead of user
  213. if nodesAllowed {
  214. // TODO --- should ensure that node is only operating on itself
  215. if _, _, _, err := logic.VerifyToken(authToken); err == nil {
  216. // this indicates request is from a node
  217. // used for failover - if a getNode comes from node, this will trigger a metrics wipe
  218. next.ServeHTTP(w, r)
  219. return
  220. }
  221. }
  222. var isAuthorized = false
  223. var nodeID = ""
  224. username, networks, isadmin, errN := logic.VerifyUserToken(authToken)
  225. if errN != nil {
  226. logic.ReturnErrorResponse(w, r, errorResponse)
  227. return
  228. }
  229. isnetadmin := isadmin
  230. if errN == nil && isadmin {
  231. nodeID = "mastermac"
  232. isAuthorized = true
  233. r.Header.Set("ismasterkey", "yes")
  234. }
  235. if !isadmin && params["network"] != "" {
  236. if logic.StringSliceContains(networks, params["network"]) && pro.IsUserNetAdmin(params["network"], username) {
  237. isnetadmin = true
  238. }
  239. }
  240. //The mastermac (login with masterkey from config) can do everything!! May be dangerous.
  241. if nodeID == "mastermac" {
  242. isAuthorized = true
  243. r.Header.Set("ismasterkey", "yes")
  244. //for everyone else, there's poor man's RBAC. The "cases" are defined in the routes in the handlers
  245. //So each route defines which access network should be allowed to access it
  246. } else {
  247. switch authNetwork {
  248. case "all":
  249. isAuthorized = true
  250. case "nodes":
  251. isAuthorized = (nodeID != "") || isnetadmin
  252. case "network":
  253. if isnetadmin {
  254. isAuthorized = true
  255. } else {
  256. node, err := logic.GetNodeByID(nodeID)
  257. if err != nil {
  258. logic.ReturnErrorResponse(w, r, errorResponse)
  259. return
  260. }
  261. isAuthorized = (node.Network == params["network"])
  262. }
  263. case "node":
  264. if isnetadmin {
  265. isAuthorized = true
  266. } else {
  267. isAuthorized = (nodeID == params["netid"])
  268. }
  269. case "user":
  270. isAuthorized = true
  271. default:
  272. isAuthorized = false
  273. }
  274. }
  275. if !isAuthorized {
  276. logic.ReturnErrorResponse(w, r, errorResponse)
  277. return
  278. } else {
  279. //If authorized, this function passes along it's request and output to the appropriate route function.
  280. if username == "" {
  281. username = "(user not found)"
  282. }
  283. r.Header.Set("user", username)
  284. next.ServeHTTP(w, r)
  285. }
  286. }
  287. }
  288. }
  289. // swagger:route GET /api/nodes/{network} nodes getNetworkNodes
  290. //
  291. // Gets all nodes associated with network including pending nodes.
  292. //
  293. // Schemes: https
  294. //
  295. // Security:
  296. // oauth
  297. //
  298. // Responses:
  299. // 200: nodeSliceResponse
  300. func getNetworkNodes(w http.ResponseWriter, r *http.Request) {
  301. w.Header().Set("Content-Type", "application/json")
  302. var params = mux.Vars(r)
  303. networkName := params["network"]
  304. nodes, err := logic.GetNetworkNodes(networkName)
  305. if err != nil {
  306. logger.Log(0, r.Header.Get("user"),
  307. fmt.Sprintf("error fetching nodes on network %s: %v", networkName, err))
  308. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  309. return
  310. }
  311. // returns all the nodes in JSON/API format
  312. apiNodes := logic.GetAllNodesAPI(nodes[:])
  313. logger.Log(2, r.Header.Get("user"), "fetched nodes on network", networkName)
  314. w.WriteHeader(http.StatusOK)
  315. json.NewEncoder(w).Encode(apiNodes)
  316. }
  317. // swagger:route GET /api/nodes nodes getAllNodes
  318. //
  319. // Get all nodes across all networks.
  320. //
  321. // Schemes: https
  322. //
  323. // Security:
  324. // oauth
  325. //
  326. // Responses:
  327. // 200: nodeSliceResponse
  328. //
  329. // Not quite sure if this is necessary. Probably necessary based on front end but may want to review after iteration 1 if it's being used or not
  330. func getAllNodes(w http.ResponseWriter, r *http.Request) {
  331. w.Header().Set("Content-Type", "application/json")
  332. user, err := logic.GetUser(r.Header.Get("user"))
  333. if err != nil && r.Header.Get("ismasterkey") != "yes" {
  334. logger.Log(0, r.Header.Get("user"),
  335. "error fetching user info: ", err.Error())
  336. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  337. return
  338. }
  339. var nodes []models.Node
  340. if user.IsAdmin || r.Header.Get("ismasterkey") == "yes" {
  341. nodes, err = logic.GetAllNodes()
  342. if err != nil {
  343. logger.Log(0, "error fetching all nodes info: ", err.Error())
  344. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  345. return
  346. }
  347. } else {
  348. nodes, err = getUsersNodes(*user)
  349. if err != nil {
  350. logger.Log(0, r.Header.Get("user"),
  351. "error fetching nodes: ", err.Error())
  352. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  353. return
  354. }
  355. }
  356. // return all the nodes in JSON/API format
  357. apiNodes := logic.GetAllNodesAPI(nodes[:])
  358. logger.Log(3, r.Header.Get("user"), "fetched all nodes they have access to")
  359. w.WriteHeader(http.StatusOK)
  360. json.NewEncoder(w).Encode(apiNodes)
  361. }
  362. func getUsersNodes(user models.User) ([]models.Node, error) {
  363. var nodes []models.Node
  364. var err error
  365. for _, networkName := range user.Networks {
  366. tmpNodes, err := logic.GetNetworkNodes(networkName)
  367. if err != nil {
  368. continue
  369. }
  370. nodes = append(nodes, tmpNodes...)
  371. }
  372. return nodes, err
  373. }
  374. // swagger:route GET /api/nodes/{network}/{nodeid} nodes getNode
  375. //
  376. // Get an individual node.
  377. //
  378. // Schemes: https
  379. //
  380. // Security:
  381. // oauth
  382. //
  383. // Responses:
  384. // 200: nodeResponse
  385. func getNode(w http.ResponseWriter, r *http.Request) {
  386. // set header.
  387. w.Header().Set("Content-Type", "application/json")
  388. nodeRequest := r.Header.Get("requestfrom") == "node"
  389. var params = mux.Vars(r)
  390. nodeid := params["nodeid"]
  391. node, err := logic.GetNodeByID(nodeid)
  392. if err != nil {
  393. logger.Log(0, r.Header.Get("user"),
  394. fmt.Sprintf("error fetching node [ %s ] info: %v", nodeid, err))
  395. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  396. return
  397. }
  398. host, err := logic.GetHost(node.HostID.String())
  399. if err != nil {
  400. logger.Log(0, r.Header.Get("user"),
  401. fmt.Sprintf("error fetching host for node [ %s ] info: %v", nodeid, err))
  402. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  403. return
  404. }
  405. peerUpdate, err := logic.GetPeerUpdate(&node, host)
  406. if err != nil && !database.IsEmptyRecord(err) {
  407. logger.Log(0, r.Header.Get("user"),
  408. fmt.Sprintf("error fetching wg peers config for node [ %s ]: %v", nodeid, err))
  409. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  410. return
  411. }
  412. hostPeerUpdate, err := logic.GetPeerUpdateForHost(host)
  413. if err != nil && !database.IsEmptyRecord(err) {
  414. logger.Log(0, r.Header.Get("user"),
  415. fmt.Sprintf("error fetching wg peers config for host [ %s ]: %v", host.ID.String(), err))
  416. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  417. return
  418. }
  419. server := servercfg.GetServerInfo()
  420. network, err := logic.GetNetwork(node.Network)
  421. if err != nil {
  422. logger.Log(0, r.Header.Get("user"),
  423. fmt.Sprintf("error fetching network for node [ %s ] info: %v", nodeid, err))
  424. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  425. return
  426. }
  427. legacy := node.Legacy(host, &server, &network)
  428. response := models.NodeGet{
  429. Node: *legacy,
  430. Host: *host,
  431. Peers: peerUpdate.Peers,
  432. HostPeers: hostPeerUpdate.Peers,
  433. ServerConfig: server,
  434. PeerIDs: peerUpdate.PeerIDs,
  435. }
  436. if servercfg.Is_EE && nodeRequest {
  437. if err = logic.EnterpriseResetAllPeersFailovers(node.ID.String(), node.Network); err != nil {
  438. logger.Log(1, "failed to reset failover list during node config pull", node.ID.String(), node.Network)
  439. }
  440. }
  441. logger.Log(2, r.Header.Get("user"), "fetched node", params["nodeid"])
  442. w.WriteHeader(http.StatusOK)
  443. json.NewEncoder(w).Encode(response)
  444. }
  445. // swagger:route POST /api/nodes/{network} nodes createNode
  446. //
  447. // Create a node on a network.
  448. //
  449. // Schemes: https
  450. //
  451. // Security:
  452. // oauth
  453. //
  454. // Responses:
  455. // 200: nodeGetResponse
  456. func createNode(w http.ResponseWriter, r *http.Request) {
  457. w.Header().Set("Content-Type", "application/json")
  458. var params = mux.Vars(r)
  459. var errorResponse = models.ErrorResponse{
  460. Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",
  461. }
  462. networkName := params["network"]
  463. networkexists, err := logic.NetworkExists(networkName)
  464. if err != nil {
  465. logger.Log(0, r.Header.Get("user"),
  466. fmt.Sprintf("failed to fetch network [%s] info: %v", networkName, err))
  467. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  468. return
  469. } else if !networkexists {
  470. errorResponse = models.ErrorResponse{
  471. Code: http.StatusNotFound, Message: "W1R3: Network does not exist! ",
  472. }
  473. logger.Log(0, r.Header.Get("user"),
  474. fmt.Sprintf("network [%s] does not exist", networkName))
  475. logic.ReturnErrorResponse(w, r, errorResponse)
  476. return
  477. }
  478. //get data from body of request
  479. data := models.JoinData{}
  480. err = json.NewDecoder(r.Body).Decode(&data)
  481. if err != nil {
  482. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  483. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  484. return
  485. }
  486. if !logic.IsVersionComptatible(data.Host.Version) {
  487. err := errors.New("incomatible netclient version")
  488. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  489. return
  490. }
  491. data.Node.Network = networkName
  492. networkSettings, err := logic.GetNetworkSettings(networkName)
  493. if err != nil {
  494. logger.Log(0, r.Header.Get("user"),
  495. fmt.Sprintf("failed to get network [%s] settings: %v", networkName, err))
  496. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  497. return
  498. }
  499. data.Node.NetworkSettings(networkSettings)
  500. keyName, validKey := logic.IsKeyValid(networkName, data.Key)
  501. if !validKey {
  502. errorResponse = models.ErrorResponse{
  503. Code: http.StatusUnauthorized, Message: "W1R3: Key invalid, or none provided.",
  504. }
  505. logger.Log(0, r.Header.Get("user"),
  506. fmt.Sprintf("failed to create node on network [%s]: %s",
  507. data.Node.Network, errorResponse.Message))
  508. logic.ReturnErrorResponse(w, r, errorResponse)
  509. return
  510. }
  511. user, err := pro.GetNetworkUser(networkName, promodels.NetworkUserID(keyName))
  512. if err == nil {
  513. if user.ID != "" {
  514. logger.Log(1, "associating new node with user", keyName)
  515. data.Node.OwnerID = string(user.ID)
  516. }
  517. }
  518. key, keyErr := logic.RetrievePublicTrafficKey()
  519. if keyErr != nil {
  520. logger.Log(0, "error retrieving key: ", keyErr.Error())
  521. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  522. return
  523. }
  524. if key == nil {
  525. logger.Log(0, "error: server traffic key is nil")
  526. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  527. return
  528. }
  529. if data.Host.TrafficKeyPublic == nil {
  530. logger.Log(0, "error: node traffic key is nil")
  531. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  532. return
  533. }
  534. server := servercfg.GetServerInfo()
  535. server.TrafficKey = key
  536. // consume password before hashing for mq client creation
  537. hostPassword := data.Host.HostPass
  538. data.Node.Server = servercfg.GetServer()
  539. if err := logic.CreateHost(&data.Host); err != nil {
  540. if errors.Is(err, logic.ErrHostExists) {
  541. logger.Log(3, "host exists .. no need to create")
  542. host, err := logic.GetHost(data.Host.ID.String())
  543. if err != nil {
  544. logger.Log(0, r.Header.Get("user"), "failed to find host:", err.Error())
  545. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  546. return
  547. }
  548. logic.UpdateHost(&data.Host, host) // update the in memory struct values
  549. networks := logic.GetHostNetworks(data.Host.ID.String())
  550. if err := mq.ModifyClient(&mq.MqClient{
  551. ID: data.Host.ID.String(),
  552. Text: data.Host.Name,
  553. Networks: networks,
  554. }); err != nil {
  555. logger.Log(0, fmt.Sprintf("failed to modify DynSec client: %v", err.Error()))
  556. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  557. return
  558. }
  559. } else {
  560. logger.Log(0, "error creating host", err.Error())
  561. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  562. return
  563. }
  564. } else {
  565. // Create client for this host in Mq
  566. if err := mq.CreateMqClient(&mq.MqClient{
  567. ID: data.Host.ID.String(),
  568. Text: data.Host.Name,
  569. Password: hostPassword,
  570. Networks: []string{networkName},
  571. }); err != nil {
  572. logger.Log(0, fmt.Sprintf("failed to create DynSec client: %v", err.Error()))
  573. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  574. return
  575. }
  576. }
  577. err = logic.AssociateNodeToHost(&data.Node, &data.Host)
  578. if err != nil {
  579. logger.Log(0, r.Header.Get("user"),
  580. fmt.Sprintf("failed to create node on network [%s]: %s",
  581. networkName, err))
  582. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  583. return
  584. }
  585. // check if key belongs to a user
  586. // if so add to their netuser data
  587. // if it fails remove the node and fail request
  588. if user != nil {
  589. var updatedUserNode bool
  590. user.Nodes = append(user.Nodes, data.Node.ID.String()) // add new node to user
  591. if err = pro.UpdateNetworkUser(networkName, user); err == nil {
  592. logger.Log(1, "added node", data.Node.ID.String(), data.Host.Name, "to user", string(user.ID))
  593. updatedUserNode = true
  594. }
  595. if !updatedUserNode { // user was found but not updated, so delete node
  596. logger.Log(0, "failed to add node to user", keyName)
  597. logic.DeleteNode(&data.Node, true)
  598. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  599. return
  600. }
  601. }
  602. hostPeerUpdate, err := logic.GetPeerUpdateForHost(&data.Host)
  603. if err != nil && !database.IsEmptyRecord(err) {
  604. logger.Log(0, r.Header.Get("user"),
  605. fmt.Sprintf("error fetching wg peers config for host [ %s ]: %v", data.Host.ID.String(), err))
  606. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  607. return
  608. }
  609. response := models.NodeJoinResponse{
  610. Node: data.Node,
  611. ServerConfig: server,
  612. Host: data.Host,
  613. Peers: hostPeerUpdate.Peers,
  614. }
  615. logger.Log(1, r.Header.Get("user"), "created new node", data.Host.Name, "on network", networkName)
  616. w.WriteHeader(http.StatusOK)
  617. json.NewEncoder(w).Encode(response)
  618. go func() {
  619. if err := mq.PublishPeerUpdate(); err != nil {
  620. logger.Log(1, "failed a peer update after creation of node", data.Host.Name)
  621. }
  622. }()
  623. //runForceServerUpdate(&data.Node, true)
  624. }
  625. // == EGRESS ==
  626. // swagger:route POST /api/nodes/{network}/{nodeid}/creategateway nodes createEgressGateway
  627. //
  628. // Create an egress gateway.
  629. //
  630. // Schemes: https
  631. //
  632. // Security:
  633. // oauth
  634. //
  635. // Responses:
  636. // 200: nodeResponse
  637. func createEgressGateway(w http.ResponseWriter, r *http.Request) {
  638. var gateway models.EgressGatewayRequest
  639. var params = mux.Vars(r)
  640. w.Header().Set("Content-Type", "application/json")
  641. err := json.NewDecoder(r.Body).Decode(&gateway)
  642. if err != nil {
  643. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  644. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  645. return
  646. }
  647. gateway.NetID = params["network"]
  648. gateway.NodeID = params["nodeid"]
  649. node, err := logic.CreateEgressGateway(gateway)
  650. if err != nil {
  651. logger.Log(0, r.Header.Get("user"),
  652. fmt.Sprintf("failed to create egress gateway on node [%s] on network [%s]: %v",
  653. gateway.NodeID, gateway.NetID, err))
  654. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  655. return
  656. }
  657. apiNode := node.ConvertToAPINode()
  658. logger.Log(1, r.Header.Get("user"), "created egress gateway on node", gateway.NodeID, "on network", gateway.NetID)
  659. w.WriteHeader(http.StatusOK)
  660. json.NewEncoder(w).Encode(apiNode)
  661. runUpdates(&node, true)
  662. }
  663. // swagger:route DELETE /api/nodes/{network}/{nodeid}/deletegateway nodes deleteEgressGateway
  664. //
  665. // Delete an egress gateway.
  666. //
  667. // Schemes: https
  668. //
  669. // Security:
  670. // oauth
  671. //
  672. // Responses:
  673. // 200: nodeResponse
  674. func deleteEgressGateway(w http.ResponseWriter, r *http.Request) {
  675. w.Header().Set("Content-Type", "application/json")
  676. var params = mux.Vars(r)
  677. nodeid := params["nodeid"]
  678. netid := params["network"]
  679. node, err := logic.DeleteEgressGateway(netid, nodeid)
  680. if err != nil {
  681. logger.Log(0, r.Header.Get("user"),
  682. fmt.Sprintf("failed to delete egress gateway on node [%s] on network [%s]: %v",
  683. nodeid, netid, err))
  684. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  685. return
  686. }
  687. apiNode := node.ConvertToAPINode()
  688. logger.Log(1, r.Header.Get("user"), "deleted egress gateway on node", nodeid, "on network", netid)
  689. w.WriteHeader(http.StatusOK)
  690. json.NewEncoder(w).Encode(apiNode)
  691. runUpdates(&node, true)
  692. }
  693. // == INGRESS ==
  694. // swagger:route POST /api/nodes/{network}/{nodeid}/createingress nodes createIngressGateway
  695. //
  696. // Create an ingress gateway.
  697. //
  698. // Schemes: https
  699. //
  700. // Security:
  701. // oauth
  702. //
  703. // Responses:
  704. // 200: nodeResponse
  705. func createIngressGateway(w http.ResponseWriter, r *http.Request) {
  706. var params = mux.Vars(r)
  707. w.Header().Set("Content-Type", "application/json")
  708. nodeid := params["nodeid"]
  709. netid := params["network"]
  710. type failoverData struct {
  711. Failover bool `json:"failover"`
  712. }
  713. var failoverReqBody failoverData
  714. json.NewDecoder(r.Body).Decode(&failoverReqBody)
  715. node, err := logic.CreateIngressGateway(netid, nodeid, failoverReqBody.Failover)
  716. if err != nil {
  717. logger.Log(0, r.Header.Get("user"),
  718. fmt.Sprintf("failed to create ingress gateway on node [%s] on network [%s]: %v",
  719. nodeid, netid, err))
  720. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  721. return
  722. }
  723. if servercfg.Is_EE && failoverReqBody.Failover {
  724. if err = logic.EnterpriseResetFailoverFunc(node.Network); err != nil {
  725. logger.Log(1, "failed to reset failover list during failover create", node.ID.String(), node.Network)
  726. }
  727. }
  728. apiNode := node.ConvertToAPINode()
  729. logger.Log(1, r.Header.Get("user"), "created ingress gateway on node", nodeid, "on network", netid)
  730. w.WriteHeader(http.StatusOK)
  731. json.NewEncoder(w).Encode(apiNode)
  732. runUpdates(&node, true)
  733. }
  734. // swagger:route DELETE /api/nodes/{network}/{nodeid}/deleteingress nodes deleteIngressGateway
  735. //
  736. // Delete an ingress gateway.
  737. //
  738. // Schemes: https
  739. //
  740. // Security:
  741. // oauth
  742. //
  743. // Responses:
  744. // 200: nodeResponse
  745. func deleteIngressGateway(w http.ResponseWriter, r *http.Request) {
  746. w.Header().Set("Content-Type", "application/json")
  747. var params = mux.Vars(r)
  748. nodeid := params["nodeid"]
  749. netid := params["network"]
  750. node, wasFailover, err := logic.DeleteIngressGateway(netid, nodeid)
  751. if err != nil {
  752. logger.Log(0, r.Header.Get("user"),
  753. fmt.Sprintf("failed to delete ingress gateway on node [%s] on network [%s]: %v",
  754. nodeid, netid, err))
  755. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  756. return
  757. }
  758. if servercfg.Is_EE && wasFailover {
  759. if err = logic.EnterpriseResetFailoverFunc(node.Network); err != nil {
  760. logger.Log(1, "failed to reset failover list during failover create", node.ID.String(), node.Network)
  761. }
  762. }
  763. apiNode := node.ConvertToAPINode()
  764. logger.Log(1, r.Header.Get("user"), "deleted ingress gateway", nodeid)
  765. w.WriteHeader(http.StatusOK)
  766. json.NewEncoder(w).Encode(apiNode)
  767. runUpdates(&node, true)
  768. }
  769. // swagger:route PUT /api/nodes/{network}/{nodeid}/migrate nodes migrateNode
  770. //
  771. // Used to migrate a legacy node.
  772. //
  773. // Schemes: https
  774. //
  775. // Security:
  776. // oauth
  777. //
  778. // Responses:
  779. // 200: nodeResponse
  780. func nodeNodeUpdate(w http.ResponseWriter, r *http.Request) {
  781. // should only be used by nodes
  782. w.Header().Set("Content-Type", "application/json")
  783. var params = mux.Vars(r)
  784. //start here
  785. nodeid := params["nodeid"]
  786. currentNode, err := logic.GetNodeByID(nodeid)
  787. if err != nil {
  788. logger.Log(0,
  789. fmt.Sprintf("error fetching node [ %s ] info: %v during migrate", nodeid, err))
  790. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  791. return
  792. }
  793. var newNode models.Node
  794. // we decode our body request params
  795. err = json.NewDecoder(r.Body).Decode(&newNode)
  796. if err != nil {
  797. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  798. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  799. return
  800. }
  801. if !servercfg.GetRce() {
  802. newNode.PostDown = currentNode.PostDown
  803. newNode.PostUp = currentNode.PostUp
  804. }
  805. ifaceDelta := logic.IfaceDelta(&currentNode, &newNode)
  806. if ifaceDelta && servercfg.Is_EE {
  807. if err = logic.EnterpriseResetAllPeersFailovers(currentNode.ID.String(), currentNode.Network); err != nil {
  808. logger.Log(0, "failed to reset failover lists during node update for node", currentNode.ID.String(), currentNode.Network)
  809. }
  810. }
  811. err = logic.UpdateNode(&currentNode, &newNode)
  812. if err != nil {
  813. logger.Log(0, r.Header.Get("user"),
  814. fmt.Sprintf("failed to update node info [ %s ] info: %v", nodeid, err))
  815. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  816. return
  817. }
  818. if servercfg.IsDNSMode() {
  819. logic.SetDNS()
  820. }
  821. logger.Log(1, r.Header.Get("user"), "updated node", currentNode.ID.String(), "on network", currentNode.Network)
  822. w.WriteHeader(http.StatusOK)
  823. json.NewEncoder(w).Encode(newNode)
  824. runUpdates(&newNode, ifaceDelta)
  825. }
  826. // swagger:route PUT /api/nodes/{network}/{nodeid} nodes updateNode
  827. //
  828. // Update an individual node.
  829. //
  830. // Schemes: https
  831. //
  832. // Security:
  833. // oauth
  834. //
  835. // Responses:
  836. // 200: nodeResponse
  837. func updateNode(w http.ResponseWriter, r *http.Request) {
  838. w.Header().Set("Content-Type", "application/json")
  839. var params = mux.Vars(r)
  840. //start here
  841. nodeid := params["nodeid"]
  842. currentNode, err := logic.GetNodeByID(nodeid)
  843. if err != nil {
  844. logger.Log(0, r.Header.Get("user"),
  845. fmt.Sprintf("error fetching node [ %s ] info: %v", nodeid, err))
  846. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  847. return
  848. }
  849. var newData models.ApiNode
  850. // we decode our body request params
  851. err = json.NewDecoder(r.Body).Decode(&newData)
  852. if err != nil {
  853. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  854. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  855. return
  856. }
  857. newNode := newData.ConvertToServerNode(&currentNode)
  858. if !servercfg.GetRce() {
  859. newNode.PostDown = currentNode.PostDown
  860. newNode.PostUp = currentNode.PostUp
  861. }
  862. ifaceDelta := logic.IfaceDelta(&currentNode, newNode)
  863. if ifaceDelta && servercfg.Is_EE {
  864. if err = logic.EnterpriseResetAllPeersFailovers(currentNode.ID.String(), currentNode.Network); err != nil {
  865. logger.Log(0, "failed to reset failover lists during node update for node", currentNode.ID.String(), currentNode.Network)
  866. }
  867. }
  868. err = logic.UpdateNode(&currentNode, newNode)
  869. if err != nil {
  870. logger.Log(0, r.Header.Get("user"),
  871. fmt.Sprintf("failed to update node info [ %s ] info: %v", nodeid, err))
  872. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  873. return
  874. }
  875. if servercfg.IsDNSMode() {
  876. logic.SetDNS()
  877. }
  878. apiNode := newNode.ConvertToAPINode()
  879. logger.Log(1, r.Header.Get("user"), "updated node", currentNode.ID.String(), "on network", currentNode.Network)
  880. w.WriteHeader(http.StatusOK)
  881. json.NewEncoder(w).Encode(apiNode)
  882. runUpdates(newNode, ifaceDelta)
  883. }
  884. // swagger:route DELETE /api/nodes/{network}/{nodeid} nodes deleteNode
  885. //
  886. // Delete an individual node.
  887. //
  888. // Schemes: https
  889. //
  890. // Security:
  891. // oauth
  892. //
  893. // Responses:
  894. // 200: nodeResponse
  895. func deleteNode(w http.ResponseWriter, r *http.Request) {
  896. // Set header
  897. w.Header().Set("Content-Type", "application/json")
  898. // get params
  899. var params = mux.Vars(r)
  900. var nodeid = params["nodeid"]
  901. fromNode := r.Header.Get("requestfrom") == "node"
  902. node, err := logic.GetNodeByID(nodeid)
  903. if err != nil {
  904. logger.Log(0, "error retrieving node to delete", err.Error())
  905. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  906. return
  907. }
  908. host, err := logic.GetHost(node.HostID.String())
  909. if err != nil {
  910. logger.Log(0, "error retrieving host for node", node.ID.String(), err.Error())
  911. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  912. return
  913. }
  914. if r.Header.Get("ismaster") != "yes" {
  915. username := r.Header.Get("user")
  916. if username != "" && !doesUserOwnNode(username, params["network"], nodeid) {
  917. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("user not permitted"), "badrequest"))
  918. return
  919. }
  920. }
  921. if err := logic.DeleteNode(&node, fromNode); err != nil {
  922. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("failed to delete node"), "internal"))
  923. return
  924. }
  925. if fromNode {
  926. // update networks for host mq client
  927. currNets := logic.GetHostNetworks(host.ID.String())
  928. if len(currNets) > 0 {
  929. mq.ModifyClient(&mq.MqClient{
  930. ID: host.ID.String(),
  931. Text: host.Name,
  932. Networks: currNets,
  933. })
  934. }
  935. }
  936. logic.ReturnSuccessResponse(w, r, nodeid+" deleted.")
  937. logger.Log(1, r.Header.Get("user"), "Deleted node", nodeid, "from network", params["network"])
  938. if !fromNode {
  939. runUpdates(&node, false)
  940. return
  941. }
  942. go func(network string) {
  943. if err := mq.PublishPeerUpdate(); err != nil {
  944. logger.Log(1, "error publishing peer update ", err.Error())
  945. }
  946. }(node.Network)
  947. }
  948. func runUpdates(node *models.Node, ifaceDelta bool) {
  949. go func() { // don't block http response
  950. // publish node update if not server
  951. if err := mq.NodeUpdate(node); err != nil {
  952. logger.Log(1, "error publishing node update to node", node.ID.String(), err.Error())
  953. }
  954. }()
  955. }
  956. func doesUserOwnNode(username, network, nodeID string) bool {
  957. u, err := logic.GetUser(username)
  958. if err != nil {
  959. return false
  960. }
  961. if u.IsAdmin {
  962. return true
  963. }
  964. netUser, err := pro.GetNetworkUser(network, promodels.NetworkUserID(u.UserName))
  965. if err != nil {
  966. return false
  967. }
  968. if netUser.AccessLevel == pro.NET_ADMIN {
  969. return true
  970. }
  971. return logic.StringSliceContains(netUser.Nodes, nodeID)
  972. }