Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
23 / 23 |
CRAP | |
100.00% |
68 / 68 |
| AustinHeap\Security\Txt\SecurityTxtHelper | |
100.00% |
1 / 1 |
|
100.00% |
23 / 23 |
41 | |
100.00% |
68 / 68 |
| __construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| buildWriterDefaultKeys | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| buildWriter | |
100.00% |
1 / 1 |
11 | |
100.00% |
22 / 22 |
|||
| addLogEntry | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
| getLogEntries | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| clearLogEntries | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| fetch | |
100.00% |
1 / 1 |
7 | |
100.00% |
13 / 13 |
|||
| enable | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| disable | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| setEnabled | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| getEnabled | |
100.00% |
1 / 1 |
2 | |
100.00% |
1 / 1 |
|||
| enableCache | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| disableCache | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| setCache | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| getCache | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| clearCache | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| setCacheKey | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| getCacheKey | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| setCacheTime | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| getCacheTime | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| hasWriter | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
| getWriter | |
100.00% |
1 / 1 |
2 | |
100.00% |
3 / 3 |
|||
| setWriter | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| <?php | |
| /** | |
| * src/SecurityTxtHelper.php. | |
| * | |
| * @author Austin Heap <me@austinheap.com> | |
| * @version v0.4.0 | |
| */ | |
| declare(strict_types=1); | |
| namespace AustinHeap\Security\Txt; | |
| use Log; | |
| use Exception; | |
| /** | |
| * SecurityTxtHelper. | |
| * | |
| * @link https://github.com/austinheap/laravel-security-txt | |
| * @link https://packagist.org/packages/austinheap/laravel-security-txt | |
| * @link https://austinheap.github.io/laravel-security-txt/classes/AustinHeap.Security.Txt.SecurityTxtHelper.html | |
| * @link https://securitytext.org/ | |
| */ | |
| class SecurityTxtHelper | |
| { | |
| /** | |
| * Internal version number. | |
| * | |
| * @var string | |
| */ | |
| const VERSION = '0.4.0'; | |
| /** | |
| * Enable the package. | |
| * | |
| * @var bool | |
| */ | |
| protected $enabled = null; | |
| /** | |
| * Internal SecurityTxt object. | |
| * | |
| * @var \AustinHeap\Security\Txt\Writer | |
| */ | |
| protected $writer = null; | |
| /** | |
| * Internal array of log entries. | |
| * | |
| * @var array | |
| */ | |
| protected $logEntries = []; | |
| /** | |
| * Enable built-in cache. | |
| * | |
| * @var bool | |
| */ | |
| protected $cache = false; | |
| /** | |
| * Minutes to cache output. | |
| * | |
| * @var int | |
| */ | |
| protected $cacheTime = null; | |
| /** | |
| * Cache key to use. | |
| * | |
| * @var string | |
| */ | |
| protected $cacheKey = 'cache:AustinHeap\Security\Txt\SecurityTxt'; | |
| /** | |
| * Create a new SecurityTxtHelper instance. | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function __construct() | |
| { | |
| $this->buildWriter(); | |
| return $this; | |
| } | |
| /** | |
| * Returns the default config key => php-security-txt mappings. | |
| * | |
| * @return array | |
| */ | |
| public static function buildWriterDefaultKeys() | |
| { | |
| return [ | |
| 'security-txt.enabled' => ['validator' => 'is_bool', 'setter' => 'setEnabled', 'self' => true], | |
| 'security-txt.debug' => ['validator' => 'is_bool', 'setter' => 'setDebug'], | |
| 'security-txt.cache' => ['validator' => 'is_bool', 'setter' => 'setCache', 'self' => true], | |
| 'security-txt.cache-time' => ['validator' => 'is_numeric', 'setter' => 'setCacheTime', 'self' => true], | |
| 'security-txt.cache-key' => ['validator' => 'is_string', 'setter' => 'setCacheKey', 'self' => true], | |
| 'security-txt.comments' => ['validator' => 'is_bool', 'setter' => 'setComments'], | |
| 'security-txt.contacts' => ['validator' => 'is_array', 'setter' => 'addContacts'], | |
| 'security-txt.encryption' => ['validator' => 'is_string', 'setter' => 'setEncryption'], | |
| 'security-txt.disclosure' => ['validator' => 'is_string', 'setter' => 'setDisclosure'], | |
| 'security-txt.acknowledgement' => ['validator' => 'is_string', 'setter' => 'setAcknowledgement'], | |
| ]; | |
| } | |
| /** | |
| * Builds the internal SecurityTxt Writer. | |
| * | |
| * @param array $keys | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function buildWriter(array $keys = null): self | |
| { | |
| $this->writer = new Writer(); | |
| $keys = is_array($keys) ? $keys : self::buildWriterDefaultKeys(); | |
| foreach ($keys as $key => $mapping) { | |
| if (is_null(config($key, null))) { | |
| $this->addLogEntry('"'.__CLASS__.'" cannot process null value for key "'.$key.'".', 'debug'); | |
| continue; | |
| } elseif (! function_exists($mapping['validator'])) { | |
| $this->addLogEntry('"'.__CLASS__.'" cannot find "validator" function named "'.$mapping['validator'].'".', 'warning'); | |
| continue; | |
| } elseif (! $mapping['validator'](config($key))) { | |
| $this->addLogEntry('"'.__CLASS__.'" failed the "validator" function named "'.$mapping['validator'].'".', 'warning'); | |
| continue; | |
| } elseif (array_key_exists('self', $mapping) && is_bool($mapping['self']) && $mapping['self'] === true) { | |
| if (! method_exists($this, $mapping['setter'])) { | |
| $this->addLogEntry('"'.__CLASS__.'" cannot find mapping "setter" method on object "'.get_class($this).'" named "'.$mapping['setter'].'".', 'error'); | |
| continue; | |
| } | |
| $this->{$mapping['setter']}(config($key)); | |
| } else { | |
| if (! method_exists($this->writer, $mapping['setter'])) { | |
| $this->addLogEntry('"'.__CLASS__.'" cannot find mapping "setter" method on object "'.get_class($this->writer).'" named "'.$mapping['setter'].'".', 'error'); | |
| continue; | |
| } | |
| $this->writer->{$mapping['setter']}(config($key)); | |
| } | |
| } | |
| return $this; | |
| } | |
| /** | |
| * Add log entry. | |
| * | |
| * @param string $text | |
| * @param string $level | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function addLogEntry(string $text, string $level = 'debug'): self | |
| { | |
| Log::$level($text); | |
| $this->logEntries[] = ['text' => $text, 'level' => $level]; | |
| return $this; | |
| } | |
| /** | |
| * Add log entries. | |
| * | |
| * @return array | |
| */ | |
| public function getLogEntries(): array | |
| { | |
| return $this->logEntries; | |
| } | |
| /** | |
| * Clears log entries. | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function clearLogEntries(): self | |
| { | |
| $this->logEntries = []; | |
| return $this; | |
| } | |
| /** | |
| * Fetches the raw text of the document. | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function fetch(): string | |
| { | |
| if ($this->cache) { | |
| $text = cache($this->cacheKey, null); | |
| if (! is_null($text)) { | |
| return $text; | |
| } | |
| } | |
| $text = $this->writer | |
| ->execute() | |
| ->getText(); | |
| if ($this->writer->getDebug()) { | |
| $text .= '# Cache is '.($this->cache ? 'enabled with key "'.$this->cacheKey.'"' : 'disabled').'.'.PHP_EOL. | |
| '#'.PHP_EOL; | |
| } | |
| if ($this->cache) { | |
| cache([$this->cacheKey => $text], now()->addMinutes($this->cacheTime)); | |
| } | |
| return empty($text) ? '' : $text; | |
| } | |
| /** | |
| * Enable the enabled flag. | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function enable(): self | |
| { | |
| return $this->setEnabled(true); | |
| } | |
| /** | |
| * Disable the enabled flag. | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function disable(): self | |
| { | |
| return $this->setEnabled(false); | |
| } | |
| /** | |
| * Set the enabled flag. | |
| * | |
| * @param bool $enabled | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function setEnabled(bool $enabled): self | |
| { | |
| $this->enabled = $enabled; | |
| return $this; | |
| } | |
| /** | |
| * Get the enabled flag. | |
| * | |
| * @return bool | |
| */ | |
| public function getEnabled(): bool | |
| { | |
| return is_null($this->enabled) ? false : $this->enabled; | |
| } | |
| /** | |
| * Enable the cache flag. | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function enableCache(): self | |
| { | |
| return $this->setCache(true); | |
| } | |
| /** | |
| * Disable the cache flag. | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function disableCache(): self | |
| { | |
| return $this->setCache(false); | |
| } | |
| /** | |
| * Set the cache flag. | |
| * | |
| * @param bool $cache | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function setCache(bool $cache): self | |
| { | |
| $this->cache = $cache; | |
| return $this; | |
| } | |
| /** | |
| * Get the cache flag. | |
| * | |
| * @return bool | |
| */ | |
| public function getCache(): bool | |
| { | |
| return $this->cache; | |
| } | |
| /** | |
| * Clear the cache. | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function clearCache(): self | |
| { | |
| cache()->delete($this->cacheKey); | |
| return $this; | |
| } | |
| /** | |
| * Set the cache key. | |
| * | |
| * @param string $cacheKey | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function setCacheKey(string $cacheKey): self | |
| { | |
| $this->cacheKey = $cacheKey; | |
| return $this; | |
| } | |
| /** | |
| * Get the cache key. | |
| * | |
| * @return string | |
| */ | |
| public function getCacheKey(): string | |
| { | |
| return $this->cacheKey; | |
| } | |
| /** | |
| * Set the cache time. | |
| * | |
| * @param int $cacheTime | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function setCacheTime(int $cacheTime): self | |
| { | |
| $this->cacheTime = $cacheTime; | |
| return $this; | |
| } | |
| /** | |
| * Get the cache time. | |
| * | |
| * @return int | |
| */ | |
| public function getCacheTime(): int | |
| { | |
| return $this->cacheTime; | |
| } | |
| /** | |
| * Determines if a SecurityTxt Writer is set. | |
| * | |
| * @return bool | |
| */ | |
| public function hasWriter(): bool | |
| { | |
| return ! is_null($this->writer); | |
| } | |
| /** | |
| * Gets the internal SecurityTxt Writer. | |
| * | |
| * @return Writer | |
| */ | |
| public function getWriter(): Writer | |
| { | |
| if (! $this->hasWriter()) { | |
| throw new Exception('Writer not set.'); | |
| } | |
| return $this->writer; | |
| } | |
| /** | |
| * Sets the internal SecurityTxt Writer. | |
| * | |
| * @param Writer|null $writer | |
| * | |
| * @return SecurityTxtHelper | |
| */ | |
| public function setWriter($writer): self | |
| { | |
| $this->writer = $writer; | |
| return $this; | |
| } | |
| } |