diff --git a/src/UnicaenZimbra/Entity/Filter/Action/Keep.php b/src/UnicaenZimbra/Entity/Filter/Action/Keep.php new file mode 100644 index 0000000000000000000000000000000000000000..62e514d64b69138dac07edbaf55d4552f8626752 --- /dev/null +++ b/src/UnicaenZimbra/Entity/Filter/Action/Keep.php @@ -0,0 +1,36 @@ +<?php +namespace UnicaenZimbra\Entity\Filter\Action; + +use SimpleXMLElement; + +/** + * @version $Id$ + * + * Action de keep pour filtre Zimbra + * + * @author David Surville <david.surville at unicaen.fr> + */ +class Keep extends Action +{ + + /** + * + * @param SimpleXMLElement $node + * @return self + */ + protected function populate( SimpleXMLElement $node ) + { + /* Aucune propriété particulière n'est requise */ + return $this; + } + + /** + * Retourne la liste des propriétés de l'objet sous forme de tableau associatif + * + * @return array + */ + public function getArrayCopy() + { + return array(); + } +} diff --git a/src/UnicaenZimbra/Processus/BoiteGenerique.php b/src/UnicaenZimbra/Processus/BoiteGenerique.php index c8c9bd8a1408d11c04c941abd6eb092e6bed6da6..b8aaacaedb4e33812c13b4e8d5dc1ad308e43ce7 100644 --- a/src/UnicaenZimbra/Processus/BoiteGenerique.php +++ b/src/UnicaenZimbra/Processus/BoiteGenerique.php @@ -11,10 +11,12 @@ namespace UnicaenZimbra\Processus; use UnicaenZimbra\Entity\Account; use UnicaenZimbra\Entity\Identity; use UnicaenZimbra\Entity\Grant; +use UnicaenZimbra\Entity\Right; use UnicaenZimbra\Entity\Filter\Filter; use UnicaenZimbra\Entity\Filter\Test\Address as FilterTestAddress; use UnicaenZimbra\Entity\Filter\Test\Header as FilterTestHeader; use UnicaenZimbra\Entity\Filter\Action\FileInto as FilterActionFileInto; +use UnicaenZimbra\Entity\Filter\Action\Keep as FilterActionKeep; use UnicaenZimbra\Entity\Filter\Action\Stop as FilterActionStop; use UnicaenZimbra\Service\Folder as FolderService; @@ -68,37 +70,43 @@ class BoiteGenerique extends Processus { $afName = $this->getMailName( $adresseFonctionnelle ); - $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); - $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); - $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); + // récupération des services + $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); + $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); + $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); + $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); - /****** Travail sur la boite générique ******/ + // Travail sur la boite générique $bg = $accountService->get( $mail ); $folderService->setAccount($bg ); $filterService->setAccount($bg ); - /* Alias */ - $accountService->addAlias( $bg, $adresseFonctionnelle ); - - /* Répertoires */ + // Liste de distribution + $distribList = $distribListService->create($adresseFonctionnelle); + $distribListService->addMembers($distribList, $mail); + + // Répertoires $inputFolder = $folderService->create($afName.' | Réception'); $sentFolder = $folderService->create($afName.' | Envoi'); - /* Filtre de réception */ + // Filtre de réception $filter = new Filter; - $filter->setName($afName.' | Réception'); - $test = new FilterTestAddress; - $test->setHeader('to,cc'); - $test->setStringComparison('is'); - $test->setPart('all'); - $test->setValue($adresseFonctionnelle); - $filter->addTest($test); + $filter->setName($afName.' | Réception') + ->setCondition($filter::CONDITION_ANYOF); + $test1 = new FilterTestAddress; + $test1->setHeader('to,cc')->setStringComparison('contains')->setPart('all') + ->setValue($adresseFonctionnelle); + $test2 = new FilterTestHeader; + $test2->setHeader('X-Zimbra-DL')->setStringComparison('contains') + ->setValue($adresseFonctionnelle); + $filter->setTests(array($test1, $test2)); $action = new FilterActionFileInto; $action->setFolderPath( $inputFolder->absFolderPath ); $filter->addAction($action); - $filter->addAction( new FilterActionStop ); + $filter->addAction( new FilterActionKeep ); $filterService->createInput($filter); + return $this; } @@ -145,56 +153,60 @@ class BoiteGenerique extends Processus { $afName = $this->getMailName( $adresseFonctionnelle ); - $aliasService = $this->getServiceManager()->get('zimbraServiceAlias'); - $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); - $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); - $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); - $identityService = $this->getServiceManager()->get('zimbraServiceIdentity'); + $distribListService = $this->getServiceManager()->get('zimbraServiceDistributionList'); + $accountService = $this->getServiceManager()->get('zimbraServiceAccount'); + $folderService = $this->getServiceManager()->get('zimbraServiceFolder'); + $filterService = $this->getServiceManager()->get('zimbraServiceFilter'); + $rightService = $this->getServiceManager()->get('zimbraServiceRight'); + $identityService = $this->getServiceManager()->get('zimbraServiceIdentity'); - $alias = $aliasService->get( $adresseFonctionnelle ); - - /****** Travail sur la boite générique ******/ - $bgAccount = $accountService->get($alias->zimbraAliasTargetId, 'id'); + // Travail sur la boite générique + $bgAccount = $distribListService->getMembers($adresseFonctionnelle, 1)[0]; $userAccount = $accountService->get( $userMail ); $folderService->setAccount($bgAccount); - /* Ajout des partages */ - $grant = new Grant; - $grant->setGrantee($userAccount); - $grant->perm = Grant::PERM_MANAGE; - + // Partages $inputFolder = $folderService->get($afName.' | Réception'); $sentFolder = $folderService->get($afName.' | Envoi'); + + $grant = new Grant; + $grant->setGrantee($userAccount); + $grant->perm = Grant::PERM_MANAGE; $folderService->addGrant( $inputFolder, $grant, FolderService::GRANT_ACTION_NONE ) ->createMountPoint($inputFolder, $userAccount, $inputFolder->absFolderPath) ->addGrant( $sentFolder, $grant, FolderService::GRANT_ACTION_NONE ) ->createMountPoint($sentFolder, $userAccount, $sentFolder->absFolderPath); - /****** Travail sur la boite utilisateur ******/ + // Travail sur la boite utilisateur $filterService->setAccount($userAccount); $identityService->setAccount($userAccount); $folderService->setAccount($userAccount); - /* Filtres */ + // Filtre d'envoi $filter = new Filter; $filter->setName($afName.' | Envoi'); - $test = new FilterTestHeader; - $test->setHeader('Reply-to'); - $test->setStringComparison('is'); - $test->setValue($adresseFonctionnelle); + $test = new FilterTestAddress; + $test->setHeader('from')->setStringComparison('contains')->setPart('all') + ->setValue($adresseFonctionnelle); $filter->addTest($test); $action = new FilterActionFileInto; $action->setFolderPath( $afName.' | Envoi' ); $filter->addAction($action); - $filter->addAction( new FilterActionStop ); $filterService->createOutput($filter); - - /* Avatar */ + + // ACE + $ace = new Right; + $ace->setTarget($distribListService->get($adresseFonctionnelle)) + ->setGrantee($userAccount) + ->setRightByRightName('sendAsDistList'); + $rightService->grantRight($ace); + + // Avatar $identity = new Identity; $identity->setName($afName); - $identity->zimbraPrefFromAddress = $userMail; + $identity->zimbraPrefFromAddress = $adresseFonctionnelle; $identity->zimbraPrefFromAddressType = 'sendAs'; $identity->zimbraPrefFromDisplay = $adresseFonctionnelle; $identity->zimbraPrefWhenInFolderIds = $folderService->get($afName.' | Réception')->getId(); @@ -204,6 +216,7 @@ class BoiteGenerique extends Processus $identity->zimbraPrefWhenSentToAddresses = $adresseFonctionnelle; $identity->zimbraPrefWhenSentToEnabled = true; $identityService->create($identity); + return $this; } diff --git a/src/UnicaenZimbra/Service/Alias.php b/src/UnicaenZimbra/Service/Alias.php index 4ebef999bc4654e575c4b913d1333ed5587b69f1..f1ce6bc5282bbccbf684aab8447d3fda90d85f9c 100644 --- a/src/UnicaenZimbra/Service/Alias.php +++ b/src/UnicaenZimbra/Service/Alias.php @@ -10,6 +10,7 @@ namespace UnicaenZimbra\Service; use UnicaenZimbra\Zimbra; use UnicaenZimbra\Entity\Alias as AliasEntity; +use UnicaenZimbra\Exception; class Alias extends Service { diff --git a/src/UnicaenZimbra/Service/Folder.php b/src/UnicaenZimbra/Service/Folder.php index a7a1a1d809ef42f6bca1543d1ddd68127910fb84..1c514038da3c8a1e414d983922aef6788ec8a9d0 100644 --- a/src/UnicaenZimbra/Service/Folder.php +++ b/src/UnicaenZimbra/Service/Folder.php @@ -442,11 +442,11 @@ class Folder extends Service { $currentAccount = $this->account; $this->account = $account; + $destFolderParent = dirname( $absPath); if ('.' == $destFolderParent) $destFolderParent = '/'; $destFolderName = basename( $absPath ); $destFolderParent = $this->get($destFolderParent); - $this->account = $currentAccount; $attributes = array(); $params = array( @@ -460,6 +460,8 @@ class Folder extends Service { ); $this->applyAccountContext(); $this->getZimbra()->request('CreateMountpointRequest', $attributes, $params, self::URN); + + $this->account = $currentAccount; return $this; }