<?php
//this script is generated by /src/jit-sitec.org in ssh://git@git.cistus.nl:2222/snow/201688-publicatie-tijd-versnellen-op-crystal.git

$logprefix="--jsc--";

require 'siteconfig.php';

if( !isset( $LogLevel ) ) { $LogLevel = 0; }
if ($LogLevel == 1 ) { $start = microtime(true); }

function logit( $text, $force = false ) {
   global $LogLevel;
   global $logprefix;
   if ( $LogLevel == 1 || $force ) {
      error_log( $logprefix . $text );
   }
}
function CheckAccess( $UserName, $url ) {
   global $TitleIndexFile;
   global $LDAPServer;
   global $SiteSourceDir;
        // begin zonder permissie en zonder bron en verder niets gezet
   $AuthUser  = "not set";
   $AuthGroup = "not set";

   $AccessArray['bronbestand'] = "";
   $AccessArray['Access']      = 403;
   $AccessArray['linetype']    = "not set";
   $contents = file_get_contents($TitleIndexFile);          // open title index, it's a csv (:-seperated, "-delimited)
   foreach(explode("\n", $contents) as $line) {             // zoeken per regel
      $values = str_getcsv( $line, ":", "\"" );
      if($values[0] == "$url") {
         $AccessArray['bronbestand'] = $values[1];
         $AccessArray['linetype']    = $values[4];
         $AuthUser  = $values[2];
         $AuthGroup = $values[3];
         break;
      }
   }
   if ($AccessArray['bronbestand'] == "" ) {  // een gevalletje niet gevonden
      logit( "URL [" . $url . "] niet gevonden in " . $TitleIndexFile, true ); 
      $AccessArray['Access'] = 404;
      return $AccessArray;
   }
   if ( !hasPrefix( $AccessArray['bronbestand'], $SiteSourceDir ) ) {
      logit( "[" . $AccessArray['bronbestand'] . "] start niet met [" . $SiteSourceDir . "]", true );
      $AccessArray['Access'] = 500;
      return $AccessArray;
   }
   if( strpos( $AccessArray['bronbestand'], "/../" ) ) {
      logit( "[" . $AccessArray['bronbestand'] . "] bevat [/../].", true );
      $AccessArray['Access'] = 500;
      return $AccessArray;
   }

   logit( "URL [\"" . $url . "\"] gevonden met als file [" . $AccessArray['bronbestand'] . "]" );
   logit( "AuthUser/Group:  [" . $AuthUser . "]/[" . $AuthGroup . "]" ); 
   logit( "LineType:  [" . $AccessArray['linetype'] . "]" ); 

   if ($AuthGroup == "all") {
      $AccessArray['Access'] = 200;
      return $AccessArray;
   }
   if ($UserName == $AuthUser) {
      logit( "Usernaam $UserName is gelijk aan $AuthUser, toegang OK" );
      $AccessArray['Access'] = 200;
      return $AccessArray;
   } 
   
   logit( "Geen toegang op gebruikersnaam, misschien wel via groepen." );

   $Groups = explode(",", $AuthGroup);  // groepen uit de SDF in een array stoppen.
   $Access = 0;                         // geen toegang is het uitgangspunt
   $filter="(|(memberUid=$UserName))";  // we zijn alleen geinteresseerd in resultaat indien de UserName lid is
   $justthese = array("gidNumber");     // gidNumber als resultaat is voldoende
   $ds = FALSE;
   foreach ($Groups as $GroupName) {
      if ( $GroupName == "" ) { continue; } // lege groepsnamen kunnen zijn gebruikt in de SDF: next!
      logit( "Zoeken naar lidmaatschap [$UserName] van groep [$GroupName]" );
      $Counter = 1;
      while( !$ds && !($ds = ldap_connect( $LDAPServer ) ) ) {
         $Counter++;
         if( $Counter > 5 ) { logit( "5 failed ldap_connects to $LDAPServer", true ); break; }
      }
      $Counter = 1;
      foreach( array( "cn=$GroupName,ou=groups,ou=intern,ou=people,dc=cistus,dc=nl",
                      "cn=$GroupName,ou=groups,ou=scn,ou=people,dc=cistus,dc=nl") as $dn ) {
         while($Access == 0 && $Counter <= 5) {
            $sr=ldap_search($ds, $dn, $filter, $justthese);
            if( $sr ) {
               logit( "search OK with: $dn, $filter, " . $justthese[0] );
               $info = ldap_get_entries($ds, $sr);
               if( $info ) {
                  logit( "LDAP get_entries OK: #" . $info[ "count" ] );
                  if( $info && $info[ "count" ] >= 1 ) {
                     $AccessArray['Access'] = 200;
                     return $AccessArray;
                  } else { // 0 results, hence no access, try next dn or group, no reason to retry this search
                     break;
                  }
               } else { // search worked, but get_entries failed; no access
                  logit( "LDAP get_entries not OK: " . ldap_error( $ds ) );
                  break; // dont know why this may occur, we don't retry this one
               }
            } else { // search failed with an error condition, retry; if not serious, break
               if( ldap_error( $ds) == "No such object" ) {
                  logit( "LDAP search found no object, this is OK" );
                  break; // no retry
               }
               logit( "LDAP search error: " . ldap_error($ds) );
               logit( "search: $dn, $filter, " . $justthese[0] );
            }
            if ($Counter > 4 ) {
               logit( "4 LDAP redo-searches" );
            }
            $Counter++;
         }
         if ($Access == 0)  {
            logit( "LDAP $UserName voor groep $GroupName Access no (after failing ldap connections)", true );
         } else {
            logit( "LDAP $UserName voor groep $GroupName Access OK (notreached)", true );
            return $AccessArray;
         }
      }
      logit( "LDAP voor groep $GroupName Access is: $Access" );
   }
   logit( "Access is " . $AccessArray['Access'] );
   return $AccessArray;
}
function hasPrefix($text, $prefix) {
   return $prefix === "" || strrpos($text, $prefix, -strlen($text)) !== false;
}
function getMimeType ( $filename ) {
   $mime_extension_map = array(
      'jpg'  => 'image/jpeg',
      'png'  => 'image/png',
      'pdf'  => 'application/pdf',
      'txt'  => 'text/plain',
      'tex'  => 'text/plain',
      'html' => 'text/html',
      'eps'  => 'application/postscript',
      'svg'  => 'image/svg+xml',
      'vcf'  => 'text/x-vcard',
      'odt'  => 'application/vnd.oasis.opendocument.text',
      'odg'  => 'application/vnd.oasis.opendocument.graphics',
      'ods'  => 'application/vnd.oasis.opendocument.spreadsheet',
      'docx' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
      'xlsx' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
      'pptx' => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
      'php'  => 'application/x-php',
      );
   $ext = strtolower(substr($filename,strrpos($filename,'.') + 1));
   if(empty($ext))
      return 'application/octet-stream';
   elseif(isset($mime_extension_map[$ext]))
      return $mime_extension_map[$ext];
   return 'x-extension/' . $ext;
}
function goBack ( $message) {
   global $_SERVER;
   global $SitePrefix;
   header( "HTTP/1.1 200 OK" );
   echo "<h2>" . $message . "</h2>";
   if( $_SERVER['HTTP_REFERER'] && $_SERVER['HTTP_REFERER'] != "" ) {
      echo "<h3>Back to [" . $_SERVER['HTTP_REFERER'] . "] in 5 seconds.</h3>";
      header( "refresh:5;url=" . $_SERVER['HTTP_REFERER'] );
   } else {
      echo "<h3>To [" . $SitePrefix . "] in 5 seconds.</h3>";
      header( "refresh:5;url=" . $SitePrefix );
   }
}

