Viewing file: EnvironmentDecryptCommand.php (4.09 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace Illuminate\Foundation\Console;
use Exception; use Illuminate\Console\Command; use Illuminate\Encryption\Encrypter; use Illuminate\Filesystem\Filesystem; use Illuminate\Support\Env; use Illuminate\Support\Str; use Symfony\Component\Console\Attribute\AsCommand;
#[AsCommand(name: 'env:decrypt')] class EnvironmentDecryptCommand extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'env:decrypt {--key= : The encryption key} {--cipher= : The encryption cipher} {--env= : The environment to be decrypted} {--force : Overwrite the existing environment file} {--path= : Path to write the decrypted file} {--filename= : Filename of the decrypted file}';
/** * The name of the console command. * * This name is used to identify the command during lazy loading. * * @var string|null * * @deprecated */ protected static $defaultName = 'env:decrypt';
/** * The console command description. * * @var string */ protected $description = 'Decrypt an environment file';
/** * The filesystem instance. * * @var \Illuminate\Filesystem\Filesystem */ protected $files;
/** * Create a new command instance. * * @param \Illuminate\Filesystem\Filesystem $files * @return void */ public function __construct(Filesystem $files) { parent::__construct();
$this->files = $files; }
/** * Execute the console command. * * @return void */ public function handle() { $key = $this->option('key') ?: Env::get('LARAVEL_ENV_ENCRYPTION_KEY');
if (! $key) { $this->components->error('A decryption key is required.');
return Command::FAILURE; }
$cipher = $this->option('cipher') ?: 'AES-256-CBC';
$key = $this->parseKey($key);
$encryptedFile = ($this->option('env') ? base_path('.env').'.'.$this->option('env') : $this->laravel->environmentFilePath()).'.encrypted';
$outputFile = $this->outputFilePath();
if (Str::endsWith($outputFile, '.encrypted')) { $this->components->error('Invalid filename.');
return Command::FAILURE; }
if (! $this->files->exists($encryptedFile)) { $this->components->error('Encrypted environment file not found.');
return Command::FAILURE; }
if ($this->files->exists($outputFile) && ! $this->option('force')) { $this->components->error('Environment file already exists.');
return Command::FAILURE; }
try { $encrypter = new Encrypter($key, $cipher);
$this->files->put( $outputFile, $encrypter->decrypt($this->files->get($encryptedFile)) ); } catch (Exception $e) { $this->components->error($e->getMessage());
return Command::FAILURE; }
$this->components->info('Environment successfully decrypted.');
$this->components->twoColumnDetail('Decrypted file', $outputFile);
$this->newLine(); }
/** * Parse the encryption key. * * @param string $key * @return string */ protected function parseKey(string $key) { if (Str::startsWith($key, $prefix = 'base64:')) { $key = base64_decode(Str::after($key, $prefix)); }
return $key; }
/** * Get the output file path that should be used for the command. * * @return string */ protected function outputFilePath() { $path = Str::finish($this->option('path') ?: base_path(), DIRECTORY_SEPARATOR);
$outputFile = $this->option('filename') ?: ('.env'.($this->option('env') ? '.'.$this->option('env') : '')); $outputFile = ltrim($outputFile, DIRECTORY_SEPARATOR);
return $path.$outputFile; } }
|