From 1023f7282660e1fac442960d979641cda60cda8d Mon Sep 17 00:00:00 2001
From: Tomasz Wolniewicz <twoln@umk.pl>
Date: Thu, 18 Jan 2024 21:32:11 +0100
Subject: [PATCH] restoring the non-docker validator class

---
 lib/validatorClass.php | 89 ++++++++++++++++++++++++++++++++++--------
 1 file changed, 72 insertions(+), 17 deletions(-)

diff --git a/lib/validatorClass.php b/lib/validatorClass.php
index b9bc1dd..3e451c3 100644
--- a/lib/validatorClass.php
+++ b/lib/validatorClass.php
@@ -1,11 +1,13 @@
 <?php
 class Validator {
     public $params;
+    private $validatordir;
     private $edugain;
     private $logger;
 
     public function __construct($params = array()) {
           
+        $this->validatordir = VALIDATOR_SCRIPTS;
         if (empty($params)) {
         $this->params = array(
                         'url' => '',
@@ -64,6 +66,7 @@ class Validator {
             $fed_id = $this->edugain->getCode($fed_id);
             $this->edugain->load_federations(0,$fed_id);
             $this->edugain->load_federation_basic_details('all');
+            $certdb = 0;
             if (empty($this->edugain->FEDS[$fed_id])) {
                 $this->params['federror'] = 'No such federation in the eduGAIN database: '.$fed_id;
             } else {
@@ -93,6 +96,7 @@ class Validator {
                          $this->edugain->FEDS[$fed_id]['certificate'][$n]['certfile'] = $certfilename;
                      }
                    }
+                   $certdb = $n;
                    $ff = fopen($this->params['filename'].'-certinfo.json', 'w');
                    fputs($ff, json_encode($this->edugain->FEDS[$fed_id]['certificate']));
                }    
@@ -278,35 +282,86 @@ class Validator {
     public function checkmetadata() {
         $params = $this->params;
         $schres = 0;
-        $certidx = 0;
+        $certidx = -1;
         if ( ($params['validate'] || $params['entities']) && ($params['url'] != "") ) {
         $ret = $this->get_data();
         if ($ret[0] == 304) {
+            $result = array();
+            $result['global']['required']['passed'] = array();
+            $result['global']['required']['failed'] = array();
+            $result['global']['required']['code'][] = 304;
+            $result['global']['recommended']['passed'] = array();
+            $result['global']['recommended']['failed'] = array();
+            $result['entities'] = array();
+            $result['sources'] = $params['url'];
+            $f = fopen($this->params['filename'], 'w');
+            fputs($f, json_encode($result));
+            fclose($f);
             $res = $schres = 304;
-            $printres = "<div class='noticeerr'>URL fetching failed<br></div>";
         } elseif ($ret[0] > 0) {
+            $result = array();
+            $result['global']['required']['passed'] = array();
+            $result['global']['required']['failed'][] = $ret[1];
+            $result['global']['required']['code'][] = 14;
+            $result['global']['recommended']['passed'] = array();
+            $result['global']['recommended']['failed'] = array();
+            $result['entities'] = array();
+            $result['sources'] = $url;
+            $f = fopen($params['filename'], 'w');
+            fputs($f, json_encode($result));
+            fclose($f);
             $res = $schres = 14;
-            $printres = "<div class='noticeerr'>URL fetching failed<br>" . $ret[1] . '</div>';
+            $aggres = 0;
+            $pyffres = 0;
         } elseif ($ret[0] == 0) {
             $f = fopen($params['filename'].'-metadata.xml', 'w');
             fputs($f, $ret[1]);
             fclose($f);
-            $this->params['feed'] = substr($this->params['filename'], strrpos($this->params['filename'], '/')+1);
-            $this->params['fedname'] = base64_encode($this->params['fedname']);
-            $f = fopen($this->params['filename'].'-params.json', 'w');
-            fputs($f, json_encode($this->params));
-	    fclose($f);
-            $ch = curl_init();
-            curl_setopt($ch, CURLOPT_URL, VALIDATOR_REQ . $this->params['feed']);
-            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
-            $response = curl_exec($ch);
-            if (file_exists($params['filename'] . '-result')) {
-              $printres = file_get_contents($params['filename'] . '-result');
-            } else {
-              $printres = '<b>A problem occured.</b><p>Please let us know: <a href="mailto:edugain-ot@lists.geant.org">edugain-ot@lists.geant.org</a>';
-              $printres = '<p>'.$params['filename'] . '-result';
+            $aggres = 0;
+            $pyffres = 0;
+            $args = "\"".$params['url']."\" \"".$params['regauth']."\" ".$params['filename']." \"".$params['langsetting']."\" ".$params['validate']." ".$params['onlyone']." ".$params['weakkeys']." ".$params['xmlout']." ".$params['edugain']." ".base64_encode($params['fedname']);
+            system($this->validatordir."/schemas.py $args",$schres);
+            if ($params['onlyone'] && !$schres) {
+                $params['onlyone'] = 0;
+                unset($_REQUEST['oneentity']);
             }
+            #if ($params['validate'] && !$params['onlyone'] && ($schres<2)) {
+            if ($params['validate'] && !$params['onlyone']) {
+                if ($params['edugain'] || $params['gobetween'])  $fromdb = 1;
+                else $fromdb = 0;
+                system($this->validatordir."/aggregator.py ".$params['filename']." $schres $fromdb >".$params['filename']."-aggregator.log 2>&1",$aggres);
+                $certidx = trim(file_get_contents($params['filename']."-aggregator.log"));
+                error_log("certidx=$certidx");
+                if ($certidx == '') {
+                  $certidx = 0;
+                }
+                system($this->validatordir."/mda.sh --verbose ".$params['filename'].".xml main > ".$params['filename']."-mda.log 2>&1", $res);
+                $searchfor = "Unable to validate signature";
+                $matches = array();
+                $handle = @fopen($params['filename']."-mda.log", "r");
+                if ($handle) {
+                  while (!feof($handle)) {
+                    $buffer = fgets($handle);
+                    if (strpos($buffer, $searchfor) !== FALSE) {
+                      $matches[] = $buffer;
+                      break;
+                    }
+                  }
+                  fclose($handle);
+                }
+                if (count($matches) && $certdb > 1) {
+                  system($this->validatordir."/aggregator.py ".$params['filename']." $schres $fromdb 1 >".$params['filename']."-aggregator2.log 2>&1",$aggres);
+                  system($this->validatordir."/mda.sh --verbose ".$params['filename']."_1.xml main > ".$params['filename']."-mda.log 2>&1", $res);
+                  $certidx = trim(file_get_contents($params['filename']."-aggregator2.log"));
+                  if ($certidx == '') {
+                    $certidx = 1;
+                  }
+                }
+                system($this->validatordir."/pyff.sh ".$params['filename'].'>'.$params['filename']."-pyff.log 2>&1", $pyffres);
+            } else $res = $schres;
         }
+        $args = $params['filename']." \"".$params['langsetting']."\" ".$params['validate']." ".$params['onlyone']." ".$params['xmlout']." ".$params['gobetween']." ".$params['edugain'];
+        $printres = shell_exec($this->validatordir."/printresults.py $args $res $schres $aggres $pyffres $certidx");
     } else
         $printres = "<span class='noticeerr'>URL fetching failed ".$ret[1]."</span>";
     if (!$params['gobetween']) {
-- 
GitLab