From ee84ce033ebcf80a7c32a931a3d5696d5c504ca1 Mon Sep 17 00:00:00 2001 From: afornerot Date: Wed, 11 Dec 2019 15:26:47 +0100 Subject: [PATCH] synchro only --- .../CoreBundle/Command/OnlyCommand.php | 214 ++++++++++++++++-- .../CoreBundle/Command/data/core-init-01.sql | 2 +- .../CoreBundle/Controller/UserController.php | 9 +- 3 files changed, 204 insertions(+), 21 deletions(-) diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/OnlyCommand.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/OnlyCommand.php index 65816bd1..0d1c9d81 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/OnlyCommand.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/OnlyCommand.php @@ -102,9 +102,6 @@ class OnlyCommand extends Command $this->only_url = $this->container->getParameter("widonlyoffice_url")."/api/2.0/"; $this->only_host = str_replace("https://","",str_replace("http://","",$this->container->getParameter("widonlyoffice_url"))); - //$this->only_url = "https://transnum.oo.ac-dijon.fr"."/api/2.0/"; - //$this->only_host = "transnum.oo.ac-dijon.fr"; - $this->only_user = $this->container->getParameter("widonlyoffice_user"); $this->only_password = $this->container->getParameter("widonlyoffice_password"); @@ -135,6 +132,7 @@ class OnlyCommand extends Command $this->writeln('== AUTHENTIFICATION ================================='); \Unirest\Request::verifyPeer(false); \Unirest\Request::verifyHost(false); + \Unirest\Request::timeout(5); $headers = ['Host' => $this->only_host, 'Accept' => 'application/json','Content-Type'=>'application/json','Retry-After'=>'5']; $query = array('userName' => $this->only_user, 'password' => $this->only_password); $body = \Unirest\Request\Body::json($query); @@ -145,12 +143,11 @@ class OnlyCommand extends Command $headers["Authorization"]=$token; // Synchronisation des utilisateur Only sur l'annuaire - /* $this->writeln(''); $this->writeln('== SYNCHRONISATION ONLY=============================='); $response = \Unirest\Request::get($this->only_url.'/settings/ldap/sync',$headers); if($this->koresponse($response)) return 0; - */ + // Fichier d'import des utilisateurs only inexistant dans ninegate $this->filesystem->remove($this->rootlog.'toimportfromonly.csv'); @@ -160,34 +157,37 @@ class OnlyCommand extends Command // Controler les utilisateur only $this->writeln(''); $this->writeln('== CONTROLE USER ONLY================================'); + $kousers=[]; $onlyusers=[]; + $start=0; $response = \Unirest\Request::get($this->only_url.'/people',$headers); if($this->koresponse($response)) return 0; + $peoples=$response->body->response; + while(isset($response->body->nextIndex)) { + $response = \Unirest\Request::get($this->only_url.'/people?startIndex='.$response->body->nextIndex,$headers); + if($this->koresponse($response)) return 0; + $peoples=array_merge($peoples,$response->body->response); + } - foreach($response->body->response as $onlyuser) { + foreach($peoples as $onlyuser) { $user=$this->em->getRepository("CadolesCoreBundle:User")->findBy(["username"=>$onlyuser->userName]); if(!$user) { $this->writelnred("ERREUR ".$onlyuser->userName." existe dans OnlyOffice mais pas dans Ninegate"); - if($onlyuser->lastName!="") { - $string=$onlyuser->userName.";".$onlyuser->firstName.";".$onlyuser->lastName.";".$onlyuser->email.";Autres;ROLE_USER"; - //$this->filesystem->appendToFile($this->rootlog.'toimportfromonly.csv', $string."\n"); - } + + $string=$onlyuser->userName.";".$onlyuser->firstName.";".$onlyuser->lastName.";".$onlyuser->email.";Autres;ROLE_USER"; + $this->filesystem->appendToFile($this->rootlog.'toimportfromonly.csv', $string."\n"); } else { // Sauvegarde l'id du useronlyoffice $onlyusers[$onlyuser->id]=$onlyuser->userName; - } - - $string=$onlyuser->userName.";".$onlyuser->firstName.";".$onlyuser->lastName.";".$onlyuser->email.";Autres;ROLE_USER"; - $this->filesystem->appendToFile($this->rootlog.'toimportfromonly.csv', $string."\n"); + } } $response = \Unirest\Request::get($this->only_url.'/people',$headers); if($this->koresponse($response)) return 0; - dump($response); + // Controler les utilisateurs ninegate - /* $this->writeln(''); $this->writeln('== CONTROLE USER NINEGATE============================'); $users=$this->em->getRepository("CadolesCoreBundle:User")->findAll(); @@ -197,7 +197,7 @@ class OnlyCommand extends Command $this->writelnred("ERREUR ".$user->getUsername()." existe dans Ninegate mais pas dans OnlyOffice"); } } - */ + // On recherche la page template de group $pagetemplate=$this->em->getRepository("CadolesPortalBundle:Page")->findOneBy(["parentfor"=>"group"]); @@ -211,8 +211,14 @@ class OnlyCommand extends Command $this->writeln('== INJECTION DES GROUPES ONLY========================'); $response = \Unirest\Request::get($this->only_url.'/project?status=0,',$headers); if($this->koresponse($response)) return 0; - foreach($response->body->response as $onlygroup) { + $projects=$response->body->response; + while(isset($response->body->nextIndex)) { + $response = \Unirest\Request::get($this->only_url.'/people?startIndex='.$response->body->nextIndex,$headers); + if($this->koresponse($response)) return 0; + $projects=array_merge($projects,$response->body->response); + } + foreach($projects as $onlygroup) { // Le groupe existe-t-il dans ninegate $group=$this->em->getRepository("CadolesCoreBundle:Group")->findBy(["idonlyoffice"=>$onlygroup->id]); if(!$group) { @@ -223,6 +229,30 @@ class OnlyCommand extends Command if($group) $this->writelnred("ERREUR Groupe déjà existant = ".$namegroup); else{ + // Le propriétaire du groupe only existe-t-il dans ninegate + if(!array_key_exists($onlygroup->responsible->id,$onlyusers)) { + if(!array_key_exists($onlygroup->responsible->id,$kousers)) { + // Comme on n'a que les 1000 permiers lors du parcours des users only peut etre que lui fait partie de ceux que l'on n'a pas scanné + $respuser = \Unirest\Request::get($this->only_url.'/people/'.$onlygroup->responsible->id,$headers); + + // Là normalement on a forcement une réponse positive + if(!$this->koresponse($respuser)) { + $onlyuser=$respuser->body->response; + $user=$this->em->getRepository("CadolesCoreBundle:User")->findBy(["username"=>$onlyuser->userName]); + if(!$user) { + $kousers[$onlygroup->responsible->id]=$onlygroup->responsible->displayName; + + $string=$onlyuser->userName.";".$onlyuser->firstName.";".$onlyuser->lastName.";".$onlyuser->email.";Autres;ROLE_USER"; + $this->filesystem->appendToFile($this->rootlog.'toimportfromonly.csv', $string."\n"); + } + else { + // Sauvegarde l'id du useronlyoffice + $onlyusers[$onlyuser->id]=$onlyuser->userName; + } + } + } + } + // Le propriétaire du groupe only existe-t-il dans ninegate if(!array_key_exists($onlygroup->responsible->id,$onlyusers)) { $this->writelnred("ERREUR Propriétaire du Groupe n'existe pas. Group = ".$namegroup. " - User = ".$onlygroup->responsible->displayName); @@ -237,7 +267,7 @@ class OnlyCommand extends Command $group=new Group(); $group->setLabel($namegroup); $group->setDescription($onlygroup->description); - $group->setFgopen(!$onlygroup->isPrivate); + $group->setFgopen(false); $group->setFgcanshare(true); $group->setFgcancreatepage(false); $group->setFgcancreatecalendar(false); @@ -267,6 +297,11 @@ class OnlyCommand extends Command $user=$this->em->getRepository("CadolesCoreBundle:User")->findOneBy(["username"=>$member->userName]); if(!$user) { $this->writelnred("ERREUR Membre du group inexistant. Group = ".$namegroup." - ".$member->userName); + if(!array_key_exists($member->id,$kousers)) { + $kousers[$member->id]=$member->displayName; + $string=$member->userName.";".$member->firstName.";".$member->lastName.";".$member->email.";Autres;ROLE_USER"; + $this->filesystem->appendToFile($this->rootlog.'toimportfromonly.csv', $string."\n"); + } } else { $this->writeln("Rattachement utilisateur. Group = ".$namegroup." - User = ".$member->userName); @@ -285,6 +320,147 @@ class OnlyCommand extends Command } } + // Injection des groupes ninegate non existant dans only + $this->writeln(''); + $this->writeln('== INJECTION DES GROUPES NINEGATE===================='); + $groups=$this->em->getRepository("CadolesCoreBundle:Group")->findBy(["fgcanshare"=>true]); + foreach($groups as $group) { + // Info du groupe + $grouptitle=$group->getLabel(); + $groupdescription=$group->getDescription(); + $groupowner=$group->getOwner(); + $groupisprivate=true; + + // Si pas de propriétaire de projet on le rattache à admin + if(!$groupowner) + $groupowner=$this->em->getRepository("CadolesCoreBundle:USer")->findBy(["username"=>"admin"]); + + // Le groupe a un identifiant only, on le recherche via cet ID + if($group->getIdonlyoffice()) { + if(!$simulate) { + if($groupowner) { + // On recherche le propriétaire du groupe dans only + $respuser = \Unirest\Request::get($this->only_url.'/people/'.$groupowner->getUsername(),$headers); + + // On recherche le groupe dans only + $respgroup = \Unirest\Request::get($this->only_url.'/project/'.$group->getIdonlyoffice(),$headers); + + // Là normalement on n'a forcement une réponse positive + if(!$this->koresponse($respuser)&&!$this->koresponse($respgroup)) { + // On regarde s'il y a des changement + if($respgroup->body->response->responsible->userName!=$groupowner->getUsername()||$respgroup->body->response->title!=$grouptitle||$respgroup->body->response->description!=$groupdescription||$respgroup->body->response->isPrivate!=$groupisprivate) { + $this->writeln("Modification du groupe dans Only. Group = ".$group->getLabel()); + + // On modifie le groupe only + $query = array('title' => $grouptitle, 'description' => $groupdescription, 'responsibleId' => $respuser->body->response->id, 'private' => $groupisprivate); + $body = \Unirest\Request\Body::json($query); + $respmodif = \Unirest\Request::put($this->only_url.'/project/'.$respgroup->body->response->id."/withSecurityInfo",$headers,$body); + if($this->koresponse($respmodif)) { + $this->writelnred("ERREUR SUR MODIFICATION du Group = ".$group->getLabel()); + } + } + } + } + } + } + + // Sinon c'est que l'on doit le créer dans Only + else { + if(!$simulate) { + if($groupowner) { + // On recherche le propriétaire du groupe dans only + $respuser = \Unirest\Request::get($this->only_url.'/people/'.$groupowner->getUsername(),$headers); + + // Là normalement on n'a forcement une réponse positive + if(!$this->koresponse($respuser)) { + + $this->writeln("Création du groupe dans Only. Group = ".$group->getLabel()); + $query = array( + 'title' => $grouptitle, + 'description' => $groupdescription, + 'responsibleId' => $respuser->body->response->id, + 'private' => $groupisprivate, + 'notify' => true + ); + $body = \Unirest\Request\Body::json($query); + $respsubmit = \Unirest\Request::post($this->only_url.'/project/withSecurity',$headers,$body); + if($this->koresponse($respsubmit)) { + $this->writelnred("ERREUR SUR CREATION du Group = ".$group->getLabel()); + } + else { + $group->setIdonlyoffice($respsubmit->body->response->id); + $this->em->persist($group); + $this->em->flush(); + } + } + } + } + } + + // Si pas d'erreur on doit avoir à présent le projet dans only rattaché à un groupe ninegate + // On va pouvoir s'occuper des membres du groupes + if($group->getIdonlyoffice()) { + // Liste des membres Ninegate + $membersNingate=[]; + foreach($group->getUsers() as $member) { + array_push($membersNingate,$member->getUser()->getUsername()); + } + + // Liste des membres Only + $membersOnly=[]; + $respmember = \Unirest\Request::get($this->only_url.'/project/'.$group->getIdonlyoffice().'/team',$headers); + if($this->koresponse($respmember)) { + $this->writelnred("ERREUR SUR RECUPERATION DES MEMBRES du Group = ".$group->getLabel()); + continue; + } + foreach($respmember->body->response as $member) { + array_push($membersOnly,$member->userName); + } + + + // On vérifie que chq membre Ninegate sont dans les membres Only et si pas le cas on le rattache + foreach($membersNingate as $member) { + if(!in_array($member,$membersOnly)) { + $this->writeln("Rattachement au groupe ".$group->getLabel()." l'utilisateur ".$member); + if(!$simulate) { + $respuser = \Unirest\Request::get($this->only_url.'/people/'.$member,$headers); + if($this->koresponse($respuser)) { + $this->writelnred("ERREUR Utilisateur inexistant dans only = ".$member); + } + else { + $query = array('userId' => $respuser->body->response->id); + $body = \Unirest\Request\Body::json($query); + $respsubmit = \Unirest\Request::post($this->only_url.'/project/'.$group->getIdonlyoffice().'/team',$headers,$body); + if($this->koresponse($respsubmit)) { + $this->writelnred("ERREUR SUR RATACHEMENT"); + } + } + } + } + } + + // On vérifie que chq membre Ninegate sont dans les membres Only et si pas le cas on le rattache + foreach($membersOnly as $member) { + if(!in_array($member,$membersNingate)) { + $this->writeln("Detachement au groupe ".$group->getLabel()." l'utilisateur ".$member); + if(!$simulate) { + $respuser = \Unirest\Request::get($this->only_url.'/people/'.$member,$headers); + if($this->koresponse($respuser)) { + $this->writelnred("ERREUR Utilisateur inexistant dans only = ".$member); + } + else { + $query = array('userId' => $respuser->body->response->id); + $body = \Unirest\Request\Body::json($query); + $respsubmit = \Unirest\Request::delete($this->only_url.'/project/'.$group->getIdonlyoffice().'/team',$headers,$body); + if($this->koresponse($respsubmit)) { + $this->writelnred("ERREUR SUR DETACHEMENT"); + } + } + } + } + } + } + } } $this->writeln(''); diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/data/core-init-01.sql b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/data/core-init-01.sql index fcd8b6ba..f9f396ff 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/data/core-init-01.sql +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Command/data/core-init-01.sql @@ -8,7 +8,7 @@ INSERT IGNORE INTO `niveau01` (`id`, `label`, `siren`) VALUES (-100, 'DRAAF', '130007107'); INSERT IGNORE INTO `user` (`id`, `niveau01_id`, `username`, `firstname`, `lastname`, `password`, `email`, `avatar`, `role`,`siren`,`authlevel`) VALUES -(-100, -100, 'admin', 'Administrateur', 'draaf', '{SSHA}7edyZMIwG4aTOpc6rVXCWrDljOW5K9xW +(-100, -100, 'admin', 'Administrateur', 'draaf', '{SSHA}aTs3IqgN93ehIEqy93uWTTyxg5wNa+80 ', 'admin@ldapbundle.ac-arno.fr', 'admin.jpg', 'ROLE_ADMIN', '130007107', 'simple'); diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/UserController.php b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/UserController.php index d558a470..0c50a841 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/UserController.php +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Controller/UserController.php @@ -803,7 +803,14 @@ class UserController extends Controller $error.="

Utilisateur = ".$user["login"]." existe déjà

"; } - if(strlen($user["login"])<5) $error.="

Utilisateur = ".$user["login"]." login trop court doit être >= 5

"; + // On s'assure que le login n'est pas trop court + if(strlen($user["login"])<5) + $error.="

Utilisateur = ".$user["login"]." login trop court doit être >= 5

"; + + // On s'assure que le username ne contient pas des caractères speciaux + $string = preg_replace('~[^@a-zA-Z0-9._-]~', '', $user["login"]); + if($string!=$user["login"]) + $error.="

Utilisateur = ".$user["login"]." login avec caractères invalide

"; // On regarde si le email n'est pas déjà existant $userbdd=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["email"=>$user["email"]]);