@@ -76,11 +76,60 @@ class PhaseSecret:
7676 path : str = "/"
7777 tags : List [str ] = field (default_factory = list )
7878 overridden : bool = False
79+ application : Optional [str ] = None
80+ environment : Optional [str ] = None
7981
8082class Phase :
8183 def __init__ (self , init = True , pss = None , host = None ):
8284 self ._phase_io = PhaseIO (init = init , pss = pss , host = host )
8385
86+ def _resolve_secret_values (self , secrets : List [PhaseSecret ], env_name : str , app_name : str ) -> List [PhaseSecret ]:
87+ """
88+ Utility function to resolve secret references within secret values.
89+
90+ Args:
91+ secrets (List[PhaseSecret]): List of secrets to process
92+ env_name (str): Environment name for secret resolution
93+ app_name (str): Application name for secret resolution
94+
95+ Returns:
96+ List[PhaseSecret]: List of secrets with resolved values
97+ """
98+ # Convert PhaseSecret objects to dict format expected by resolve_all_secrets
99+ all_secrets = [
100+ {
101+ 'environment' : secret .environment or env_name ,
102+ 'path' : secret .path ,
103+ 'key' : secret .key ,
104+ 'value' : secret .value
105+ }
106+ for secret in secrets
107+ ]
108+
109+ # Create new list of secrets with resolved values
110+ resolved_secrets = []
111+ for secret in secrets :
112+ resolved_value = resolve_all_secrets (
113+ value = secret .value ,
114+ all_secrets = all_secrets ,
115+ phase = self ._phase_io ,
116+ current_application_name = secret .application or app_name ,
117+ current_env_name = secret .environment or env_name
118+ )
119+
120+ resolved_secrets .append (PhaseSecret (
121+ key = secret .key ,
122+ value = resolved_value ,
123+ comment = secret .comment ,
124+ path = secret .path ,
125+ tags = secret .tags ,
126+ overridden = secret .overridden ,
127+ application = secret .application ,
128+ environment = secret .environment
129+ ))
130+
131+ return resolved_secrets
132+
84133 def get_secret (self , options : GetSecretOptions ) -> Optional [PhaseSecret ]:
85134 secrets = self ._phase_io .get (
86135 env_name = options .env_name ,
@@ -92,14 +141,25 @@ def get_secret(self, options: GetSecretOptions) -> Optional[PhaseSecret]:
92141 )
93142 if secrets :
94143 secret = secrets [0 ]
95- return PhaseSecret (
144+ phase_secret = PhaseSecret (
96145 key = secret ['key' ],
97146 value = secret ['value' ],
98147 comment = secret .get ('comment' , '' ),
99148 path = secret .get ('path' , '/' ),
100149 tags = secret .get ('tags' , []),
101- overridden = secret .get ('overridden' , False )
150+ overridden = secret .get ('overridden' , False ),
151+ application = secret .get ('application' ),
152+ environment = secret .get ('environment' )
102153 )
154+
155+ # Resolve any secret references in the value
156+ resolved_secrets = self ._resolve_secret_values (
157+ [phase_secret ],
158+ options .env_name ,
159+ secret .get ('application' , options .app_name )
160+ )
161+
162+ return resolved_secrets [0 ] if resolved_secrets else None
103163 return None
104164
105165 def get_all_secrets (self , options : GetAllSecretsOptions ) -> List [PhaseSecret ]:
@@ -110,17 +170,33 @@ def get_all_secrets(self, options: GetAllSecretsOptions) -> List[PhaseSecret]:
110170 tag = options .tag ,
111171 path = options .secret_path
112172 )
113- return [
173+
174+ if not secrets :
175+ return []
176+
177+ # Get the application name from the first secret
178+ app_name = secrets [0 ].get ('application' , options .app_name )
179+
180+ phase_secrets = [
114181 PhaseSecret (
115182 key = secret ['key' ],
116183 value = secret ['value' ],
117184 comment = secret .get ('comment' , '' ),
118185 path = secret .get ('path' , '/' ),
119186 tags = secret .get ('tags' , []),
120- overridden = secret .get ('overridden' , False )
187+ overridden = secret .get ('overridden' , False ),
188+ application = secret .get ('application' ),
189+ environment = secret .get ('environment' )
121190 )
122191 for secret in secrets
123192 ]
193+
194+ # Resolve any secret references in the values
195+ return self ._resolve_secret_values (
196+ phase_secrets ,
197+ options .env_name ,
198+ app_name
199+ )
124200
125201 def create_secrets (self , options : CreateSecretsOptions ) -> str :
126202 # Convert the list of dictionaries to a list of tuples
0 commit comments