64 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Traits;
 | |
| 
 | |
| use Symfony\Component\Yaml\Yaml;
 | |
| 
 | |
| trait EnvironmentVariableProtection
 | |
| {
 | |
|     /**
 | |
|      * Check if an environment variable is protected from deletion
 | |
|      *
 | |
|      * @param  string  $key  The environment variable key to check
 | |
|      * @return bool True if the variable is protected, false otherwise
 | |
|      */
 | |
|     protected function isProtectedEnvironmentVariable(string $key): bool
 | |
|     {
 | |
|         return str($key)->startsWith('SERVICE_FQDN') || str($key)->startsWith('SERVICE_URL');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Check if an environment variable is used in Docker Compose
 | |
|      *
 | |
|      * @param  string  $key  The environment variable key to check
 | |
|      * @param  string|null  $dockerCompose  The Docker Compose YAML content
 | |
|      * @return array [bool $isUsed, string $reason] Whether the variable is used and the reason if it is
 | |
|      */
 | |
|     protected function isEnvironmentVariableUsedInDockerCompose(string $key, ?string $dockerCompose): array
 | |
|     {
 | |
|         if (empty($dockerCompose)) {
 | |
|             return [false, ''];
 | |
|         }
 | |
| 
 | |
|         try {
 | |
|             $dockerComposeData = Yaml::parse($dockerCompose);
 | |
|             $dockerEnvVars = data_get($dockerComposeData, 'services.*.environment');
 | |
| 
 | |
|             foreach ($dockerEnvVars as $serviceEnvs) {
 | |
|                 if (! is_array($serviceEnvs)) {
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 // Check for direct variable usage
 | |
|                 foreach ($serviceEnvs as $env => $value) {
 | |
|                     if ($env === $key) {
 | |
|                         return [true, "Environment variable '{$key}' is used directly in the Docker Compose file."];
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 // Check for variable references in values
 | |
|                 foreach ($serviceEnvs as $env => $value) {
 | |
|                     if (is_string($value) && str_contains($value, '$'.$key)) {
 | |
|                         return [true, "Environment variable '{$key}' is referenced in the Docker Compose file."];
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         } catch (\Exception $e) {
 | |
|             // If there's an error parsing the Docker Compose file, we'll assume it's not used
 | |
|             return [false, ''];
 | |
|         }
 | |
| 
 | |
|         return [false, ''];
 | |
|     }
 | |
| }
 | 
