X-Git-Url: https://git.rapsys.eu/packbundle/blobdiff_plain/ef9ee86cb52ee5b4e1ab70c26fd977fa2eb80586..85c625bbcc50b111b146d54bbc2963f07a468e17:/Util/SluggerUtil.php?ds=sidebyside diff --git a/Util/SluggerUtil.php b/Util/SluggerUtil.php index 3b1e6b5..0ff32c5 100644 --- a/Util/SluggerUtil.php +++ b/Util/SluggerUtil.php @@ -38,20 +38,25 @@ class SluggerUtil { /** * Construct slugger util * - * @description Run "php bin/console rapsyspack:range" to generate RAPSYSPACK_RANGE="ayl[...]z9w" range in .env.local + * Run "bin/console rapsyspack:range" to generate RAPSYSPACK_RANGE="ayl[...]z9w" range in .env.local * * @todo Use Cache like in calendar controller through FilesystemAdapter ? * - * @param string $range The shuffled range string * @param string $secret The secret string */ - public function __construct(protected string $range, protected string $secret) { + public function __construct(protected string $secret) { + //Without range + if (!isset($_ENV['RAPSYSPACK_RANGE']) || empty($range = $_ENV['RAPSYSPACK_RANGE']) || $range === 'Ch4ng3m3!') { + //Protect member variable setup + return; + } + /** * Get pseuto-random alphabet by splitting range string * TODO: see required range by json_encode result and short input (0->255 ???) * XXX: The key count mismatch, count(alpha)>count(rev), resulted in a data corruption due to duplicate numeric values */ - $this->alpha = str_split($this->range); + $this->alpha = str_split($range); //Init rev array $this->count = count($rev = $this->rev = array_flip($this->alpha)); @@ -60,6 +65,7 @@ class SluggerUtil { $split = str_split($this->secret); //Set offset + //TODO: protect undefined index ? $this->offset = array_reduce($split, function ($res, $a) use ($rev) { return $res += $rev[$a]; }, count($split)) % $this->count; } @@ -110,7 +116,7 @@ class SluggerUtil { //Return hashed data //XXX: we use hash_hmac with md5 hash //XXX: crypt was dropped because it provided identical signature for string starting with same pattern - return str_replace(['+','/'], ['-','_'], base64_encode(hash_hmac('md5', $data, $this->secret, true))); + return str_replace(['+','/','='], ['-','_',''], base64_encode(hash_hmac('md5', $data, $this->secret, true))); } /** @@ -156,9 +162,10 @@ class SluggerUtil { * Convert string to safe slug * * @param string $data The data string + * @param string $separator The separator string * @return ?string The slugged data */ - function slug(?string $data): ?string { + function slug(?string $data, string $separator = '-'): ?string { //With null if ($data === null) { //Return null @@ -170,11 +177,11 @@ class SluggerUtil { //Convert from any to latin, then to ascii and lowercase $trans = \Transliterator::create('Any-Latin; Latin-ASCII; Lower()'); //Replace every non alphanumeric character by dash then trim dash - return trim(preg_replace('/[^a-zA-Z0-9]+/', '-', $trans->transliterate($data)), '-'); + return trim(preg_replace('/[^a-zA-Z0-9]+/', $separator, $trans->transliterate($data)), $separator); } //Convert from utf-8 to ascii, replace quotes with space, remove non alphanumericseparator, replace separator with dash and trim dash - return trim(preg_replace('/[\/_|+ -]+/', '-', strtolower(preg_replace('/[^a-zA-Z0-9\/_|+ -]/', '', str_replace(['\'', '"'], ' ', iconv('UTF-8', 'ASCII//TRANSLIT', $data))))), '-'); + return trim(preg_replace('/[\/_|+ -]+/', $separator, strtolower(preg_replace('/[^a-zA-Z0-9\/_|+ -]/', '', str_replace(['\'', '"'], ' ', iconv('UTF-8', 'ASCII//TRANSLIT', $data))))), $separator); } /**