src/Controller/WebserviceController.php line 404

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Users;
  4. use App\Entity\UsersAmbienti;
  5. use App\Entity\Questionari;
  6. use App\Entity\QuestionariIniziati;
  7. use App\Entity\Domande;
  8. use App\Entity\Risposte;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use Doctrine\Persistence\ManagerRegistry;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Symfony\Component\Yaml\Yaml;
  17. use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
  18. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  19. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  20. class WebserviceController extends AbstractController
  21. {
  22.     private RequestStack $requestStack;
  23.     private SessionInterface $session;
  24.     public function __construct (RequestStack $requestStack, private TokenStorageInterface $tokenStorage)
  25.     {
  26.         $this->requestStack $requestStack;
  27.         $this->session $requestStack->getSession();
  28.     }
  29.     private function checkAuth(string $authManagerRegistry $doctrine): int
  30.     {
  31.         $a explode(" "$auth);
  32.         if ($a[0] == "Basic") {
  33.             $t $a[1];
  34.             if ($t == "") {
  35.                 return 0;
  36.             } else {
  37.                 $t explode("."$t);
  38.                 $t0_header base64_decode($t[0]);
  39.                 $t1_payload base64_decode($t[1]);
  40.                 $t0_header json_decode($t0_header);
  41.                 if ($t0_header) {
  42.                     $t1_payload json_decode($t1_payload);
  43.                     if ($t1_payload) {
  44.                         $from $t1_payload->from;
  45.                         $to $t1_payload->to;
  46.                         if ($from <= $t1_payload->from && $to >= $t1_payload->to) {
  47.                             $user $doctrine->getRepository(Users::class)->findOneBy(['email' => $t1_payload->user]);
  48.                             if ($user) {
  49.                                 $ambiente $doctrine->getRepository(UsersAmbienti::class)->findOneBy(['user' => $user"url" => $t1_payload->url]);
  50.                                 $apisecret $ambiente->getApisecret();
  51.                                 if ($t0_header == "HS256") {
  52.                                     $alg "sha256";
  53.                                 } else {
  54.                                     $alg "sha256";
  55.                                 }
  56.                                 $signature hash_hmac($alg$t[0] . $t[1], $apisecrettrue);
  57.                                 $signature base64_encode($signature);
  58.                                 if ($signature == $t[2]) {
  59.                                     return $ambiente->getId();
  60.                                 } else {
  61.                                     //$signature = $user->getEmail()."|".$t1_payload->url."|".$signature;
  62.                                     return -3;
  63.                                 }
  64.                             } else {
  65.                                 return -1;
  66.                             }
  67.                         } else {
  68.                             return -2;
  69.                         }
  70.                         
  71.                     } else {
  72.                         return 0;
  73.                     }
  74.                 } else {
  75.                     return 0;
  76.                 }
  77.             }
  78.         }
  79.         return 0;
  80.     }
  81.     
  82.     #[Route('/webservice'name'app_webservice')]
  83.     public function index(Request $requestManagerRegistry $doctrine): Response
  84.     {
  85.         $s '<html>
  86.             <head>
  87.             <meta charset="UTF-8">
  88.             <meta name="viewport" content="width=device-width, initial-scale=1">
  89.             <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css">
  90.             <title>LIVE</title>
  91.             <link href="/dist/css/pages/login-register-lock.css" rel="stylesheet">
  92.             <link href="/dist/css/style.min.css" rel="stylesheet">
  93.             <style>
  94.             footer {
  95.             width: 100%;
  96.             position: fixed;
  97.             bottom: 0px;
  98.             text-align: center;
  99.             padding: 3px;
  100.             background-color: #000;
  101.             color: #fff;
  102.             }
  103.             </style>
  104.             </head>
  105.             <body>
  106.             <div style="width: 100%; height: 20px; position: absolute; top: 50%; margin-top: -10px;">
  107.             <center>LIVE</center>
  108.             </div>
  109.             </body>
  110.             <footer><center>42b.it</center></footer>
  111.             </html>';
  112.         return new Response($s);
  113.     }
  114.     
  115.     #[Route('/webservice/connect'name'app_webservice_connect')]
  116.     public function connect(Request $request,ManagerRegistry $doctrine): Response
  117.     {
  118.         $apikey $request->get("a");
  119.         $apisecret $request->get("b");
  120.         $url $request->get("c");
  121.         $user $doctrine->getRepository(UsersAmbienti::class)->findOneBy(['apikey' => $apikey"apisecret" => $apisecret]);
  122.         if ($user) {
  123.             $header = [
  124.                 'typ' => 'JWT',
  125.                 'alg' => 'HS256'
  126.             ];
  127.             $header json_encode($header);        
  128.             $header base64_encode($header);
  129.             $now strtotime(date("Y-m-d H:i:s"));
  130.             $to $now 3600// 1 ora;
  131.             $payload = [            
  132.                 "from" => date("Y-m-d H:i:s"),
  133.                 "to" => date("Y-m-d H:i:s"$to),
  134.                 "url" => $url,
  135.                 "user" => $user->getUser()->getEmail()
  136.             ];
  137.             $payload json_encode($payload);
  138.             $payload base64_encode($payload);
  139.             $signature hash_hmac('sha256'$header $payload$apisecrettrue);
  140.             $signature base64_encode($signature);
  141.             $token $header "." $payload "." $signature;
  142.             echo $token;
  143.             exit();
  144.         } else {
  145.             echo "0";
  146.             exit();
  147.         }
  148.     }
  149.     
  150.     
  151.     #[Route('/webservice/getquestionari'name'app_webservice_getquestionari')]
  152.     public function getQuestionari(Request $request,ManagerRegistry $doctrine): Response
  153.     {
  154.         $headers apache_request_headers();
  155.         $check $this->checkAuth($headers["Authorization"], $doctrine);
  156.         if ((int)$check 0) {
  157.             $questionari $doctrine->getRepository(Questionari::class)->findBy(['ambiente' => $check]);
  158.             $res = [];
  159.             foreach ($questionari as $q) {
  160.                 if ($q->getQuestionario()) {
  161.                     // non riporto 
  162.                 } else {
  163.                     $res[$q->getId()] = $q->getTitolo();
  164.                 }
  165.             }
  166.             echo json_encode($res);
  167.         } else {
  168.             if ((int)$check == -1) {
  169.                 echo "Api error";
  170.             } elseif ((int)$check == -2) {
  171.                 echo "Expired";
  172.             } elseif ((int)$check == -3) {
  173.                 echo "Api error";
  174.             } else {
  175.                 echo "Error";
  176.             }
  177.         }
  178.         exit();
  179.     }
  180.     
  181.     #[Route('/webservice/getquestionarofatherfromson'name'app_webservice_getquestionariofatherfromson')]
  182.     public function getquestionarofatherfromson(Request $request,ManagerRegistry $doctrine): Response
  183.     {
  184.         $headers apache_request_headers();
  185.         $check $this->checkAuth($headers["Authorization"], $doctrine);
  186.         if ((int)$check 0){
  187.             if (!isset($_REQUEST["questionario"])) {
  188.                 var_dump($_REQUEST);
  189.                 return new Response("Error cod 205");
  190.             }
  191.             $questionario $_REQUEST["questionario"];
  192.             $q $doctrine->getRepository(Questionari::class)->findOneById((int)$questionario);
  193.             if ($q) {
  194.                 return new Response($q->getQuestionario()->getId());
  195.             } else {
  196.                 return new Response("0");
  197.             }
  198.         }
  199.         exit();
  200.     }
  201.     
  202.     #[Route('/webservice/createquestionaro'name'app_webservice_createquestionario')]
  203.     public function createQuestionario(Request $request,ManagerRegistry $doctrine): Response
  204.     {
  205.         $headers apache_request_headers();
  206.         $check $this->checkAuth($headers["Authorization"], $doctrine);
  207.         if ((int)$check 0){
  208.             $teachers = [];
  209.             $nteachers $request->get("nteachers");
  210.             if ((int)$nteachers 0) {
  211.                 for ($i 1$i <= $nteachers$i++) {
  212.                     $teachers[] = [
  213.                         "id" => $request->get("teacher_id_" $i),
  214.                         "username" => $request->get("teacher_id_username_" $i),
  215.                         "name" => $request->get("teacher_id_name_" $i)
  216.                     ];
  217.                 } 
  218.             }
  219.             if (!isset($_REQUEST["questionario"])) {
  220.                 return new Response("Error cod 205");
  221.             }
  222.             $questionario $_REQUEST["questionario"];
  223.             
  224.             $q $doctrine->getRepository(Questionari::class)->findOneById((int)$questionario);
  225.             if ($q) {
  226.                 $q2 = new Questionari();
  227.                 $q2->setQuestionario($q);
  228.                 $q2->setAmbiente($q->getAmbiente());
  229.                 $q2->setCorsoId($_REQUEST["course"]);
  230.                 $q2->setUser($q->getUser());
  231.                 $q2->setTitolo($q->getTitolo());     
  232.                 $q2->setDescrizione($q->getDescrizione());     
  233.                 $q2->setCreatedAt(new \DateTimeImmutable("now"));
  234.                 $token bin2hex(random_bytes(32));
  235.                 $soken bin2hex(hash_hmac('sha256',$token,bin2hex(random_bytes(8)), true));
  236.                 $q2->setToken($soken);
  237.                 $entityManager $doctrine->getManager();
  238.                 $entityManager->persist($q2);
  239.                 $entityManager->flush();
  240.                 $qid $q2->getId();
  241.                 $domande $doctrine->getRepository(Domande::class)->findByQuestionario(["questionario" => $q], ["posizione" => "ASC"]);
  242.                 if ($domande){
  243.                     $posizione 1;
  244.                     foreach ($domande as $d) {
  245.                         if ($d->getTipoRisposta() == "docente") {
  246.                             foreach ($teachers as $t) {
  247.                                 $d2 = new Domande();
  248.                                 $d2->setQuestionario($q2);
  249.                                 $d2->setDomanda($d->getDomanda());
  250.                                 $d2->setTipoRisposta($d->getTipoRisposta());
  251.                                 $d2->setOpzioniRisposta($d->getOpzioniRisposta() . "\nTeacher:" json_encode($t));     
  252.                                 $d2->setMultipla($d->isMultipla());
  253.                                 $d2->setPosizione($d->getMostraPosizione());
  254.                                 $d2->setMostraPosizione(1);
  255.                                 $d2->setCreatedAt(new \DateTimeImmutable("now"));
  256.                                 $d2->setPlaceholder($d->getPlaceholder());
  257.                                 $d2->setObbligatoria($d->isObbligatoria());
  258.                                 $entityManager->persist($d2);
  259.                                 $posizione++;
  260.                             }
  261.                         } else {
  262.                             $d2 = new Domande();
  263.                             $d2->setQuestionario($q2);
  264.                             $d2->setDomanda($d->getDomanda());
  265.                             $d2->setTipoRisposta($d->getTipoRisposta());
  266.                             $d2->setOpzioniRisposta($d->getOpzioniRisposta());     
  267.                             $d2->setMultipla($d->isMultipla());
  268.                             $d2->setPosizione($posizione);
  269.                             $d2->setMostraPosizione($d->getMostraPosizione());
  270.                             $d2->setCreatedAt(new \DateTimeImmutable("now"));
  271.                             $d2->setPlaceholder($d->getPlaceholder());
  272.                             $d2->setObbligatoria($d->isObbligatoria());
  273.                             $entityManager->persist($d2);
  274.                             $posizione++;
  275.                         }     
  276.                     }
  277.                     $entityManager->flush();
  278.                 }
  279.                 echo $soken "." $q2->getId() . "." $q->getId();
  280.             } else {
  281.                 echo "Errore 149";
  282.             }
  283.             exit();
  284.         } else {
  285.             if((int)$check == -1) {
  286.                 echo "Api error";
  287.             } elseif ((int)$check == -2) {
  288.                 echo "Expired";
  289.             } elseif ((int)$check == -3) {
  290.                 echo "Api error";
  291.             } else {
  292.                 echo "Error";
  293.             }
  294.         }
  295.         exit();
  296.     }
  297.     #[Route('/webservice/getStudentQuestionario'name'app_webservice_getstudentquestionario')]
  298.     public function getStudentQuestionario(Request $request,ManagerRegistry $doctrine): Response{
  299.         $headers apache_request_headers();
  300.         $check $this->checkAuth($headers["Authorization"], $doctrine);
  301.         $user $request->get("user");
  302.         if ((int)$check && $user != "") {
  303.             // il token generale e' corretto
  304.             // controllo che il token passato sia corretto rispetto al questioanrio
  305.             $q $doctrine->getRepository(Questionari::class)->findOneByToken($request->get("token"));
  306.             if ($q->getId() == $request->get("questionario") || $q->getQuestionario()->getId() == $request->get("questionario")) {
  307.                 if ($q->getId() == $request->get("questionario")) {
  308.                     $qid $q->getId();
  309.                 } else {
  310.                     $qid $q->getQuestionario()->getId();
  311.                 }
  312.                 $qi $doctrine->getRepository(QuestionariIniziati::class)->findOneBy([
  313.                     "questionario" => $q,
  314.                     "user_id" => $user,
  315.                     "status" => 1,
  316.                     "ambiente" => $q->getQuestionario()->getAmbiente()
  317.                 ]);
  318.                 if ($qi) {
  319.                     $qid .= "_" $qi->getId();
  320.                 }
  321.                 echo $qid;
  322.             } else {
  323.                 echo "error";
  324.             }
  325.         }
  326.         exit();
  327.     }
  328.     
  329.     #[Route('/webservice/tutor'name'app_webservice_tutorquestionario')]
  330.     public function tutorQuestionario(Request $request,ManagerRegistry $doctrine): Response
  331.     
  332.         $headers apache_request_headers();
  333.         $session $this->requestStack->getSession();
  334.         $session_token $session->get('token');
  335.         $session_signature $session->get('signature');
  336.         $session_message $session->get('message');
  337.         if ($session_token != "") {
  338.             $token1 $session_token;
  339.             $session->set('token'"");
  340.             $signature $session_signature;
  341.             $session->set('signature'"");
  342.             $res json_decode(base64_decode($token1));
  343.         } else {
  344.             $token1 $request->get("token");
  345.             $signature $request->get("signature");
  346.         }
  347.         if ($token1 == "") {
  348.             echo "288";
  349.             return $this->redirectToRoute("login");
  350.         }
  351.         $res json_decode(base64_decode($token1));
  352.         // controllo se esiste il questionario ( questionario ) con il token passato ( token )
  353.         $q $doctrine->getRepository(Questionari::class)->findOneBy([
  354.             "id" => $res->questionario,
  355.             "token"=> $res->token
  356.         ]);
  357.         
  358.         if (!$q) {
  359.             $questionario $doctrine->getRepository(Questionari::class)->find($res->questionario);
  360.             if ($questionario) {
  361.                 $q $doctrine->getRepository(Questionari::class)->findOneBy([
  362.                     "questionario" => $questionario,
  363.                     "token"=> $res->token
  364.                 ]);
  365.             }
  366.         }
  367.         if ($q) {
  368.             $ambiente $q->getQuestionario()->getAmbiente();
  369.             $secret $ambiente->getApisecret();
  370.             $signature2 hash_hmac("sha256"$token1$secrettrue);
  371.             $signature2 base64_encode($signature2);
  372.             if ($signature != $signature2) {
  373.                 echo "Error code 283";
  374.                 echo $signature " " $signature2 "<br />";
  375.                 exit();
  376.             }
  377.             
  378.             // riscrivo il token e la signature perche' e' cambiato il valore di questionarioiniziato
  379.             $repository $doctrine->getRepository(Users::class);
  380.             $user $repository->findOneBy(['email' => $res->user_email]);
  381.             $roles $user->getRoles();
  382.             if (in_array("ROLE_MANAGER"$roles)) {
  383.                 $ttoken = new UsernamePasswordToken($user'main'$user->getRoles());
  384.                 $this->tokenStorage->setToken($ttoken);
  385.                 $this->session->set('_security_main'serialize($ttoken));
  386.                 return $this->forward('App\Controller\DefaultController::index', ["moodle_token" => """uid" => 0]);
  387.             } else {
  388.                 return new Response("Error code 369");
  389.             }
  390.         } else {
  391.             var_dump($res);
  392.             return new Response("Error code 373");
  393.         }
  394.     }
  395.     
  396.     #[Route('/webservice/sustain'name'app_webservice_sustainstudentquestionario')]
  397.     public function sustainStudentQuestionario(Request $request,ManagerRegistry $doctrine): Response
  398.     
  399.         $headers apache_request_headers();
  400.         $session $this->requestStack->getSession();
  401.         $session_token $session->get('token');
  402.         $session_signature $session->get('signature');
  403.         $session_message $session->get('message');
  404.         if ($session_token != "") {
  405.             $token1 $session_token;
  406.             $session->set('token'"");
  407.             $signature $session_signature;
  408.             $session->set('signature'"");
  409.             $res json_decode(base64_decode($token1));
  410.         } else {
  411.             $token1 $request->get("token");
  412.             $signature $request->get("signature");
  413.         }
  414.         if ($token1 == "") {
  415.             echo "288";
  416.             return $this->redirectToRoute("login");
  417.         }
  418.         $res json_decode(base64_decode($token1));
  419.         // controllo se esiste il questionario ( questionario ) con il token passato ( token )
  420.         $q $doctrine->getRepository(Questionari::class)->findOneBy([
  421.             "id" => $res->questionario,
  422.             "token"=> $res->token
  423.         ]);
  424.         
  425.         if (!$q) {
  426.             $questionario $doctrine->getRepository(Questionari::class)->find($res->questionario);
  427.             if ($questionario) {
  428.                 $q $doctrine->getRepository(Questionari::class)->findOneBy([
  429.                     "questionario" => $questionario,
  430.                     "token"=> $res->token
  431.                 ]);
  432.             }
  433.         }
  434.         if ($q) {
  435.             $ambiente $q->getQuestionario()->getAmbiente();
  436.             $secret $ambiente->getApisecret();
  437.             $signature2 hash_hmac("sha256"$token1$secrettrue);
  438.             $signature2 base64_encode($signature2);
  439.             if ($signature != $signature2) {
  440.                 echo "Error code 283";
  441.                 echo $signature " " $signature2 "<br />";
  442.                 exit();
  443.             }
  444.             if ((int)$res->questionarioiniziato != 0) {
  445.                 $qi $doctrine->getRepository(QuestionariIniziati::class)->findOneBy([
  446.                     "id" => $res->questionarioiniziato
  447.                 ]);
  448.                 if ($qi) {
  449.                     $domande $doctrine->getRepository(Domande::class)->findBy(["questionario" => $q], ["posizione" => "ASC"]);
  450.                     $risposte $doctrine->getRepository(Risposte::class)->findBy(["questionario_iniziato" => $qi], ["posizione" => "ASC"]);
  451.                     $risp = [];
  452.                     foreach ($risposte as $r){
  453.                         $risp[$r->getDomanda()->getId()] = $r;
  454.                     }
  455.                 } else {
  456.                     echo "errore";
  457.                     exit();
  458.                 }
  459.                 
  460.             } else {
  461.                 //exit();
  462.                 $qi = new QuestionariIniziati();
  463.                 $qi->setQuestionario($q);
  464.                 $qi->setAmbiente($q->getQuestionario()->getAmbiente());
  465.                 $qi->setUserId($res->user);
  466.                 $qi->setUserEmail($res->user_email);
  467.                 $qi->setUserEmailHash($res->user_email_hash);
  468.                 $qi->setStatus(1);
  469.                 $qi->setLastQuestion(0);
  470.                 $qi->setReturnurl($res->return);
  471.                 $qi->setCreatedAt(new \DateTimeImmutable("now"));
  472.                 $qi->setModifiedAt(new \DateTimeImmutable("now"));
  473.                 $entityManager $doctrine->getManager();
  474.                 $entityManager->persist($qi);
  475.                 $entityManager->flush();
  476.                 
  477.                 // riscrivo il token e la signature perche' e' cambiato il valore di questionarioiniziato
  478.                 $r= [];
  479.                 $r["user"] = $res->user;
  480.                 $r["user_email"] = $res->user_email;
  481.                 $r["user_email_hash"] = $res->user_email_hash;
  482.                 $r["course"] = $res->course;
  483.                 $r["questionario"] = $res->questionario;
  484.                 $r["questionarioiniziato"] = $qi->getId();
  485.                 $r["return"] = $res->return;
  486.                 $r["token"] = $res->token;
  487.                 echo "<!-- token: " $token1 "<br/>-->";
  488.                 echo "<!-- secret: " $secret "<br />-->";
  489.                 echo "<!-- signature: " $signature "<br />-->";
  490.                 $token1 base64_encode(json_encode($r));
  491.                 $signature hash_hmac("sha256"$token1$secrettrue);
  492.                 $signature base64_encode($signature);
  493.                 $domande $doctrine->getRepository(Domande::class)->findBy(["questionario" => $q], ["posizione" => "ASC"]);
  494.                 if ($domande) {
  495.                     $posizione 1;
  496.                     foreach ($domande as $d) {
  497.                         $r = new Risposte();
  498.                         $r->setQuestionario($q);
  499.                         $r->setQuestionarioIniziato($qi);
  500.                         $r->setDomanda($d);
  501.                         $r->setTipoRisposta($d->getTipoRisposta());
  502.                         $r->setOpzioniRisposta($d->getOpzioniRisposta());     
  503.                         $r->setMultipla($d->isMultipla());
  504.                         $r->setPosizione($posizione);
  505.                         $r->setRisposta("");
  506.                         $r->setCreatedAt(new \DateTimeImmutable("now"));
  507.                         $r->setModifiedAt(new \DateTimeImmutable("now"));
  508.                         $r->setObbligatoria($d->isObbligatoria());
  509.                         $entityManager->persist($r);
  510.                         $posizione++;
  511.                     }     
  512.                 }
  513.                 $entityManager->flush();
  514.                 $risposte $doctrine->getRepository(Risposte::class)->findBy(["questionario_iniziato" => $qi], ["posizione" => "ASC"]);
  515.                 $risp = [];
  516.                 foreach ($risposte as $r) {
  517.                     $risp[$r->getDomanda()->getId()] = $r;
  518.                 }
  519.             }
  520.             return $this->render('webservice/questionario.html.twig', [
  521.                 "qi" => $qi,
  522.                 "domande" => $domande,
  523.                 "risposte" => $risp,
  524.                 "token" => $token1,
  525.                 "signature" => $signature,
  526.                 "message" => $session_message,
  527.             ]);
  528.         } else {
  529.             var_dump($res);
  530.             echo "Error code 380";
  531.             exit();
  532.         }
  533.     }
  534.     #[Route('/webservice/cancelAndBack/{qi}'name'app_webservice_cancelquestionario_andback')]
  535.     public function cancelQuestionarioAndBack(Request $requestManagerRegistry $doctrineQuestionariIniziati $qi): Response
  536.     {
  537.         $entityManager $doctrine->getManager();
  538.         $token1 $request->get("token");
  539.         $signature $request->get("signature");
  540.         $url $request->get("return");
  541.         $res json_decode(base64_decode($token1));
  542.         // controllo se esiste il questionario ( questionario ) con il token passato ( token )
  543.         $q $doctrine->getRepository(Questionari::class)->findOneBy([
  544.             "id" => $res->questionario,
  545.             "token" => $res->token
  546.         ]);
  547.         if ($q) {
  548.             $ambiente $q->getQuestionario()->getAmbiente();
  549.             $secret $ambiente->getApisecret();
  550.             $signature2 hash_hmac("sha256"$token1$secrettrue);
  551.             $signature2 base64_encode($signature2);
  552.             if ($signature != $signature2) {
  553.                 echo "Error code 283";
  554.                 exit();
  555.             }
  556.         }
  557.         $qi->setStatus(-1);
  558.         $qi->setModifiedAt(new \DateTimeImmutable("now"));
  559.         $entityManager->persist($qi);
  560.         $entityManager->flush();
  561.         return $this->redirect($res->return);
  562.     }
  563.     #[Route('/webservice/save/{qi}'name'app_webservice_savequestionario')]
  564.     public function save(Request $requestManagerRegistry $doctrineQuestionariIniziati $qi): Response
  565.     {
  566.         $entityManager $doctrine->getManager();
  567.         $token1 $request->get("token");
  568.         $signature $request->get("signature");
  569.         $url $request->get("return");
  570.         $res json_decode(base64_decode($token1));
  571.         // controllo se esiste il questionario ( questionario ) con il token passato ( token )
  572.         $q $doctrine->getRepository(Questionari::class)->findOneBy([
  573.             "id" => $res->questionario,
  574.             "token"=> $res->token
  575.         ]);
  576.         if ($q) {
  577.             $ambiente $q->getQuestionario()->getAmbiente();
  578.             $secret $ambiente->getApisecret();
  579.             $signature2 hash_hmac("sha256"$token1$secrettrue);
  580.             $signature2 base64_encode($signature2);
  581.             if ($signature != $signature2) {
  582.                 echo "Error code 283";
  583.                 exit();
  584.             }
  585.         }
  586.         
  587.         $domandeObbligatorie = [];
  588.         $domandes $qi->getQuestionario()->getDomandes();
  589.         foreach ($domandes as $d) {
  590.             if ($d->isObbligatoria()) {
  591.                 if ($d->getTipoRisposta() == "linkert5" || $d->getTipoRisposta() == "linkert7" || $d->getTipoRisposta()=="docente"){
  592.                     $domandeObbligatorie[$d->getId()] = [];
  593.                     $argomenti $d->getOpzioniRisposta();
  594.                     $righe explode("\n",$argomenti);
  595.                     foreach($righe as $r){
  596.                         $v explode("#",$r);
  597.                         if($v[0]=="argomenti"){
  598.                             $args explode("|",$v[1]);
  599.                             $i 1;
  600.                             foreach($args as $a){
  601.                                 $domandeObbligatorie[$d->getId()][$i] = 1;
  602.                                 $i++;
  603.                             }
  604.                         }
  605.                     }
  606.                 }
  607.             }
  608.         }
  609.         
  610.         $risposte = [];
  611.         $risposte_complete = [];
  612.         foreach ($_REQUEST as $k => $v) {
  613.             if (stripos($k,"domanda_") !== false) {
  614.                 $d explode("_",$k);
  615.                 $id_domanda $d[1];
  616.                 if (count($d) == 3) {
  617.                     $argomento $d[2];
  618.                 } else {
  619.                     $argomento "";
  620.                 }
  621.                 if (!isset($risposte[$id_domanda])) {
  622.                     $risposte[$id_domanda] = [];
  623.                 }
  624.                 $valore $v;
  625.                 $risposte[$id_domanda][$argomento] = $v;
  626.             }
  627.         }
  628.         
  629.         foreach ($risposte as $id_domanda => $k) {
  630.             $i 1;
  631.             foreach ($risposte[$id_domanda] as $k2 => $v2) {
  632.                 if ($k2 == "") {
  633.                     $risposte_complete[$id_domanda][$k2] = $v2;
  634.                 } else {
  635.                     if ($k2 == $i) {
  636.                         $risposte_complete[$id_domanda][$k2] = $v2;
  637.                     } else {
  638.                         while ($i $k2) {
  639.                             $risposte_complete[$id_domanda][$i] = "";
  640.                             $i++;
  641.                         }
  642.                         $risposte_complete[$id_domanda][$k2] = $v2;
  643.                     }
  644.                 }
  645.                 $i++;
  646.             }
  647.         }
  648.         foreach ($risposte_complete as $domanda => $v) {
  649.             if (isset($domandeObbligatorie[$domanda])) {
  650.                 $d array_diff_key($risposte_complete[$domanda],$domandeObbligatorie[$domanda]);
  651.                 if (count($d) == 0) {
  652.                     unset($domandeObbligatorie[$domanda]);
  653.                 }
  654.             }
  655.         }
  656.         $error 0;
  657.         $message = [];
  658.         $message["Error"] = [];
  659.         $message["Success"] = [];
  660.         if (count($domandeObbligatorie) > 0) {
  661.             $message['Error'][] = 'Tutte le domande obbligatorie devono essere completate. Grazie!';
  662.             $error 1;
  663.         }
  664.         if (!$error) {
  665.             foreach ($risposte_complete as $domanda => $v) {
  666.                 $domanda_ $doctrine->getRepository(Domande::class)->findOneBy(["id" => $domanda]);
  667.                 if ($domanda_) {
  668.                     $risposta $doctrine->getRepository(Risposte::class)->findOneBy([
  669.                         "questionario_iniziato" => $qi,
  670.                         "domanda"=> $domanda_
  671.                     ]);
  672.                     if ($risposta) {
  673.                         $s = [];
  674.                         $posizione "";
  675.                         foreach ($risposte_complete[$domanda] as $posizione => $valore) {
  676.                             if (is_array($valore)) {
  677.                                 $valore implode(","$valore);
  678.                             }
  679.                             $s[] = $posizione ":" $valore;
  680.                         }
  681.                         if (count($s) == && $posizione == "") {
  682.                             $r $risposte_complete[$domanda][$posizione];
  683.                             if (is_array($r)) {
  684.                                 $r implode("|"$r);
  685.                             }
  686.                         } else {
  687.                             $r implode("|"$s);
  688.                         }
  689.                         $risposta->setRisposta($r);
  690.                         $risposta->setModifiedAt(new \DateTimeImmutable("now"));
  691.                         $entityManager->persist($risposta);
  692.                         $qi->setModifiedAt(new \DateTimeImmutable("now"));
  693.                         $entityManager->persist($qi);
  694.                     } else {
  695.                         echo "489";
  696.                         exit();
  697.                     }
  698.                 } else {
  699.                     echo "492";
  700.                     exit();
  701.                 }
  702.             }
  703.             $entityManager->flush();
  704.             $message["Success"][] = "Questionario salvato correttamente";
  705.             $session $this->requestStack->getSession();
  706.             $session->set('token'$token1);
  707.             $session->set('signature'$signature);
  708.             $session->set('message'$message);
  709.             return $this->redirectToRoute("app_webservice_sustainstudentquestionariook", ["qi" => $qi->getId()]);
  710.         }
  711.         $session $this->requestStack->getSession();
  712.         $session->set('token'$token1);
  713.         $session->set('signature'$signature);
  714.         $session->set('message'$message);
  715.         //$foo = $session->get('foo');
  716.         // the second argument is the value returned when the attribute doesn't exist
  717.         //$filters = $session->get('filters', []);
  718.         return $this->redirectToRoute("app_webservice_sustainstudentquestionario");
  719.     }
  720.     #[Route('/webservice/saved/{qi}'name'app_webservice_sustainstudentquestionariook')]
  721.     public function saved(Request $request,ManagerRegistry $doctrine,QuestionariIniziati $qi): Response
  722.     {
  723.         $entityManager $doctrine->getManager();
  724.         $session $this->requestStack->getSession();
  725.         $token1 $session->get("token");
  726.         $signature $session->get("signature");
  727.         $url $qi->getReturnurl();
  728.         $res json_decode(base64_decode($token1));
  729.         // controllo se esiste il questionario ( questionario ) con il token passato ( token )
  730.         $q $doctrine->getRepository(Questionari::class)->findOneBy([
  731.             "id" => $res->questionario,
  732.             "token" => $res->token
  733.         ]);
  734.         if ($q) {
  735.             $ambiente $q->getQuestionario()->getAmbiente();
  736.             $secret $ambiente->getApisecret();
  737.             $signature2 hash_hmac("sha256"$token1$secrettrue);
  738.             $signature2 base64_encode($signature2);
  739.             if($signature!=$signature2){
  740.                 echo "Error code 283";
  741.                 exit();
  742.             }
  743.         }
  744.         $session $this->requestStack->getSession();
  745.         $session->set('token'$token1);
  746.         $session->set('signature'$signature);
  747.         return $this->render('webservice/saved.html.twig', [
  748.             "qi" => $qi
  749.         ]);
  750.     }
  751.     #[Route('/webservice/chiamaallinea/{ambiente}'name'app_webservice_chiama_allinea_ambiente')]
  752.     public function chiamaallinea(Request $requestManagerRegistry $doctrinestring $ambiente ""): Response
  753.     {
  754.         // wget https://questionari.42b.it/webservice/chiamaallinea/partecipa?token=UN49MEURY2vNn6zf --output-document=logAllinea.`date +\%Y\%m\%d-\%H_\%M_\%S`.log
  755.         // da mettere in crontab
  756.         // il token e' definito nel file yaml dell' ambiente, nella cartella conig, assieme a username e password con cui contattare moodle.
  757.         $token $request->get("token");
  758.         $yaml Yaml::parse(file_get_contents('../config/' $ambiente '.yaml'));
  759.         $stored_token $yaml["parameters"]["token"];
  760.         if ($token != $stored_token) {
  761.             return new Response("Token errato");
  762.         }
  763.         $token2 "";
  764.         if (isset($yaml["parameters"]["password"])) {
  765.             $token2 md5(date("Y-m-d H") . " " $ambiente " " $yaml["parameters"]["password"]);
  766.         } else {
  767.             return new Response("File errato");
  768.         }
  769.         // chiamata di fatto interna, ma la faccio come se fosse esterna
  770.         $url "https://questionari.42b.it/webservice/allineaambiente/" $ambiente "?token=" $token2;
  771.         $ch curl_init();
  772.         curl_setopt($chCURLOPT_URL$url);
  773.         curl_setopt($chCURLOPT_HEADERfalse);
  774.         $res curl_exec($ch);
  775.         curl_close($ch);
  776.         return new Response("Ok");
  777.         
  778.     }
  779.     #[Route('/webservice/allineaambiente/{ambiente}'name'app_webservice_allinea_ambiente')]
  780.     public function allinea(Request $requestManagerRegistry $doctrinestring $ambiente ""): Response
  781.     {
  782.         $entityManager $doctrine->getManager();
  783.         $session $this->requestStack->getSession();
  784.         $yaml Yaml::parse(file_get_contents('../config/' $ambiente '.yaml'));
  785.         $token1 md5(date("Y-m-d H") . " " $ambiente " " $yaml["parameters"]["password"]);
  786.         $t $request->get("token");
  787.         if ($ambiente == "") {
  788.             return new Response("manca ambiente");
  789.             
  790.         }
  791.         if ($_SERVER["REMOTE_ADDR"] != "51.77.220.131" && $_SERVER["REMOTE_ADDR"] != "92.246.117.18" && $_SERVER["REMOTE_ADDR"] != "92.246.117.158") {
  792.             return new Response("Non puoi eseguire da qui: " $_SERVER["REMOTE_ADDR"]);
  793.         }
  794.         if ($t != $token1) {
  795.             return new Response("Token errato");
  796.         }
  797.         // se sono qui, posso cominciare ad eseguire
  798.         switch ($ambiente) {
  799.             case "partecipa":
  800.                 $url "https://www.partecipa.eu";
  801.                 break;
  802.             case "cfcs":
  803.                 $url "https://fad.cafoscarichallengeschool.it";
  804.                 break;
  805.             case "safety":
  806.                 $url "https://elearning.headup.it";
  807.                 break;
  808.             default:
  809.                 return new Response("Manca ambiente");
  810.         }
  811.         $username $password "";
  812.         if (isset($yaml) && isset($yaml["parameters"])) {
  813.             $username $yaml["parameters"]["username"];
  814.             $password $yaml["parameters"]["password"];
  815.         }
  816.         if ($username=="" || $password == "") {
  817.             return new Response("mancano credenziali");
  818.         } else {
  819.             $x exec('curl "' $url '/login/token.php?service=moodle_mobile_app" -d "username=' $username '&password=' $password '"');
  820.             $j json_decode($x);
  821.             if (!$j) {
  822.                 return new Response("error 751");
  823.             }
  824.             $token $j->token;
  825.             if ($token) {
  826.                 $utenti = [];
  827.                 $ambiente $doctrine->getRepository(UsersAmbienti::class)
  828.                 ->findOneBy(["url" => $url]);
  829.                 if ($ambiente) {
  830.                     $entityManager $doctrine->getManager();
  831.                     $query $entityManager->createQuery(
  832.                     'SELECT q
  833.                     FROM App\Entity\Questionari q
  834.                     WHERE q.ambiente = :ambiente
  835.                     AND q.corso_id IS NOT NULL
  836.                     ORDER BY q.id ASC'
  837.                     )->setParameter('ambiente'$ambiente->getId());
  838.                     $res $query->getResult();
  839.                     $corsi = [];
  840.                     foreach ($res as $r) {
  841.                         if (!in_array($r->getCorsoId(), $corsi)) {
  842.                             $corsi[] = $r->getCorsoId();
  843.                         }
  844.                     }
  845.                     $utenti = [];
  846.                     if (count($corsi) > 0) {
  847.                         foreach ($corsi as $c) {
  848.                             //$x = exec('curl "https:///www.partecipa.eu/webservice/rest/server.php?wstoken='.$token.'&wsfunction=core_user_get_users_by_field" -d "field=username&values[0]='.$username.'&moodlewsrestformat=json"');
  849.                             $x exec('curl "' $url '/webservice/rest/server.php?wstoken=' $token '&wsfunction=core_enrol_get_enrolled_users" -d "courseid=' $c '&moodlewsrestformat=json"');
  850.                             $j json_decode($x);
  851.                             foreach ($j as $u) {
  852.                                 foreach ($u->roles as $role) {
  853.                                     if ($role->shortname == "manager") {
  854.                                         if (!isset($utenti[$u->email])) {
  855.                                             $utenti[$u->email] = [];
  856.                                         }
  857.                                         $utenti[$u->email][] = $c;
  858.                                     }
  859.                                 }
  860.                             }
  861.                         }
  862.                     }
  863.                 }
  864.                 foreach ($utenti as $k => $v) {
  865.                     $user $doctrine->getRepository(Users::class)
  866.                     ->findOneBy(["email" => $k]);
  867.                     if ($user) {
  868.                         $user->setCorsiMoodle(json_encode($v));
  869.                         $entityManager $doctrine->getManager();
  870.                         $entityManager->persist($user);
  871.                         $entityManager->flush();
  872.                     } else {
  873.                         $u = new Users();
  874.                         $u->setEmail($k);
  875.                         $u->setPassword("emty");
  876.                         $u->setRoles(array("ROLE_MANAGER"));
  877.                         $u->setIsVerified(false);
  878.                         $u->setCorsiMoodle(json_encode($v));
  879.                         $entityManager $doctrine->getManager();
  880.                         $entityManager->persist($u);
  881.                         $entityManager->flush();
  882.                     }
  883.                 }
  884.                 return new Response("");
  885.             } else {
  886.                 return new Response("errore nel token");
  887.             }
  888.         }
  889.     }
  890. }