From 6479e16339ec1f3dc82cb90a233d830d572431f1 Mon Sep 17 00:00:00 2001 From: Pellaeon Lin Date: Sat, 2 Jul 2016 12:54:20 +0800 Subject: [PATCH] Update# automatically logs user in after account creation --- appinfo/application.php | 3 +- controller/registercontroller.php | 66 ++++++++++++++++++++++++++----- 2 files changed, 59 insertions(+), 10 deletions(-) diff --git a/appinfo/application.php b/appinfo/application.php index 3c79b2f..78d50b7 100644 --- a/appinfo/application.php +++ b/appinfo/application.php @@ -42,7 +42,8 @@ class Application extends App { $c->query('UserManager'), $c->query('Config'), $c->query('GroupManager'), - $c->query('Defaults') + $c->query('Defaults'), + $c->query('ServerContainer')->getSecureRandom()->getMediumStrengthGenerator() ); }); diff --git a/controller/registercontroller.php b/controller/registercontroller.php index 04d2be8..37797c5 100644 --- a/controller/registercontroller.php +++ b/controller/registercontroller.php @@ -22,6 +22,8 @@ use \OCP\IGroupManager; use \OCP\IL10N; use \OCP\IConfig; use \OCP\Mail\IMailer; +use \OC_User; +use \OC_Util; class RegisterController extends Controller { @@ -34,10 +36,12 @@ class RegisterController extends Controller { private $groupmanager; /** @var \OC_Defaults */ private $defaults; + private $random; protected $appName; public function __construct($appName, IRequest $request, IMailer $mailer, IL10N $l10n, $urlgenerator, - $pendingreg, IUserManager $usermanager, IConfig $config, IGroupManager $groupmanager, \OC_Defaults $defaults){ + $pendingreg, IUserManager $usermanager, IConfig $config, IGroupManager $groupmanager, \OC_Defaults $defaults, + ISecureRandom $random){ $this->mailer = $mailer; $this->l10n = $l10n; $this->urlgenerator = $urlgenerator; @@ -47,6 +51,7 @@ class RegisterController extends Controller { $this->groupmanager = $groupmanager; $this->defaults = $defaults; $this->appName = $appName; + $this->random = $random; parent::__construct($appName, $request); } @@ -196,9 +201,10 @@ class RegisterController extends Controller { )) ), 'error'); } else { + $userId = $user->getUID(); // Set user email try { - $this->config->setUserValue($user->getUID(), 'settings', 'email', $email); + $this->config->setUserValue($userId, 'settings', 'email', $email); } catch (\Exception $e) { return new TemplateResponse('', 'error', array( 'errors' => array(array( @@ -234,6 +240,7 @@ class RegisterController extends Controller { ), 'error'); } + // Notify admin $admin_users = $this->groupmanager->get('admin')->getUsers(); $to_arr = array(); foreach ( $admin_users as $au ) { @@ -243,17 +250,42 @@ class RegisterController extends Controller { } } try { - $this->sendNewUserNotifEmail($to_arr, $user->getUID()); + $this->sendNewUserNotifEmail($to_arr, $userId); } catch (\Exception $e) { \OCP\Util::writeLog('registration', 'Sending admin notification email failed: '. $e->getMessage, \OCP\Util::ERROR); } - } - return new TemplateResponse('registration', 'message', array('msg' => - str_replace('{link}', - $this->urlgenerator->getAbsoluteURL('/'), - $this->l10n->t('Your account has been successfully created, you can log in now.')) - ), 'guest'); + // Try to log user in + if (OC_User::login($username, $password)) { + // setting up the time zone + /* + if (isset($_POST['timezone-offset'])) { + self::$server->getSession()->set('timezone', (string)$_POST['timezone-offset']); + self::$server->getConfig()->setUserValue($userId, 'core', 'timezone', (string)$_POST['timezone']); + }*/ + + $this->cleanupLoginTokens($userId); + /*if (!empty($_POST["remember_login"])) { + $logintoken = $this->random->generate(32); + $this->config->setUserValue($userId, 'login_token', $logintoken, time()); + OC_User::setMagicInCookie($userId, $logintoken); + } else { + OC_User::unsetMagicInCookie(); + }*/ + // FIXME unsetMagicInCookie will fail from session already closed, so now we always remember + $logintoken = $this->random->generate(32); + $this->config->setUserValue($userId, 'login_token', $logintoken, time()); + OC_User::setMagicInCookie($userId, $logintoken); + OC_Util::redirectToDefaultPage(); + + // Render message in case redirect failed + return new TemplateResponse('registration', 'message', array('msg' => + str_replace('{link}', + $this->urlgenerator->getAbsoluteURL('/'), + $this->l10n->t('Your account has been successfully created, you can log in now.')) + ), 'guest'); + } + } } } @@ -318,4 +350,20 @@ class RegisterController extends Controller { if ( !empty($failed_recipients) ) throw new \Exception('Failed recipients: '.print_r($failed_recipients, true)); } + + /** + * Replicates OC::cleanupLoginTokens() since it's protected + * @param string $userId + * @return null + */ + private function cleanupLoginTokens($userId) { + $cutoff = time() - $this->config->getSystemValue('remember_login_cookie_lifetime', 60 * 60 * 24 * 15); + $tokens = $this->config->getUserKeys($userId, 'login_token'); + foreach ($tokens as $token) { + $time = $this->config->getUserValue($userId, 'login_token', $token); + if ($time < $cutoff) { + $this->config->deleteUserValue($userId, 'login_token', $token); + } + } + } }