google.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package google
  2. import (
  3. "context"
  4. "encoding/base64"
  5. "encoding/json"
  6. "github.com/gravitl/netmaker/logic"
  7. "github.com/gravitl/netmaker/pro/idp"
  8. admindir "google.golang.org/api/admin/directory/v1"
  9. "google.golang.org/api/impersonate"
  10. "google.golang.org/api/option"
  11. )
  12. type Client struct {
  13. service *admindir.Service
  14. }
  15. func NewGoogleWorkspaceClient() (*Client, error) {
  16. settings := logic.GetServerSettings()
  17. credsJson, err := base64.StdEncoding.DecodeString(settings.GoogleSACredsJson)
  18. if err != nil {
  19. return nil, err
  20. }
  21. credsJsonMap := make(map[string]interface{})
  22. err = json.Unmarshal(credsJson, &credsJsonMap)
  23. if err != nil {
  24. return nil, err
  25. }
  26. source, err := impersonate.CredentialsTokenSource(
  27. context.TODO(),
  28. impersonate.CredentialsConfig{
  29. TargetPrincipal: credsJsonMap["client_email"].(string),
  30. Scopes: []string{
  31. admindir.AdminDirectoryUserReadonlyScope,
  32. admindir.AdminDirectoryGroupReadonlyScope,
  33. admindir.AdminDirectoryGroupMemberReadonlyScope,
  34. },
  35. Subject: settings.GoogleAdminEmail,
  36. },
  37. option.WithCredentialsJSON(credsJson),
  38. )
  39. if err != nil {
  40. return nil, err
  41. }
  42. service, err := admindir.NewService(
  43. context.TODO(),
  44. option.WithTokenSource(source),
  45. )
  46. if err != nil {
  47. return nil, err
  48. }
  49. return &Client{
  50. service: service,
  51. }, nil
  52. }
  53. func (g *Client) GetUsers() ([]idp.User, error) {
  54. var retval []idp.User
  55. err := g.service.Users.List().
  56. Customer("my_customer").
  57. Fields("users(id,primaryEmail,name,suspended)", "nextPageToken").
  58. Pages(context.TODO(), func(users *admindir.Users) error {
  59. for _, user := range users.Users {
  60. retval = append(retval, idp.User{
  61. ID: user.Id,
  62. Username: user.PrimaryEmail,
  63. DisplayName: user.Name.FullName,
  64. AccountDisabled: user.Suspended,
  65. })
  66. }
  67. return nil
  68. })
  69. return retval, err
  70. }
  71. func (g *Client) GetGroups() ([]idp.Group, error) {
  72. var retval []idp.Group
  73. err := g.service.Groups.List().
  74. Customer("my_customer").
  75. Fields("groups(id,name)", "nextPageToken").
  76. Pages(context.TODO(), func(groups *admindir.Groups) error {
  77. for _, group := range groups.Groups {
  78. var retvalMembers []string
  79. err := g.service.Members.List(group.Id).
  80. Fields("members(id)", "nextPageToken").
  81. Pages(context.TODO(), func(members *admindir.Members) error {
  82. for _, member := range members.Members {
  83. retvalMembers = append(retvalMembers, member.Id)
  84. }
  85. return nil
  86. })
  87. if err != nil {
  88. return err
  89. }
  90. retval = append(retval, idp.Group{
  91. ID: group.Id,
  92. Name: group.Name,
  93. Members: retvalMembers,
  94. })
  95. }
  96. return nil
  97. })
  98. return retval, err
  99. }