vendor/uvdesk/mailbox-component/Controller/MailboxChannel.php line 31

Open in your IDE?
  1. <?php
  2. namespace Webkul\UVDesk\MailboxBundle\Controller;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Contracts\Translation\TranslatorInterface;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Webkul\UVDesk\MailboxBundle\Utils\IMAP;
  10. use Webkul\UVDesk\MailboxBundle\Utils\SMTP;
  11. use Webkul\UVDesk\MailboxBundle\Utils\Mailbox\Mailbox;
  12. use Webkul\UVDesk\MailboxBundle\Services\MailboxService;
  13. use Webkul\UVDesk\CoreFrameworkBundle\Services\UserService;
  14. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Microsoft\MicrosoftApp;
  15. use Webkul\UVDesk\CoreFrameworkBundle\Entity\Microsoft\MicrosoftAccount;
  16. use Webkul\UVDesk\CoreFrameworkBundle\SwiftMailer\SwiftMailer as SwiftMailerService;
  17. class MailboxChannel extends AbstractController
  18. {
  19.     public function loadMailboxes(UserService $userService)
  20.     {
  21.         if (! $userService->isAccessAuthorized('ROLE_ADMIN')) {
  22.             return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  23.         }
  24.         return $this->render('@UVDeskMailbox//listConfigurations.html.twig');
  25.     }
  26.     public function createMailboxConfiguration(Request $requestEntityManagerInterface $entityManagerUserService $userServiceMailboxService $mailboxServiceTranslatorInterface $translatorSwiftMailerService $swiftMailer)
  27.     {
  28.         if (! $userService->isAccessAuthorized('ROLE_ADMIN')) {
  29.             return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  30.         }
  31.         $microsoftAppCollection $entityManager->getRepository(MicrosoftApp::class)->findBy(['isEnabled' => true'isVerified' => true]);
  32.         $microsoftAccountCollection $entityManager->getRepository(MicrosoftAccount::class)->findAll();
  33.         $microsoftAppCollection array_map(function ($microsoftApp) {
  34.             return [
  35.                 'id'   => $microsoftApp->getId(),
  36.                 'name' => $microsoftApp->getName(),
  37.             ];
  38.         }, $microsoftAppCollection);
  39.         $microsoftAccountCollection array_map(function ($microsoftAccount) {
  40.             return [
  41.                 'id'    => $microsoftAccount->getId(),
  42.                 'name'  => $microsoftAccount->getName(),
  43.                 'email' => $microsoftAccount->getEmail(),
  44.             ];
  45.         }, $microsoftAccountCollection);
  46.         # load swift mailer configuration
  47.         $swiftMailerConfigurationCollection $swiftMailer->parseSwiftMailerConfigurations();
  48.         if ($request->getMethod() == 'POST') {
  49.             $params $request->request->all();
  50.             $smtpConfiguration null;
  51.             $imapConfiguration null;
  52.             // IMAP Configuration
  53.             if (! empty($params['imap']['transport'])) {
  54.                 $imapConfiguration IMAP\Configuration::createTransportDefinition($params['imap']['transport'], !empty($params['imap']['host']) ? trim($params['imap']['host'], '"') : null);
  55.                 if ($imapConfiguration instanceof IMAP\Transport\AppTransportConfigurationInterface) {
  56.                     if ($params['imap']['transport'] == 'outlook_oauth') {
  57.                         $microsoftAccount $entityManager->getRepository(MicrosoftAccount::class)->findOneById($params['imap']['username']);
  58.                         if (empty($microsoftAccount)) {
  59.                             $this->addFlash('warning''No configuration details were found for the provided microsoft account.');
  60.                             return $this->render('@UVDeskMailbox//manageConfigurations.html.twig', [
  61.                                 'microsoftAppCollection'     => $microsoftAppCollection,
  62.                                 'microsoftAccountCollection' => $microsoftAccountCollection,
  63.                             ]);
  64.                         }
  65.                         $params['imap']['username'] = $microsoftAccount->getEmail();
  66.                         $params['imap']['client'] = $microsoftAccount->getMicrosoftApp()->getClientId();
  67.                         $imapConfiguration
  68.                             ->setClient($params['imap']['client'])
  69.                             ->setUsername($params['imap']['username'])
  70.                         ;
  71.                     } else {
  72.                         $this->addFlash('warning''The resolved IMAP configuration is not configured for any valid available app.');
  73.                         return $this->render('@UVDeskMailbox//manageConfigurations.html.twig', [
  74.                             'microsoftAppCollection'     => $microsoftAppCollection,
  75.                             'microsoftAccountCollection' => $microsoftAccountCollection,
  76.                         ]);
  77.                     }
  78.                 } else if ($imapConfiguration instanceof IMAP\Transport\SimpleTransportConfigurationInterface) {
  79.                     $imapConfiguration
  80.                         ->setUsername($params['imap']['username']);
  81.                 } else {
  82.                     $imapConfiguration
  83.                         ->setUsername($params['imap']['username'])
  84.                         ->setPassword(urlencode($params['imap']['password']))
  85.                     ;
  86.                 }
  87.             }
  88.             // SMTP Configuration
  89.             if (
  90.                 ! empty($params['smtp']['transport'])
  91.                 && 'swiftmailer_id' !== $params['smtp']['transport']
  92.             ) {
  93.                 $smtpConfiguration SMTP\Configuration::createTransportDefinition($params['smtp']['transport'], !empty($params['smtp']['host']) ? trim($params['smtp']['host'], '"') : null);
  94.                 if ($smtpConfiguration instanceof SMTP\Transport\AppTransportConfigurationInterface) {
  95.                     if ($params['smtp']['transport'] == 'outlook_oauth') {
  96.                         $microsoftAccount $entityManager->getRepository(MicrosoftAccount::class)->findOneById($params['smtp']['username']);
  97.                         if (empty($microsoftAccount)) {
  98.                             $this->addFlash('warning''No configuration details were found for the provided microsoft account.');
  99.                             return $this->render('@UVDeskMailbox//manageConfigurations.html.twig', [
  100.                                 'microsoftAppCollection'     => $microsoftAppCollection,
  101.                                 'microsoftAccountCollection' => $microsoftAccountCollection,
  102.                                 'swiftmailerConfigurations'  => $swiftMailerConfigurationCollection,
  103.                             ]);
  104.                         }
  105.                         $params['smtp']['username'] = $microsoftAccount->getEmail();
  106.                         $params['smtp']['client'] = $microsoftAccount->getMicrosoftApp()->getClientId();
  107.                         $smtpConfiguration
  108.                             ->setClient($params['smtp']['client'])
  109.                             ->setUsername($params['smtp']['username'])
  110.                         ;
  111.                     } else {
  112.                         $this->addFlash('warning''The resolved SMTP configuration is not configured for any valid available app.');
  113.                         return $this->render('@UVDeskMailbox//manageConfigurations.html.twig', [
  114.                             'microsoftAppCollection'     => $microsoftAppCollection,
  115.                             'microsoftAccountCollection' => $microsoftAccountCollection,
  116.                             'swiftmailerConfigurations'  => $swiftMailerConfigurationCollection,
  117.                         ]);
  118.                     }
  119.                 } else if ($smtpConfiguration instanceof SMTP\Transport\ResolvedTransportConfigurationInterface) {
  120.                     $smtpConfiguration
  121.                         ->setUsername($params['smtp']['username'])
  122.                         ->setPassword(urlencode($params['smtp']['password']))
  123.                     ;
  124.                 } else {
  125.                     $smtpConfiguration
  126.                         ->setHost($params['smtp']['host'])
  127.                         ->setPort((int) $params['smtp']['port'])
  128.                         ->setUsername($params['smtp']['username'])
  129.                         ->setPassword(urlencode($params['smtp']['password']))
  130.                         ->setSenderAddress(!empty($params['smtp']['senderAddress']) ? $params['smtp']['senderAddress'] : null)
  131.                     ;
  132.                 }
  133.             }
  134.             if (
  135.                 empty($imapConfiguration)
  136.                 && empty($smtpConfiguration)
  137.             ) {
  138.                 $this->addFlash('warning''Invalid mailbox details provided. Mailbox needs to have at least IMAP or SMTP settings defined.');
  139.             } else {
  140.                 $mailboxConfiguration $mailboxService->parseMailboxConfigurations();
  141.                 // SwiftMailer Configuration
  142.                 if (! empty($params['swiftmailer_id'])) {
  143.                     foreach ($swiftMailerConfigurationCollection as $configuration) {
  144.                         if ($configuration->getId() == $params['swiftmailer_id']) {
  145.                             $swiftmailerConfiguration $configuration;
  146.                             break;
  147.                         }
  148.                     }
  149.                 }
  150.                 $mailbox = new Mailbox(!empty($params['id']) ? $params['id'] : null);
  151.                 $mailbox
  152.                     ->setName($params['name'])
  153.                     ->setIsEnabled(!empty($params['isEnabled']) && 'on' == $params['isEnabled'] ? true false)
  154.                     ->setIsEmailDeliveryDisabled(!empty($params['isEmailDeliveryDisabled']) && 'on' == $params['isEmailDeliveryDisabled'] ? true false)
  155.                 ;
  156.                 if (! empty($imapConfiguration)) {
  157.                     $mailbox
  158.                         ->setImapConfiguration($imapConfiguration);
  159.                 }
  160.                 if (! empty($smtpConfiguration)) {
  161.                     $mailbox
  162.                         ->setSmtpConfiguration($smtpConfiguration);
  163.                 }
  164.                 if (! empty($swiftmailerConfiguration)) {
  165.                     $mailbox
  166.                         ->setSwiftMailerConfiguration($swiftmailerConfiguration);;
  167.                 }
  168.                 $mailboxConfiguration->addMailbox($mailbox);
  169.                 if (! empty($params['isDefault']) && 'on' == $params['isDefault']) {
  170.                     $mailboxConfiguration
  171.                         ->setDefaultMailbox($mailbox);
  172.                 }
  173.                 file_put_contents($mailboxService->getPathToConfigurationFile(), (string) $mailboxConfiguration);
  174.                 $this->addFlash('success'$translator->trans('Mailbox successfully created.'));
  175.                 return new RedirectResponse($this->generateUrl('helpdesk_member_mailbox_settings'));
  176.             }
  177.         }
  178.         return $this->render('@UVDeskMailbox//manageConfigurations.html.twig', [
  179.             'microsoftAppCollection'     => $microsoftAppCollection,
  180.             'microsoftAccountCollection' => $microsoftAccountCollection,
  181.             'swiftmailerConfigurations'  => $swiftMailerConfigurationCollection,
  182.         ]);
  183.     }
  184.     public function updateMailboxConfiguration($idRequest $requestEntityManagerInterface $entityManagerUserService $userServiceMailboxService $mailboxServiceTranslatorInterface $translatorSwiftMailerService $swiftMailer)
  185.     {
  186.         if (! $userService->isAccessAuthorized('ROLE_ADMIN')) {
  187.             return $this->redirect($this->generateUrl('helpdesk_member_dashboard'));
  188.         }
  189.         $mailboxConfiguration $mailboxService->parseMailboxConfigurations();
  190.         $mailbox $mailboxConfiguration->getMailboxById($id);
  191.         if (empty($mailbox)) {
  192.             return new Response(''404);
  193.         }
  194.         $microsoftAppCollection $entityManager->getRepository(MicrosoftApp::class)->findBy(['isEnabled' => true'isVerified' => true]);
  195.         $microsoftAccountCollection $entityManager->getRepository(MicrosoftAccount::class)->findAll();
  196.         $microsoftAppCollection array_map(function ($microsoftApp) {
  197.             return [
  198.                 'id'   => $microsoftApp->getId(),
  199.                 'name' => $microsoftApp->getName(),
  200.             ];
  201.         }, $microsoftAppCollection);
  202.         $microsoftAccountCollection array_map(function ($microsoftAccount) {
  203.             return [
  204.                 'id'    => $microsoftAccount->getId(),
  205.                 'name'  => $microsoftAccount->getName(),
  206.                 'email' => $microsoftAccount->getEmail(),
  207.             ];
  208.         }, $microsoftAccountCollection);
  209.         # load swift mailer configuration
  210.         $swiftMailerConfigurationCollection $swiftMailer->parseSwiftMailerConfigurations();
  211.         if ($request->getMethod() == 'POST') {
  212.             $params $request->request->all();
  213.             $smtpConfiguration null;
  214.             $imapConfiguration null;
  215.             // IMAP Configuration
  216.             if (!empty($params['imap']['transport'])) {
  217.                 $imapConfiguration IMAP\Configuration::createTransportDefinition($params['imap']['transport'], !empty($params['imap']['host']) ? trim($params['imap']['host'], '"') : null);
  218.                 if ($imapConfiguration instanceof IMAP\Transport\AppTransportConfigurationInterface) {
  219.                     if ($params['imap']['transport'] == 'outlook_oauth') {
  220.                         $microsoftAccount $entityManager->getRepository(MicrosoftAccount::class)->findOneById($params['imap']['username']);
  221.                         if (empty($microsoftAccount)) {
  222.                             $this->addFlash('warning''No configuration details were found for the provided microsoft account.');
  223.                             return $this->render('@UVDeskMailbox//manageConfigurations.html.twig', [
  224.                                 'microsoftAppCollection'     => $microsoftAppCollection,
  225.                                 'microsoftAccountCollection' => $microsoftAccountCollection,
  226.                                 'swiftmailerConfigurations'  => $swiftMailerConfigurationCollection,
  227.                             ]);
  228.                         }
  229.                         $params['imap']['username'] = $microsoftAccount->getEmail();
  230.                         $params['imap']['client'] = $microsoftAccount->getMicrosoftApp()->getClientId();
  231.                         $imapConfiguration
  232.                             ->setClient($params['imap']['client'])
  233.                             ->setUsername($params['imap']['username'])
  234.                         ;
  235.                     } else {
  236.                         $this->addFlash('warning''The resolved IMAP configuration is not configured for any valid available app.');
  237.                         return $this->render('@UVDeskMailbox//manageConfigurations.html.twig', [
  238.                             'microsoftAppCollection'     => $microsoftAppCollection,
  239.                             'microsoftAccountCollection' => $microsoftAccountCollection,
  240.                             'swiftmailerConfigurations'  => $swiftMailerConfigurationCollection,
  241.                         ]);
  242.                     }
  243.                 } else if ($imapConfiguration instanceof IMAP\Transport\SimpleTransportConfigurationInterface) {
  244.                     $imapConfiguration
  245.                         ->setUsername($params['imap']['username']);
  246.                 } else {
  247.                     $imapConfiguration
  248.                         ->setUsername($params['imap']['username'])
  249.                         ->setPassword(urlencode($params['imap']['password']))
  250.                     ;
  251.                 }
  252.             }
  253.             // SMTP Configuration
  254.             if (
  255.                 ! empty($params['smtp']['transport'])
  256.                 && 'swiftmailer_id' !== $params['smtp']['transport']
  257.             ) {
  258.                 $smtpConfiguration SMTP\Configuration::createTransportDefinition($params['smtp']['transport'], !empty($params['smtp']['host']) ? trim($params['smtp']['host'], '"') : null);
  259.                 if ($smtpConfiguration instanceof SMTP\Transport\AppTransportConfigurationInterface) {
  260.                     if ($params['smtp']['transport'] == 'outlook_oauth') {
  261.                         $microsoftAccount $entityManager->getRepository(MicrosoftAccount::class)->findOneById($params['smtp']['username']);
  262.                         if (empty($microsoftAccount)) {
  263.                             $this->addFlash('warning''No configuration details were found for the provided microsoft account.');
  264.                             return $this->render('@UVDeskMailbox//manageConfigurations.html.twig', [
  265.                                 'microsoftAppCollection'     => $microsoftAppCollection,
  266.                                 'microsoftAccountCollection' => $microsoftAccountCollection,
  267.                                 'swiftmailerConfigurations'  => $swiftMailerConfigurationCollection,
  268.                             ]);
  269.                         }
  270.                         $params['smtp']['username'] = $microsoftAccount->getEmail();
  271.                         $params['smtp']['client'] = $microsoftAccount->getMicrosoftApp()->getClientId();
  272.                         $smtpConfiguration
  273.                             ->setClient($params['smtp']['client'])
  274.                             ->setUsername($params['smtp']['username'])
  275.                         ;
  276.                     } else {
  277.                         $this->addFlash('warning''The resolved SMTP configuration is not configured for any valid available app.');
  278.                         return $this->render('@UVDeskMailbox//manageConfigurations.html.twig', [
  279.                             'microsoftAppCollection'     => $microsoftAppCollection,
  280.                             'microsoftAccountCollection' => $microsoftAccountCollection,
  281.                             'swiftmailerConfigurations'  => $swiftMailerConfigurationCollection,
  282.                         ]);
  283.                     }
  284.                 } else if ($smtpConfiguration instanceof SMTP\Transport\ResolvedTransportConfigurationInterface) {
  285.                     $smtpConfiguration
  286.                         ->setUsername($params['smtp']['username'])
  287.                         ->setPassword(urlencode($params['smtp']['password']))
  288.                     ;
  289.                 } else {
  290.                     $smtpConfiguration
  291.                         ->setHost($params['smtp']['host'])
  292.                         ->setPort((int) $params['smtp']['port'])
  293.                         ->setUsername($params['smtp']['username'])
  294.                         ->setPassword(urlencode($params['smtp']['password']))
  295.                         ->setSenderAddress(!empty($params['smtp']['senderAddress']) ? $params['smtp']['senderAddress'] : null)
  296.                     ;
  297.                 }
  298.             }
  299.             if (empty($imapConfiguration) && empty($smtpConfiguration)) {
  300.                 $this->addFlash('warning''Invalid mailbox details provided. Mailbox needs to have at least IMAP or SMTP settings defined.');
  301.             } else {
  302.                 $mailboxConfiguration->removeMailbox($mailbox);
  303.                 $mailbox = new Mailbox($params['id']);
  304.                 // SwiftMailer Configuration
  305.                 if (! empty($params['swiftmailer_id'])) {
  306.                     foreach ($swiftMailerConfigurationCollection as $configuration) {
  307.                         if ($configuration->getId() == $params['swiftmailer_id']) {
  308.                             $swiftmailerConfiguration $configuration;
  309.                             break;
  310.                         }
  311.                     }
  312.                 }
  313.                 $mailbox
  314.                     ->setName($params['name'])
  315.                     ->setIsEnabled(!empty($params['isEnabled']) && 'on' == $params['isEnabled'] ? true false);
  316.                 if (! empty($imapConfiguration)) {
  317.                     $mailbox
  318.                         ->setImapConfiguration($imapConfiguration);
  319.                 }
  320.                 if (! empty($smtpConfiguration)) {
  321.                     $mailbox
  322.                         ->setSmtpConfiguration($smtpConfiguration);
  323.                 }
  324.                 if (! empty($swiftmailerConfiguration) && empty($smtpConfiguration)) {
  325.                     $mailbox
  326.                         ->setSwiftMailerConfiguration($swiftmailerConfiguration);;
  327.                 }
  328.                 $mailboxConfiguration->addMailbox($mailbox);
  329.                 if (! empty($params['isDefault']) && 'on' == $params['isDefault']) {
  330.                     $mailboxConfiguration
  331.                         ->setDefaultMailbox($mailbox);
  332.                 }
  333.                 file_put_contents($mailboxService->getPathToConfigurationFile(), (string) $mailboxConfiguration);
  334.                 $this->addFlash('success'$translator->trans('Mailbox successfully updated.'));
  335.                 return new RedirectResponse($this->generateUrl('helpdesk_member_mailbox_settings'));
  336.             }
  337.         }
  338.         return $this->render('@UVDeskMailbox//manageConfigurations.html.twig', [
  339.             'mailbox'                    => $mailbox,
  340.             'microsoftAppCollection'     => $microsoftAppCollection,
  341.             'microsoftAccountCollection' => $microsoftAccountCollection,
  342.             'swiftmailerConfigurations'  => $swiftMailerConfigurationCollection,
  343.         ]);
  344.     }
  345. }