filer_etc_policy.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package filer_etc
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "github.com/seaweedfs/seaweedfs/weed/filer"
  7. "github.com/seaweedfs/seaweedfs/weed/glog"
  8. "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
  9. "github.com/seaweedfs/seaweedfs/weed/s3api/policy_engine"
  10. )
  11. type PoliciesCollection struct {
  12. Policies map[string]policy_engine.PolicyDocument `json:"policies"`
  13. }
  14. // GetPolicies retrieves all IAM policies from the filer
  15. func (store *FilerEtcStore) GetPolicies(ctx context.Context) (map[string]policy_engine.PolicyDocument, error) {
  16. policiesCollection := &PoliciesCollection{
  17. Policies: make(map[string]policy_engine.PolicyDocument),
  18. }
  19. // Check if filer client is configured
  20. if store.filerGrpcAddress == "" {
  21. glog.V(1).Infof("Filer client not configured for policy retrieval, returning empty policies")
  22. // Return empty policies if filer client is not configured
  23. return policiesCollection.Policies, nil
  24. }
  25. err := store.withFilerClient(func(client filer_pb.SeaweedFilerClient) error {
  26. var buf bytes.Buffer
  27. if err := filer.ReadEntry(nil, client, filer.IamConfigDirectory, filer.IamPoliciesFile, &buf); err != nil {
  28. if err == filer_pb.ErrNotFound {
  29. glog.V(1).Infof("Policies file not found at %s/%s, returning empty policies", filer.IamConfigDirectory, filer.IamPoliciesFile)
  30. // If file doesn't exist, return empty collection
  31. return nil
  32. }
  33. return err
  34. }
  35. if buf.Len() > 0 {
  36. return json.Unmarshal(buf.Bytes(), policiesCollection)
  37. }
  38. return nil
  39. })
  40. if err != nil {
  41. return nil, err
  42. }
  43. return policiesCollection.Policies, nil
  44. }
  45. // CreatePolicy creates a new IAM policy in the filer
  46. func (store *FilerEtcStore) CreatePolicy(ctx context.Context, name string, document policy_engine.PolicyDocument) error {
  47. return store.updatePolicies(ctx, func(policies map[string]policy_engine.PolicyDocument) {
  48. policies[name] = document
  49. })
  50. }
  51. // UpdatePolicy updates an existing IAM policy in the filer
  52. func (store *FilerEtcStore) UpdatePolicy(ctx context.Context, name string, document policy_engine.PolicyDocument) error {
  53. return store.updatePolicies(ctx, func(policies map[string]policy_engine.PolicyDocument) {
  54. policies[name] = document
  55. })
  56. }
  57. // DeletePolicy deletes an IAM policy from the filer
  58. func (store *FilerEtcStore) DeletePolicy(ctx context.Context, name string) error {
  59. return store.updatePolicies(ctx, func(policies map[string]policy_engine.PolicyDocument) {
  60. delete(policies, name)
  61. })
  62. }
  63. // updatePolicies is a helper method to update policies atomically
  64. func (store *FilerEtcStore) updatePolicies(ctx context.Context, updateFunc func(map[string]policy_engine.PolicyDocument)) error {
  65. // Load existing policies
  66. policies, err := store.GetPolicies(ctx)
  67. if err != nil {
  68. return err
  69. }
  70. // Apply update
  71. updateFunc(policies)
  72. // Save back to filer
  73. policiesCollection := &PoliciesCollection{
  74. Policies: policies,
  75. }
  76. data, err := json.Marshal(policiesCollection)
  77. if err != nil {
  78. return err
  79. }
  80. return store.withFilerClient(func(client filer_pb.SeaweedFilerClient) error {
  81. return filer.SaveInsideFiler(client, filer.IamConfigDirectory, filer.IamPoliciesFile, data)
  82. })
  83. }
  84. // GetPolicy retrieves a specific IAM policy by name from the filer
  85. func (store *FilerEtcStore) GetPolicy(ctx context.Context, name string) (*policy_engine.PolicyDocument, error) {
  86. policies, err := store.GetPolicies(ctx)
  87. if err != nil {
  88. return nil, err
  89. }
  90. if policy, exists := policies[name]; exists {
  91. return &policy, nil
  92. }
  93. return nil, nil // Policy not found
  94. }