| 
									
										
										
										
											2021-07-01 05:10:02 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | namespace BookStack\Access\Mfa; | 
					
						
							| 
									
										
										
										
											2021-07-01 05:10:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 00:52:19 +08:00
										 |  |  | use Closure; | 
					
						
							|  |  |  | use Illuminate\Contracts\Validation\ValidationRule; | 
					
						
							| 
									
										
										
										
											2021-07-01 05:10:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 00:52:19 +08:00
										 |  |  | class TotpValidationRule implements ValidationRule | 
					
						
							| 
									
										
										
										
											2021-07-01 05:10:02 +08:00
										 |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Create a new rule instance. | 
					
						
							|  |  |  |      * Takes the TOTP secret that must be system provided, not user provided. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2024-03-18 00:52:19 +08:00
										 |  |  |     public function __construct( | 
					
						
							|  |  |  |         protected string $secret, | 
					
						
							|  |  |  |         protected TotpService $totpService, | 
					
						
							|  |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2021-07-01 05:10:02 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-18 00:52:19 +08:00
										 |  |  |     public function validate(string $attribute, mixed $value, Closure $fail): void | 
					
						
							| 
									
										
										
										
											2021-07-01 05:10:02 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-03-18 00:52:19 +08:00
										 |  |  |         $passes = $this->totpService->verifyCode($value, $this->secret); | 
					
						
							|  |  |  |         if (!$passes) { | 
					
						
							|  |  |  |             $fail(trans('validation.totp')); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-07-01 05:10:02 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } |