migrate.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package controller
  2. import (
  3. "encoding/json"
  4. "io"
  5. "net/http"
  6. "strings"
  7. "github.com/gorilla/mux"
  8. "github.com/gravitl/netmaker/database"
  9. "github.com/gravitl/netmaker/logger"
  10. "github.com/gravitl/netmaker/logic"
  11. "github.com/gravitl/netmaker/models"
  12. "golang.org/x/crypto/bcrypt"
  13. )
  14. // swagger:route PUT /api/nodes/{network}/{nodeid}/migrate nodes migrateNode
  15. //
  16. // Used to migrate a legacy node.
  17. //
  18. // Schemes: https
  19. //
  20. // Security:
  21. // oauth
  22. //
  23. // Responses:
  24. // 200: nodeJoinResponse
  25. func migrate(w http.ResponseWriter, r *http.Request) {
  26. // we decode our body request params
  27. data := models.MigrationData{}
  28. err := json.NewDecoder(r.Body).Decode(&data)
  29. if err != nil {
  30. logger.Log(0, r.Header.Get("user"), "error decoding request body: ", err.Error())
  31. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  32. return
  33. }
  34. params := mux.Vars(r)
  35. //check authorization
  36. record, err := database.FetchRecord(database.NODES_TABLE_NAME, data.LegacyNodeID)
  37. if err != nil {
  38. logger.Log(0, "no record for legacy node", data.LegacyNodeID, err.Error())
  39. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  40. return
  41. }
  42. var legacyNode models.LegacyNode
  43. if err = json.Unmarshal([]byte(record), &legacyNode); err != nil {
  44. logger.Log(0, "error decoding legacy node", err.Error())
  45. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  46. return
  47. }
  48. if err := bcrypt.CompareHashAndPassword([]byte(legacyNode.Password), []byte(data.Password)); err != nil {
  49. logger.Log(0, "error decoding legacy password", err.Error())
  50. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "unauthorized"))
  51. return
  52. }
  53. network, err := logic.GetNetwork(params["network"])
  54. if err != nil {
  55. logger.Log(0, "error retrieving network: ", err.Error())
  56. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  57. return
  58. }
  59. key, err := logic.CreateAccessKey(models.AccessKey{}, network)
  60. if err != nil {
  61. logger.Log(0, "error creating key: ", err.Error())
  62. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  63. return
  64. }
  65. data.JoinData.Key = key.Value
  66. payload, err := json.Marshal(data.JoinData)
  67. if err != nil {
  68. logger.Log(0, "error encoding data: ", err.Error())
  69. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  70. return
  71. }
  72. r.Body = io.NopCloser(strings.NewReader(string(payload)))
  73. r.ContentLength = int64(len(string(payload)))
  74. createNode(w, r)
  75. }