synchro only

This commit is contained in:
afornerot 2019-12-12 12:02:54 +01:00
parent ee84ce033e
commit 8e9ff10223
7 changed files with 254 additions and 82 deletions

View File

@ -183,10 +183,6 @@ class OnlyCommand extends Command
} }
} }
$response = \Unirest\Request::get($this->only_url.'/people',$headers);
if($this->koresponse($response)) return 0;
// Controler les utilisateurs ninegate // Controler les utilisateurs ninegate
$this->writeln(''); $this->writeln('');
$this->writeln('== CONTROLE USER NINEGATE============================'); $this->writeln('== CONTROLE USER NINEGATE============================');
@ -198,7 +194,6 @@ class OnlyCommand extends Command
} }
} }
// On recherche la page template de group // On recherche la page template de group
$pagetemplate=$this->em->getRepository("CadolesPortalBundle:Page")->findOneBy(["parentfor"=>"group"]); $pagetemplate=$this->em->getRepository("CadolesPortalBundle:Page")->findOneBy(["parentfor"=>"group"]);
if(!$pagetemplate) { if(!$pagetemplate) {
@ -275,6 +270,7 @@ class OnlyCommand extends Command
$group->setFgall(false); $group->setFgall(false);
$group->setFgtemplate(false); $group->setFgtemplate(false);
$group->setOwner($user); $group->setOwner($user);
$group->setPagetemplate($pagetemplate);
$group->setIdonlyoffice($onlygroup->id); $group->setIdonlyoffice($onlygroup->id);
$this->em->persist($group); $this->em->persist($group);
@ -330,27 +326,29 @@ class OnlyCommand extends Command
$groupdescription=$group->getDescription(); $groupdescription=$group->getDescription();
$groupowner=$group->getOwner(); $groupowner=$group->getOwner();
$groupisprivate=true; $groupisprivate=true;
$tocreate=false;
// Si pas de propriétaire de projet on le rattache à admin // Si pas de propriétaire de projet on le rattache à admin
if(!$groupowner) if(!$groupowner)
$groupowner=$this->em->getRepository("CadolesCoreBundle:USer")->findBy(["username"=>"admin"]); $groupowner=$this->em->getRepository("CadolesCoreBundle:User")->findOneBy(["username"=>"admin"]);
// Le groupe a un identifiant only, on le recherche via cet ID
if($group->getIdonlyoffice()) {
if(!$simulate) {
if($groupowner) { if($groupowner) {
// On recherche le propriétaire du groupe dans only // On recherche le propriétaire du groupe dans only
$respuser = \Unirest\Request::get($this->only_url.'/people/'.$groupowner->getUsername(),$headers); $respuser = \Unirest\Request::get($this->only_url.'/people/'.$groupowner->getUsername(),$headers);
// Là normalement on a forcement une réponse positive
if(!$this->koresponse($respuser)) {
// Le groupe a un identifiant only, on le recherche via cet ID
if($group->getIdonlyoffice()) {
// On recherche le groupe dans only // On recherche le groupe dans only
$respgroup = \Unirest\Request::get($this->only_url.'/project/'.$group->getIdonlyoffice(),$headers); $respgroup = \Unirest\Request::get($this->only_url.'/project/'.$group->getIdonlyoffice(),$headers);
// Là normalement on n'a forcement une réponse positive // Si le projet existe
if(!$this->koresponse($respuser)&&!$this->koresponse($respgroup)) { if(!$this->koresponse($respgroup)) {
// On regarde s'il y a des changement // 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) { 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()); $this->writeln("Modification du groupe dans Only. Group = ".$group->getLabel());
if(!$simulate) {
// On modifie le groupe only // On modifie le groupe only
$query = array('title' => $grouptitle, 'description' => $groupdescription, 'responsibleId' => $respuser->body->response->id, 'private' => $groupisprivate); $query = array('title' => $grouptitle, 'description' => $groupdescription, 'responsibleId' => $respuser->body->response->id, 'private' => $groupisprivate);
$body = \Unirest\Request\Body::json($query); $body = \Unirest\Request\Body::json($query);
@ -361,20 +359,21 @@ class OnlyCommand extends Command
} }
} }
} }
// Sinon c'est qu'il a été supprimé via only : il faut donc le regénérer
else {
$tocreate=true;
} }
} }
// Sinon c'est que l'on doit le créer dans Only // Sinon c'est que l'on doit le créer dans Only
else { else {
if(!$simulate) { $tocreate=true;
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)) {
// Création
if($tocreate) {
$this->writeln("Création du groupe dans Only. Group = ".$group->getLabel()); $this->writeln("Création du groupe dans Only. Group = ".$group->getLabel());
if(!$simulate) {
$query = array( $query = array(
'title' => $grouptitle, 'title' => $grouptitle,
'description' => $groupdescription, 'description' => $groupdescription,
@ -406,6 +405,11 @@ class OnlyCommand extends Command
array_push($membersNingate,$member->getUser()->getUsername()); array_push($membersNingate,$member->getUser()->getUsername());
} }
// Si groupe sans propriétaire on ajoute forcement admin à la liste des membres du groupe
if(!$group->getOwner()) {
array_push($membersNingate,"admin");
}
// Liste des membres Only // Liste des membres Only
$membersOnly=[]; $membersOnly=[];
$respmember = \Unirest\Request::get($this->only_url.'/project/'.$group->getIdonlyoffice().'/team',$headers); $respmember = \Unirest\Request::get($this->only_url.'/project/'.$group->getIdonlyoffice().'/team',$headers);

View File

@ -933,7 +933,7 @@ class GroupController extends Controller
$em = $this->getDoctrine()->getManager(); $em = $this->getDoctrine()->getManager();
if($group->getOwner()) { if($group->getOwner()) {
$usergroup=$em->getRepository("CadolesCoreBundle:Usergroup")->findOneBy(["user"=>$group->getOwner()]); $usergroup=$em->getRepository("CadolesCoreBundle:Usergroup")->findOneBy(["user"=>$group->getOwner()]);
if($usergroup) { if(!$usergroup) {
$key = Uuid::uuid4(); $key = Uuid::uuid4();
$usergroup=new Usergroup; $usergroup=new Usergroup;
$usergroup->setUser($group->getOwner()); $usergroup->setUser($group->getOwner());

View File

@ -39,7 +39,10 @@ class syncGroup implements EventSubscriber
if(!($entity instanceof Group)) return; if(!($entity instanceof Group)) return;
// Synchronisation uniquement si changement de valeur // Synchronisation uniquement si changement de valeur
$this->shouldSync = $args->hasChangedField('label'); $this->shouldSync = $args->hasChangedField('label') ||
$args->hasChangedField('description') ||
$args->hasChangedField('owner') ||
$args->hasChangedField('fgcanshare');
if($args->hasChangedField('label')) $this->oldid=$args->getOldValue('label'); if($args->hasChangedField('label')) $this->oldid=$args->getOldValue('label');
} }

View File

@ -6,6 +6,7 @@ use Cadoles\CoreBundle\Entity\User;
use Cadoles\CoreBundle\Entity\Group; use Cadoles\CoreBundle\Entity\Group;
use Cadoles\CoreBundle\Entity\UserGroup; use Cadoles\CoreBundle\Entity\UserGroup;
use Doctrine\ORM\EntityManager; use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpFoundation\Response;
class onlyService class onlyService
{ {
@ -18,6 +19,7 @@ class onlyService
protected $only_user; protected $only_user;
protected $only_password; protected $only_password;
protected $debug = true; protected $debug = true;
protected $headers = [];
public function __construct($container, EntityManager $em) public function __construct($container, EntityManager $em)
{ {
@ -45,8 +47,45 @@ class onlyService
//================================================================================================================================================================== //==================================================================================================================================================================
public function syncUser(User $user) { public function syncUser(User $user) {
error_log("==SYNC ONLY USER=========================================================="); $this->mydebug("==SYNC ONLY USER==========================================================");
// Recherche utilisateur eportail
// Authentification à Only
if($this->authOnly()) {
// Recherche utilisateur only
$this->mydebug("Recherche utilisateur only");
$respuser = \Unirest\Request::get($this->only_url.'/people/'.$user->getUsername(),$this->headers);
// Si existe modification
if(!$this->koresponse($respuser)) {
$this->mydebug("Modification user = ".$user->getUsername());
$onlyuser=$respuser->body->response;
// Si véritable modification
if($onlyuser->firstName!=$user->getFirstname()||$onlyuser->lastName!=$user->getLastname()||$onlyuser->email!=$user->getEmail()) {
$this->mydebug("Lancer la modification");
$this->mydebug($onlyuser->firstName." !=".$user->getFirstname());
$this->mydebug($onlyuser->lastName." !=".$user->getLastname());
$this->mydebug($onlyuser->email." !=".$user->getEmail());
$query = array(
'firstName' => $user->getFirstname(),
'lastName' => $user->getLastname(),
'email' => $user->getEmail(),
);
$body = \Unirest\Request\Body::json($query);
$respupdate = \Unirest\Request::put($this->only_url.'/people/'.$onlyuser->id,$this->headers,$body);
}
}
// Sinon création
else {
$this->mydebug("Création user = ".$user->getUsername());
}
}
//$respuser = \Unirest\Request::get($this->only_url.'/people/'.$onlygroup->responsible->id,$this->headers);
// Correspondance profil ldapuser = profil eportail // Correspondance profil ldapuser = profil eportail
@ -72,17 +111,95 @@ class onlyService
//================================================================================================================================================================== //==================================================================================================================================================================
public function syncGroup(Group $group, $oldid) { public function syncGroup(Group $group, $oldid) {
error_log("==SYNC ONLY GROUP========================================================="); $this->mydebug("==SYNC ONLY GROUP=========================================================");
// Renommage du précédent groupe // Authentification à Only
if(isset($oldid)&&$oldid!=$group->getLabel()) { if($this->authOnly()) {
// Si groupe de travail
if($group->getFgcanshare()) {
// Info du groupe
$grouptitle=$group->getLabel();
$groupdescription=$group->getDescription();
$groupowner=$group->getOwner();
$groupisprivate=true;
$tocreate=false;
// Si pas de propriétaire de projet on le rattache à admin
if(!$groupowner)
$groupowner=$this->em->getRepository("CadolesCoreBundle:USer")->findOneBy(["username"=>"admin"]);
if($groupowner) {
// On recherche le propriétaire du groupe dans only
$this->mydebug("Recherche du propriétaire du group only");
$respuser = \Unirest\Request::get($this->only_url.'/people/'.$groupowner->getUsername(),$this->headers);
// Normalement on a toujours le propriétaire dans only
if(!$this->koresponse($respuser)) {
// Si idonlyoffice de lié
if($group->getIdonlyoffice()) {
// Recherche groupe only
$this->mydebug("Recherche group only ".$group->getIdonlyoffice());
$respgroup = \Unirest\Request::get($this->only_url.'/project/'.$group->getIdonlyoffice(),$this->headers);
// Si existe modification
if(!$this->koresponse($respgroup)) {
$this->mydebug("Modification Group = ".$group->getLabel());
$onlygroup=$respgroup->body->response;
// Si véritable modification
if($onlygroup->responsible->userName!=$groupowner->getUsername()||$onlygroup->title!=$grouptitle||$onlygroup->description!=$groupdescription||$onlygroup->isPrivate!=$groupisprivate) {
$this->mydebug("Lancer la modification");
$this->mydebug($respuser->body->response->userName." !=".$groupowner->getUsername());
$this->mydebug($onlygroup->title." !=".$grouptitle);
$this->mydebug($onlygroup->description." !=".$groupdescription);
$this->mydebug($onlygroup->isPrivate." !=".$groupisprivate);
$query = array(
'title' => $grouptitle,
'description' => $groupdescription,
'responsibleId' => $respuser->body->response->id,
'private' => $groupisprivate
);
$body = \Unirest\Request\Body::json($query);
$respupdate = \Unirest\Request::put($this->only_url.'/project/'.$onlygroup->id."/withSecurityInfo",$this->headers,$body);
}
} }
// On recherche le groupe à insérer / modifier // Sinon c'est qu'il a été supprimé via only : il faut donc le regénérer
else {
$tocreate=true;
}
}
// Si existe modification = rien à faire normalement // Sinon il faut le créer dans only
// Sinon création else {
$tocreate=true;
}
// Création
if($tocreate) {
$this->mydebug("Création 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',$this->headers,$body);
if(!$this->koresponse($respsubmit)) {
$group->setIdonlyoffice($respsubmit->body->response->id);
$this->em->persist($group);
$this->em->flush();
}
}
}
}
}
// Si non groupe de travail mais avec un id Only
}
return true; return true;
} }
@ -122,8 +239,52 @@ public function addUserGroup(UserGroup $usergroup) {
// Création du rattachement // Création du rattachement
} }
private function authOnly() {
// Only Office est-il dans le domaine
if(stripos($this->only_url,"/")===0)
$this->only_url="https://".$this->container->getParameter("weburl").$this->only_url;
$indomaine = (stripos($this->only_url,$this->container->getParameter("weburl"))!==false);
// Si hors domaine on utilise le proxy si proxy il y a
if(!$indomaine) {
$PROXYactivate = $this->em->getRepository("CadolesCoreBundle:Config")->find("PROXYactivate")->getValue();
if($PROXYactivate) {
$PROXYserver = $this->em->getRepository("CadolesCoreBundle:Config")->find("PROXYserver")->getValue();
$PROXYport = $this->em->getRepository("CadolesCoreBundle:Config")->find("PROXYport")->getValue();
\Unirest\Request::proxy($PROXYserver, $PROXYport, CURLPROXY_HTTP, true);
}
}
\Unirest\Request::verifyPeer(false);
\Unirest\Request::verifyHost(false);
\Unirest\Request::timeout(5);
$this->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);
$response = \Unirest\Request::post($this->only_url.'/authentication',$this->headers,$body);
if($this->koresponse($response)) return false;
$token=$response->body->response->token;
$this->headers["Authorization"]=$token;
return true;
}
private function koresponse($response) {
if($response->code>=Response::HTTP_BAD_REQUEST) {
$this->mydebug("ERREUR ".$response->code);
if(property_exists($response,"body") && property_exists($response->body,"error")) $this->mydebug("ERREUR ".$response->body->error->message);;
return true;
}
return false;
}
private function mydebug($texte) { private function mydebug($texte) {
if($this->debug) error_log("==SYNC ONLY USER=========================================================="); if($this->debug) error_log($texte);
} }
} }

View File

@ -994,7 +994,7 @@ class InitDataCommand extends ContainerAwareCommand
$entityWidget->setParameter($parameter); $entityWidget->setParameter($parameter);
$em->persist($entityWidget); $em->persist($entityWidget);
} }
else { elseif($entityWidget) {
$em->remove($entityWidget); $em->remove($entityWidget);
} }
@ -1241,6 +1241,7 @@ class InitDataCommand extends ContainerAwareCommand
if(!$entityPagewidget) { if(!$entityPagewidget) {
$entityWidget = $em->getRepository('CadolesPortalBundle:Widget')->find($widgetid); $entityWidget = $em->getRepository('CadolesPortalBundle:Widget')->find($widgetid);
if($entityWidget) {
$entityPagewidget = new Pagewidget(); $entityPagewidget = new Pagewidget();
$entityPagewidget->setId($id); $entityPagewidget->setId($id);
$entityPagewidget->setLoc($loc); $entityPagewidget->setLoc($loc);
@ -1257,6 +1258,7 @@ class InitDataCommand extends ContainerAwareCommand
$em->persist($entityPagewidget); $em->persist($entityPagewidget);
$em->flush(); $em->flush();
} }
}
} }
} }

View File

@ -8,6 +8,7 @@ Alias /ninegate /var/www/html/ninegate/web
php_admin_flag allow_url_fopen On php_admin_flag allow_url_fopen On
</Directory> </Directory>
%if %%getVar("ninegate_activate_websocket", 'non') == "oui"
Listen %%adresse_ip_eth0:%%ninegate_websocket_portexterne Listen %%adresse_ip_eth0:%%ninegate_websocket_portexterne
<VirtualHost %%adresse_ip_eth0:%%ninegate_websocket_portexterne> <VirtualHost %%adresse_ip_eth0:%%ninegate_websocket_portexterne>
ErrorLog /var/log/apache2/ssl_error.log ErrorLog /var/log/apache2/ssl_error.log
@ -27,3 +28,4 @@ Listen %%adresse_ip_eth0:%%ninegate_websocket_portexterne
ProxyPass / ws://%%adresse_ip_eth0:%%ninegate_websocket_portinterne retry=0 keepalive=On ProxyPass / ws://%%adresse_ip_eth0:%%ninegate_websocket_portinterne retry=0 keepalive=On
ProxyPassReverse / ws://%%adresse_ip_eth0:%%ninegate_websocket_portinterne retry=0 ProxyPassReverse / ws://%%adresse_ip_eth0:%%ninegate_websocket_portinterne retry=0
</VirtualHost> </VirtualHost>
%end if

View File

@ -45,9 +45,9 @@ parameters:
websocket_portinterne: %%ninegate_websocket_portinterne websocket_portinterne: %%ninegate_websocket_portinterne
%else %else
websocket_activate: false websocket_activate: false
websocket_host: websocket_host: %%web_url
websocket_port: websocket_port: 80
websocket_portinterne: websocket_portinterne: 80
%end if %end if
%if %%getVar("ninegate_activate_portal", 'non') == "oui" %if %%getVar("ninegate_activate_portal", 'non') == "oui"
portal_activate: true portal_activate: true