node.go 32 KB

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