$url=rawurldecode( $_SERVER['REQUEST_URI'] );
$UserName=array_key_exists( 'REMOTE_USER', $_SERVER) ? $_SERVER['REMOTE_USER'] : '';

logit( "Url: " . $url );
logit( "TitleIndexFile: " . $TitleIndexFile );
logit( "Ingelogd met LDAP gebruiker:" . $UserName );

$AccessArray = CheckAccess( $UserName, $url ) ;
logit( "Total Access is " . $AccessArray['Access'] );

if ( $AccessArray['Access'] == 404 ) {
   logit( "Presenteer-pagina 404 voor " . $url );
   goBack( "For the URL [" . $url . "] is no title available.<br>" );
} elseif ( $AccessArray['Access'] == 403 ) {
   logit( "Presenteer-pagina 403 voor " . $url );
   goBack( "For the URL [" . $url . "] is no access granted.<br>" );
} elseif ( $AccessArray['Access'] == 200 )  {
   if( $AccessArray['linetype'] == "title" ) {
      $xmlDoc = new DOMDocument();
      $xslDoc = new DOMDocument();

      if( $xslDoc->load( $SiteStyleSheet ) && $xmlDoc->load($AccessArray['bronbestand']) ) {
         $xsltProcessor = new XSLTProcessor();
         $xsltProcessor->registerPHPFunctions();
         $xsltProcessor->importStyleSheet($xslDoc);

             // the site-description file to use, no default:
         $xsltProcessor->setParameter('','sitefilename', $SDFFile);
         
             // site-local references not mentioned in the sdf are prefixed with the following (not a configuration variable):
         $xsltProcessor->setParameter('','jit201688sitelocalprefix', "" . "file=");
         
             // lri's come from the local site, from a directory called lris/, not a configuration variable
         $xsltProcessor->setParameter('','lriprefix', "$SitePrefix" . "file=" . "lris/");
         
             // the logo always sits locally in . ; not a configuration variable:
         $xsltProcessor->setParameter('','logoprefix', "$SitePrefix" . "file=");
         
             // auxiliary files may come from a remote URL or be just local objects; this is a configuration item
         $xsltProcessor->setParameter('','auxfileprefix', isset( $AuxFilePrefix ) ? $AuxFilePrefix : $SitePrefix . "file=");
         
             // some sites require /<some name>/ for addressing site-local urls.
         $xsltProcessor->setParameter('','siteprefix', "$SitePrefix");
         
             // in order to correctly select random lri's, the max amount is needed
         $xsltProcessor->setParameter('','numOfLRIs', '10');      

         $result = $xsltProcessor->transformToXML($xmlDoc);
         if( $result ) {
            header( "HTTP/1.1 200 OK" );
            echo $result;
         } else {
            logit( "XsltProcessing failed: " . $AccessArray['bronbestand'], true );
            goBack( "You requested a known title, but presenting it has failed. Please inform joost@helberg.nl" );
         }
      } else {
         logit( "DOMDoc->load() failed: on" . $AccessArray['bronbestand'], true );
         goBack( "You requested a known title, but preparing for presenting has failed.. Please Inform joost@helberg.nl" );
      }
   } else { // it is an object
      logit( "Presenting object: " . $AccessArray['bronbestand'] . " with mime-type " . getMimeType($AccessArray['bronbestand']) );
      header( "HTTP/1.1 200 OK" );
      header( sprintf( "Content-type: %s", getMimeType( $AccessArray[ 'bronbestand' ] ) ) );
      readfile( $AccessArray[ 'bronbestand' ] );
   }
} else {
   logit( "unknown access returnvalue: [" . $AccessArray['Access'] . "] for url [" . $url . "]", true );
   goBack( "For the URL [" . $url . "] an unexpected error occurred: [" . $AccessArray['Access'] . "] with regards to access." );
}

if ($LogLevel == 1 ) {
   $time_elapsed_secs = microtime(true) - $start;
   logit( "Elapsed: " . $time_elapsed_secs );
}

?>
