From 2c4fae60bccfb24c5cb913cda2a06c803460a936 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 23 Nov 2015 11:53:57 +1030 Subject: [PATCH] Allow provision of an avatar URL to upload during sign up This can be used by authentication extensions (i.e. mirror Facebook/Twitter profile picture). Rough implementation, needs refactoring. --- js/forum/src/components/SignUpModal.js | 6 +++- src/Core/Command/RegisterUserHandler.php | 44 +++++++++++++++++++++++- src/Core/CoreServiceProvider.php | 4 +++ 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/js/forum/src/components/SignUpModal.js b/js/forum/src/components/SignUpModal.js index f1bc716be..efd46bccf 100644 --- a/js/forum/src/components/SignUpModal.js +++ b/js/forum/src/components/SignUpModal.js @@ -73,7 +73,7 @@ export default class SignUpModal extends Modal {
- @@ -216,6 +216,10 @@ export default class SignUpModal extends Modal { data.password = this.password(); } + if (this.props.avatarUrl) { + data.avatarUrl = this.props.avatarUrl; + } + return data; } } diff --git a/src/Core/Command/RegisterUserHandler.php b/src/Core/Command/RegisterUserHandler.php index f8164abb7..b9c7a735d 100644 --- a/src/Core/Command/RegisterUserHandler.php +++ b/src/Core/Command/RegisterUserHandler.php @@ -16,9 +16,16 @@ use Flarum\Core\AuthToken; use Flarum\Core\Validator\UserValidator; use Flarum\Event\UserWillBeSaved; use Flarum\Core\Support\DispatchEventsTrait; +use Flarum\Foundation\Application; use Flarum\Settings\SettingsRepositoryInterface; use Flarum\Core\Exception\PermissionDeniedException; use Illuminate\Contracts\Events\Dispatcher; +use Illuminate\Support\Str; +use Intervention\Image\ImageManager; +use League\Flysystem\Adapter\Local; +use League\Flysystem\Filesystem; +use League\Flysystem\FilesystemInterface; +use League\Flysystem\MountManager; class RegisterUserHandler { @@ -35,16 +42,30 @@ class RegisterUserHandler */ protected $validator; + /** + * @var Application + */ + protected $app; + + /** + * @var FilesystemInterface + */ + protected $uploadDir; + /** * @param Dispatcher $events * @param SettingsRepositoryInterface $settings * @param UserValidator $validator + * @param Application $app + * @param FilesystemInterface $uploadDir */ - public function __construct(Dispatcher $events, SettingsRepositoryInterface $settings, UserValidator $validator) + public function __construct(Dispatcher $events, SettingsRepositoryInterface $settings, UserValidator $validator, Application $app, FilesystemInterface $uploadDir) { $this->events = $events; $this->settings = $settings; $this->validator = $validator; + $this->app = $app; + $this->uploadDir = $uploadDir; } /** @@ -98,6 +119,8 @@ class RegisterUserHandler $this->validator->assertValid(array_merge($user->getAttributes(), compact('password'))); + $this->saveAvatarFromUrl($user, array_get($data, 'attributes.avatarUrl')); + $user->save(); if (isset($token)) { @@ -108,4 +131,23 @@ class RegisterUserHandler return $user; } + + private function saveAvatarFromUrl(User $user, $avatarUrl) + { + $tmpFile = tempnam($this->app->storagePath().'/tmp', 'avatar'); + + $manager = new ImageManager; + $manager->make($avatarUrl)->fit(100, 100)->save($tmpFile); + + $mount = new MountManager([ + 'source' => new Filesystem(new Local(pathinfo($tmpFile, PATHINFO_DIRNAME))), + 'target' => $this->uploadDir, + ]); + + $uploadName = Str::lower(Str::quickRandom()) . '.jpg'; + + $user->changeAvatarPath($uploadName); + + $mount->move("source://".pathinfo($tmpFile, PATHINFO_BASENAME), "target://$uploadName"); + } } diff --git a/src/Core/CoreServiceProvider.php b/src/Core/CoreServiceProvider.php index adc682933..4f7f1511a 100644 --- a/src/Core/CoreServiceProvider.php +++ b/src/Core/CoreServiceProvider.php @@ -55,6 +55,10 @@ class CoreServiceProvider extends AbstractServiceProvider $this->app->when('Flarum\Core\Command\DeleteAvatarHandler') ->needs('League\Flysystem\FilesystemInterface') ->give($avatarsFilesystem); + + $this->app->when('Flarum\Core\Command\RegisterUserHandler') + ->needs('League\Flysystem\FilesystemInterface') + ->give($avatarsFilesystem); } /**