diff --git a/lib/Alchemy/Phrasea/Controller/Prod/UsrLists.php b/lib/Alchemy/Phrasea/Controller/Prod/UsrLists.php
index 960dc0658a..02a6cb2692 100644
--- a/lib/Alchemy/Phrasea/Controller/Prod/UsrLists.php
+++ b/lib/Alchemy/Phrasea/Controller/Prod/UsrLists.php
@@ -217,7 +217,7 @@ class UsrLists implements ControllerProviderInterface
$em->merge($list);
$em->flush();
-
+
$datas = array(
'success' => true
, 'message' => ''
@@ -246,7 +246,7 @@ class UsrLists implements ControllerProviderInterface
$em = $app['Core']->getEntityManager();
$repository = $em->getRepository('\Entities\Usr');
-
+
try
{
$repository = $em->getRepository('\Entities\UsrList');
@@ -255,13 +255,18 @@ class UsrLists implements ControllerProviderInterface
$em->remove($list);
$em->flush();
+
+ $datas = array(
+ 'success' => true
+ , 'message' => sprintf(_('List has been deleted'))
+ );
}
catch (\Exception $e)
{
$datas = array(
'success' => false
- , 'message' => sprintf(_('Unable to create list %s'), $list_name)
+ , 'message' => sprintf(_('Unable to delete list'))
);
}
@@ -275,11 +280,41 @@ class UsrLists implements ControllerProviderInterface
/**
* Remove a usr_id from a list
*/
- $controllers->post('/list/{list_id}/remove/{usr_id}/', function() use ($app)
+ $controllers->post('/list/{list_id}/remove/{entry_id}/', function() use ($app)
{
$em = $app['Core']->getEntityManager();
- $repository = $em->getRepository('\Entities\Usr');
+ try
+ {
+ $repository = $em->getRepository('\Entities\UsrList');
+
+ $list = $repository->findUserListByUserAndId($user, $list_id);
+ /* @var $list \Entities\UsrList */
+
+ $entry_repository = $em->getRepository('\Entities\UsrListEntry');
+
+ $user_entry = $entry_repository->findEntryByListAndEntryId($list, $entry_id);
+
+ $em->remove($user_entry);
+ $em->flush();
+
+ $datas = array(
+ 'success' => false
+ , 'message' => _('Entry removed from list')
+ );
+ }
+ catch (\Exception $e)
+ {
+
+ $datas = array(
+ 'success' => false
+ , 'message' => _('Unable to remove entry from list')
+ );
+ }
+
+ $Json = $app['Core']['Serializer']->serialize($datas, 'json');
+
+ return new Response($Json, 200, array('Content-Type' => 'application/json'));
}
);
@@ -290,7 +325,42 @@ class UsrLists implements ControllerProviderInterface
{
$em = $app['Core']->getEntityManager();
- $repository = $em->getRepository('\Entities\Usr');
+ try
+ {
+ $repository = $em->getRepository('\Entities\UsrList');
+
+ $list = $repository->findUserListByUserAndId($user, $list_id);
+ /* @var $list \Entities\UsrList */
+ $user_entry = \User_Adapter::getInstance($usr_id, appbox::get_instance());
+
+ $entry = new \Entities\UsrListEntry();
+ $entry->setUser($user_entry);
+ $entry->setList($list);
+
+ $list->addUsrListEntry($entry);
+
+ $em->persist($entry);
+ $em->merge($list);
+
+ $em->flush();
+
+ $datas = array(
+ 'success' => false
+ , 'message' => _('Usr added to list')
+ );
+ }
+ catch (\Exception $e)
+ {
+
+ $datas = array(
+ 'success' => false
+ , 'message' => _('Unable to add usr to list')
+ );
+ }
+
+ $Json = $app['Core']['Serializer']->serialize($datas, 'json');
+
+ return new Response($Json, 200, array('Content-Type' => 'application/json'));
}
);
@@ -300,18 +370,108 @@ class UsrLists implements ControllerProviderInterface
$controllers->post('/list/{list_id}/share/{usr_id}/', function() use ($app)
{
$em = $app['Core']->getEntityManager();
+ $user = $app['Core']->getAuthenticatedUser();
- $repository = $em->getRepository('\Entities\Usr');
+ try
+ {
+ $repository = $em->getRepository('\Entities\UsrList');
+
+ $list = $repository->findUserListByUserAndId($user, $list_id);
+ /* @var $list \Entities\UsrList */
+
+ if($list->getOwner($user)->getList() < \Entities\UsrListOwner::ROLE_EDITOR)
+ {
+ throw new \Exception('You are not authorized to do this');
+ }
+
+ $new_owner = \User_Adapter::getInstance($usr_id, appbox::get_instance());
+
+ if($list->hasAccess($new_owner))
+ {
+ $owner = $list->getOwner($new_owner);
+ }
+ else
+ {
+ $owner = new \Entities\UsrListOwner();
+ $owner->setList($list);
+ $owner->setUser($new_owner);
+
+ $list->addUsrListOwner($owner);
+
+ $em->persist($owner);
+ $em->merge($list);
+ }
+
+ $role = $app['request']->get('role', \Entities\UsrListOwner::ROLE_USER);
+
+ $owner->setRole($role);
+
+ $em->merge($owner);
+ $em->flush();
+
+ $datas = array(
+ 'success' => false
+ , 'message' => _('Usr added to list')
+ );
+ }
+ catch (\Exception $e)
+ {
+
+ $datas = array(
+ 'success' => false
+ , 'message' => _('Unable to add usr to list')
+ );
+ }
+
+ $Json = $app['Core']['Serializer']->serialize($datas, 'json');
+
+ return new Response($Json, 200, array('Content-Type' => 'application/json'));
}
);
/**
* UnShare a list to a user
*/
- $controllers->post('/list/{list_id}/unshare/{usr_id}/', function() use ($app)
+ $controllers->post('/list/{list_id}/unshare/{owner_id}/', function() use ($app)
{
$em = $app['Core']->getEntityManager();
+ $user = $app['Core']->getAuthenticatedUser();
- $repository = $em->getRepository('\Entities\Usr');
+ try
+ {
+ $repository = $em->getRepository('\Entities\UsrList');
+
+ $list = $repository->findUserListByUserAndId($user, $list_id);
+ /* @var $list \Entities\UsrList */
+
+ if($list->getOwner($user)->getList() < \Entities\UsrListOwner::ROLE_ADMIN)
+ {
+ throw new \Exception('You are not authorized to do this');
+ }
+
+ $owners_repository = $em->getRepository('\Entities\UsrListOwner');
+
+ $owner = $owners_repository->findByListAndOwner($list, $owner_id);
+
+ $em->remove($owner);
+ $em->flush();
+
+ $datas = array(
+ 'success' => false
+ , 'message' => _('Owner removed from list')
+ );
+ }
+ catch (\Exception $e)
+ {
+
+ $datas = array(
+ 'success' => false
+ , 'message' => _('Unable to add usr to list')
+ );
+ }
+
+ $Json = $app['Core']['Serializer']->serialize($datas, 'json');
+
+ return new Response($Json, 200, array('Content-Type' => 'application/json'));
}
);
diff --git a/lib/Alchemy/Phrasea/Core.php b/lib/Alchemy/Phrasea/Core.php
index 7fbe38374a..5f14a15d35 100644
--- a/lib/Alchemy/Phrasea/Core.php
+++ b/lib/Alchemy/Phrasea/Core.php
@@ -18,13 +18,14 @@ use Alchemy\Phrasea\Core\Configuration;
require_once __DIR__ . '/../../vendor/Silex/vendor/pimple/lib/Pimple.php';
/**
+ *
+ * Phraseanet Core Container
*
* @license http://opensource.org/licenses/gpl-3.0 GPLv3
* @link www.phraseanet.com
*/
class Core extends \Pimple
{
-
protected static $availableLanguages = array(
'ar_SA' => 'العربية'
@@ -358,7 +359,6 @@ class Core extends \Pimple
public static function initAutoloads()
{
require_once __DIR__ . '/../../vendor/symfony/src/Symfony/Component/ClassLoader/UniversalClassLoader.php';
-
require_once __DIR__ . '/../../vendor/Twig/lib/Twig/Autoloader.php';
require_once __DIR__ . '/../../vendor/Twig-extensions/lib/Twig/Extensions/Autoloader.php';
diff --git a/lib/Doctrine/Entities/UsrList.php b/lib/Doctrine/Entities/UsrList.php
index dcdfefecf9..9fc5c8a62b 100644
--- a/lib/Doctrine/Entities/UsrList.php
+++ b/lib/Doctrine/Entities/UsrList.php
@@ -156,6 +156,22 @@ class UsrList
return false;
}
+ /**
+ *
+ * @param \User_Adapter $user
+ * @return \Entities\UsrListOwner
+ */
+ public function getOwner(\User_Adapter $user)
+ {
+ foreach ($this->getOwners() as $owner)
+ {
+ if ($owner->getUser()->get_id() == $user->get_id())
+ return $owner;
+ }
+
+ throw new \Exception('This user is not an owner of the list');
+ }
+
/**
* Add users
*
diff --git a/lib/Doctrine/Entities/UsrListEntry.php b/lib/Doctrine/Entities/UsrListEntry.php
index 38c877c885..ef4575d2bc 100644
--- a/lib/Doctrine/Entities/UsrListEntry.php
+++ b/lib/Doctrine/Entities/UsrListEntry.php
@@ -138,5 +138,9 @@ class UsrListEntry
{
return \User_Adapter::getInstance($this->getUsrId(), \appbox::get_instance());
}
+ public function setUser(\User_Adapter $user)
+ {
+ return $this->setUsrId($user->get_id());
+ }
}
\ No newline at end of file
diff --git a/lib/Doctrine/Entities/UsrListOwner.php b/lib/Doctrine/Entities/UsrListOwner.php
index babb4475db..9f2267bf2f 100644
--- a/lib/Doctrine/Entities/UsrListOwner.php
+++ b/lib/Doctrine/Entities/UsrListOwner.php
@@ -18,9 +18,9 @@ namespace Entities;
*/
class UsrListOwner
{
- const ROLE_USER = 'user';
- const ROLE_EDITOR = 'editor';
- const ROLE_ADMIN = 'admin';
+ const ROLE_USER = 1;
+ const ROLE_EDITOR = 2;
+ const ROLE_ADMIN = 3;
/**
* @var integer $id
diff --git a/lib/Doctrine/Proxies/EntitiesUsrListEntryProxy.php b/lib/Doctrine/Proxies/EntitiesUsrListEntryProxy.php
index b4ab53b932..fdc40e6062 100644
--- a/lib/Doctrine/Proxies/EntitiesUsrListEntryProxy.php
+++ b/lib/Doctrine/Proxies/EntitiesUsrListEntryProxy.php
@@ -96,6 +96,12 @@ class EntitiesUsrListEntryProxy extends \Entities\UsrListEntry implements \Doctr
return parent::getUser();
}
+ public function setUser(\User_Adapter $user)
+ {
+ $this->__load();
+ return parent::setUser($user);
+ }
+
public function __sleep()
{
diff --git a/lib/Doctrine/Proxies/EntitiesUsrListOwnerProxy.php b/lib/Doctrine/Proxies/EntitiesUsrListOwnerProxy.php
index 7a4ca66326..6765ac71e8 100644
--- a/lib/Doctrine/Proxies/EntitiesUsrListOwnerProxy.php
+++ b/lib/Doctrine/Proxies/EntitiesUsrListOwnerProxy.php
@@ -102,6 +102,12 @@ class EntitiesUsrListOwnerProxy extends \Entities\UsrListOwner implements \Doctr
return parent::getList();
}
+ public function setUser(\User_Adapter $user)
+ {
+ $this->__load();
+ return parent::setUser($user);
+ }
+
public function getUser()
{
$this->__load();
diff --git a/lib/Doctrine/Proxies/EntitiesUsrListProxy.php b/lib/Doctrine/Proxies/EntitiesUsrListProxy.php
index 9003b77769..7d2270bf23 100644
--- a/lib/Doctrine/Proxies/EntitiesUsrListProxy.php
+++ b/lib/Doctrine/Proxies/EntitiesUsrListProxy.php
@@ -90,6 +90,18 @@ class EntitiesUsrListProxy extends \Entities\UsrList implements \Doctrine\ORM\Pr
return parent::getOwners();
}
+ public function hasAccess(\User_Adapter $user)
+ {
+ $this->__load();
+ return parent::hasAccess($user);
+ }
+
+ public function getOwner(\User_Adapter $user)
+ {
+ $this->__load();
+ return parent::getOwner($user);
+ }
+
public function addUsrListEntry(\Entities\UsrListEntry $users)
{
$this->__load();
diff --git a/lib/Doctrine/Repositories/UsrListEntryRepository.php b/lib/Doctrine/Repositories/UsrListEntryRepository.php
index f01ce73c3a..a66157fd8e 100644
--- a/lib/Doctrine/Repositories/UsrListEntryRepository.php
+++ b/lib/Doctrine/Repositories/UsrListEntryRepository.php
@@ -34,4 +34,22 @@ class UsrListEntryRepository extends EntityRepository
return $query->getResult();
}
+
+ public function findEntryByListAndEntryId(\Entities\UsrList $list, $entry_id)
+ {
+ $entry = $this->find($entry_id);
+
+ if(!$entry)
+ {
+ throw new \Exception_NotFound('Entry not found');
+ }
+
+ /* @var $entry \Entities\UsrListEntry */
+ if($entry->getList()->getId() != $list->getId())
+ {
+ throw new \Exception_Forbidden('Entry mismatch list');
+ }
+
+ return $entry;
+ }
}
\ No newline at end of file
diff --git a/lib/Doctrine/Repositories/UsrListOwnerRepository.php b/lib/Doctrine/Repositories/UsrListOwnerRepository.php
index 9ebab13851..5a58262215 100644
--- a/lib/Doctrine/Repositories/UsrListOwnerRepository.php
+++ b/lib/Doctrine/Repositories/UsrListOwnerRepository.php
@@ -12,4 +12,29 @@ use Doctrine\ORM\EntityRepository;
*/
class UsrListOwnerRepository extends EntityRepository
{
+ /**
+ *
+ *
+ * @param \Entities\UsrList $list
+ * @param type $owner_id
+ * @return \Entities\UsrList
+ */
+ public function findByListAndOwner(\Entities\UsrList $list, $owner_id)
+ {
+ $owner = $this->find($owner_id);
+
+ /* @var $owner \Entities\UsrListOwner */
+ if (null === $owner)
+ {
+ throw new \Exception_NotFound(_('Owner is not found'));
+ }
+
+ if (!$owner->getList()->getid() != $list->getId())
+ {
+ throw new \Exception_Forbidden(_('Owner and list mismatch'));
+ }
+
+ return $owner;
+ }
+
}
\ No newline at end of file
diff --git a/lib/classes/ACL.class.php b/lib/classes/ACL.class.php
index ccd588066c..91c73943ae 100644
--- a/lib/classes/ACL.class.php
+++ b/lib/classes/ACL.class.php
@@ -321,7 +321,7 @@ class ACL implements cache_cacheableInterface
$this->give_access_to_base($bas_to_acces);
- foreach ($rights_to_give as $sbas_id => $rights)
+ foreach ($rights_to_give as $base_id => $rights)
{
$this->update_rights_to_base($base_id, $rights);
}
diff --git a/lib/classes/eventsmanager/notify/validationdone.class.php b/lib/classes/eventsmanager/notify/validationdone.class.php
index 172ece27f8..97ff69938b 100644
--- a/lib/classes/eventsmanager/notify/validationdone.class.php
+++ b/lib/classes/eventsmanager/notify/validationdone.class.php
@@ -110,7 +110,7 @@ class eventsmanager_notify_validationdone extends eventsmanager_notifyAbstract
'name' => $user_from->get_display_name()
);
- if (self::mail($to, $from, $params['ssel_id']))
+ if (self::mail($to, $from, $params['ssel_id'], $params['url']))
$mailed = true;
}
@@ -192,7 +192,7 @@ class eventsmanager_notify_validationdone extends eventsmanager_notifyAbstract
* @param int $ssel_id
* @return boolean
*/
- function mail($to, $from, $ssel_id)
+ function mail($to, $from, $ssel_id, $url)
{
try
{
@@ -217,7 +217,7 @@ class eventsmanager_notify_validationdone extends eventsmanager_notifyAbstract
$from['name']
) . "\n";
- $body .= "
\n" . $this->registry->get('GV_ServerName') . 'lightbox/validate/' . $ssel_id;
+ $body .= "
\n" . $url;
return mail::send_mail($subject, $body, $to, $from, array());
}
diff --git a/lib/classes/gatekeeper.class.php b/lib/classes/gatekeeper.class.php
index a0a47e72d6..97aa6996bb 100644
--- a/lib/classes/gatekeeper.class.php
+++ b/lib/classes/gatekeeper.class.php
@@ -76,7 +76,6 @@ class gatekeeper
$session = $appbox->get_session();
if (http_request::is_command_line())
-
return;
if (isset($_SERVER['PHP_SELF']) && trim($_SERVER['PHP_SELF']))
@@ -105,7 +104,7 @@ class gatekeeper
}
catch (Exception $e)
{
-
+
}
}
@@ -122,7 +121,6 @@ class gatekeeper
if ($this->_PHP_SELF == '/thesaurus2/xmlhttp/getterm.x.php'
|| $this->_PHP_SELF == '/thesaurus2/xmlhttp/searchcandidate.x.php'
|| $this->_PHP_SELF == '/thesaurus2/xmlhttp/getsy.x.php')
-
return;
phrasea::redirect('/login/?redirect=/thesaurus2');
break;
@@ -131,7 +129,6 @@ class gatekeeper
break;
case 'admin':
if ($this->_script_name === 'runscheduler.php')
-
return;
phrasea::redirect('/login/?redirect=' . $_SERVER['REQUEST_URI']);
break;
@@ -151,7 +148,6 @@ class gatekeeper
return;
case 'setup':
if ($appbox->upgradeavailable())
-
return;
else
phrasea::redirect('/login/');
@@ -161,7 +157,7 @@ class gatekeeper
break;
case 'lightbox':
$this->token_access();
- if(!$session->is_authenticated())
+ if (!$session->is_authenticated())
{
phrasea::redirect('/login/?redirect=' . $_SERVER['REQUEST_URI']);
}
@@ -268,13 +264,12 @@ class gatekeeper
$parm = $request->get_parms('LOG');
if (is_null($parm["LOG"]))
-
return $this;
try
{
- if($session->is_authenticated())
- $session->logout ();
+ if ($session->is_authenticated())
+ $session->logout();
$auth = new Session_Authentication_Token($appbox, $parm['LOG']);
$session->authenticate($auth);
}
@@ -286,10 +281,11 @@ class gatekeeper
try
{
$datas = random::helloToken($parm['LOG']);
+ return phrasea::redirect("/lightbox/validate/" . $datas['datas'] . "/");
}
catch (Exception_NotFound $e)
{
-
+
}
return $this;
diff --git a/lib/classes/record/preview.class.php b/lib/classes/record/preview.class.php
index bcf7ee2893..6d95132d3f 100644
--- a/lib/classes/record/preview.class.php
+++ b/lib/classes/record/preview.class.php
@@ -381,8 +381,14 @@ class record_preview extends record_adapter
$tab[$hour][$site][$action] = array();
if (!isset($tab[$hour][$site][$action][$row['usr_id']]))
+ {
$tab[$hour][$site][$action][$row['usr_id']] =
- array('final' => array(), 'comment' => array());
+ array(
+ 'final' => array()
+ , 'comment' => array()
+ , 'user' => \User_Adapter::getInstance($row['usr_id'], $appbox)
+ );
+ }
if (!in_array($row['final'], $tab[$hour][$site][$action][$row['usr_id']]['final']))
$tab[$hour][$site][$action][$row['usr_id']]['final'][] =
diff --git a/lib/conf.d/Doctrine/Entities.UsrListOwner.dcm.yml b/lib/conf.d/Doctrine/Entities.UsrListOwner.dcm.yml
index 9a6e4af5cc..7afebbff4c 100644
--- a/lib/conf.d/Doctrine/Entities.UsrListOwner.dcm.yml
+++ b/lib/conf.d/Doctrine/Entities.UsrListOwner.dcm.yml
@@ -2,6 +2,9 @@ Entities\UsrListOwner:
type: entity
repositoryClass: Repositories\UsrListOwnerRepository
table: UsrListOwners
+ uniqueConstraints:
+ unique_owner:
+ columns: usr_id,id
id:
id:
type: integer
diff --git a/templates/web/prod/preview/short_history.html b/templates/web/prod/preview/short_history.html
index 2292814be0..5386068f8f 100644
--- a/templates/web/prod/preview/short_history.html
+++ b/templates/web/prod/preview/short_history.html
@@ -3,7 +3,7 @@
{% for hour, sites in record.get_short_history() %}
{% for site, actions in sites %}
{% for action, users in actions %}
- {% for current_user, done in users %}
+ {% for done in users %}