From 21295df38155b97213962720951e357224ae0424 Mon Sep 17 00:00:00 2001 From: afornerot Date: Tue, 29 Sep 2020 17:18:21 +0200 Subject: [PATCH 1/4] mise en place d'une auto creation des groupes sur le modele LDAP-Open --- dicos/91_ninegate.xml | 179 ++++++++++-------- .../CoreBundle/Command/InitDataCommand.php | 2 +- .../CoreBundle/Command/SynchroCommand.php | 22 +++ tmpl/ninegate-template.yml | 17 ++ 4 files changed, 140 insertions(+), 80 deletions(-) diff --git a/dicos/91_ninegate.xml b/dicos/91_ninegate.xml index 13046828..0491d3f6 100644 --- a/dicos/91_ninegate.xml +++ b/dicos/91_ninegate.xml @@ -80,37 +80,41 @@ oui - LDAP - CAS - APIKeyNinegate + LDAP + CAS + APIKeyNinegate non - scribe + scribe oui - oui + oui + (uid=*) + oui + (objectClass=posixGroup) - - - niveau01 - niveau02 - - - Ecole - Ecoles - fa-building + + + niveau01 + niveau02 + + + + Ecole + Ecoles + fa-building non - Service - Services - fa-sitemap + Service + Services + fa-sitemap - 2c3e50 - FFFFFF + 2c3e50 + FFFFFF - none - 8 - 8 + none + 8 + 8 @@ -170,208 +174,208 @@ non - + non - - + + non - + non - + non - + non - + non - + non - + non - + non - + non - - + + non - + non - + non - + non - - - - + + + + non - + non - - - + + + non - - + + non - + non - + non - - + + non - + non - + non - - + + non - + non - - + + non - - + + - - + + 5555 - + 5556 - + oui - - - - - - + + + + + + - - - - - - + + + + + + @@ -428,6 +432,9 @@ ninegate_ldaptemplate ninegate_scribegroup ninegate_scribemaster + ninegate_openldapreqniveau01 + ninegate_openldapsynchrogroup + ninegate_openldapreqgroup ninegate_pwdadmin ninegate_organization @@ -604,8 +611,22 @@ ninegate_scribemaster - - + + + open + + ninegate_openldapreqniveau01 + ninegate_openldapsynchrogroup + ninegate_openldapreqgroup + + + + + non + + ninegate_openldapreqgroup + + non diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/InitDataCommand.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/InitDataCommand.php index ec4956a0..ad1a08ff 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/InitDataCommand.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/InitDataCommand.php @@ -144,7 +144,7 @@ class InitDataCommand extends ContainerAwareCommand if($ldap_template=="scribe") $niveau01->setLdapfilter("(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))"); else - $niveau01->setLdapfilter("(uid=*)"); + $niveau01->setLdapfilter($this->getContainer()->getParameter('openldapreqniveau01')); $em->persist($niveau01); $em->flush(); diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/SynchroCommand.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/SynchroCommand.php index f893ca10..c2dc6d8f 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/SynchroCommand.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/SynchroCommand.php @@ -174,6 +174,22 @@ class SynchroCommand extends Command if(!$simulate) $this->addmodGroup($label,$ldapfilter,$scribe_group); } } + elseif($ldap_template=="open") { + if($this->container->getParameter('openldapsynchrogroup')) { + $this->writeln(''); + $this->writeln('== GROUPES =========================================='); + + $results = $this->ldap->search($this->container->getParameter('openldapreqgroup'), ['cn','description','gidNumber'], $this->ldap_basedn); + foreach($results as $result) { + $cn=$result["cn"]; + $ldapfilter="(&".$this->container->getParameter('openldapreqgroup')."(cn=$cn))"; + + $label=$result["cn"]; + $this->writeln(" - $label"); + if(!$simulate) $this->addmodGroup($label,$ldapfilter,false); + } + } + } $this->writeln(''); $this->writeln('== USERS ============================================'); @@ -760,6 +776,12 @@ class SynchroCommand extends Command protected function addmodGroup($label,$ldapfilter,$fgcanshare) { $portal_activate = $this->container->getParameter('portal_activate'); + $group=$this->em->getRepository('CadolesCoreBundle:Group')->findOneBy(array('fgtemplate' => false, 'label' => $label)); + if($group) { + $this->writelnred(" - ".$label." existe déjà comme groupe interne à Ninegate"); + return 0; + } + $group=$this->em->getRepository('CadolesCoreBundle:Group')->findOneBy(array('fgtemplate' => true, 'label' => $label)); if(!$group) { $group=new Group(); diff --git a/tmpl/ninegate-template.yml b/tmpl/ninegate-template.yml index 4efb13fa..5d7348b0 100644 --- a/tmpl/ninegate-template.yml +++ b/tmpl/ninegate-template.yml @@ -203,6 +203,23 @@ parameters: scribe_master: false %end if +%if %%getVar("ninegate_ldaptemplate", 'non') == "open" + openldapreqniveau01: %%ninegate_openldapreqniveau01 + + %if %%getVar("ninegate_openldapsynchrogroup", 'non') == "oui" + openldapsynchrogroup: true + openldapreqgroup: %%ninegate_openldapreqgroup + %else + openldapsynchrogroup: false + openldapreqgroup: + %end if +%else + openldapreqniveau01: + openldapsynchrogroup: false + openldapreqgroup: +%end if + + # Activation Widget %if %%getVar("ninegate_activate_widadminer", 'non') == "oui" From 923c6c0b42cb5782a8e52a72535d863ed0cf472d Mon Sep 17 00:00:00 2001 From: afornerot Date: Wed, 30 Sep 2020 13:55:31 +0200 Subject: [PATCH 2/4] resolution attribut sso en tableau --- .../Controller/SecurityController.php | 54 ++++++++++++++----- .../CASBundle/Resources/config/routing.yml | 4 ++ .../Resources/views/Test/test.html.twig | 35 ++++++++++++ .../CoreBundle/Command/InitDataCommand.php | 14 +++++ .../CoreBundle/Repository/GroupRepository.php | 10 ++-- .../Repository/Niveau01Repository.php | 10 ++-- sso/filtres/ninegate.ini | 12 ++--- 7 files changed, 108 insertions(+), 31 deletions(-) create mode 100644 src/ninegate-1.0/src/Cadoles/CASBundle/Resources/views/Test/test.html.twig diff --git a/src/ninegate-1.0/src/Cadoles/CASBundle/Controller/SecurityController.php b/src/ninegate-1.0/src/Cadoles/CASBundle/Controller/SecurityController.php index c351f5d5..a33dfec5 100644 --- a/src/ninegate-1.0/src/Cadoles/CASBundle/Controller/SecurityController.php +++ b/src/ninegate-1.0/src/Cadoles/CASBundle/Controller/SecurityController.php @@ -28,7 +28,7 @@ class SecurityController extends Controller $masteridentity=$this->getParameter("masteridentity"); // Init Client CAS - \phpCAS::setDebug(false); + \phpCAS::setDebug("/var/log/phpcas/phpCAS-ninegate.log"); \phpCAS::client(CAS_VERSION_2_0, $this->getParameter('cas_host'), $this->getParameter('cas_port'), is_null($this->getParameter('cas_path')) ? '' : $this->getParameter('cas_path'), false); \phpCAS::setNoCasServerValidation(); @@ -42,12 +42,6 @@ class SecurityController extends Controller // Récupération Attribut $attributes = \phpCAS::getAttributes(); - // Suppression des Attributs en tableaux - foreach ($attributes as $key => $value) { - if(is_array($value)) - unset($attributes[$key]); - } - // Rechercher l'utilisateur $em = $this->getDoctrine()->getManager(); if(isset($attributes[$this->getParameter('user_attr_cas_username')])) @@ -62,6 +56,7 @@ class SecurityController extends Controller if(isset($attributes[$this->getParameter('user_attr_cas_firstname')])) $firstname = $attributes[$this->getParameter('user_attr_cas_firstname')]; + $user = $em->getRepository('CadolesCoreBundle:User')->findOneBy(array("username"=>$username)); $exists = $user ? true : false; @@ -108,7 +103,8 @@ class SecurityController extends Controller $em->flush(); // On calcule les groupes de l'utilisateur - $groups=$em->getRepository('CadolesCoreBundle:Group')->calculateGroup($user,$attributes); + $user=$em->getRepository('CadolesCoreBundle:Group')->calculateGroup($user,$attributes); + } } else { @@ -122,14 +118,15 @@ class SecurityController extends Controller // On s'assure que le niveau 02 appartient bien au niveau 01 calculé $sameniveau01=(!is_null($user->getNiveau02())&&$niveau01==$user->getNiveau02()->getNiveau01()); - // On calcule les groupes de l'utilisateur - $user=$groups=$em->getRepository('CadolesCoreBundle:Group')->calculateGroup($user,$attributes); - $user->setLastname($lastname); $user->setFirstname($firstname); $user->setEmail($email); if(!$sameniveau01) $user->setNiveau02(null); - + + // On calcule les groupes de l'utilisateur + $user=$em->getRepository('CadolesCoreBundle:Group')->calculateGroup($user,$attributes); + + $em->persist($user); $em->flush(); } @@ -179,4 +176,37 @@ class SecurityController extends Controller $url=$this->generateUrl('cadoles_core_home', array(), UrlGeneratorInterface::ABSOLUTE_URL); \phpCAS::logout(array("service"=>$url)); } + + public function testAction() { + $em = $this->getDoctrine()->getManager(); + + // Init Client CAS + \phpCAS::setDebug("/var/log/phpcas/phpCAS-ninegate.log"); + \phpCAS::client(CAS_VERSION_2_0, $this->getParameter('cas_host'), $this->getParameter('cas_port'), is_null($this->getParameter('cas_path')) ? '' : $this->getParameter('cas_path'), false); + \phpCAS::setNoCasServerValidation(); + + + // Authentification + \phpCAS::forceAuthentication(); + + // Récupération UID + $username = \phpCAS::getUser(); + + // Récupération Attribut + $attributes = \phpCAS::getAttributes(); + $user = $em->getRepository('CadolesCoreBundle:User')->findOneBy(array("username"=>$username)); + $niveau01=$em->getRepository('CadolesCoreBundle:Niveau01')->calculateNiveau01($attributes); + $user=$em->getRepository('CadolesCoreBundle:Group')->calculateGroup($user,$attributes); + + return $this->render('CadolesCASBundle:Test:test.html.twig',[ + 'useheader' => true, + 'usemenu' => false, + 'usesidebar' => false, + 'attributes' => $attributes, + 'user' => $user, + 'username' => $username, + 'niveau01' => $niveau01, + ]); + + } } diff --git a/src/ninegate-1.0/src/Cadoles/CASBundle/Resources/config/routing.yml b/src/ninegate-1.0/src/Cadoles/CASBundle/Resources/config/routing.yml index 728e4a44..f97aa770 100644 --- a/src/ninegate-1.0/src/Cadoles/CASBundle/Resources/config/routing.yml +++ b/src/ninegate-1.0/src/Cadoles/CASBundle/Resources/config/routing.yml @@ -6,3 +6,7 @@ cas_sp.logout: path: /logout defaults: { _controller: CadolesCASBundle:Security:logout } +cas_sp.test: + path: /test + defaults: { _controller: CadolesCASBundle:Security:test } + diff --git a/src/ninegate-1.0/src/Cadoles/CASBundle/Resources/views/Test/test.html.twig b/src/ninegate-1.0/src/Cadoles/CASBundle/Resources/views/Test/test.html.twig new file mode 100644 index 00000000..a1c7b0c7 --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/CASBundle/Resources/views/Test/test.html.twig @@ -0,0 +1,35 @@ +{% extends '@CadolesCore/base.html.twig' %} + +{% block pagewrapper %} +

