Issues (165)

app/Factories/IdFactory.php (1 issue)

Labels
Severity
1
<?php
2
3
/**
4
 * webtrees: online genealogy
5
 * Copyright (C) 2023 webtrees development team
6
 * This program is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
 * (at your option) any later version.
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
 * GNU General Public License for more details.
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
 */
17
18
declare(strict_types=1);
19
20
namespace Fisharebest\Webtrees\Factories;
21
22
use Fisharebest\Webtrees\Contracts\IdFactoryInterface;
23
use Ramsey\Uuid\Exception\RandomSourceException;
24
use Ramsey\Uuid\Uuid;
25
26
use function dechex;
27
use function hexdec;
28
use function str_pad;
29
use function strtoupper;
30
use function substr;
31
32
use const STR_PAD_LEFT;
33
34
/**
35
 * Create a unique identifier.
36
 */
37
class IdFactory implements IdFactoryInterface
38
{
39
    /**
40
     * @return string
41
     */
42
    public function uuid(): string
43
    {
44
        try {
45
            return strtolower(strtr(Uuid::uuid4()->toString(), ['-' => '']));
46
        } catch (RandomSourceException) {
47
            // uuid4() can fail if there is insufficient entropy in the system.
48
            return '';
49
        }
50
    }
51
52
    /**
53
     * An identifier for use in CSS/HTML
54
     *
55
     * @param string $prefix
56
     *
57
     * @return string
58
     */
59
    public function id(string $prefix = 'id-'): string
60
    {
61
        return $prefix . $this->uuid();
62
    }
63
64
    /**
65
     * A value for _UID fields, as created by PAF
66
     *
67
     * @return string
68
     */
69
    public function pafUid(): string
70
    {
71
        $uid = strtoupper(strtr($this->uuid(), ['-' => '']));
72
73
        if ($uid === '') {
74
            return '';
75
        }
76
77
        return $uid . $this->pafUidChecksum($uid);
78
    }
79
80
    /**
81
     * @param string $uid exactly 32 hex characters
82
     *
83
     * @return string
84
     */
85
    public function pafUidChecksum(string $uid): string
86
    {
87
        $checksum_a = 0; // a sum of the bytes
88
        $checksum_b = 0; // a sum of the incremental values of $checksum_a
89
90
        for ($i = 0; $i < 32; $i += 2) {
91
            $checksum_a += hexdec(substr($uid, $i, 2));
92
            $checksum_b += $checksum_a & 0xff;
93
        }
94
95
        $digit1 = str_pad(dechex($checksum_a), 2, '0', STR_PAD_LEFT);
0 ignored issues
show
It seems like $checksum_a can also be of type double; however, parameter $num of dechex() does only seem to accept integer, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

95
        $digit1 = str_pad(dechex(/** @scrutinizer ignore-type */ $checksum_a), 2, '0', STR_PAD_LEFT);
Loading history...
96
        $digit2 = str_pad(dechex($checksum_b), 2, '0', STR_PAD_LEFT);
97
98
        return strtoupper($digit1 . $digit2);
99
    }
100
}
101