src/Controller/WebserviceController.php line 648

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