You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							226 lines
						
					
					
						
							7.3 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							226 lines
						
					
					
						
							7.3 KiB
						
					
					
				| package dash | |
| 
 | |
| import ( | |
| 	"context" | |
| 	"fmt" | |
| 	"time" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/credential" | |
| 	"github.com/seaweedfs/seaweedfs/weed/glog" | |
| 	"github.com/seaweedfs/seaweedfs/weed/s3api/policy_engine" | |
| ) | |
| 
 | |
| type IAMPolicy struct { | |
| 	Name         string                       `json:"name"` | |
| 	Document     policy_engine.PolicyDocument `json:"document"` | |
| 	DocumentJSON string                       `json:"document_json"` | |
| 	CreatedAt    time.Time                    `json:"created_at"` | |
| 	UpdatedAt    time.Time                    `json:"updated_at"` | |
| } | |
| 
 | |
| type PoliciesCollection struct { | |
| 	Policies map[string]policy_engine.PolicyDocument `json:"policies"` | |
| } | |
| 
 | |
| type PoliciesData struct { | |
| 	Username      string      `json:"username"` | |
| 	Policies      []IAMPolicy `json:"policies"` | |
| 	TotalPolicies int         `json:"total_policies"` | |
| 	LastUpdated   time.Time   `json:"last_updated"` | |
| } | |
| 
 | |
| // Policy management request structures | |
| type CreatePolicyRequest struct { | |
| 	Name         string                       `json:"name" binding:"required"` | |
| 	Document     policy_engine.PolicyDocument `json:"document" binding:"required"` | |
| 	DocumentJSON string                       `json:"document_json"` | |
| } | |
| 
 | |
| type UpdatePolicyRequest struct { | |
| 	Document     policy_engine.PolicyDocument `json:"document" binding:"required"` | |
| 	DocumentJSON string                       `json:"document_json"` | |
| } | |
| 
 | |
| // PolicyManager interface is now in the credential package | |
|  | |
| // CredentialStorePolicyManager implements credential.PolicyManager by delegating to the credential store | |
| type CredentialStorePolicyManager struct { | |
| 	credentialManager *credential.CredentialManager | |
| } | |
| 
 | |
| // NewCredentialStorePolicyManager creates a new CredentialStorePolicyManager | |
| func NewCredentialStorePolicyManager(credentialManager *credential.CredentialManager) *CredentialStorePolicyManager { | |
| 	return &CredentialStorePolicyManager{ | |
| 		credentialManager: credentialManager, | |
| 	} | |
| } | |
| 
 | |
| // GetPolicies retrieves all IAM policies via credential store | |
| func (cspm *CredentialStorePolicyManager) GetPolicies(ctx context.Context) (map[string]policy_engine.PolicyDocument, error) { | |
| 	// Get policies from credential store | |
| 	// We'll use the credential store to access the filer indirectly | |
| 	// Since policies are stored separately, we need to access the underlying store | |
| 	store := cspm.credentialManager.GetStore() | |
| 	glog.V(1).Infof("Getting policies from credential store: %T", store) | |
| 
 | |
| 	// Check if the store supports policy management | |
| 	if policyStore, ok := store.(credential.PolicyManager); ok { | |
| 		glog.V(1).Infof("Store supports policy management, calling GetPolicies") | |
| 		policies, err := policyStore.GetPolicies(ctx) | |
| 		if err != nil { | |
| 			glog.Errorf("Error getting policies from store: %v", err) | |
| 			return nil, err | |
| 		} | |
| 		glog.V(1).Infof("Got %d policies from store", len(policies)) | |
| 		return policies, nil | |
| 	} else { | |
| 		// Fallback: use empty policies for stores that don't support policies | |
| 		glog.V(1).Infof("Credential store doesn't support policy management, returning empty policies") | |
| 		return make(map[string]policy_engine.PolicyDocument), nil | |
| 	} | |
| } | |
| 
 | |
| // CreatePolicy creates a new IAM policy via credential store | |
| func (cspm *CredentialStorePolicyManager) CreatePolicy(ctx context.Context, name string, document policy_engine.PolicyDocument) error { | |
| 	store := cspm.credentialManager.GetStore() | |
| 
 | |
| 	if policyStore, ok := store.(credential.PolicyManager); ok { | |
| 		return policyStore.CreatePolicy(ctx, name, document) | |
| 	} | |
| 
 | |
| 	return fmt.Errorf("credential store doesn't support policy creation") | |
| } | |
| 
 | |
| // UpdatePolicy updates an existing IAM policy via credential store | |
| func (cspm *CredentialStorePolicyManager) UpdatePolicy(ctx context.Context, name string, document policy_engine.PolicyDocument) error { | |
| 	store := cspm.credentialManager.GetStore() | |
| 
 | |
| 	if policyStore, ok := store.(credential.PolicyManager); ok { | |
| 		return policyStore.UpdatePolicy(ctx, name, document) | |
| 	} | |
| 
 | |
| 	return fmt.Errorf("credential store doesn't support policy updates") | |
| } | |
| 
 | |
