diff --git a/app/Http/Controllers/Server/ServerController.php b/app/Http/Controllers/Server/ServerController.php index 0f8bc8b7f6..f755d3f1ec 100644 --- a/app/Http/Controllers/Server/ServerController.php +++ b/app/Http/Controllers/Server/ServerController.php @@ -176,7 +176,7 @@ public function getDownloadFile(Request $request, $uuid, $file) $download = new Models\Download; - $download->token = Uuid::generate(4); + $download->token = (string) Uuid::generate(4); $download->server = $server->uuid; $download->path = str_replace('../', '', $file); diff --git a/app/Models/User.php b/app/Models/User.php index ca1031ffd1..251d1b018b 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -137,5 +137,4 @@ public function sendPasswordResetNotification($token) $this->notify(new ResetPasswordNotification($token)); } - } diff --git a/app/Notifications/AccountCreated.php b/app/Notifications/AccountCreated.php new file mode 100644 index 0000000000..d3566db42b --- /dev/null +++ b/app/Notifications/AccountCreated.php @@ -0,0 +1,90 @@ + + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +namespace Pterodactyl\Notifications; + +use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Notification; +use Illuminate\Contracts\Queue\ShouldQueue; +use Illuminate\Notifications\Messages\MailMessage; + +class AccountCreated extends Notification implements ShouldQueue +{ + use Queueable; + + /** + * The password reset token to send. + * + * @var string + */ + public $token; + + /** + * Create a new notification instance. + * + * @return void + */ + public function __construct($token) + { + $this->token = $token; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['mail', 'database']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + return (new MailMessage) + ->line('You are recieving this email because an account has been created for you on Pterodactyl Panel.') + ->line('Email: ' . $notifiable->email) + ->action('Setup Your Account', url('/auth/password/reset/' . $this->token . '?email=' . $notifiable->email)); + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + 'email' => $notifiable->email, + 'token' => $this->token + ]; + } +} diff --git a/app/Notifications/SendPasswordReset.php b/app/Notifications/SendPasswordReset.php index 7aa95dde09..b7aa49ec09 100644 --- a/app/Notifications/SendPasswordReset.php +++ b/app/Notifications/SendPasswordReset.php @@ -1,5 +1,26 @@ + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ namespace Pterodactyl\Notifications; use Illuminate\Bus\Queueable; @@ -7,7 +28,7 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; -class SendPasswordReset extends Notification +class SendPasswordReset extends Notification implements ShouldQueue { use Queueable; diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index b5afa6de52..92702d59ed 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -29,9 +29,11 @@ use Hash; use Validator; use Mail; +use Carbon; use Pterodactyl\Models; use Pterodactyl\Services\UuidService; +use Pterodactyl\Notifications\AccountCreated; use Pterodactyl\Exceptions\DisplayValidationException; use Pterodactyl\Exceptions\DisplayException; @@ -48,10 +50,10 @@ public function __construct() * Creates a user on the panel. Returns the created user's ID. * * @param string $email - * @param string $password An unhashed version of the user's password. + * @param string|null $password An unhashed version of the user's password. * @return bool|integer */ - public function create($email, $password, $admin = false) + public function create($email, $password = null, $admin = false) { $validator = Validator::make([ 'email' => $email, @@ -59,7 +61,7 @@ public function create($email, $password, $admin = false) 'root_admin' => $admin ], [ 'email' => 'required|email|unique:users,email', - 'password' => 'required|regex:((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,})', + 'password' => 'nullable|regex:((?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,})', 'root_admin' => 'required|boolean' ]); @@ -77,25 +79,26 @@ public function create($email, $password, $admin = false) $user->uuid = $uuid->generate('users', 'uuid'); $user->email = $email; - $user->password = Hash::make($password); + $user->password = Hash::make((is_null($password)) ? str_random(30) : $password); $user->language = 'en'; $user->root_admin = ($admin) ? 1 : 0; $user->save(); - Mail::queue('emails.new-account', [ + // Setup a Password Reset to use when they set a password. + $token = str_random(32); + DB::table('password_resets')->insert([ 'email' => $user->email, - 'forgot' => route('auth.password'), - 'login' => route('auth.login') - ], function ($message) use ($email) { - $message->to($email); - $message->from(Settings::get('email_from', env('MAIL_FROM')), Settings::get('email_sender_name', env('MAIL_FROM_NAME', 'Pterodactyl Panel'))); - $message->subject(Settings::get('company') . ' - New Account'); - }); + 'token' => $token, + 'created_at' => Carbon::now()->toDateTimeString() + ]); + + $user->notify((new AccountCreated($token))); + DB::commit(); return $user->id; } catch (\Exception $ex) { DB::rollBack(); - throw $e; + throw $ex; } } diff --git a/app/Services/UuidService.php b/app/Services/UuidService.php index e4694c2bc0..430c82f822 100644 --- a/app/Services/UuidService.php +++ b/app/Services/UuidService.php @@ -59,7 +59,7 @@ public function generate($table = 'users', $field = 'uuid', $type = 4) } while (!$return); - return $return; + return (string) $return; } @@ -85,7 +85,7 @@ public function generateShort($table = 'servers', $field = 'uuidShort', $attache } while (!$return); - return $return; + return (string) $return; } diff --git a/composer.json b/composer.json index 5ef2a0d29f..9958528f47 100644 --- a/composer.json +++ b/composer.json @@ -17,7 +17,7 @@ ], "require": { "php": ">=5.6.4", - "laravel/framework": "5.3.*", + "laravel/framework": "5.3.6", "barryvdh/laravel-debugbar": "^2.2.3", "doctrine/dbal": "^2.5.4", "guzzlehttp/guzzle": "^6.2.1", @@ -35,7 +35,8 @@ "mockery/mockery": "0.9.*", "phpunit/phpunit": "~5.0", "symfony/css-selector": "3.1.*", - "symfony/dom-crawler": "3.1.*" + "symfony/dom-crawler": "3.1.*", + "laravel/homestead": "3.0.*" }, "autoload": { "classmap": [ diff --git a/config/queue.php b/config/queue.php index dd2f960388..0d80b7c518 100644 --- a/config/queue.php +++ b/config/queue.php @@ -39,14 +39,14 @@ 'driver' => 'database', 'table' => 'jobs', 'queue' => 'default', - 'expire' => 60, + 'retry_after' => 60, ], 'beanstalkd' => [ 'driver' => 'beanstalkd', 'host' => 'localhost', 'queue' => 'default', - 'ttr' => 60, + 'retry_after' => 60, ], 'sqs' => [ @@ -70,7 +70,7 @@ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', - 'expire' => 60, + 'retry_after' => 60, ], ], diff --git a/database/migrations/2016_09_04_182835_create_notifications_table.php b/database/migrations/2016_09_04_182835_create_notifications_table.php new file mode 100644 index 0000000000..160a1c42f4 --- /dev/null +++ b/database/migrations/2016_09_04_182835_create_notifications_table.php @@ -0,0 +1,34 @@ +string('id')->primary(); + $table->string('type'); + $table->morphs('notifiable'); + $table->text('data'); + $table->timestamp('read_at')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::drop('notifications'); + } +} diff --git a/resources/views/vendor/notifications/email-plain.blade.php b/resources/views/vendor/notifications/email-plain.blade.php index acefa65238..8750958958 100644 --- a/resources/views/vendor/notifications/email-plain.blade.php +++ b/resources/views/vendor/notifications/email-plain.blade.php @@ -19,4 +19,4 @@ } echo 'Regards,', "\n"; -echo config('app.name'), "\n"; +echo Settings::get('company'), "\n"; diff --git a/resources/views/vendor/notifications/email.blade.php b/resources/views/vendor/notifications/email.blade.php index 94f86a960e..855286b633 100644 --- a/resources/views/vendor/notifications/email.blade.php +++ b/resources/views/vendor/notifications/email.blade.php @@ -71,7 +71,7 @@ - {{ config('app.name') }} + {{ Settings::get('company') }} @@ -140,7 +140,7 @@ class="button"

- Regards,
{{ config('app.name') }} + Regards,
{{ Settings::get('company') }}

@@ -176,7 +176,7 @@ class="button"

© {{ date('Y') }} - {{ config('app.name') }}. + {{ Settings::get('company') }}. All rights reserved.