auth.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package auth
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "os"
  6. "github.com/gravitl/netmaker/models"
  7. "github.com/gravitl/netmaker/netclient/config"
  8. "github.com/gravitl/netmaker/netclient/ncutils"
  9. // "os"
  10. "context"
  11. nodepb "github.com/gravitl/netmaker/grpc"
  12. "google.golang.org/grpc/codes"
  13. "google.golang.org/grpc/metadata"
  14. "google.golang.org/grpc/status"
  15. )
  16. // SetJWT func will used to create the JWT while signing in and signing out
  17. func SetJWT(client nodepb.NodeServiceClient, network string) (context.Context, error) {
  18. home := ncutils.GetNetclientPathSpecific()
  19. tokentext, err := os.ReadFile(home + "nettoken-" + network)
  20. if err != nil {
  21. err = AutoLogin(client, network)
  22. if err != nil {
  23. return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong with Auto Login: %v", err))
  24. }
  25. tokentext, err = ncutils.GetFileWithRetry(home+"nettoken-"+network, 1)
  26. if err != nil {
  27. return nil, status.Errorf(codes.Unauthenticated, fmt.Sprintf("Something went wrong: %v", err))
  28. }
  29. }
  30. token := string(tokentext)
  31. // Anything linked to this variable will transmit request headers.
  32. md := metadata.New(map[string]string{"authorization": token})
  33. ctx := context.Background()
  34. ctx = metadata.NewOutgoingContext(ctx, md)
  35. return ctx, nil
  36. }
  37. // AutoLogin - auto logins whenever client needs to request from server
  38. func AutoLogin(client nodepb.NodeServiceClient, network string) error {
  39. home := ncutils.GetNetclientPathSpecific()
  40. cfg, err := config.ReadConfig(network)
  41. if err != nil {
  42. return err
  43. }
  44. pass, err := RetrieveSecret(network)
  45. if err != nil {
  46. return err
  47. }
  48. node := models.Node{
  49. Password: pass,
  50. MacAddress: cfg.Node.MacAddress,
  51. ID: cfg.Node.ID,
  52. Network: network,
  53. }
  54. data, err := json.Marshal(&node)
  55. if err != nil {
  56. return nil
  57. }
  58. login := &nodepb.Object{
  59. Data: string(data),
  60. Type: nodepb.NODE_TYPE,
  61. }
  62. // RPC call
  63. res, err := client.Login(context.TODO(), login)
  64. if err != nil {
  65. return err
  66. }
  67. tokenstring := []byte(res.Data)
  68. err = os.WriteFile(home+"nettoken-"+network, tokenstring, 0600)
  69. if err != nil {
  70. return err
  71. }
  72. return err
  73. }
  74. // StoreSecret - stores auth secret locally
  75. func StoreSecret(key string, network string) error {
  76. d1 := []byte(key)
  77. return os.WriteFile(ncutils.GetNetclientPathSpecific()+"secret-"+network, d1, 0600)
  78. }
  79. // RetrieveSecret - fetches secret locally
  80. func RetrieveSecret(network string) (string, error) {
  81. dat, err := ncutils.GetFileWithRetry(ncutils.GetNetclientPathSpecific()+"secret-"+network, 3)
  82. return string(dat), err
  83. }
  84. // StoreTrafficKey - stores traffic key
  85. func StoreTrafficKey(key *[32]byte, network string) error {
  86. var data, err = ncutils.ConvertKeyToBytes(key)
  87. if err != nil {
  88. return err
  89. }
  90. return os.WriteFile(ncutils.GetNetclientPathSpecific()+"traffic-"+network, data, 0600)
  91. }
  92. // RetrieveTrafficKey - reads traffic file locally
  93. func RetrieveTrafficKey(network string) (*[32]byte, error) {
  94. data, err := ncutils.GetFileWithRetry(ncutils.GetNetclientPathSpecific()+"traffic-"+network, 2)
  95. if err != nil {
  96. return nil, err
  97. }
  98. return ncutils.ConvertBytesToKey(data)
  99. }
  100. // Configuraion - struct for mac and pass
  101. type Configuration struct {
  102. MacAddress string
  103. Password string
  104. }