]> BookStack Code Mirror - bookstack/blobdiff - app/Console/Commands/CreateAdmin.php
Started work on details/summary blocks
[bookstack] / app / Console / Commands / CreateAdmin.php
index 90c1ddb1c325e4e67761b5a81d9d602ad254c103..8c273bc1ff416ee5f6c5e1607d25a16e4733b002 100644 (file)
@@ -4,6 +4,10 @@ namespace BookStack\Console\Commands;
 
 use BookStack\Auth\UserRepo;
 use Illuminate\Console\Command;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Validation\Rules\Password;
+use Illuminate\Validation\Rules\Unique;
+use Symfony\Component\Console\Command\Command as SymfonyCommand;
 
 class CreateAdmin extends Command
 {
@@ -28,8 +32,6 @@ class CreateAdmin extends Command
 
     /**
      * Create a new command instance.
-     *
-     * @param UserRepo $userRepo
      */
     public function __construct(UserRepo $userRepo)
     {
@@ -40,46 +42,46 @@ class CreateAdmin extends Command
     /**
      * Execute the console command.
      *
-     * @return mixed
      * @throws \BookStack\Exceptions\NotFoundException
+     *
+     * @return mixed
      */
     public function handle()
     {
-        $email = trim($this->option('email'));
-        if (empty($email)) {
-            $email = $this->ask('Please specify an email address for the new admin user');
-        }
-        if (strlen($email) < 5 || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
-            return $this->error('Invalid email address provided');
-        }
+        $details = $this->options();
 
-        if ($this->userRepo->getByEmail($email) !== null) {
-            return $this->error('A user with the provided email already exists!');
+        if (empty($details['email'])) {
+            $details['email'] = $this->ask('Please specify an email address for the new admin user');
         }
-
-        $name = trim($this->option('name'));
-        if (empty($name)) {
-            $name = $this->ask('Please specify an name for the new admin user');
+        if (empty($details['name'])) {
+            $details['name'] = $this->ask('Please specify a name for the new admin user');
         }
-        if (strlen($name) < 2) {
-            return $this->error('Invalid name provided');
+        if (empty($details['password'])) {
+            $details['password'] = $this->ask('Please specify a password for the new admin user (8 characters min)');
         }
 
-        $password = trim($this->option('password'));
-        if (empty($password)) {
-            $password = $this->secret('Please specify a password for the new admin user');
-        }
-        if (strlen($password) < 5) {
-            return $this->error('Invalid password provided, Must be at least 5 characters');
-        }
+        $validator = Validator::make($details, [
+            'email'    => ['required', 'email', 'min:5', new Unique('users', 'email')],
+            'name'     => ['required', 'min:2'],
+            'password' => ['required', Password::default()],
+        ]);
 
+        if ($validator->fails()) {
+            foreach ($validator->errors()->all() as $error) {
+                $this->error($error);
+            }
 
-        $user = $this->userRepo->create(['email' => $email, 'name' => $name, 'password' => $password]);
+            return SymfonyCommand::FAILURE;
+        }
+
+        $user = $this->userRepo->create($validator->validated());
         $this->userRepo->attachSystemRole($user, 'admin');
         $this->userRepo->downloadAndAssignUserAvatar($user);
         $user->email_confirmed = true;
         $user->save();
 
         $this->info("Admin account with email \"{$user->email}\" successfully created!");
+
+        return SymfonyCommand::SUCCESS;
     }
 }