src/Controller/ConfigureHelpdesk.php line 53

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Doctrine\ORM\Tools\Setup;
  4. use Doctrine\ORM\EntityManager;
  5. use Symfony\Bundle\FrameworkBundle\Console\Application;
  6. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  7. use Symfony\Component\Yaml\Yaml;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Console\Input\ArrayInput;
  11. use Symfony\Component\Console\Output\NullOutput;
  12. use Symfony\Component\HttpKernel\KernelInterface;
  13. use Symfony\Component\HttpFoundation\JsonResponse;
  14. use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
  15. use Webkul\UVDesk\CoreFrameworkBundle\Entity as CoreEntities;
  16. use Webkul\UVDesk\CoreFrameworkBundle\Services\UVDeskService;
  17. class ConfigureHelpdesk extends AbstractController
  18. {
  19.     const HELPDESK_VERSION '1.1.0';
  20.     const DB_ENV_PATH_TEMPLATE "DATABASE_URL=DB_DRIVER://DB_USER:DB_PASSWORD@DB_HOST/DB_NAME\n";
  21.     const DB_ENV_PATH_PARAM_TEMPLATE "env(DATABASE_URL): 'DB_DRIVER://DB_USER:DB_PASSWORD@DB_HOST/DB_NAME'\n";
  22.     const DEFAULT_JSON_HEADERS = [
  23.         'Content-Type' => 'application/json',
  24.     ];
  25.     private static $requiredExtensions = [
  26.         [
  27.             'name' => 'imap',
  28.         ],
  29.         [
  30.             'name' => 'mailparse',
  31.         ],
  32.         [
  33.             'name' => 'mysqli',
  34.         ],
  35.     ];
  36.     private static $requiredConfigfiles = [
  37.         [
  38.             'name' => 'uvdesk',
  39.         ],
  40.         [
  41.             'name' => 'swiftmailer',
  42.         ],
  43.         [
  44.             'name' => 'uvdesk_mailbox',
  45.         ],
  46.     ];
  47.     public function load()
  48.     {
  49.         return $this->render('installation-wizard/index.html.twig', [
  50.             'version' => self::HELPDESK_VERSION,
  51.         ]);
  52.     }
  53.     public function evaluateSystemRequirements(Request $requestKernelInterface $kernel)
  54.     {
  55.         $max_execution_time ini_get('max_execution_time');
  56.         // Evaluate system specification requirements
  57.         switch (strtolower($request->request->get('specification'))) {
  58.             case 'php-version':
  59.                 $response = [
  60.                     'status' => version_compare(phpversion(), '7.0.0''<') ? false true,
  61.                     'version' => sprintf('%s.%s.%s'PHP_MAJOR_VERSIONPHP_MINOR_VERSIONPHP_RELEASE_VERSION),
  62.                 ];
  63.                 if ($response['status']) {
  64.                     $response['message'] = sprintf('Using PHP v%s'$response['version']);
  65.                 } else {
  66.                     $response['message'] = sprintf('Currently using PHP v%s. Please use PHP 7 or greater.'$response['version']);
  67.                 }
  68.                 break;
  69.             case 'php-extensions':
  70.                 $extensions_status array_map(function ($extension) {
  71.                     return [
  72.                         $extension['name'] => extension_loaded($extension['name']),
  73.                     ];
  74.                 }, self::$requiredExtensions);
  75.                 $response = [
  76.                     'extensions' => $extensions_status,
  77.                 ];
  78.                 break;
  79.             case 'php-maximum-execution':
  80.                 $response['status' ] = $max_execution_time >= 30 true false;
  81.                 if ($response['status']) {
  82.                     $response['message'] = sprintf('Maximum execution time is %s'ini_get('max_execution_time').' sec');
  83.                 } else {
  84.                     $response['message'] = sprintf('Please increase your max execution time.' );
  85.                     $response['description'] = '</span>Issue can be resolved by simply<p><a href="https://www.simplified.guide/php/increase-max-execution-time" target="_blank"> increasing your maximum execution time</a> make it 60 or more and restart your server after making this change, refresh the browser and try again.</p>';
  86.                 }
  87.                 break;
  88.             case 'php-envfile-permission':
  89.                     $filename =  $kernel->getProjectDir().'/.env';
  90.                     $response['status'] = is_writable($filename) ? true false;
  91.    
  92.                     if ($response['status']) {
  93.                         $response['message'] = sprintf('Read/Write permission enabled for .env file.');
  94.                     } else {
  95.                         $response['message'] = sprintf('Please enable read/write permission for <b>.env</b> file of your project.');
  96.                         $response['description'] = '</span> Issue can be resolved by simply <a href="https://www.uvdesk.com/en/blog/open-source-helpdesk-installation-on-ubuntu-uvdesk/" target="_blank"><p> enabling your <b>.env</b> file read/write permission</a> refresh the browser and try again.</p>';
  97.                     }
  98.                 break;
  99.             case 'php-configfiles-permission':
  100.                     $configfiles_status array_map(function ($configfile) use ($kernel) {
  101.                         return [
  102.                             $configfile['name'] => is_writable($kernel->getProjectDir().'/config/packages/'.$configfile['name'].'.yaml') ,
  103.                         ];
  104.                     }, self::$requiredConfigfiles);
  105.    
  106.                     $response = [
  107.                         'configfiles' => $configfiles_status,
  108.                         'description' => '</span> <br><p> Issue can be resolved by simply <a href="https://www.uvdesk.com/en/blog/open-source-helpdesk-installation-on-ubuntu-uvdesk/" target="_blank"> enabling read/write permissions for your files under config/packages folder of your project.</a></p>',
  109.                     ];
  110.                 break;
  111.             default:
  112.                 $code 404;
  113.                 break;
  114.         }
  115.         
  116.         return new Response(json_encode($response ?? []), $code ?? 200self::DEFAULT_JSON_HEADERS);
  117.     }
  118.     public function verifyDatabaseCredentials(Request $request)
  119.     {
  120.         if (session_status() == PHP_SESSION_NONE) {
  121.             session_start();
  122.         }
  123.         
  124.         try {
  125.             $entityManager EntityManager::create([
  126.                 'driver' => 'pdo_mysql',
  127.                 "host" => $request->request->get('serverName'),
  128.                 "port" => $request->request->get('serverPort'),
  129.                 'user' => $request->request->get('username'),
  130.                 'password' => $request->request->get('password'),
  131.             ], Setup::createAnnotationMetadataConfiguration(['src/Entity'], false));
  132.             $databaseConnection $entityManager->getConnection();
  133.             // Establish a connection if not active
  134.             if (false == $databaseConnection->isConnected()) {
  135.                 $databaseConnection->connect();
  136.             }
  137.             // Check if database exists
  138.             $createDatabase = (bool) $request->request->get('createDatabase');
  139.             if (!in_array($request->request->get('database'), $databaseConnection->getSchemaManager()->listDatabases()) && false == $createDatabase) {
  140.                 return new JsonResponse([
  141.                     'status' => false,
  142.                     'message' => "The requested database was not found."
  143.                 ]);
  144.             }
  145.             // Storing database configuration to session.
  146.             $_SESSION['DB_CONFIG'] = [
  147.                 'host' => $request->request->get('serverName'),
  148.                 "port" => $request->request->get('serverPort'),
  149.                 'username' => $request->request->get('username'),
  150.                 'password' => $request->request->get('password'),
  151.                 'database' => $request->request->get('database'),
  152.                 'createDatabase' => $createDatabase,
  153.             ];
  154.         } catch (\Exception $e) {
  155.             return new JsonResponse([
  156.                 'status' => false,
  157.                 'message' => "Failed to establish a connection with database server."
  158.             ]);
  159.         }
  160.         
  161.         return new JsonResponse(['status' => true]);
  162.     }
  163.     public function prepareSuperUserDetailsXHR(Request $request)
  164.     {
  165.         if (session_status() == PHP_SESSION_NONE) {
  166.             session_start();
  167.         }
  168.         
  169.         // unset($_SESSION['USER_DETAILS']);
  170.         $_SESSION['USER_DETAILS'] = [
  171.             'name' => $request->request->get('name'),
  172.             'email' => $request->request->get('email'),
  173.             'password' => $request->request->get('password'),
  174.         ];
  175.         return new Response(json_encode(['status' => true]), 200self::DEFAULT_JSON_HEADERS);
  176.     }
  177.     public function updateConfigurationsXHR(Request $requestKernelInterface $kernel)
  178.     {
  179.         if (session_status() == PHP_SESSION_NONE) {
  180.             session_start();
  181.         }
  182.         $database_host $_SESSION['DB_CONFIG']['host'];
  183.         $database_port $_SESSION['DB_CONFIG']['port'];
  184.         $database_user $_SESSION['DB_CONFIG']['username'];
  185.         $database_pass $_SESSION['DB_CONFIG']['password'];
  186.         $database_name $_SESSION['DB_CONFIG']['database'];
  187.         $create_database $_SESSION['DB_CONFIG']['createDatabase'];
  188.         try {
  189.             $entityManager EntityManager::create([
  190.                 'driver' => 'pdo_mysql',
  191.                 "host" => $database_host,
  192.                 "port" => $database_port,
  193.                 'user' => $database_user,
  194.                 'password' => $database_pass,
  195.             ], Setup::createAnnotationMetadataConfiguration(['src/Entity'], false));
  196.             // Establish an active connection with database server
  197.             $databaseConnection $entityManager->getConnection();
  198.             if (false == $databaseConnection->isConnected()) {
  199.                 $databaseConnection->connect();
  200.             }
  201.             // Check if database exists
  202.             if (!in_array($database_name$databaseConnection->getSchemaManager()->listDatabases())) {
  203.                 if (false == $create_database) {
  204.                     throw new \Exception('Database does not exist.');
  205.                 }
  206.                 
  207.                 // Create database
  208.                 $databaseConnection->getSchemaManager()->createDatabase($databaseConnection->getDatabasePlatform()->quoteSingleIdentifier($database_name));
  209.             }
  210.             // Update .env
  211.             $application = new Application($kernel);
  212.             $application->setAutoExit(false);
  213.             $returnCode $application->run(new ArrayInput([
  214.                 'command' => 'uvdesk_wizard:env:update'
  215.                 'name' => 'DATABASE_URL'
  216.                 'value' => sprintf("mysql://%s:%s@%s/%s"$database_userurlencode($database_pass), $database_host . ($database_port ':' $database_port ''), $database_name)
  217.             ]), new NullOutput());
  218.     
  219.             if (=== $returnCode) {
  220.                 return new JsonResponse(['success' => true]);
  221.             }
  222.         } catch (\Exception $e) {
  223.             // Dump Exception ...
  224.             dump($e->getMessage()); die;
  225.         }
  226.         return new JsonResponse(['success' => false], 500);
  227.     }
  228.     public function migrateDatabaseSchemaXHR(Request $requestKernelInterface $kernel)
  229.     {
  230.         $application = new Application($kernel);
  231.         $application->setAutoExit(false);
  232.         $resultCode $application->run(new ArrayInput([
  233.             'command' => 'uvdesk_wizard:database:migrate'
  234.         ]), new NullOutput());
  235.         
  236.         return new Response(json_encode([]), 200self::DEFAULT_JSON_HEADERS);
  237.     }
  238.     public function populateDatabaseEntitiesXHR(Request $requestKernelInterface $kernel)
  239.     {
  240.         $application = new Application($kernel);
  241.         $application->setAutoExit(false);
  242.         $resultCode $application->run(new ArrayInput([
  243.             'command' => 'doctrine:fixtures:load',
  244.             '--append' => true,
  245.         ]), new NullOutput());
  246.         return new Response(json_encode([]), 200self::DEFAULT_JSON_HEADERS);
  247.     }
  248.     public function createDefaultSuperUserXHR(Request $requestUserPasswordEncoderInterface $encoder)
  249.     {
  250.         if (session_status() == PHP_SESSION_NONE) {
  251.             session_start();
  252.         }
  253.         // $entityManager = $this->getDoctrine()->getEntityManager();
  254.         $entityManager $this->getDoctrine()->getManager();
  255.         $role $entityManager->getRepository('UVDeskCoreFrameworkBundle:SupportRole')->findOneByCode('ROLE_SUPER_ADMIN');
  256.         $userInstance $entityManager->getRepository('UVDeskCoreFrameworkBundle:UserInstance')->findOneBy([
  257.             'isActive' => true,
  258.             'supportRole' => $role,
  259.         ]);
  260.             
  261.         if (empty($userInstance)) {
  262.             list($name$email$password) = array_values($_SESSION['USER_DETAILS']);
  263.             // Retrieve existing user or generate new empty user
  264.             $accountExistsFlag false;
  265.             $user $entityManager->getRepository('UVDeskCoreFrameworkBundle:User')->findOneByEmail($email) ?: (new CoreEntities\User())->setEmail($email);
  266.             if ($user->getId() != null) {
  267.                 $userInstance $user->getAgentInstance();
  268.                 if (!empty($userInstance)) {
  269.                     $accountExistsFlag true;
  270.                     if ($userInstance->getSupportRole()->getId() != $role->getId()) {
  271.                         $userInstance->setSupportRole($role);
  272.                         $entityManager->persist($userInstance);
  273.                         $entityManager->flush();
  274.                     }
  275.                 }
  276.             } else {
  277.                 $username explode(' '$name2);
  278.                 $encodedPassword $encoder->encodePassword($user$password);
  279.                 $user
  280.                     ->setFirstName($username[0])
  281.                     ->setLastName(!empty($username[1]) ? $username[1] : '')
  282.                     ->setPassword($encodedPassword)
  283.                     ->setIsEnabled(true);
  284.                 
  285.                 $entityManager->persist($user);
  286.                 $entityManager->flush();
  287.             }
  288.             
  289.             if (false == $accountExistsFlag) {
  290.                 $userInstance = new CoreEntities\UserInstance();
  291.                 $userInstance->setSource('website');
  292.                 $userInstance->setIsActive(true);
  293.                 $userInstance->setIsVerified(true);
  294.                 $userInstance->setUser($user);
  295.                 $userInstance->setSupportRole($role);
  296.                 $entityManager->persist($userInstance);
  297.                 $entityManager->flush();
  298.             }
  299.         }
  300.         return new Response(json_encode([]), 200self::DEFAULT_JSON_HEADERS);
  301.     }
  302.     public function websiteConfigurationXHR(Request $requestUVDeskService $uvdesk)
  303.     {
  304.         switch ($request->getMethod()) {
  305.             case "GET":
  306.                 $currentWebsitePrefixCollection $uvdesk->getCurrentWebsitePrefixes();
  307.                 
  308.                 if ($currentWebsitePrefixCollection) {
  309.                     $result $currentWebsitePrefixCollection;
  310.                     $result['status'] = true;
  311.                 } else {
  312.                     $result['status'] = false;
  313.                 }
  314.                 break;
  315.             case "POST":
  316.                 if (session_status() == PHP_SESSION_NONE) {
  317.                     session_start();
  318.                 }
  319.                 
  320.                 $_SESSION['PREFIXES_DETAILS'] = [
  321.                     'member' => $request->request->get('member-prefix'),
  322.                     'customer' => $request->request->get('customer-prefix'),
  323.                 ];
  324.                 $result = ['status' => true];
  325.                 break;
  326.             default:
  327.                 break;
  328.         }
  329.         return new Response(json_encode($result ?? []), 200self::DEFAULT_JSON_HEADERS);
  330.     }
  331.     public function updateWebsiteConfigurationXHR(Request $requestUVDeskService $uvdesk)
  332.     {
  333.         if (session_status() == PHP_SESSION_NONE) {
  334.             session_start();
  335.         }
  336.         $collectionURL$uvdesk->updateWebsitePrefixes(
  337.             $_SESSION['PREFIXES_DETAILS']['member'],
  338.             $_SESSION['PREFIXES_DETAILS']['customer']
  339.         );
  340.         return new Response(json_encode($collectionURL), 200self::DEFAULT_JSON_HEADERS);
  341.     }
  342. }