Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
95.00% |
19 / 20 |
CRAP | |
98.91% |
91 / 92 |
AustinHeap\Database\Encryption\EncryptionHelper | |
0.00% |
0 / 1 |
|
95.00% |
19 / 20 |
57 | |
98.91% |
91 / 92 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
reset | |
100.00% |
1 / 1 |
1 | |
100.00% |
7 / 7 |
|||
getVersion | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
setEnabled | |
100.00% |
1 / 1 |
2 | |
100.00% |
2 / 2 |
|||
isEnabled | |
100.00% |
1 / 1 |
4 | |
100.00% |
4 / 4 |
|||
setDisabled | |
100.00% |
1 / 1 |
3 | |
100.00% |
1 / 1 |
|||
isDisabled | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setVersioning | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
isVersioning | |
100.00% |
1 / 1 |
4 | |
100.00% |
4 / 4 |
|||
setVersionless | |
100.00% |
1 / 1 |
3 | |
100.00% |
1 / 1 |
|||
isVersionless | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
getVersionParts | |
100.00% |
1 / 1 |
10 | |
100.00% |
13 / 13 |
|||
getVersionForPrefix | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setHeaderPrefix | |
100.00% |
1 / 1 |
3 | |
100.00% |
4 / 4 |
|||
getHeaderPrefix | |
100.00% |
1 / 1 |
2 | |
100.00% |
7 / 7 |
|||
buildHeader | |
100.00% |
1 / 1 |
3 | |
100.00% |
17 / 17 |
|||
setPrefix | |
100.00% |
1 / 1 |
5 | |
100.00% |
6 / 6 |
|||
getPrefix | |
0.00% |
0 / 1 |
5.07 | |
85.71% |
6 / 7 |
|||
getControlCharacters | |
100.00% |
1 / 1 |
4 | |
100.00% |
7 / 7 |
|||
getInstance | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
<?php | |
/** | |
* src/EncryptionHelper.php. | |
* | |
* @author Austin Heap <me@austinheap.com> | |
* @version v0.2.0 | |
*/ | |
declare(strict_types=1); | |
namespace AustinHeap\Database\Encryption; | |
use RuntimeException; | |
use Illuminate\Support\Facades\Config; | |
/** | |
* EncryptionHelper. | |
* | |
* @link https://github.com/austinheap/laravel-database-encryption | |
* @link https://packagist.org/packages/austinheap/laravel-database-encryption | |
* @link https://austinheap.github.io/laravel-database-encryption/classes/AustinHeap.Database.Encryption.EncryptionHelper.html | |
*/ | |
class EncryptionHelper extends EncryptionDefaults | |
{ | |
/** | |
* Internal version number. | |
* | |
* @var string | |
*/ | |
public const VERSION = '0.1.2'; | |
/** | |
* Private enable flag cache. | |
* | |
* @var null|bool | |
*/ | |
private $enabledCache = null; | |
/** | |
* Private versioning flag cache. | |
* | |
* @var null|bool | |
*/ | |
private $versioningCache = null; | |
/** | |
* Private version parts cache. | |
* | |
* @var null|array | |
*/ | |
private $versionPartsCache = null; | |
/** | |
* Private control characters cache. | |
* | |
* @var null|array | |
*/ | |
private $controlCharactersCache = null; | |
/** | |
* Private prefix cache. | |
* | |
* @var null|string | |
*/ | |
private $prefixCache = null; | |
/** | |
* Private header prefix cache. | |
* | |
* @var null|string | |
*/ | |
private $headerPrefixCache = null; | |
/** | |
* EncryptionHelper constructor. | |
*/ | |
public function __construct() | |
{ | |
$this->reset(); | |
} | |
/** | |
* Reset the class; mostly the cache. | |
* | |
* @return EncryptionHelper | |
*/ | |
public function reset(): self | |
{ | |
$this->enabledCache = | |
$this->versioningCache = | |
$this->versionPartsCache = | |
$this->controlCharactersCache = | |
$this->prefixCache = | |
$this->headerPrefixCache = null; | |
return $this; | |
} | |
/** | |
* Get the package version. | |
* | |
* @return string | |
*/ | |
public function getVersion(): string | |
{ | |
throw_if(! defined('LARAVEL_DATABASE_ENCRYPTION_VERSION'), RuntimeException::class, | |
'The provider did not boot.'); | |
return LARAVEL_DATABASE_ENCRYPTION_VERSION; | |
} | |
/** | |
* Set the enabled flag. | |
* | |
* @return bool | |
*/ | |
public function setEnabled(?bool $value = null): self | |
{ | |
$this->enabledCache = $value; | |
return $this; | |
} | |
/** | |
* Check the enabled flag. | |
* | |
* @return bool | |
*/ | |
public function isEnabled(): bool | |
{ | |
if (is_null($this->enabledCache)) { | |
$enabled = Config('database-encryption.enabled', null); | |
$this->enabledCache = ! is_null($enabled) && is_bool($enabled) ? $enabled : self::isEnabledDefault(); | |
} | |
return $this->enabledCache; | |
} | |
/** | |
* Set the enabled flag inverse. | |
* | |
* @return bool | |
*/ | |
public function setDisabled(?bool $value = null): self | |
{ | |
return $this->setEnabled(is_bool($value) ? ! $value : null); | |
} | |
/** | |
* Check the enabled flag inverse. | |
* | |
* @return bool | |
*/ | |
public function isDisabled(): bool | |
{ | |
return ! $this->isEnabled(); | |
} | |
/** | |
* Set the versioning flag. | |
* | |
* @return null|bool | |
*/ | |
public function setVersioning(?bool $value = null): self | |
{ | |
$this->reset(); | |
$this->versioningCache = $value; | |
return $this; | |
} | |
/** | |
* Check the versioning flag. | |
* | |
* @return bool | |
*/ | |
public function isVersioning(): bool | |
{ | |
if (is_null($this->versioningCache)) { | |
$versioning = Config('database-encryption.versioning', null); | |
$this->versioningCache = ! is_null($versioning) && is_bool($versioning) ? $versioning : self::isVersioningDefault(); | |
} | |
return $this->versioningCache; | |
} | |
/** | |
* Set the enabled flag inverse. | |
* | |
* @return null|bool | |
*/ | |
public function setVersionless(?bool $value = null): self | |
{ | |
return $this->setVersioning(is_bool($value) ? ! $value : null); | |
} | |
/** | |
* Check the versioning flag inverse. | |
* | |
* @return bool | |
*/ | |
public function isVersionless(): bool | |
{ | |
return ! $this->isVersioning(); | |
} | |
/** | |
* Get the package version in parts. | |
* | |
* @return array | |
*/ | |
public function getVersionParts(?int $padding = null): array | |
{ | |
if (! is_array($this->versionPartsCache)) { | |
$this->versionPartsCache = []; | |
} | |
$padding = is_int($padding) && $padding === 0 ? null : $padding; | |
$key = 'padding-'.(is_null($padding) ? 'null' : (string) $padding); | |
if (! array_key_exists($key, $this->versionPartsCache)) { | |
$parts = explode('.', $this->getVersion()); | |
$this->versionPartsCache[$key] = array_map(function ($part) use ($padding) { | |
$part = (string) $part; | |
if (is_null($padding)) { | |
return $part; | |
} | |
$length = strlen(is_string($part) ? $part : (string) $part); | |
return $length == $padding ? $part : str_repeat('0', $padding - $length).$part; | |
}, $parts); | |
} | |
return $this->versionPartsCache[$key]; | |
} | |
/** | |
* Get the package version for a prefix. | |
* | |
* @return string | |
*/ | |
public function getVersionForPrefix(int $padding = 2, string $glue = '-'): string | |
{ | |
return 'VERSION-'.implode($glue, $this->getVersionParts($padding)); | |
} | |
/** | |
* Set the configured header prefix. | |
* | |
* @return EncryptionHelper | |
*/ | |
public function setHeaderPrefix(?string $value = null): self | |
{ | |
throw_if(is_string($value) && strlen(trim($value)) == 0, RuntimeException::class, | |
'Cannot use empty string as header prefix.'); | |
$this->headerPrefixCache = $value; | |
return $this; | |
} | |
/** | |
* Get the configured header prefix. | |
* | |
* @return string | |
*/ | |
public function getHeaderPrefix(): string | |
{ | |
if (is_null($this->headerPrefixCache)) { | |
$characters = $this->getControlCharacters(); | |
$this->headerPrefixCache = $characters['header']['start']['string']. | |
$characters['prefix']['start']['string']. | |
$this->getPrefix(). | |
$characters['prefix']['stop']['string']; | |
} | |
return $this->headerPrefixCache; | |
} | |
/** | |
* Build a header string, optionally with an object. | |
* | |
* @return string | |
*/ | |
public function buildHeader($object = null): string | |
{ | |
$characters = $this->getControlCharacters(); | |
return $characters['header']['start']['string']. | |
$characters['prefix']['start']['string']. | |
$this->getPrefix(). | |
$characters['prefix']['stop']['string']. | |
$characters['field']['start']['string']. | |
'version'. | |
$characters['field']['delimiter']['string']. | |
self::getVersionForPrefix(). | |
$characters['field']['stop']['string']. | |
(is_null($object) ? '' : | |
$characters['field']['start']['string']. | |
'type'. | |
$characters['field']['delimiter']['string']. | |
gettype($object).'['.(is_object($object) ? get_class($object) : 'native').']'. | |
$characters['field']['stop']['string'] | |
). | |
$characters['header']['stop']['string']; | |
} | |
/** | |
* Set the configured prefix. | |
* | |
* @return EncryptionHelper | |
*/ | |
public function setPrefix(?string $value = null): self | |
{ | |
throw_if(is_string($value) && strlen(trim($value)) == 0, RuntimeException::class, | |
'Cannot use empty string as prefix.'); | |
$this->prefixCache = is_string($value) && $this->isVersioning() ? | |
str_replace('%VERSION%', $this->getVersionForPrefix(), $value) : | |
$value; | |
return $this; | |
} | |
/** | |
* Get the configured prefix. | |
* | |
* @return string | |
*/ | |
public function getPrefix(): string | |
{ | |
if (is_null($this->prefixCache)) { | |
$prefix = Config::get('database-encryption.prefix', null); | |
$prefix = ! empty($prefix) && is_string($prefix) ? $prefix : self::getPrefixDefault(); | |
$this->prefixCache = $this->isVersioning() ? | |
str_replace('%VERSION%', $this->getVersionForPrefix(), $prefix) : | |
$prefix; | |
} | |
return $this->prefixCache; | |
} | |
/** | |
* Get the configured control characters. | |
* | |
* @return array | |
*/ | |
public function getControlCharacters(?string $type = null): array | |
{ | |
$defaults = self::getControlCharactersDefault(); | |
$characters = self::getControlCharactersDefault(); | |
if (! is_null($type)) { | |
throw_if(! array_key_exists($type, $characters), | |
'Control characters do not exist for $type: "'.(empty($type) ? '(empty)' : $type).'".'); | |
return $characters[$type]; | |
} | |
return $characters; | |
} | |
/** | |
* Get the singleton of this class. | |
* | |
* @return EncryptionHelper | |
*/ | |
public static function getInstance(): self | |
{ | |
return EncryptionFacade::getInstance(); | |
} | |
} |