EnvironmentEncryptCommand.php
TLDR
This file contains the EnvironmentEncryptCommand
class, which is a command used to encrypt an environment file. The command accepts various options such as encryption key, encryption cipher, environment, and force overwrite.
Methods
handle
This method is executed when the env:encrypt
command is run. It handles the encryption process of the environment file based on the provided options. It generates an encryption key if not provided, checks for the existence of the environment file and the encrypted file, and then performs the encryption using the Encrypter class.
parseKey
This method is used to parse the encryption key provided to the command. If the key starts with the prefix 'base64:', it decodes the base64-encoded key and returns it.
Classes
EnvironmentEncryptCommand
This class extends the Command
class and represents the command that can be executed to encrypt an environment file. It has properties for the command signature, description, and filesystem instance. The class constructor accepts a FileSystem
instance, which is used to interact with the file system. The class also contains the handle
method and the parseKey
method.
<?php
namespace Illuminate\Foundation\Console;
use Exception;
use Illuminate\Console\Command;
use Illuminate\Encryption\Encrypter;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Str;
use Symfony\Component\Console\Attribute\AsCommand;
#[AsCommand(name: 'env:encrypt')]
class EnvironmentEncryptCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'env:encrypt
{--key= : The encryption key}
{--cipher= : The encryption cipher}
{--env= : The environment to be encrypted}
{--force : Overwrite the existing encrypted environment file}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Encrypt 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()
{
$cipher = $this->option('cipher') ?: 'AES-256-CBC';
$key = $this->option('key');
$keyPassed = $key !== null;
$environmentFile = $this->option('env')
? Str::finish(dirname($this->laravel->environmentFilePath()), DIRECTORY_SEPARATOR).'.env.'.$this->option('env')
: $this->laravel->environmentFilePath();
$encryptedFile = $environmentFile.'.encrypted';
if (! $keyPassed) {
$key = Encrypter::generateKey($cipher);
}
if (! $this->files->exists($environmentFile)) {
$this->components->error('Environment file not found.');
return Command::FAILURE;
}
if ($this->files->exists($encryptedFile) && ! $this->option('force')) {
$this->components->error('Encrypted environment file already exists.');
return Command::FAILURE;
}
try {
$encrypter = new Encrypter($this->parseKey($key), $cipher);
$this->files->put(
$encryptedFile,
$encrypter->encrypt($this->files->get($environmentFile))
);
} catch (Exception $e) {
$this->components->error($e->getMessage());
return Command::FAILURE;
}
$this->components->info('Environment successfully encrypted.');
$this->components->twoColumnDetail('Key', $keyPassed ? $key : 'base64:'.base64_encode($key));
$this->components->twoColumnDetail('Cipher', $cipher);
$this->components->twoColumnDetail('Encrypted file', $encryptedFile);
$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;
}
}