| // DeletePolicy deletes an IAM policy via credential store | |
| func (cspm *CredentialStorePolicyManager) DeletePolicy(ctx context.Context, name string) error { | |
| 	store := cspm.credentialManager.GetStore() | |
| 
 | |
| 	if policyStore, ok := store.(credential.PolicyManager); ok { | |
| 		return policyStore.DeletePolicy(ctx, name) | |
| 	} | |
| 
 | |
| 	return fmt.Errorf("credential store doesn't support policy deletion") | |
| } | |
| 
 | |
| // GetPolicy retrieves a specific IAM policy via credential store | |
| func (cspm *CredentialStorePolicyManager) GetPolicy(ctx context.Context, name string) (*policy_engine.PolicyDocument, error) { | |
| 	store := cspm.credentialManager.GetStore() | |
| 
 | |
| 	if policyStore, ok := store.(credential.PolicyManager); ok { | |
| 		return policyStore.GetPolicy(ctx, name) | |
| 	} | |
| 
 | |
| 	return nil, fmt.Errorf("credential store doesn't support policy retrieval") | |
| } | |
| 
 | |
| // AdminServer policy management methods using credential.PolicyManager | |
| func (s *AdminServer) GetPolicyManager() credential.PolicyManager { | |
| 	if s.credentialManager == nil { | |
| 		glog.V(1).Infof("Credential manager is nil, policy management not available") | |
| 		return nil | |
| 	} | |
| 	glog.V(1).Infof("Credential manager available, creating CredentialStorePolicyManager") | |
| 	return NewCredentialStorePolicyManager(s.credentialManager) | |
| } | |
| 
 | |
| // GetPolicies retrieves all IAM policies | |
| func (s *AdminServer) GetPolicies() ([]IAMPolicy, error) { | |
| 	policyManager := s.GetPolicyManager() | |
| 	if policyManager == nil { | |
| 		return nil, fmt.Errorf("policy manager not available") | |
| 	} | |
| 
 | |
| 	ctx := context.Background() | |
| 	policyMap, err := policyManager.GetPolicies(ctx) | |
| 	if err != nil { | |
| 		return nil, err | |
| 	} | |
| 
 | |
| 	// Convert map[string]PolicyDocument to []IAMPolicy | |
| 	var policies []IAMPolicy | |
| 	for name, doc := range policyMap { | |
| 		policy := IAMPolicy{ | |
| 			Name:         name, | |
| 			Document:     doc, | |
| 			DocumentJSON: "", // Will be populated if needed | |
| 			CreatedAt:    time.Now(), | |
| 			UpdatedAt:    time.Now(), | |
| 		} | |
| 		policies = append(policies, policy) | |
| 	} | |
| 
 | |
| 	return policies, nil | |
| } | |
| 
 | |
| // CreatePolicy creates a new IAM policy | |
| func (s *AdminServer) CreatePolicy(name string, document policy_engine.PolicyDocument) error { | |
| 	policyManager := s.GetPolicyManager() | |
| 	if policyManager == nil { | |
| 		return fmt.Errorf("policy manager not available") | |
| 	} | |
| 
 | |
| 	ctx := context.Background() | |
| 	return policyManager.CreatePolicy(ctx, name, document) | |
| } | |
| 
 | |
| // UpdatePolicy updates an existing IAM policy | |
| func (s *AdminServer) UpdatePolicy(name string, document policy_engine.PolicyDocument) error { | |
| 	policyManager := s.GetPolicyManager() | |
| 	if policyManager == nil { | |
| 		return fmt.Errorf("policy manager not available") | |
| 	} | |
| 
 | |
| 	ctx := context.Background() | |
| 	return policyManager.UpdatePolicy(ctx, name, document) | |
| } | |
| 
 | |
| // DeletePolicy deletes an IAM policy | |
| func (s *AdminServer) DeletePolicy(name string) error { | |
| 	policyManager := s.GetPolicyManager() | |
| 	if policyManager == nil { | |
| 		return fmt.Errorf("policy manager not available") | |
| 	} | |
| 
 | |
| 	ctx := context.Background() | |
| 	return policyManager.DeletePolicy(ctx, name) | |
| } | |
| 
 | |
| // GetPolicy retrieves a specific IAM policy | |
| func (s *AdminServer) GetPolicy(name string) (*IAMPolicy, error) { | |
| 	policyManager := s.GetPolicyManager() | |
| 	if policyManager == nil { | |
| 		return nil, fmt.Errorf("policy manager not available") | |
| 	} | |
| 
 | |
| 	ctx := context.Background() | |
| 	policyDoc, err := policyManager.GetPolicy(ctx, name) | |
| 	if err != nil { | |
| 		return nil, err | |
| 	} | |
| 
 | |
| 	if policyDoc == nil { | |
| 		return nil, nil | |
| 	} | |
| 
 | |
| 	// Convert PolicyDocument to IAMPolicy | |
| 	policy := &IAMPolicy{ | |
| 		Name:         name, | |
| 		Document:     *policyDoc, | |
| 		DocumentJSON: "", // Will be populated if needed | |
| 		CreatedAt:    time.Now(), | |
| 		UpdatedAt:    time.Now(), | |
| 	} | |
| 
 | |
| 	return policy, nil | |
| }
 |