src/Controller/ConfigureHelpdesk.php line 54

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