TEST SSO

+ +

Atttribut SSO

+ {% for key, attribute in attributes %} + {% if attribute is iterable %} + {% for value in attribute %} + {{ key }} = {{ value }}
+ {% endfor %} + {% else %} + {{ key }} = {{ attribute }}
+ {% endif %} + {% endfor %} + + +

Correspondance Utilisateur Ninegate

+ username = {{ user.username }}
+ firstname = {{ user.firstname }}
+ lastname = {{ user.lastname }}
+ email = {{ user.email }}
+ +

Appartient au Niveau 01

+ {{ niveau01.label }} = {{ niveau01.attributes }} + +

Appartient aux Groupes

+ {% for usergroup in user.groups %} + {% if not usergroup.group.attributes is empty %} + {{usergroup.group.label}} = {{usergroup.group.attributes}}
+ {% endif %} + {% endfor %} + +






+{% endblock %} \ No newline at end of file diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/InitDataCommand.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/InitDataCommand.php index ad1a08ff..cfe337ac 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/InitDataCommand.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/InitDataCommand.php @@ -151,6 +151,20 @@ class InitDataCommand extends ContainerAwareCommand } } + // On s'assure si masteridentity est à SSO qu'au minimum un niveau01 possède un attribut + if($masteridentity=="SSO") { + $niveau01=$em->createQueryBuilder()->select('n')->from('CadolesCoreBundle:Niveau01','n')->where('n.attributes IS NOT NULL')->getQuery()->getResult(); + if(!$niveau01) { + // Si ce n'est pas le cas on positionne un attribut ultra large sur le niveau01 de base + $niveau01=$group=$em->getRepository('CadolesCoreBundle:Niveau01')->find(-100); + $niveau01->setAttributes('{"username":"*"}'); + + $em->persist($niveau01); + $em->flush(); + } + } + + $output->writeln(''); } diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Repository/GroupRepository.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Repository/GroupRepository.php index bf3922b8..85a9e554 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Repository/GroupRepository.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Repository/GroupRepository.php @@ -21,15 +21,15 @@ class GroupRepository extends \Doctrine\ORM\EntityRepository foreach($attgroup as $key => $value) { if(array_key_exists($key,$attruser)) { - if(is_array($value)) { - foreach($value as $val) { - if($val=="*") + if(is_array($attruser[$key])) { + foreach($attruser[$key] as $val) { + if($value=="*") $retgroups->add($group); - elseif($val==$attruser[$key]) + elseif($val==$value) $retgroups->add($group); } } - elseif(array_key_exists($key,$attruser)) { + else { if($value=="*") $retgroups->add($group); elseif($value==$attruser[$key]) diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Repository/Niveau01Repository.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Repository/Niveau01Repository.php index b221d163..deac4a9c 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Repository/Niveau01Repository.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Repository/Niveau01Repository.php @@ -15,15 +15,15 @@ class Niveau01Repository extends \Doctrine\ORM\EntityRepository foreach($attniveau as $key => $value) { if(array_key_exists($key,$attruser)) { - if(is_array($value)) { - foreach($value as $val) { - if($val=="*") + if(is_array($attruser[$key])) { + foreach($attruser[$key] as $val) { + if($value=="*") return $niveau01; - elseif($val==$attruser[$key]) + elseif($val==$value) return $niveau01; } } - else if(array_key_exists($key,$attruser)) { + else { if($value=="*") return $niveau01; elseif($value==$attruser[$key]) diff --git a/sso/filtres/ninegate.ini b/sso/filtres/ninegate.ini index f61e4ce0..97099a10 100644 --- a/sso/filtres/ninegate.ini +++ b/sso/filtres/ninegate.ini @@ -1,14 +1,8 @@ -[user] +[attributes] user=uid - -[username] username=uid - -[firstname] firstname=givenName - -[lastname] lastname=sn +email=mail +user_groups=user_groups -[email] -email=mail \ No newline at end of file From 6f77194ae55cc98ace4e885ff2c1e1606c45e0f1 Mon Sep 17 00:00:00 2001 From: afornerot Date: Wed, 30 Sep 2020 14:56:00 +0200 Subject: [PATCH 3/4] auto create groupe sso --- dicos/91_ninegate.xml | 21 ++++++- .../Controller/SecurityController.php | 59 +++++++++++++++++++ tmpl/ninegate-template.yml | 10 +++- 3 files changed, 87 insertions(+), 3 deletions(-) diff --git a/dicos/91_ninegate.xml b/dicos/91_ninegate.xml index 0491d3f6..3460b327 100644 --- a/dicos/91_ninegate.xml +++ b/dicos/91_ninegate.xml @@ -84,6 +84,9 @@ CAS APIKeyNinegate + oui + user_groups + non scribe oui @@ -92,7 +95,6 @@ oui (objectClass=posixGroup) - niveau01 @@ -427,6 +429,8 @@ ninegate_mode_auth ninegate_api_key + ninegate_ssosynchrogroup + ninegate_ssoreqgroup ninegate_syncldap ninegate_ldaptemplate @@ -514,6 +518,14 @@ ninegate_test_conf_cadolesldap
+ + SQL + LDAP + + ninegate_ssosynchrogroup + ninegate_ssoreqgroup + + non @@ -572,7 +584,12 @@ non + + + non + ninegate_ssoreqgroup + @@ -620,7 +637,7 @@ ninegate_openldapreqgroup - + non diff --git a/src/ninegate-1.0/src/Cadoles/CASBundle/Controller/SecurityController.php b/src/ninegate-1.0/src/Cadoles/CASBundle/Controller/SecurityController.php index a33dfec5..a3fd9e8d 100644 --- a/src/ninegate-1.0/src/Cadoles/CASBundle/Controller/SecurityController.php +++ b/src/ninegate-1.0/src/Cadoles/CASBundle/Controller/SecurityController.php @@ -11,6 +11,7 @@ use Symfony\Component\EventDispatcher\EventDispatcher; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Cadoles\CoreBundle\Entity\User; +use Cadoles\CoreBundle\Entity\Group; class SecurityController extends Controller { @@ -99,9 +100,15 @@ class SecurityController extends Controller $user->setAuthlevel("simple"); $user->setRole("ROLE_USER"); + if(in_array($username,$this->getParameter("ldap_usersadmin"))) + $user->setRole("ROLE_ADMIN"); + $em->persist($user); $em->flush(); + // Génération auto des groupes + $this->submitGroup($attributes); + // On calcule les groupes de l'utilisateur $user=$em->getRepository('CadolesCoreBundle:Group')->calculateGroup($user,$attributes); @@ -122,6 +129,11 @@ class SecurityController extends Controller $user->setFirstname($firstname); $user->setEmail($email); if(!$sameniveau01) $user->setNiveau02(null); + if(in_array($username,$this->getParameter("ldap_usersadmin"))) + $user->setRole("ROLE_ADMIN"); + + // Génération auto des groupes + $this->submitGroup($attributes); // On calcule les groupes de l'utilisateur $user=$em->getRepository('CadolesCoreBundle:Group')->calculateGroup($user,$attributes); @@ -195,7 +207,14 @@ class SecurityController extends Controller // Récupération Attribut $attributes = \phpCAS::getAttributes(); $user = $em->getRepository('CadolesCoreBundle:User')->findOneBy(array("username"=>$username)); + + // On calcule le niveau01 de l'utilisateur $niveau01=$em->getRepository('CadolesCoreBundle:Niveau01')->calculateNiveau01($attributes); + + // Génération auto des groupes + $groups=$this->submitGroup($attributes); + + // On calcule les groupes de l'utilisateur $user=$em->getRepository('CadolesCoreBundle:Group')->calculateGroup($user,$attributes); return $this->render('CadolesCASBundle:Test:test.html.twig',[ @@ -209,4 +228,44 @@ class SecurityController extends Controller ]); } + + private function submitGroup($attributes) { + $em = $this->getDoctrine()->getManager(); + + if(!$this->getParameter('ssosynchrogroup')) + return null; + + $user_attr_cas_group=$this->getParameter('user_attr_cas_group'); + + // Si l'utilisateur possège l'attribut groupe dans ses attributs + if(array_key_exists($user_attr_cas_group,$attributes)) { + if(!is_array($attributes[$user_attr_cas_group])) { + $attributes[$user_attr_cas_group]=[$attributes[$user_attr_cas_group]]; + } + + foreach($attributes[$user_attr_cas_group] as $ssogroup) { + // Recherche du groupe + $group=$em->getRepository("CadolesCoreBundle:Group")->findOneBy(["label"=>$ssogroup]); + if(!$group) { + $group=new Group(); + $group->setLabel($ssogroup); + $group->setFgcancreatepage(false); + $group->setFgcancreateblog(false); + $group->setFgcancreatecalendar(false); + $group->setFgcancreateproject(false); + $group->setFgcanshare(false); + $group->setFgopen(false); + $group->setFgall(false); + } + + $group->setAttributes('{"'.$user_attr_cas_group.'":"'.$ssogroup.'"}'); + $group->setFgtemplate(false); + + $em->persist($group); + $em->flush(); + + } + } + + } } diff --git a/tmpl/ninegate-template.yml b/tmpl/ninegate-template.yml index 5d7348b0..43f7b579 100644 --- a/tmpl/ninegate-template.yml +++ b/tmpl/ninegate-template.yml @@ -487,7 +487,15 @@ parameters: user_attr_saml_mail: mail user_attr_saml_lastname: sn user_attr_saml_firstname: givenName - + +%if %%getVar("ninegate_ssosynchrogroup", 'non') == "oui" + ssosynchrogroup: true + user_attr_cas_group: %%ninegate_ssoreqgroup +%else + ssosynchrogroup: fase + user_attr_cas_group: +%end if + %if %%is_defined("ninegate_smtpport") mailer_port: '%%ninegate_smtpport' mailer_encryption: %%ninegate_smtpencryption From 06c3e0559b90547a7377459bb6bb6a74a992758b Mon Sep 17 00:00:00 2001 From: afornerot Date: Wed, 30 Sep 2020 17:02:14 +0200 Subject: [PATCH 4/4] ajout calendars dans api rest --- .../CoreBundle/Command/TestRestCommand.php | 4 +- .../CoreBundle/Controller/RestController.php | 38 +++- .../Controller/PagewidgetController.php | 164 +----------------- .../Repository/CalendareventRepository.php | 85 +++++++++ 4 files changed, 126 insertions(+), 165 deletions(-) diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/TestRestCommand.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/TestRestCommand.php index 0f70233c..a96a182f 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/TestRestCommand.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/TestRestCommand.php @@ -58,10 +58,10 @@ class TestRestCommand extends Command // key = parametre obligatoire // key = clé d'accès du l'api // only = paramétre optionnel - // only = liste des informations désirés = user, items, bookmarks, groups, alerts + // only = liste des informations désirés = user, items, bookmarks, groups, alerts, calendars $apiurl = $url."/rest/user/".$login; $this->writeln($apiurl); - $response = \Unirest\Request::post($apiurl,$headers,["key"=>$masterapikey,"only"=>"user,items"]); + $response = \Unirest\Request::post($apiurl,$headers,["key"=>$masterapikey,"only"=>"user,calendars"]); dump($response->body); $this->writeln(''); diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/RestController.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/RestController.php index e0182c72..e0e693a3 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/RestController.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/RestController.php @@ -34,7 +34,7 @@ class RestController extends Controller // key = parametre obligatoire // key = clé d'accès de l'api // only = paramétre optionnel - // only = liste des informations désirés = user, items, bookmarks, groups, alerts + // only = liste des informations désirés = user, items, bookmarks, groups, alerts, calendars public function userAction($login, Request $request) { $key=$request->get('key'); @@ -65,6 +65,8 @@ class RestController extends Controller if($only==""||in_array("groups",$only)) $output["groups"] = []; if($only==""||in_array("alerts",$only)) $output["alerts"] = []; if($only==""||in_array("alerts",$only)) $output["alertcategorys"] = []; + if($only==""||in_array("calendars",$only)) $output["calendars"] = []; + if($only==""||in_array("calendars",$only)) $output["calendarevents"] = []; $bookmarks=null; $items=null; @@ -94,7 +96,7 @@ class RestController extends Controller $tmp["url"] = $bookmark->getUrl(); $tmp["target"] = $bookmark->getTarget(); $tmp["order"] = 0; - $tmp["color"] = ($bookmark->getColor()?$bookmark->getColor():$this->get('session')->get('color')["main"]); + $tmp["color"] = "#".($bookmark->getColor()?$bookmark->getColor():$this->get('session')->get('color')["main"]); $tmp["icon"] = $weburl.($bookmark->getIcon()?$bookmark->getIcon()->getLabel():"uploads/icon/icon_pin.png"); array_push($output["bookmarks"],$tmp); @@ -111,7 +113,7 @@ class RestController extends Controller $tmp["url"] = $item->getUrl(); $tmp["target"] = $item->getTarget(); $tmp["order"] = $item->getRoworder(); - $tmp["color"] = ($item->getColor()?$item->getColor():$this->get('session')->get('color')["main"]); + $tmp["color"] = "#".($item->getColor()?$item->getColor():$this->get('session')->get('color')["main"]); $tmp["icon"] = $weburl.($item->getIcon()?$item->getIcon()->getLabel():"uploads/icon/icon_pin.png"); $tmp["essential"] = $item->getEssential(); $tmp["category"] = $item->getItemcategory()->getId(); @@ -126,7 +128,7 @@ class RestController extends Controller $tmp["id"] = $itemcategory->getId(); $tmp["title"] = $itemcategory->getLabel(); $tmp["order"] = $itemcategory->getRoworder(); - $tmp["color"] = ($itemcategory->getColor()?$itemcategory->getColor():$this->get('session')->get('color')["main"]); + $tmp["color"] = "#".($itemcategory->getColor()?$itemcategory->getColor():$this->get('session')->get('color')["main"]); array_push($output["itemcategorys"],$tmp); } @@ -162,13 +164,39 @@ class RestController extends Controller $tmp=[]; $tmp["id"] = $alertcategory->getId(); $tmp["title"] = $alertcategory->getLabel(); - $tmp["color"] = ($alertcategory->getColor()?$alertcategory->getColor():$this->get('session')->get('color')["main"]); + $tmp["color"] = "#".($alertcategory->getColor()?$alertcategory->getColor():$this->get('session')->get('color')["main"]); $tmp["icon"] = $weburl.($alertcategory->getIcon()?$alertcategory->getIcon()->getLabel():"uploads/icon/icon_pin.png"); array_push($output["alertcategorys"],$tmp); } } + if($only==""||in_array("calendars",$only)) { + + $events=$em->getRepository("CadolesPortalBundle:Calendarevent")->getUserCalendarevents($user,$this->get('session')->get('color')["main"],null,null,$firstcalendar); + foreach($events as $event) { + $tmp=[]; + $tmp["id"] = $event["id"]; + $tmp["title"] = $event["title"]; + $tmp["description"] = $event["description"]; + $tmp['start'] = $event["start"]; + $tmp['end'] = $event["end"]; + $tmp['allday'] = $event["allDay"]; + $tmp['calendar'] = $event["calendar"]; + + array_push($output["calendarevents"],$tmp); + + $tmp=[]; + $tmp["id"] = $event["calendar"]; + $tmp["title"] = $event["name"]; + $tmp["color"] = $event["color"]; + + if(!in_array($tmp,$output["calendars"])) + array_push($output["calendars"],$tmp); + } + } + + // Retour diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/PagewidgetController.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/PagewidgetController.php index d9945446..ef287842 100644 --- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/PagewidgetController.php +++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Controller/PagewidgetController.php @@ -849,6 +849,7 @@ class PagewidgetController extends Controller // Récupération des paramétres du widget $idalertcategory=null; + $alertcategoryfilter=null; foreach($entity->getParameter()["fields"] as $parameter) { switch($parameter["id"]) { case "alertcategory": @@ -863,88 +864,8 @@ class PagewidgetController extends Controller // Profilage $user=$this->getUser(); - $roles=($user?$user->getRoles():["ROLE_ANONYME"]); - $niveau01=($user?$user->getNiveau01():null); - $groups=($user?$user->getGroups():[]); + $alertsordered=$em->getRepository("CadolesPortalBundle:Alert")->getUserAlerts($user,$idalertcategory,$alertcategoryfilter); - // Initialisation du calcul des alerts - $alerts=new ArrayCollection(); - - // Récupération des alerts par rôles - foreach($roles as $role) { - $qb = $em->createQueryBuilder(); - $qb->select('alert') - ->from("CadolesPortalBundle:Alert", 'alert') - ->where($qb->expr()->like('alert.roles', $qb->expr()->literal("%$role%"))) - ->andWhere('alert.publishedat <= :today') - ->andWhere($qb->expr()->orX( - $qb->expr()->gt('alert.unpublishedat', ':today'), - $qb->expr()->isNull('alert.unpublishedat') - )) - ->setParameter('today', date('Y-m-d')); - - if($idalertcategory && $alertcategoryfilter) { - $qb->andWhere("alert.alertcategory=:alertcategory") - ->setParameter("alertcategory",$alertcategoryfilter); - } - $alertsroles=$qb->getQuery()->getResult(); - foreach($alertsroles as $alertrole) { - if(!$alerts->contains($alertrole)&&!$alertrole->getReaders()->contains($this->getUser())) $alerts->add($alertrole); - } - } - - // Récupération par Niveau01 - $qb = $em->createQueryBuilder(); - $qb->select('alert') - ->from("CadolesPortalBundle:Alert", 'alert') - ->where(":niveau01 MEMBER OF alert.niveau01s") - ->andWhere('alert.publishedat <= :today') - ->andWhere($qb->expr()->orX( - $qb->expr()->gt('alert.unpublishedat', ':today'), - $qb->expr()->isNull('alert.unpublishedat') - )) - ->setParameter("niveau01",$niveau01) - ->setParameter('today', date('Y-m-d')); - - if($idalertcategory && $alertcategoryfilter) { - $qb->andWhere("alert.alertcategory=:alertcategory") - ->setParameter("alertcategory",$alertcategoryfilter); - } - $alertsniveau01s=$qb->getQuery()->getResult(); - foreach($alertsniveau01s as $alertniveau01) { - if(!$alerts->contains($alertniveau01)&&!$alertniveau01->getReaders()->contains($this->getUser())) $alerts->add($alertniveau01); - } - - // Récupération des alerts par group - foreach($groups as $group) { - $qb = $em->createQueryBuilder(); - $qb->select('alert') - ->from("CadolesPortalBundle:Alert", 'alert') - ->where(":group MEMBER OF alert.groups") - ->andWhere('alert.publishedat <= :today') - ->andWhere($qb->expr()->orX( - $qb->expr()->gt('alert.unpublishedat', ':today'), - $qb->expr()->isNull('alert.unpublishedat') - )) - ->setParameter("group",$group->getGroup()) - ->setParameter('today', date('Y-m-d')); - - if($idalertcategory && $alertcategoryfilter) { - $qb->andWhere("alert.alertcategory=:alertcategory") - ->setParameter("alertcategory",$alertcategoryfilter); - } - $alertsgroups=$qb->getQuery()->getResult(); - foreach($alertsgroups as $alertgroup) { - if(!$alerts->contains($alertgroup)&&!$alertgroup->getReaders()->contains($this->getUser())) $alerts->add($alertgroup); - } - } - - // Trie des alerts - $alertsordered = $alerts->getIterator(); - $alertsordered->uasort(function ($first, $second) { - return (int) $first->getRowOrder() > (int) $second->getRowOrder() ? 1 : -1; - }); - // Render return $this->render($this->labelentity.':viewalert.html.twig', [ 'entity' => $entity, @@ -1720,84 +1641,11 @@ class PagewidgetController extends Controller // Préference utilisateur $this->getPreference($entity); - - // On récupère soit les calendriers du group en cours soit l'ensemble des calendriers de l'utilisateur - if($usage=="group") { - $calendars=$em->getRepository("CadolesPortalBundle:Calendar")->getCalendarsGroup($this->getUser(),$group); - if($calendars) $firstcalendar=$calendars[0]->getId(); - } - else { - $this->getDoctrine()->getRepository("CadolesPortalBundle:Calendar")->getCalendarsUser($this->getUser(),$calendarssuser,$calendarsadmin,$calendarsshared); - $calendars=array_merge($calendarssuser,$calendarsadmin->toArray(),$calendarsshared); - $firstcalendar="all"; - } - - // Début & fin - $start=new \DateTime(); - $start->setTime(0,0); - - $end=new \DateTime(); - $end->setTime(0,0); - $end->add(new \DateInterval('P3M')); - $end->modify('last day of this month'); - - $events=[]; - $eventids=[]; - - foreach($calendars as $calendar) { - $calendarevents = $this->getDoctrine()->getRepository("CadolesPortalBundle:Calendarevent")->getCalendareventByDate($calendar,$start,$end); - - foreach($calendarevents as $calendarevent) { - $tmp=[]; - $tmp['id'] = strval($calendarevent->getId()); - $tmp['title'] = $calendarevent->getName(); - $tmp['description'] = $calendarevent->getDescription(); - $tmp['start'] = $calendarevent->getStart(); - $tmp['end'] = $calendarevent->getEnd(); - $tmp['color'] = "#".(is_null($calendar->getColor())?$this->get('session')->get('color')["main"]:$calendar->getColor()); - $tmp['allDay'] = $calendarevent->getAllday(); - $tmp['calendar'] = $calendar->getId(); - $tmp['editable'] = $calendar->getCanupdate(); - - // Si évènement sur la journée on enlève une 1 seconde à la date de fin - if($tmp['allDay']) - $tmp['end']->sub(new \DateInterval('PT1S')); - - array_push($events,$tmp); - array_push($eventids,$tmp["id"]); - } - } - - // On récupére les évenement partagé de l'utilisateur - if($this->getUser()) { - $calendarevents = $this->getDoctrine()->getRepository("CadolesPortalBundle:Calendarevent")->getCalendareventGroupsShareByDate($this->getUser(),$start,$end); - foreach($calendarevents as $calendarevent) { - if($usage=="group") { - if(!$calendarevent->getGroups()->contains($groupentity)) continue; - } - - $tmp=[]; - $tmp['id'] = strval($calendarevent->getId()); - $tmp['title'] = $calendarevent->getName(); - $tmp['description'] = $calendarevent->getDescription(); - $tmp['start'] = $calendarevent->getStart(); - $tmp['end'] = $calendarevent->getEnd(); - $tmp['color'] = "#".(is_null($calendar->getColor())?$this->get('session')->get('color')["main"]:$calendar->getColor()); - $tmp['allDay'] = $calendarevent->getAllday(); - $tmp['calendar'] = $calendar->getId(); - $tmp['editable'] = $calendar->getCanupdate(); - - // Si évènement sur la journée on enlève une 1 seconde à la date de fin - if($tmp['allDay']) - $tmp['end']->sub(new \DateInterval('PT1S')); - - if(!in_array($tmp['id'],$eventids)) { - array_push($events,$tmp); - array_push($eventids,$tmp["id"]); - } - } - } + // Récupérer les events de l'utilisateur + $user=$this->getUser(); + $events=$em->getRepository("CadolesPortalBundle:Calendarevent")->getUserCalendarevents($user,$this->get('session')->get('color')["main"],$usage,$group,$firstcalendar); + // Render return $this->render($this->labelentity.':viewcalendar.html.twig', [ 'entity' => $entity, diff --git a/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/CalendareventRepository.php b/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/CalendareventRepository.php index c9d66baa..a1849471 100644 --- a/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/CalendareventRepository.php +++ b/src/ninegate-1.0/src/Cadoles/PortalBundle/Repository/CalendareventRepository.php @@ -93,4 +93,89 @@ class CalendareventRepository extends EntityRepository return $calendareventshared; } + + public function getUserCalendarevents($user,$sessioncolor,$usage,$group,&$firstcalendar) { + $em=$this->getEntityManager(); + + // On récupère soit les calendriers du group en cours soit l'ensemble des calendriers de l'utilisateur + if($usage=="group") { + $calendars=$em->getRepository("CadolesPortalBundle:Calendar")->getCalendarsGroup($user,$group); + if($calendars) $firstcalendar=$calendars[0]->getId(); + } + else { + $em->getRepository("CadolesPortalBundle:Calendar")->getCalendarsUser($user,$calendarssuser,$calendarsadmin,$calendarsshared); + $calendars=array_merge($calendarssuser,$calendarsadmin->toArray(),$calendarsshared); + $firstcalendar="all"; + } + + // Début & fin + $start=new \DateTime(); + $start->setTime(0,0); + + $end=new \DateTime(); + $end->setTime(0,0); + $end->add(new \DateInterval('P3M')); + $end->modify('last day of this month'); + + $events=[]; + $eventids=[]; + + foreach($calendars as $calendar) { + $calendarevents = $em->getRepository("CadolesPortalBundle:Calendarevent")->getCalendareventByDate($calendar,$start,$end); + + foreach($calendarevents as $calendarevent) { + $tmp=[]; + $tmp['id'] = strval($calendarevent->getId()); + $tmp['title'] = $calendarevent->getName(); + $tmp['description'] = $calendarevent->getDescription(); + $tmp['start'] = $calendarevent->getStart(); + $tmp['end'] = $calendarevent->getEnd(); + $tmp['color'] = "#".(is_null($calendar->getColor())?$sessioncolor:$calendar->getColor()); + $tmp['allDay'] = $calendarevent->getAllday(); + $tmp['calendar'] = $calendar->getId(); + $tmp['name'] = $calendar->getName(); + $tmp['editable'] = $calendar->getCanupdate(); + + // Si évènement sur la journée on enlève une 1 seconde à la date de fin + if($tmp['allDay']) + $tmp['end']->sub(new \DateInterval('PT1S')); + + array_push($events,$tmp); + array_push($eventids,$tmp["id"]); + + } + } + + // On récupére les évenement partagé de l'utilisateur + if($user) { + $calendarevents = $em->getRepository("CadolesPortalBundle:Calendarevent")->getCalendareventGroupsShareByDate($user,$start,$end); + foreach($calendarevents as $calendarevent) { + if($usage=="group") { + if(!$calendarevent->getGroups()->contains($groupentity)) continue; + } + + $tmp=[]; + $tmp['id'] = strval($calendarevent->getId()); + $tmp['title'] = $calendarevent->getName(); + $tmp['description'] = $calendarevent->getDescription(); + $tmp['start'] = $calendarevent->getStart(); + $tmp['end'] = $calendarevent->getEnd(); + $tmp['color'] = "#".(is_null($calendar->getColor())?$sessioncolor:$calendar->getColor()); + $tmp['allDay'] = $calendarevent->getAllday(); + $tmp['calendar'] = $calendar->getId(); + $tmp['name'] = $calendar->getName(); + $tmp['editable'] = $calendar->getCanupdate(); + + // Si évènement sur la journée on enlève une 1 seconde à la date de fin + if($tmp['allDay']) + $tmp['end']->sub(new \DateInterval('PT1S')); + + if(!in_array($tmp['id'],$eventids)) { + array_push($events,$tmp); + array_push($eventids,$tmp["id"]); + } + } + } + return $events; + } }