1 | <?php |
||
20 | class PasswordGenerator |
||
21 | { |
||
22 | /** |
||
23 | * @var array Characters intervall utf8 dec rappresentation |
||
24 | */ |
||
25 | private $chars = [ |
||
26 | [[65, 90]], //u 117 |
||
27 | [[97, 122]], //l 108 |
||
28 | [[48, 57]], //d 100 |
||
29 | [[33, 47], [58, 64], [91, 96], [123, 126]], //s 115 |
||
30 | ]; |
||
31 | |||
32 | /** |
||
33 | * Generate a random password. |
||
34 | * <pre><code class="php">use Linna\Auth\PasswordGenerator; |
||
35 | * |
||
36 | * $passwordGenerator = new PasswordGenerator(); |
||
37 | * $random = $passwordGenerator->getFromRandom(20); |
||
38 | * |
||
39 | * //var_dump result |
||
40 | * //r4Q,1J*tM7D_99q0u>61 |
||
41 | * var_dump($random); |
||
42 | * </code></pre> |
||
43 | * |
||
44 | * @param int $length Desiderated password length. |
||
45 | * @return string Random password. |
||
46 | */ |
||
47 | 8 | public function getFromRandom(int $length): string |
|
59 | |||
60 | /** |
||
61 | * Return topology for given password. |
||
62 | * <pre><code class="php">use Linna\Auth\PasswordGenerator; |
||
63 | * |
||
64 | * $passwordGenerator = new PasswordGenerator(); |
||
65 | * $topology = $passwordGenerator->getTopology('r4Q,1J*tM7D_99q0u>61'); |
||
66 | * |
||
67 | * //var_dump result |
||
68 | * //ldusdusludusddldlsdd |
||
69 | * var_dump($topology); |
||
70 | * </code></pre> |
||
71 | * @param string $password Password. |
||
72 | * |
||
73 | * @return string Topology for the argument passed password. |
||
74 | */ |
||
75 | 25 | public function getTopology(string $password): string |
|
86 | |||
87 | /** |
||
88 | * Return topology group for the given char. |
||
89 | * |
||
90 | * @param string $char |
||
91 | * |
||
92 | * @return string |
||
93 | */ |
||
94 | 25 | private function getTopologyGroup(string $char) : string |
|
105 | |||
106 | /** |
||
107 | * Generate a random password corresponding at the given topology. |
||
108 | * <pre><code class="php">use Linna\Auth\PasswordGenerator; |
||
109 | * |
||
110 | * $passwordGenerator = new PasswordGenerator(); |
||
111 | * $random = $passwordGenerator->getFromTopology('ldusdusludusddldlsdd'); |
||
112 | * |
||
113 | * //var_dump result |
||
114 | * //r4Q,1J*tM7D_99q0u>61 |
||
115 | * var_dump($random); |
||
116 | * </code></pre> |
||
117 | * |
||
118 | * @param string $topology Topology for generate password. |
||
119 | * @return string Random password corresponding the given topology. |
||
120 | * |
||
121 | * @throws InvalidArgumentException If invalid pattern is provided. |
||
122 | */ |
||
123 | 16 | public function getFromTopology(string $topology): string |
|
143 | |||
144 | /** |
||
145 | * Get random char between. |
||
146 | * |
||
147 | * @param array $interval |
||
148 | * @return string |
||
149 | */ |
||
150 | 21 | private function getRandomChar(array $interval): string |
|
151 | { |
||
152 | do { |
||
153 | 21 | $int = random_int(33, 122); |
|
154 | 21 | if ($this->inRanges($int, $interval)) { |
|
155 | 21 | break; |
|
156 | } |
||
157 | 21 | } while (true); |
|
158 | |||
159 | 21 | return chr($int); |
|
160 | } |
||
161 | |||
162 | /** |
||
163 | * Check if value is between given range. |
||
164 | * |
||
165 | * @param mixed $value |
||
166 | * @param array $ranges |
||
167 | * |
||
168 | * @return bool |
||
169 | */ |
||
170 | 32 | private function inRanges($value, array $ranges): bool |
|
180 | } |
||
181 |