diff --git a/lib/Doctrine/Repositories/SessionRepository.php b/lib/Doctrine/Repositories/SessionRepository.php index 747d99d7f3..a801d1f51e 100644 --- a/lib/Doctrine/Repositories/SessionRepository.php +++ b/lib/Doctrine/Repositories/SessionRepository.php @@ -12,4 +12,15 @@ use Doctrine\ORM\EntityRepository; */ class SessionRepository extends EntityRepository { + public function findByUser(\User_Adapter $user) + { + $dql = 'SELECT s + FROM Entities\Session s + WHERE s.usr_id = :usr_id'; + + $query = $this->_em->createQuery($dql); + $query->setParameters(array('usr_id' => $user->get_id())); + + return $query->getResult(); + } } diff --git a/lib/classes/User/Adapter.php b/lib/classes/User/Adapter.php index 417282679b..d252a7dadd 100644 --- a/lib/classes/User/Adapter.php +++ b/lib/classes/User/Adapter.php @@ -974,6 +974,12 @@ class User_Adapter implements User_Interface, cache_cacheableInterface $this->app['EM']->remove($provider); } + $repo = $this->app['EM']->getRepository('Entities\Session'); + + foreach ($repo->findByUser($this) as $session) { + $this->app['EM']->remove($session); + } + $this->app['EM']->flush(); $sql = 'UPDATE usr SET usr_login = :usr_login , usr_mail = null diff --git a/lib/classes/patch/383alpha1a.php b/lib/classes/patch/383alpha1a.php new file mode 100644 index 0000000000..0a3172ab95 --- /dev/null +++ b/lib/classes/patch/383alpha1a.php @@ -0,0 +1,76 @@ +release; + } + + /** + * {@inheritdoc} + */ + public function require_all_upgrades() + { + return false; + } + + /** + * {@inheritdoc} + */ + public function concern() + { + return $this->concern; + } + + /** + * {@inheritdoc} + */ + public function apply(base $appbox, Application $app) + { + // Remove deleted users sessions + $sql = 'SELECT s.id FROM `Sessions` s, usr u WHERE u.usr_login LIKE "(#deleted%" AND u.usr_id = s.usr_id'; + $stmt = $appbox->get_connection()->prepare($sql); + $stmt->execute(); + $rows = $stmt->fetchAll(\PDO::FETCH_ASSOC); + $stmt->closeCursor(); + + foreach ($rows as $row) { + if (null !== $session = $app['EM']->find('Entities\Session', $row['id'])) { + $app['EM']->remove($session); + } + } + + // Remove API sessions + $query = $app['EM']->createQuery('SELECT s FROM Entities\Session s WHERE s.user_agent LIKE :guzzle'); + $query->setParameter(':guzzle', 'Guzzle%'); + + foreach ($query->getResult() as $session) { + $app['EM']->remove($session); + } + + $app['EM']->flush(); + + return true; + } +} diff --git a/tests/classes/userTest.php b/tests/classes/userTest.php index eb747973c7..f831111205 100644 --- a/tests/classes/userTest.php +++ b/tests/classes/userTest.php @@ -49,6 +49,29 @@ class userTest extends PhraseanetPHPUnitAbstract $this->assertNull($repo->findWithProviderAndId('custom-one', 12345)); } + public function testDeleteSetMailToNullAndRemovesSessions() + { + try { + $usrId = \User_Adapter::get_usr_id_from_login(self::$DI['app'], 'test_phpunit_sessions'); + $user = \User_Adapter::getInstance($usrId, self::$DI['app']); + } catch (\Exception $e) { + $user = \User_Adapter::create(self::$DI['app'], 'test_phpunit_sessions', 'any', null, false); + } + + $session = new Entities\Session(); + $session + ->setUsrId($user->get_id()) + ->setUserAgent(''); + + self::$DI['app']['EM']->persist($session); + self::$DI['app']['EM']->flush(); + + $user->delete(); + + $repo = self::$DI['app']['EM']->getRepository('Entities\Session'); + $this->assertCount(0, $repo->findByUser($user)); + } + public function testGetPref() { $user = $this->get_user();