remote_access_client.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //go:build ee
  2. // +build ee
  3. package pro
  4. import (
  5. "fmt"
  6. "time"
  7. "github.com/gravitl/netmaker/logic"
  8. "github.com/gravitl/netmaker/models"
  9. "github.com/gravitl/netmaker/mq"
  10. "golang.org/x/exp/slog"
  11. )
  12. const unauthorisedUserNodeCheckInterval = 3 * time.Minute
  13. // AddUnauthorisedUserNodeHooks - adds hook to prevent access from unauthorised (expired) user nodes
  14. func AddUnauthorisedUserNodeHooks() {
  15. slog.Debug("adding unauthorisedUserNode hook")
  16. logic.HookManagerCh <- models.HookDetails{
  17. Hook: unauthorisedUserNodeHook,
  18. Interval: unauthorisedUserNodeCheckInterval,
  19. }
  20. }
  21. // unauthorisedUserNodeHook - checks if a user node should be disabled, using the user's last login time
  22. func unauthorisedUserNodeHook() error {
  23. slog.Debug("running unauthorisedUserNode hook")
  24. users, err := logic.GetUsers()
  25. if err != nil {
  26. slog.Error("error getting users: ", "error", err)
  27. return err
  28. }
  29. clients, err := logic.GetAllExtClients()
  30. if err != nil {
  31. slog.Error("error getting clients: ", "error", err)
  32. return err
  33. }
  34. currentTime := time.Now()
  35. validityDuration := logic.GetJwtValidityDuration()
  36. for _, user := range users {
  37. if user.PlatformRoleID == models.AdminRole ||
  38. user.PlatformRoleID == models.SuperAdminRole {
  39. continue
  40. }
  41. if !currentTime.After(user.LastLoginTime.Add(validityDuration)) {
  42. continue
  43. }
  44. for _, client := range clients {
  45. if client.RemoteAccessClientID == "" {
  46. continue
  47. }
  48. if (client.OwnerID == user.UserName) &&
  49. client.Enabled {
  50. slog.Info(fmt.Sprintf("disabling user node %s for user %s: auth token expired", client.ClientID, client.OwnerID))
  51. if err := disableExtClient(&client); err != nil {
  52. slog.Error("error disabling user node", "error", err)
  53. continue // dont return but try for other clients
  54. }
  55. }
  56. }
  57. }
  58. slog.Debug("finished running unauthorisedUserNode hook")
  59. return nil
  60. }
  61. func disableExtClient(client *models.ExtClient) error {
  62. if newClient, err := logic.ToggleExtClientConnectivity(client, false); err != nil {
  63. return err
  64. } else {
  65. // publish peer update to ingress gateway
  66. if ingressNode, err := logic.GetNodeByID(newClient.IngressGatewayID); err == nil {
  67. if err = mq.PublishPeerUpdate(false); err != nil {
  68. slog.Error("error updating ext clients on", "ingress", ingressNode.ID.String(), "err", err.Error())
  69. }
  70. ingressHost, err := logic.GetHost(ingressNode.HostID.String())
  71. if err != nil {
  72. return err
  73. }
  74. nodes, err := logic.GetAllNodes()
  75. if err != nil {
  76. return err
  77. }
  78. go mq.PublishSingleHostPeerUpdate(ingressHost, nodes, nil, []models.ExtClient{*client}, false, nil)
  79. } else {
  80. return err
  81. }
  82. }
  83. return nil
  84. }