network.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  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/acls"
  13. "github.com/gravitl/netmaker/models"
  14. "github.com/gravitl/netmaker/mq"
  15. "github.com/gravitl/netmaker/servercfg"
  16. )
  17. func networkHandlers(r *mux.Router) {
  18. r.HandleFunc("/api/networks", logic.SecurityCheck(false, http.HandlerFunc(getNetworks))).Methods("GET")
  19. r.HandleFunc("/api/networks", logic.SecurityCheck(true, checkFreeTierLimits(networks_l, http.HandlerFunc(createNetwork)))).Methods("POST")
  20. r.HandleFunc("/api/networks/{networkname}", logic.SecurityCheck(false, http.HandlerFunc(getNetwork))).Methods("GET")
  21. r.HandleFunc("/api/networks/{networkname}", logic.SecurityCheck(false, http.HandlerFunc(updateNetwork))).Methods("PUT")
  22. r.HandleFunc("/api/networks/{networkname}/nodelimit", logic.SecurityCheck(true, http.HandlerFunc(updateNetworkNodeLimit))).Methods("PUT")
  23. r.HandleFunc("/api/networks/{networkname}", logic.SecurityCheck(true, http.HandlerFunc(deleteNetwork))).Methods("DELETE")
  24. r.HandleFunc("/api/networks/{networkname}/keyupdate", logic.SecurityCheck(true, http.HandlerFunc(keyUpdate))).Methods("POST")
  25. r.HandleFunc("/api/networks/{networkname}/keys", logic.SecurityCheck(false, http.HandlerFunc(createAccessKey))).Methods("POST")
  26. r.HandleFunc("/api/networks/{networkname}/keys", logic.SecurityCheck(false, http.HandlerFunc(getAccessKeys))).Methods("GET")
  27. r.HandleFunc("/api/networks/{networkname}/keys/{name}", logic.SecurityCheck(false, http.HandlerFunc(deleteAccessKey))).Methods("DELETE")
  28. // ACLs
  29. r.HandleFunc("/api/networks/{networkname}/acls", logic.SecurityCheck(true, http.HandlerFunc(updateNetworkACL))).Methods("PUT")
  30. r.HandleFunc("/api/networks/{networkname}/acls", logic.SecurityCheck(true, http.HandlerFunc(getNetworkACL))).Methods("GET")
  31. }
  32. // swagger:route GET /api/networks networks getNetworks
  33. //
  34. // Lists all networks.
  35. //
  36. // Schemes: https
  37. //
  38. // Security:
  39. // oauth
  40. //
  41. // Responses:
  42. // 200: getNetworksSliceResponse
  43. func getNetworks(w http.ResponseWriter, r *http.Request) {
  44. headerNetworks := r.Header.Get("networks")
  45. networksSlice := []string{}
  46. marshalErr := json.Unmarshal([]byte(headerNetworks), &networksSlice)
  47. if marshalErr != nil {
  48. logger.Log(0, r.Header.Get("user"), "error unmarshalling networks: ",
  49. marshalErr.Error())
  50. logic.ReturnErrorResponse(w, r, logic.FormatError(marshalErr, "badrequest"))
  51. return
  52. }
  53. allnetworks := []models.Network{}
  54. var err error
  55. if networksSlice[0] == logic.ALL_NETWORK_ACCESS {
  56. allnetworks, err = logic.GetNetworks()
  57. if err != nil && !database.IsEmptyRecord(err) {
  58. logger.Log(0, r.Header.Get("user"), "failed to fetch networks: ", err.Error())
  59. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  60. return
  61. }
  62. } else {
  63. for _, network := range networksSlice {
  64. netObject, parentErr := logic.GetParentNetwork(network)
  65. if parentErr == nil {
  66. allnetworks = append(allnetworks, netObject)
  67. }
  68. }
  69. }
  70. if !servercfg.IsDisplayKeys() {
  71. for i, net := range allnetworks {
  72. net.AccessKeys = logic.RemoveKeySensitiveInfo(net.AccessKeys)
  73. allnetworks[i] = net
  74. }
  75. }
  76. logger.Log(2, r.Header.Get("user"), "fetched networks.")
  77. w.WriteHeader(http.StatusOK)
  78. json.NewEncoder(w).Encode(allnetworks)
  79. }
  80. // swagger:route GET /api/networks/{networkname} networks getNetwork
  81. //
  82. // Get a network.
  83. //
  84. // Schemes: https
  85. //
  86. // Security:
  87. // oauth
  88. //
  89. // Responses:
  90. // 200: networkBodyResponse
  91. func getNetwork(w http.ResponseWriter, r *http.Request) {
  92. // set header.
  93. w.Header().Set("Content-Type", "application/json")
  94. var params = mux.Vars(r)
  95. netname := params["networkname"]
  96. network, err := logic.GetNetwork(netname)
  97. if err != nil {
  98. logger.Log(0, r.Header.Get("user"), fmt.Sprintf("failed to fetch network [%s] info: %v",
  99. netname, err))
  100. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  101. return
  102. }
  103. if !servercfg.IsDisplayKeys() {
  104. network.AccessKeys = logic.RemoveKeySensitiveInfo(network.AccessKeys)
  105. }
  106. logger.Log(2, r.Header.Get("user"), "fetched network", netname)
  107. w.WriteHeader(http.StatusOK)
  108. json.NewEncoder(w).Encode(network)
  109. }
  110. // swagger:route POST /api/networks/{networkname}/keyupdate networks keyUpdate
  111. //
  112. // Update keys for a network.
  113. //
  114. // Schemes: https
  115. //
  116. // Security:
  117. // oauth
  118. //
  119. // Responses:
  120. // 200: networkBodyResponse
  121. func keyUpdate(w http.ResponseWriter, r *http.Request) {
  122. w.Header().Set("Content-Type", "application/json")
  123. var params = mux.Vars(r)
  124. netname := params["networkname"]
  125. network, err := logic.KeyUpdate(netname)
  126. if err != nil {
  127. logger.Log(0, r.Header.Get("user"), fmt.Sprintf("failed to update keys for network [%s]: %v",
  128. netname, err))
  129. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  130. return
  131. }
  132. logger.Log(2, r.Header.Get("user"), "updated key on network", netname)
  133. w.WriteHeader(http.StatusOK)
  134. json.NewEncoder(w).Encode(network)
  135. nodes, err := logic.GetNetworkNodes(netname)
  136. if err != nil {
  137. logger.Log(0, "failed to retrieve network nodes for network", netname, err.Error())
  138. return
  139. }
  140. for _, node := range nodes {
  141. logger.Log(2, "updating node ", node.Name, " for a key update")
  142. if node.IsServer != "yes" {
  143. if err = mq.NodeUpdate(&node); err != nil {
  144. logger.Log(1, "failed to send update to node during a network wide key update", node.Name, node.ID, err.Error())
  145. }
  146. }
  147. }
  148. }
  149. // swagger:route PUT /api/networks/{networkname} networks updateNetwork
  150. //
  151. // Update a network.
  152. //
  153. // Schemes: https
  154. //
  155. // Security:
  156. // oauth
  157. //
  158. // Responses:
  159. // 200: networkBodyResponse
  160. func updateNetwork(w http.ResponseWriter, r *http.Request) {
  161. w.Header().Set("Content-Type", "application/json")
  162. var params = mux.Vars(r)
  163. var network models.Network
  164. netname := params["networkname"]
  165. network, err := logic.GetParentNetwork(netname)
  166. if err != nil {
  167. logger.Log(0, r.Header.Get("user"), "failed to get network info: ",
  168. err.Error())
  169. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  170. return
  171. }
  172. var newNetwork models.Network
  173. err = json.NewDecoder(r.Body).Decode(&newNetwork)
  174. if err != nil {
  175. logger.Log(0, r.Header.Get("user"), "error decoding request body: ",
  176. err.Error())
  177. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  178. return
  179. }
  180. if !servercfg.GetRce() {
  181. newNetwork.DefaultPostDown = network.DefaultPostDown
  182. newNetwork.DefaultPostUp = network.DefaultPostUp
  183. }
  184. rangeupdate4, rangeupdate6, localrangeupdate, holepunchupdate, groupsDelta, userDelta, err := logic.UpdateNetwork(&network, &newNetwork)
  185. if err != nil {
  186. logger.Log(0, r.Header.Get("user"), "failed to update network: ",
  187. err.Error())
  188. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  189. return
  190. }
  191. if len(groupsDelta) > 0 {
  192. for _, g := range groupsDelta {
  193. users, err := logic.GetGroupUsers(g)
  194. if err == nil {
  195. for _, user := range users {
  196. logic.AdjustNetworkUserPermissions(&user, &newNetwork)
  197. }
  198. }
  199. }
  200. }
  201. if len(userDelta) > 0 {
  202. for _, uname := range userDelta {
  203. user, err := logic.GetReturnUser(uname)
  204. if err == nil {
  205. logic.AdjustNetworkUserPermissions(&user, &newNetwork)
  206. }
  207. }
  208. }
  209. if rangeupdate4 {
  210. err = logic.UpdateNetworkNodeAddresses(network.NetID)
  211. if err != nil {
  212. logger.Log(0, r.Header.Get("user"),
  213. fmt.Sprintf("failed to update network [%s] ipv4 addresses: %v",
  214. network.NetID, err.Error()))
  215. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  216. return
  217. }
  218. }
  219. if rangeupdate6 {
  220. err = logic.UpdateNetworkNodeAddresses6(network.NetID)
  221. if err != nil {
  222. logger.Log(0, r.Header.Get("user"),
  223. fmt.Sprintf("failed to update network [%s] ipv6 addresses: %v",
  224. network.NetID, err.Error()))
  225. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  226. return
  227. }
  228. }
  229. if localrangeupdate {
  230. err = logic.UpdateNetworkLocalAddresses(network.NetID)
  231. if err != nil {
  232. logger.Log(0, r.Header.Get("user"),
  233. fmt.Sprintf("failed to update network [%s] local addresses: %v",
  234. network.NetID, err.Error()))
  235. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  236. return
  237. }
  238. }
  239. if holepunchupdate {
  240. err = logic.UpdateNetworkHolePunching(network.NetID, newNetwork.DefaultUDPHolePunch)
  241. if err != nil {
  242. logger.Log(0, r.Header.Get("user"),
  243. fmt.Sprintf("failed to update network [%s] hole punching: %v",
  244. network.NetID, err.Error()))
  245. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  246. return
  247. }
  248. }
  249. if rangeupdate4 || rangeupdate6 || localrangeupdate || holepunchupdate {
  250. nodes, err := logic.GetNetworkNodes(network.NetID)
  251. if err != nil {
  252. logger.Log(0, r.Header.Get("user"),
  253. fmt.Sprintf("failed to get network [%s] nodes: %v",
  254. network.NetID, err.Error()))
  255. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  256. return
  257. }
  258. for _, node := range nodes {
  259. runUpdates(&node, true)
  260. }
  261. }
  262. logger.Log(1, r.Header.Get("user"), "updated network", netname)
  263. w.WriteHeader(http.StatusOK)
  264. json.NewEncoder(w).Encode(newNetwork)
  265. }
  266. // swagger:route PUT /api/networks/{networkname}/nodelimit networks updateNetworkNodeLimit
  267. //
  268. // Update a network's node limit.
  269. //
  270. // Schemes: https
  271. //
  272. // Security:
  273. // oauth
  274. //
  275. // Responses:
  276. // 200: networkBodyResponse
  277. func updateNetworkNodeLimit(w http.ResponseWriter, r *http.Request) {
  278. w.Header().Set("Content-Type", "application/json")
  279. var params = mux.Vars(r)
  280. var network models.Network
  281. netname := params["networkname"]
  282. network, err := logic.GetParentNetwork(netname)
  283. if err != nil {
  284. logger.Log(0, r.Header.Get("user"),
  285. fmt.Sprintf("failed to get network [%s] nodes: %v",
  286. network.NetID, err.Error()))
  287. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  288. return
  289. }
  290. var networkChange models.Network
  291. err = json.NewDecoder(r.Body).Decode(&networkChange)
  292. if err != nil {
  293. logger.Log(0, r.Header.Get("user"), "error decoding request body: ",
  294. err.Error())
  295. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  296. return
  297. }
  298. if networkChange.NodeLimit != 0 {
  299. network.NodeLimit = networkChange.NodeLimit
  300. data, err := json.Marshal(&network)
  301. if err != nil {
  302. logger.Log(0, r.Header.Get("user"),
  303. "error marshalling resp: ", err.Error())
  304. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  305. return
  306. }
  307. database.Insert(network.NetID, string(data), database.NETWORKS_TABLE_NAME)
  308. logger.Log(1, r.Header.Get("user"), "updated network node limit on", netname)
  309. }
  310. w.WriteHeader(http.StatusOK)
  311. json.NewEncoder(w).Encode(network)
  312. }
  313. // swagger:route PUT /api/networks/{networkname}/acls networks updateNetworkACL
  314. //
  315. // Update a network ACL (Access Control List).
  316. //
  317. // Schemes: https
  318. //
  319. // Security:
  320. // oauth
  321. //
  322. // Responses:
  323. // 200: aclContainerResponse
  324. func updateNetworkACL(w http.ResponseWriter, r *http.Request) {
  325. w.Header().Set("Content-Type", "application/json")
  326. var params = mux.Vars(r)
  327. netname := params["networkname"]
  328. var networkACLChange acls.ACLContainer
  329. networkACLChange, err := networkACLChange.Get(acls.ContainerID(netname))
  330. if err != nil {
  331. logger.Log(0, r.Header.Get("user"),
  332. fmt.Sprintf("failed to fetch ACLs for network [%s]: %v", netname, err))
  333. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  334. return
  335. }
  336. err = json.NewDecoder(r.Body).Decode(&networkACLChange)
  337. if err != nil {
  338. logger.Log(0, r.Header.Get("user"), "error decoding request body: ",
  339. err.Error())
  340. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  341. return
  342. }
  343. newNetACL, err := networkACLChange.Save(acls.ContainerID(netname))
  344. if err != nil {
  345. logger.Log(0, r.Header.Get("user"),
  346. fmt.Sprintf("failed to update ACLs for network [%s]: %v", netname, err))
  347. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  348. return
  349. }
  350. logger.Log(1, r.Header.Get("user"), "updated ACLs for network", netname)
  351. // send peer updates
  352. if servercfg.IsMessageQueueBackend() {
  353. serverNode, err := logic.GetNetworkServerLocal(netname)
  354. if err != nil {
  355. logger.Log(1, "failed to find server node after ACL update on", netname)
  356. } else {
  357. if err = logic.ServerUpdate(&serverNode, false); err != nil {
  358. logger.Log(1, "failed to update server node after ACL update on", netname)
  359. }
  360. if err = mq.PublishPeerUpdate(&serverNode, false); err != nil {
  361. logger.Log(0, "failed to publish peer update after ACL update on", netname)
  362. }
  363. }
  364. }
  365. w.WriteHeader(http.StatusOK)
  366. json.NewEncoder(w).Encode(newNetACL)
  367. }
  368. // swagger:route GET /api/networks/{networkname}/acls networks getNetworkACL
  369. //
  370. // Get a network ACL (Access Control List).
  371. //
  372. // Schemes: https
  373. //
  374. // Security:
  375. // oauth
  376. //
  377. // Responses:
  378. // 200: aclContainerResponse
  379. func getNetworkACL(w http.ResponseWriter, r *http.Request) {
  380. w.Header().Set("Content-Type", "application/json")
  381. var params = mux.Vars(r)
  382. netname := params["networkname"]
  383. var networkACL acls.ACLContainer
  384. networkACL, err := networkACL.Get(acls.ContainerID(netname))
  385. if err != nil {
  386. logger.Log(0, r.Header.Get("user"),
  387. fmt.Sprintf("failed to fetch ACLs for network [%s]: %v", netname, err))
  388. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  389. return
  390. }
  391. logger.Log(2, r.Header.Get("user"), "fetched acl for network", netname)
  392. w.WriteHeader(http.StatusOK)
  393. json.NewEncoder(w).Encode(networkACL)
  394. }
  395. // swagger:route DELETE /api/networks/{networkname} networks deleteNetwork
  396. //
  397. // Delete a network. Will not delete if there are any nodes that belong to the network.
  398. //
  399. // Schemes: https
  400. //
  401. // Security:
  402. // oauth
  403. //
  404. // Responses:
  405. // 200: stringJSONResponse
  406. func deleteNetwork(w http.ResponseWriter, r *http.Request) {
  407. // Set header
  408. w.Header().Set("Content-Type", "application/json")
  409. var params = mux.Vars(r)
  410. network := params["networkname"]
  411. err := logic.DeleteNetwork(network)
  412. if err != nil {
  413. errtype := "badrequest"
  414. if strings.Contains(err.Error(), "Node check failed") {
  415. errtype = "forbidden"
  416. }
  417. logger.Log(0, r.Header.Get("user"),
  418. fmt.Sprintf("failed to delete network [%s]: %v", network, err))
  419. logic.ReturnErrorResponse(w, r, logic.FormatError(err, errtype))
  420. return
  421. }
  422. // Deletes the network role from MQ
  423. event := mq.MqDynsecPayload{
  424. Commands: []mq.MqDynSecCmd{
  425. {
  426. Command: mq.DeleteRoleCmd,
  427. RoleName: network,
  428. },
  429. },
  430. }
  431. if err := mq.PublishEventToDynSecTopic(event); err != nil {
  432. logger.Log(0, fmt.Sprintf("failed to send DynSec command [%v]: %v",
  433. event.Commands, err.Error()))
  434. }
  435. logger.Log(1, r.Header.Get("user"), "deleted network", network)
  436. w.WriteHeader(http.StatusOK)
  437. json.NewEncoder(w).Encode("success")
  438. }
  439. // swagger:route POST /api/networks networks createNetwork
  440. //
  441. // Create a network.
  442. //
  443. // Schemes: https
  444. //
  445. // Security:
  446. // oauth
  447. //
  448. // Responses:
  449. // 200: networkBodyResponse
  450. func createNetwork(w http.ResponseWriter, r *http.Request) {
  451. w.Header().Set("Content-Type", "application/json")
  452. var network models.Network
  453. // we decode our body request params
  454. err := json.NewDecoder(r.Body).Decode(&network)
  455. if err != nil {
  456. logger.Log(0, r.Header.Get("user"), "error decoding request body: ",
  457. err.Error())
  458. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  459. return
  460. }
  461. if network.AddressRange == "" && network.AddressRange6 == "" {
  462. err := errors.New("IPv4 or IPv6 CIDR required")
  463. logger.Log(0, r.Header.Get("user"), "failed to create network: ",
  464. err.Error())
  465. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  466. return
  467. }
  468. network, err = logic.CreateNetwork(network)
  469. if err != nil {
  470. logger.Log(0, r.Header.Get("user"), "failed to create network: ",
  471. err.Error())
  472. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  473. return
  474. }
  475. // Create Role with acls for the network
  476. event := mq.MqDynsecPayload{
  477. Commands: []mq.MqDynSecCmd{
  478. {
  479. Command: mq.CreateRoleCmd,
  480. RoleName: network.NetID,
  481. Textname: "Network wide role with Acls for nodes",
  482. Acls: mq.FetchNetworkAcls(network.NetID),
  483. },
  484. },
  485. }
  486. if err := mq.PublishEventToDynSecTopic(event); err != nil {
  487. logger.Log(0, fmt.Sprintf("failed to send DynSec command [%v]: %v",
  488. event.Commands, err.Error()))
  489. }
  490. if servercfg.IsClientMode() != "off" {
  491. _, err := logic.ServerJoin(&network)
  492. if err != nil {
  493. logic.DeleteNetwork(network.NetID)
  494. if err == nil {
  495. err = errors.New("Failed to add server to network " + network.NetID)
  496. }
  497. logger.Log(0, r.Header.Get("user"), "failed to create network: ",
  498. err.Error())
  499. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  500. return
  501. }
  502. }
  503. logger.Log(1, r.Header.Get("user"), "created network", network.NetID)
  504. w.WriteHeader(http.StatusOK)
  505. json.NewEncoder(w).Encode(network)
  506. }
  507. // swagger:route POST /api/networks/{networkname}/keys networks createAccessKey
  508. //
  509. // Create a network access key.
  510. //
  511. // Schemes: https
  512. //
  513. // Security:
  514. // oauth
  515. //
  516. // Responses:
  517. // 200: accessKeyBodyResponse
  518. //
  519. // BEGIN KEY MANAGEMENT SECTION
  520. func createAccessKey(w http.ResponseWriter, r *http.Request) {
  521. w.Header().Set("Content-Type", "application/json")
  522. var params = mux.Vars(r)
  523. var accesskey models.AccessKey
  524. //start here
  525. netname := params["networkname"]
  526. network, err := logic.GetParentNetwork(netname)
  527. if err != nil {
  528. logger.Log(0, r.Header.Get("user"), "failed to get network info: ",
  529. err.Error())
  530. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  531. return
  532. }
  533. err = json.NewDecoder(r.Body).Decode(&accesskey)
  534. if err != nil {
  535. logger.Log(0, r.Header.Get("user"), "error decoding request body: ",
  536. err.Error())
  537. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  538. return
  539. }
  540. key, err := logic.CreateAccessKey(accesskey, network)
  541. if err != nil {
  542. logger.Log(0, r.Header.Get("user"), "failed to create access key: ",
  543. err.Error())
  544. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  545. return
  546. }
  547. // do not allow access key creations view API with user names
  548. if _, err = logic.GetUser(key.Name); err == nil {
  549. logger.Log(0, "access key creation with invalid name attempted by", r.Header.Get("user"))
  550. logic.ReturnErrorResponse(w, r, logic.FormatError(fmt.Errorf("cannot create access key with user name"), "badrequest"))
  551. logic.DeleteKey(key.Name, network.NetID)
  552. return
  553. }
  554. logger.Log(1, r.Header.Get("user"), "created access key", accesskey.Name, "on", netname)
  555. w.WriteHeader(http.StatusOK)
  556. json.NewEncoder(w).Encode(key)
  557. }
  558. // swagger:route GET /api/networks/{networkname}/keys networks getAccessKeys
  559. //
  560. // Get network access keys for a network.
  561. //
  562. // Schemes: https
  563. //
  564. // Security:
  565. // oauth
  566. //
  567. // Responses:
  568. // 200: accessKeySliceBodyResponse
  569. func getAccessKeys(w http.ResponseWriter, r *http.Request) {
  570. w.Header().Set("Content-Type", "application/json")
  571. var params = mux.Vars(r)
  572. network := params["networkname"]
  573. keys, err := logic.GetKeys(network)
  574. if err != nil {
  575. logger.Log(0, r.Header.Get("user"), fmt.Sprintf("failed to get keys for network [%s]: %v",
  576. network, err))
  577. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  578. return
  579. }
  580. if !servercfg.IsDisplayKeys() {
  581. keys = logic.RemoveKeySensitiveInfo(keys)
  582. }
  583. logger.Log(2, r.Header.Get("user"), "fetched access keys on network", network)
  584. w.WriteHeader(http.StatusOK)
  585. json.NewEncoder(w).Encode(keys)
  586. }
  587. // swagger:route DELETE /api/networks/{networkname}/keys/{name} networks deleteAccessKey
  588. //
  589. // Delete a network access key.
  590. //
  591. // Schemes: https
  592. //
  593. // Security:
  594. // oauth
  595. //
  596. // Responses:
  597. // 200:
  598. // *: stringJSONResponse
  599. //
  600. // delete key. Has to do a little funky logic since it's not a collection item
  601. func deleteAccessKey(w http.ResponseWriter, r *http.Request) {
  602. w.Header().Set("Content-Type", "application/json")
  603. var params = mux.Vars(r)
  604. keyname := params["name"]
  605. netname := params["networkname"]
  606. err := logic.DeleteKey(keyname, netname)
  607. if err != nil {
  608. logger.Log(0, r.Header.Get("user"), fmt.Sprintf("failed to delete key [%s] for network [%s]: %v",
  609. keyname, netname, err))
  610. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  611. return
  612. }
  613. logger.Log(1, r.Header.Get("user"), "deleted access key", keyname, "on network,", netname)
  614. w.WriteHeader(http.StatusOK)
  615. }