Commit ccadd7fc authored by Vincent Petry's avatar Vincent Petry Committed by GitHub
Browse files

Merge pull request #26206 from owncloud/first-login-event

First login event
parents 8ddd74c9 a68d6313
......@@ -29,6 +29,7 @@ use OCA\DAV\CardDAV\SyncService;
use OCA\DAV\HookManager;
use \OCP\AppFramework\App;
use OCP\Contacts\IManager;
use OCP\IUser;
use Symfony\Component\EventDispatcher\GenericEvent;
class Application extends App {
......@@ -58,6 +59,16 @@ class Application extends App {
$hm = $this->getContainer()->query(HookManager::class);
$hm->setup();
$dispatcher = $this->getContainer()->getServer()->getEventDispatcher();
// first time login event setup
$dispatcher->addListener(IUser::class . '::firstLogin', function ($event) use ($hm) {
if ($event instanceof GenericEvent) {
$hm->firstLogin($event->getSubject());
}
});
// carddav/caldav sync event setup
$listener = function($event) {
if ($event instanceof GenericEvent) {
/** @var BirthdayService $b */
......@@ -70,7 +81,6 @@ class Application extends App {
}
};
$dispatcher = $this->getContainer()->getServer()->getEventDispatcher();
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::createCard', $listener);
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::updateCard', $listener);
$dispatcher->addListener('\OCA\DAV\CardDAV\CardDavBackend::deleteCard', function($event) {
......
......@@ -84,10 +84,6 @@ class HookManager {
'changeUser',
$this,
'changeUser');
Util::connectHook('OC_User',
'post_login',
$this,
'postLogin');
}
public function postCreateUser($params) {
......@@ -123,8 +119,7 @@ class HookManager {
$this->syncService->updateUser($user);
}
public function postLogin($params) {
$user = $this->userManager->get($params['uid']);
public function firstLogin(IUser $user = null) {
if (!is_null($user)) {
$principal = 'principals/users/' . $user->getUID();
$calendars = $this->calDav->getCalendarsForUser($principal);
......
......@@ -86,6 +86,7 @@ class UploadTest extends RequestTest {
public function testUploadOverWriteWriteLocked() {
$user = $this->getUniqueID();
$view = $this->setupUser($user, 'pass');
$this->loginAsUser($user);
$view->file_put_contents('foo.txt', 'bar');
......
......@@ -60,7 +60,6 @@ class HookManagerTest extends TestCase {
$userManager = $this->getMockBuilder(IUserManager::class)
->disableOriginalConstructor()
->getMock();
$userManager->expects($this->once())->method('get')->willReturn($user);
/** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
$syncService = $this->getMockBuilder(SyncService::class)
......@@ -90,7 +89,7 @@ class HookManagerTest extends TestCase {
'contacts', ['{DAV:}displayname' => $this->l10n->t('Contacts')]);
$hm = new HookManager($userManager, $syncService, $cal, $card, $this->l10n);
$hm->postLogin(['uid' => 'newUser']);
$hm->firstLogin($user);
}
public function testWithExisting() {
......@@ -103,7 +102,6 @@ class HookManagerTest extends TestCase {
$userManager = $this->getMockBuilder(IUserManager::class)
->disableOriginalConstructor()
->getMock();
$userManager->expects($this->once())->method('get')->willReturn($user);
/** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
$syncService = $this->getMockBuilder(SyncService::class)
......@@ -129,7 +127,7 @@ class HookManagerTest extends TestCase {
$card->expects($this->never())->method('createAddressBook');
$hm = new HookManager($userManager, $syncService, $cal, $card, $this->l10n);
$hm->postLogin(['uid' => 'newUser']);
$hm->firstLogin($user);
}
public function testWithBirthdayCalendar() {
......@@ -142,7 +140,6 @@ class HookManagerTest extends TestCase {
$userManager = $this->getMockBuilder(IUserManager::class)
->disableOriginalConstructor()
->getMock();
$userManager->expects($this->once())->method('get')->willReturn($user);
/** @var SyncService | \PHPUnit_Framework_MockObject_MockObject $syncService */
$syncService = $this->getMockBuilder(SyncService::class)
......@@ -174,7 +171,7 @@ class HookManagerTest extends TestCase {
'contacts', ['{DAV:}displayname' => $this->l10n->t('Contacts')]);
$hm = new HookManager($userManager, $syncService, $cal, $card, $this->l10n);
$hm->postLogin(['uid' => 'newUser']);
$hm->firstLogin($user);
}
public function testDeleteCalendar() {
......
......@@ -23,8 +23,10 @@
namespace OCA\Files\Tests\Command;
use OC\Files\View;
use OCA\Files\Command\DeleteOrphanedFiles;
use OCP\Files\StorageNotAvailableException;
use Test\TestCase;
/**
* Class DeleteOrphanedFilesTest
......@@ -33,7 +35,7 @@ use OCP\Files\StorageNotAvailableException;
*
* @package OCA\Files\Tests\Command
*/
class DeleteOrphanedFilesTest extends \Test\TestCase {
class DeleteOrphanedFilesTest extends TestCase {
/**
* @var DeleteOrphanedFiles
......@@ -93,7 +95,7 @@ class DeleteOrphanedFilesTest extends \Test\TestCase {
$this->loginAsUser($this->user1);
$view = new \OC\Files\View('/' . $this->user1 . '/');
$view = new View('/' . $this->user1 . '/');
$view->mkdir('files/test');
$fileInfo = $view->getFileInfo('files/test');
......@@ -114,7 +116,7 @@ class DeleteOrphanedFilesTest extends \Test\TestCase {
$output
->expects($this->once())
->method('writeln')
->with('4 orphaned file cache entries deleted');
->with('3 orphaned file cache entries deleted');
$this->command->execute($input, $output);
......
......@@ -349,7 +349,6 @@ class Root extends Folder implements IRootFolder {
$folder = $folder->get($dir);
} catch (NotFoundException $e) {
$folder = $folder->newFolder($dir);
\OC_Util::copySkeleton($userId, $folder);
}
return $folder;
......
......@@ -366,15 +366,6 @@ class Setup {
$group =\OC::$server->getGroupManager()->createGroup('admin');
$group->addUser($user);
// Create a session token for the newly created user
// The token provider requires a working db, so it's not injected on setup
/* @var $userSession User\Session */
$userSession = \OC::$server->getUserSession();
$defaultTokenProvider = \OC::$server->query('OC\Authentication\Token\DefaultTokenProvider');
$userSession->setTokenProvider($defaultTokenProvider);
$userSession->login($username, $password);
$userSession->createSessionToken($request, $userSession->getUser()->getUID(), $username, $password);
//guess what this does
Installer::installShippedApps();
......@@ -395,6 +386,15 @@ class Setup {
//and we are done
$config->setSystemValue('installed', true);
// Create a session token for the newly created user
// The token provider requires a working db, so it's not injected on setup
/* @var $userSession User\Session */
$userSession = \OC::$server->getUserSession();
$defaultTokenProvider = \OC::$server->query('OC\Authentication\Token\DefaultTokenProvider');
$userSession->setTokenProvider($defaultTokenProvider);
$userSession->login($username, $password);
$userSession->createSessionToken($request, $userSession->getUser()->getUID(), $username, $password);
}
return $error;
......
......@@ -78,14 +78,6 @@ class Manager extends PublicEmitter implements IUserManager {
/** @var \OC\User\User $user */
unset($cachedUsers[$user->getUID()]);
});
$this->listen('\OC\User', 'postLogin', function ($user) {
/** @var \OC\User\User $user */
$user->updateLastLoginTimestamp();
});
$this->listen('\OC\User', 'postRememberedLogin', function ($user) {
/** @var \OC\User\User $user */
$user->updateLastLoginTimestamp();
});
}
/**
......
......@@ -49,6 +49,7 @@ use OCP\IUserManager;
use OCP\IUserSession;
use OCP\Session\Exceptions\SessionNotAvailableException;
use OCP\Util;
use Symfony\Component\EventDispatcher\GenericEvent;
/**
* Class Session
......@@ -371,15 +372,25 @@ class Session implements IUserSession, Emitter {
}
}
protected function prepareUserLogin() {
protected function prepareUserLogin($firstTimeLogin) {
// TODO: mock/inject/use non-static
// Refresh the token
\OC::$server->getCsrfTokenManager()->refreshToken();
//we need to pass the user name, which may differ from login name
$user = $this->getUser()->getUID();
OC_Util::setupFS($user);
//trigger creation of user home and /files folder
\OC::$server->getUserFolder($user);
if ($firstTimeLogin) {
// TODO: lock necessary?
//trigger creation of user home and /files folder
$userFolder = \OC::$server->getUserFolder($user);
// copy skeleton
\OC_Util::copySkeleton($user, $userFolder);
// trigger any other initialization
\OC::$server->getEventDispatcher()->dispatch(IUser::class . '::firstLogin', new GenericEvent($this->getUser()));
}
}
/**
......@@ -431,9 +442,10 @@ class Session implements IUserSession, Emitter {
if ($user->isEnabled()) {
$this->setUser($user);
$this->setLoginName($uid);
$firstTimeLogin = $user->updateLastLoginTimestamp();
$this->manager->emit('\OC\User', 'postLogin', [$user, $password]);
if ($this->isLoggedIn()) {
$this->prepareUserLogin();
$this->prepareUserLogin($firstTimeLogin);
return true;
} else {
// injecting l10n does not work - there is a circular dependency between session and \OCP\L10N\IFactory
......@@ -688,6 +700,7 @@ class Session implements IUserSession, Emitter {
//login
$this->setUser($user);
$user->updateLastLoginTimestamp();
$this->manager->emit('\OC\User', 'postRememberedLogin', [$user]);
return true;
}
......
......@@ -180,9 +180,12 @@ class User implements IUser {
* updates the timestamp of the most recent login of this user
*/
public function updateLastLoginTimestamp() {
$firstTimeLogin = ($this->lastLogin === 0);
$this->lastLogin = time();
\OC::$server->getConfig()->setUserValue(
$this->config->setUserValue(
$this->uid, 'login', 'lastLogin', $this->lastLogin);
return $firstTimeLogin;
}
/**
......
......@@ -333,6 +333,10 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase {
self::logout();
\OC\Files\Filesystem::tearDown();
\OC_User::setUserId($user);
$userObject = \OC::$server->getUserManager()->get($user);
if (!is_null($userObject)) {
$userObject->updateLastLoginTimestamp();
}
\OC_Util::setupFS($user);
if (\OC_User::userExists($user)) {
\OC::$server->getUserFolder($user);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment