| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Console\Commands; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-13 20:56:26 +08:00
										 |  |  | use BookStack\Auth\Role; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | use BookStack\Auth\UserRepo; | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  | use BookStack\Exceptions\NotFoundException; | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  | use Illuminate\Console\Command; | 
					
						
							| 
									
										
										
										
											2021-12-19 00:31:48 +08:00
										 |  |  | use Illuminate\Support\Facades\Validator; | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  | use Illuminate\Support\Str; | 
					
						
							| 
									
										
										
										
											2021-12-19 00:31:48 +08:00
										 |  |  | use Illuminate\Validation\Rules\Password; | 
					
						
							|  |  |  | use Illuminate\Validation\Rules\Unique; | 
					
						
							| 
									
										
										
										
											2021-11-06 00:18:06 +08:00
										 |  |  | use Symfony\Component\Console\Command\Command as SymfonyCommand; | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class CreateAdmin extends Command | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * The name and signature of the console command. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @var string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected $signature = 'bookstack:create-admin | 
					
						
							|  |  |  |                             {--email= : The email address for the new admin user} | 
					
						
							|  |  |  |                             {--name= : The name of the new admin user} | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  |                             {--password= : The password to assign to the new admin user} | 
					
						
							|  |  |  |                             {--external-auth-id= : The external authentication system id for the new admin user (SAML2/LDAP/OIDC)}'; | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * The console command description. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @var string | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected $description = 'Add a new admin user to the system'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected $userRepo; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Create a new command instance. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function __construct(UserRepo $userRepo) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->userRepo = $userRepo; | 
					
						
							|  |  |  |         parent::__construct(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Execute the console command. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  |      * @throws NotFoundException | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function handle() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  |         $details = $this->snakeCaseOptions(); | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 00:31:48 +08:00
										 |  |  |         if (empty($details['email'])) { | 
					
						
							|  |  |  |             $details['email'] = $this->ask('Please specify an email address for the new admin user'); | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 00:31:48 +08:00
										 |  |  |         if (empty($details['name'])) { | 
					
						
							|  |  |  |             $details['name'] = $this->ask('Please specify a name for the new admin user'); | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 00:31:48 +08:00
										 |  |  |         if (empty($details['password'])) { | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  |             if (empty($details['external_auth_id'])) { | 
					
						
							|  |  |  |                 $details['password'] = $this->ask('Please specify a password for the new admin user (8 characters min)'); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 $details['password'] = Str::random(32); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 00:31:48 +08:00
										 |  |  |         $validator = Validator::make($details, [ | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  |             'email'            => ['required', 'email', 'min:5', new Unique('users', 'email')], | 
					
						
							|  |  |  |             'name'             => ['required', 'min:2'], | 
					
						
							|  |  |  |             'password'         => ['required_without:external_auth_id', Password::default()], | 
					
						
							|  |  |  |             'external_auth_id' => ['required_without:password'], | 
					
						
							| 
									
										
										
										
											2021-12-19 00:31:48 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2021-11-06 00:27:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-19 00:31:48 +08:00
										 |  |  |         if ($validator->fails()) { | 
					
						
							|  |  |  |             foreach ($validator->errors()->all() as $error) { | 
					
						
							|  |  |  |                 $this->error($error); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-12-19 00:41:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-06 00:18:06 +08:00
										 |  |  |             return SymfonyCommand::FAILURE; | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-04 08:26:19 +08:00
										 |  |  |         $user = $this->userRepo->createWithoutActivity($validator->validated()); | 
					
						
							| 
									
										
										
										
											2022-02-13 20:56:26 +08:00
										 |  |  |         $user->attachRole(Role::getSystemRole('admin')); | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  |         $user->email_confirmed = true; | 
					
						
							|  |  |  |         $user->save(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->info("Admin account with email \"{$user->email}\" successfully created!"); | 
					
						
							| 
									
										
										
										
											2021-11-06 00:27:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-06 00:18:06 +08:00
										 |  |  |         return SymfonyCommand::SUCCESS; | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     protected function snakeCaseOptions(): array | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $returnOpts = []; | 
					
						
							|  |  |  |         foreach ($this->options() as $key => $value) { | 
					
						
							|  |  |  |             $returnOpts[str_replace('-', '_', $key)] = $value; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-02-01 19:49:30 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-01 04:43:41 +08:00
										 |  |  |         return $returnOpts; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-01-29 02:09:26 +08:00
										 |  |  | } |