Index: trunk/info/info/alkisn/alkisfkt.php
===================================================================
--- trunk/info/info/alkisn/alkisfkt.php	(revision 419)
+++ trunk/info/info/alkisn/alkisfkt.php	(revision 422)
@@ -3,23 +3,79 @@
 
 	ALKIS-Buchauskunft, Kommunales Rechenzentrum Minden-Ravensberg/Lippe (Lemgo).
-	Functions
+	F u n c t i o n s
 
 	Version:
 	2016-02-24 Version fuer norGIS-ALKIS-Import, "function linkgml" raus. Case-EntschlÃŒsselung raus.
-	2016-03-03 Hinweis auf Datenfehler wenn "ax_person" fehlt in function "eigentuemer"
-	2016-03-14 Kleine Korrekturen
-	2016-11-29 Gemeinsam genutzte Datenbanken ermÃ¶glichen (Filter Gemeinde)
-	2017-06-08 gestreifte Tabelle, Feinkorrekturen
-	2017-10-17 Deutsches Datumsformat fÃŒr Geburtsdatum der Person
-	2017-11-03 neue function werteliste()
-	2017-12-20 Default Anzeigewert "EigentÃŒmer" im Link fÃŒr leere EigentÃŒmerart, JÃŒngste Adresse zur Person verwenden.
-	2018-04-23 Berechtigte Buchungen im FS-Nachw. verbessern. Neue Spalte statt Ãberschriften fÃŒr "EigentÃŒmer" und "Berechtigte Buchungen".
-	2018-05-03 GrundstÃŒcksnachweis
-	2018-11-09 Umstellung Full-Schema
-	2018-11-19 EntschlÃŒsseln "zeigtaufexternes_art" mit function fortfuehrungen().
-	2018-12-18 function fskenn_dbformat
-
-	++ ToDo: Parameter $lnkclass in eigentuemer() und $jfenster in buchung_anzg() vereinheitlichen
+	....
+	2020-12-03 function selbstverlinkung() statt $_SERVER['PHP_SELF'] fÃŒr Einsatz hinter Gateway mit Ãnderung des Pfades (Docker/QWC2)
+	2020-12-09 Entschl. BodenschÃ€tzung korrigiert in function werteliste()
+	2020-12-15 Input-Validation und Strict Comparisation (===)
+	2020-12-16 Sonderfall QWC2 API-Gateway-Umleitung bei Selbstverlinkung
 */
+
+function selbstverlinkung() {
+//	Aus der Server-Variable den Pfad entfernen.
+	global $pfadlos_selbstlink;
+	If ($pfadlos_selbstlink === 1) { // pfad-lose Selbstverlinkung hinter einer Umleitung. z.B. QWC2 API-Gateway
+		// Pfad entfernen
+		$mod=strrchr($_SERVER['PHP_SELF'], '/');
+		$mod=substr($mod, 1);
+	} else { // normaler Webserver, die Systemvariable ist korrekt
+		$mod=$_SERVER['PHP_SELF'];
+	}
+	return $mod;
+}
+
+function darf_ich() {
+//	Am Anfang jedes Moduls aufrufen um $customer zu fÃŒllen.	
+//	Nach EinfÃŒhrung eines automatisch einloggenden anonymen Mapbender-Gast-Benutzers muss dieser bei der Authentifizierung ausgeschlossen werden.
+	global $auth, $customer, $mb_guest_user, $debug;
+
+	if ($auth === "") {	// nicht prÃŒfen
+	//	if ($debug > 1) {echo "\n<p class='dbg'>keine Berechtigungs-PrÃŒfung</p>";}
+		$customer = "(unbekannt)";
+		return 1;	// alles erlaubt
+
+	} elseif ($auth === "mapbender") {
+
+	//	if ($debug > 1) {echo "\n<p class='dbg' Berechtigungs-Pr&uuml;fung Mapbender</p>";}
+		$customer = "";
+		include '/opt/gdi/mapbender/http/php/mb_validateSession.php';
+		
+		if (!isset($_SESSION)) { // keine (passende) Session
+			if ($debug > 1) {echo "\n<p class='dbg'>Session nicht gesetzt</p>";}
+		} elseif ( !isset($_SESSION["mb_user_name"]) )  {
+			if ($debug > 1) {echo "\n<p class='dbg'>username nicht gesetzt</p>";}
+		} else {
+			$customer = $_SESSION["mb_user_name"]; // angemeldeter Benutzer	
+		}
+		//if ($debug > 1) {echo "\n<p class='dbg'>Customer '".$customer."'</p>";}
+		if ($customer == "") {	// Wer bin ich?
+			echo "<p class='stop2'>Aufruf nur aus Mapbender erlaubt.</p>";
+			return 0;
+		} elseif ($customer == $mb_guest_user) { // in conf festgelegt
+			echo "<p class='stop2'>Eine Anmeldung im Mapbender ist notwendig.</p>";
+			return 0;	// gast-User darf nix
+		} else {
+			return 1;	// echter User, ist erlaubt
+		}
+
+	} elseif ($auth === "qwc2") {
+
+		if ($debug > 1) {echo "\n<p class='dbg'>Berechtigungs-PrÃŒfung QWC2 -GEPLANT-</p>";}
+
+		// BAUSTELLE: Hier den Code einfÃŒgen um im QWC2 die Berechtigung zu prÃŒfen und den Benutzer auszulesen.
+		// Guggs du: https://git.sourcepole.ch/krz_dt/qwc2/-/issues/78
+
+		$customer = "(Unbekannt)";
+		echo "<p class='stop2'>Berechtigungspr&uuml;fung fÃŒr QWC2 ist noch nicht m&ouml;glich.</p>";
+		return 1;	// vorlÃ€ufig erlaubt
+
+	} else {
+
+		echo "\n<p class='stop2'>Die Berechtigungs-PrÃŒfung ist falsch konfiguriert</p>";
+		return 0;	// verboten
+	}
+}
 
 function footer($gmlid, $link, $append) {
@@ -28,13 +84,13 @@
 	// Den URL-Parameter "&showkey=j/n" umschalten lassen.
 	// $append wird angehaengt wenn gefuellt. Anwendung: &eig=j bei FS-NW, &ltyp=m/p/o bei Lage
-	global $gkz, $showkey, $hilfeurl, $auth, $debug;
-
-	// S c r e e n - Foot
+	global $gkz, $showkey, $hilfeurl, $debug, $customer;
+
+	echo "<footer>";
+	// S c r e e n - F o o t
 	echo "\n<div class='confbereich noprint'>"
 	."\n\t<table class='outer'>\n\t<tr>";
 
 	// Spalte 1: Info Benutzerkennung
-	if ($auth == "mapbender") {
-		$customer=$_SESSION["mb_user_name"];
+	if (isset($customer)) { // ÃŒber global von fkt. darf_ich()
 		echo "\n\t\t<td title='Info'><i>Benutzer:&nbsp;".$customer."</i></td>";
 	} else {
@@ -50,7 +106,6 @@
 			echo $mylink."&amp;showkey=j' title='Verschl&uuml;sselungen anzeigen'>Schl&uuml;ssel ein</a>";
 		}
-		// TemporÃ€r eine Ansicht ohne Entwicklungsumgebung
-		if ($debug > 0) {
-			echo "&nbsp;|&nbsp;".$mylink."&amp;nodebug=j' title='Debug-Ausgaben tempor&auml;r abschalten'>Ansicht ohne Testausgaben</a>";
+		if ($debug > 0) { // FÃŒr Entwickler temporÃ€r eine Ansicht OHNE debug
+			echo "<br>".$mylink."&amp;nodebug=j' title='Debug-Ausgaben tempor&auml;r abschalten'>Ansicht ohne Testausgaben</a>";
 		}
 	echo "\n\t\t</td>";
@@ -62,9 +117,10 @@
 	."\n</div>\n";
 
-	// P r i n t - Foot
-	if ($auth == "mapbender") {
-	//	$customer=$_SESSION["mb_user_name"];
-		echo "\n<p class='onlyprint'><i>Mapbender-Benutzer:&nbsp;".$customer."</i></p>";
-	}
+	// P r i n t - F o o t
+	if (isset($customer)) {
+		echo "\n<p class='onlyprint'><i>Benutzer:&nbsp;".$customer."</i></p>";
+	}
+
+	echo "</footer>";
 	return 0;
 }
@@ -110,11 +166,12 @@
 	if (!$resbs) {
 		echo "\n<p class='err'>Fehler bei 'Buchungsstelle ausgeben'.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sqlbs, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmlbs."'</p>";}
-	}
-	$gezeigt=false; // Funktionswert
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmlbs."'", $sqlbs), ENT_QUOTES, "UTF-8")."</p>";}
+	}
+	$gezeigt = 0; // Funktionswert default
+
 	if ($rowbs = pg_fetch_assoc($resbs)) { // ein Treffer
 		$blattkeyber=$rowbs["blattart"]; // Schluessel von Blatt-Art des GB
 		if ($blattkeyber != '5000' or $debug > 1) { // "Fiktives Blatt" nur bei Entwicklung anzeigen
-			$gezeigt=true; // Funktionswert
+			$gezeigt = 1; // Funktionswert nach Treffer
 			$hgml=$rowbs["hgml"]; // GML-ID der (herrschenden) BuchungsStelle
 			$bartkey=$rowbs["buchungsart"]; // Buchungsart SchlÃŒssel
@@ -137,13 +194,13 @@
 					switch ($barttyp) { // Text der Ãberschrift
 						case "E":
-							if ($eig == 'j') {$h3txt = "Buchung und Eigentum";} 
+							if ($eig === 'j') {$h3txt = "Buchung und Eigentum";} 
 							else {$h3txt = "Buchung";}
 						break;
 						case "R": $h3txt = "Grundst&uuml;cksgleiche Rechte"; break;
 					}
-					if ($barttypgrp == "" and $gml_fs != "") { // die erste Ãberschrift mit ID und Umschalter
+					if ($barttypgrp === "" and $gml_fs != "") { // die erste Ãberschrift mit ID und Umschalter
 						echo "\n\t<tr>\n\t\t<td colspan='3'>\n\t\t\t<h3 id='gb'>".$h3txt."</h3>\n\t\t</td>"; // 1-3
 						echo "\n\t\t<td>\n\t\t\t<p class='nwlink noprint'>" // 4
-							."\n\t\t\t\t<a href='".$_SERVER['PHP_SELF']. "?gkz=".$gkz."&amp;gmlid=".$gml_fs;
+							."\n\t\t\t\t<a href='".selbstverlinkung()."?gkz=".$gkz."&amp;gmlid=".$gml_fs;
 							if ($showkey) {echo "&amp;showkey=j";}
 							if ($eig=="j") { // Umschalter: FS-Nachweis ruft sich selbst mit geaendertem Parameter auf. Positionierung auf Marke "#gb"
@@ -192,5 +249,5 @@
 					."\n\t\t\t</tr>";
 
-					if ($trtyp == 3) { // Treffer-Grundst. einfÃ€rben
+					if ($trtyp === 3) { // Treffer-Grundst. einfÃ€rben
 						echo "\n\t\t\t<tr class='paa'>";
 					} else {
@@ -205,5 +262,5 @@
 					."\n\t\t\t</table>";
 
-					if ($rowbs["zaehler"] <> "") {
+					if ($rowbs["zaehler"] != "") {
 						echo "\n\t\t\t<p class='ant'>".$rowbs["zaehler"]."/".$rowbs["nenner"]."&nbsp;Anteil am Flurst&uuml;ck</p>";
 					}
@@ -227,5 +284,5 @@
 						."</a>";
 					// Buchung
-						if ($trtyp == 1) {
+						if ($trtyp === 1) {
 							echo "<br>";
 							if ($showkey) {echo "<span class='key'>".$bartkey."</span> ";}
@@ -240,5 +297,5 @@
 				."\n\t\t</td>" // 4
 			."\n\t</tr>";
-			if ($eig == "j") {
+			if ($eig === "j") {
 				if ($jsfenster) {$lnkclass = "imFenster";} else {$lnkclass = "";} 
 				$n = eigentuemer($gbgml, true, $lnkclass); // mit Adresse
@@ -247,5 +304,8 @@
 	}
 	pg_free_result($resbs);
-	return $gezeigt; // true wenn eine Buchung ausgegeben wurde
+	
+	//if ($debug > 1) {echo "\n<p class='dbg'>Ende function buchung_anzg(), Return = ". $gezeigt ."</p>";}
+	
+	return $gezeigt; // 1 wenn eine Buchung ausgegeben wurde
 }
 
@@ -272,5 +332,5 @@
 	if (!$resber) {
 		echo "\n<p class='err'>Fehler bei 'berechtigte Buchungsstellen'.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = gml_id = '".$gmls."'</p>";}
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities(str_replace("$1", "'".$gmls."'", $sql), ENT_QUOTES, "UTF-8")."</p>";}
 	}
 	$an=0;
@@ -279,5 +339,5 @@
 		$hgml=$rowan["hgml"]; // GML-ID der berechtigten Buchungs-Stelle
 
-		if ($hgml == $gsanfrd) {
+		if ($hgml === $gsanfrd) {
 			$trtyp=3; // einfÃ€rben, o. Lnk.
 		} else {
@@ -322,5 +382,5 @@
 	."FROM ax_flurstueck f LEFT JOIN ax_gemarkung g ON f.land=g.land AND f.gemarkungsnummer=g.gemarkungsnummer "
 	."WHERE f.endet IS NULL AND g.endet IS NULL AND f.istgebucht = $1 ";
-	if ($filtgem == '' ) { // ungefiltert
+	if ($filtgem === '') { // ungefiltert
 		$v=array($gml_bs);
 	} else {
@@ -338,5 +398,5 @@
 		$bvnr="";
 	}
-	$altbvnr=""; // ++ besser mit "$j == 0" steuern?
+	$altbvnr=""; // ++ besser mit "$j === 0" steuern?
 	$j=0;
 	while($rowf = pg_fetch_assoc($resf)) {
@@ -350,5 +410,5 @@
 		echo "\n<tr class='".$trclass."'>"; // eine Zeile je Flurstueck
 			// Sp. 1-3 der Tab. aus Buchungsstelle, nicht aus FS
-			if($bvnr == $altbvnr) { // gleiches Grundstueck, leer lassen
+			if($bvnr === $altbvnr) { // gleiches Grundstueck, leer lassen
 				echo "\n\t<td>&nbsp;</td>"
 				."\n\t<td>&nbsp;</td>"
@@ -377,5 +437,5 @@
 			echo "\n\t<td>\n\t\t<p class='nwlink noprint'>";
 		//	if($bvnr != $altbvnr) {
-			if($j == 0) {
+			if($j === 0) {
 				echo "\n\t\t\t<a href='alkisgsnw.php?gkz=".$gkz."&amp;gmlid=".$gml_bs;
 					if ($showkey) {echo "&amp;showkey=j";}
@@ -394,5 +454,5 @@
 		$altbvnr=$bvnr;
 		$j++;
-	} // Ende Loop Flurstueck
+	}
 	pg_free_result($resf);
 	return $j;
@@ -433,5 +493,5 @@
 	if (!$resn) {
 		echo "\n<p class='err'>Fehler bei Eigent&uuml;mer</p>"; // kein Fehler bei Blattarten > 1000
-		//if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".$sqln."<br>$1=gml= '".$gmlid."'</p>";}
+		//if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".str_replace("$1", "'".$gmlid."'", $sqln )."</p>";}
 	}
 
@@ -442,5 +502,5 @@
 		$rechtsg=$rown["adr"];
 		echo "\n\t<tr>";
-			if($n == 0) { // erste EigentÃŒmer-Zeile zu einer Buchung
+			if($n === 0) { // erste EigentÃŒmer-Zeile zu einer Buchung
 				echo "\n\t\t<td class='ll'><img src='ico/Eigentuemer_2.png' width='16' height='16' alt=''> Eigent&uuml;mer:</td>"; // 1
 			} else { // Folgezeile
@@ -477,5 +537,5 @@
 		if (!$resp) {
 			echo "\n\t<p class='err'>Fehler bei Person</p>";
-			if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqlp."<br>$1=gml= '".$gmlpers."'</p>";}
+			if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlpers."'", $sqlp)."</p>";}
 		}
 
@@ -483,10 +543,10 @@
 		while($rowp = pg_fetch_assoc($resp)) { // Schleife weglassen: "benennt" ist KEIN Array!
 			$diePerson=""; //++ Anrede?
-			if ($rowp["akademischergrad"] <> "") {$diePerson=$rowp["akademischergrad"]." ";}
+			if ($rowp["akademischergrad"] != "") {$diePerson=$rowp["akademischergrad"]." ";}
 			$diePerson.=$rowp["nachnameoderfirma"];
-			if ($rowp["vorname"] <> "") {$diePerson.=", ".$rowp["vorname"];}
-			if ($rowp["namensbestandteil"] <> "") {$diePerson.=". ".$rowp["namensbestandteil"];}
-			if ($rowp["geburtsdatum"] <> "") {$diePerson.=", geb. ".$rowp["geburtsdatum"];}
-			if ($rowp["geburtsname"] <> "") {$diePerson.=", geb. ".$rowp["geburtsname"];}
+			if ($rowp["vorname"] != "") {$diePerson.=", ".$rowp["vorname"];}
+			if ($rowp["namensbestandteil"] != "") {$diePerson.=". ".$rowp["namensbestandteil"];}
+			if ($rowp["geburtsdatum"] != "") {$diePerson.=", geb. ".$rowp["geburtsdatum"];}
+			if ($rowp["geburtsname"] != "") {$diePerson.=", geb. ".$rowp["geburtsname"];}
 			$diePerson=htmlentities($diePerson, ENT_QUOTES, "UTF-8"); // Umlaute
 			$eiartkey=$rown["eigentuemerart"]; // Key
@@ -498,5 +558,5 @@
 				echo "\n\t\t\t\t<a href='".$lnkvor."alkisnamstruk.php?gkz=".$gkz."&amp;gmlid=".$gmlpers;
 				if ($showkey) {echo "&amp;showkey=j";}
-				if ($eiartkey == "") {$eiart="Eigent&uuml;mer" ;} // Default. Ersatz-Text, wenn nicht gefÃŒllt
+				if ($eiartkey === "") {$eiart="Eigent&uuml;mer" ;} // Default. Ersatz-Text, wenn nicht gefÃŒllt
 				echo $lnknach."' title='vollst&auml;ndiger Name und Adresse eines Eigent&uuml;mers'>".$eiart
 				." <img src='ico/Eigentuemer.png' width='16' height='16' alt=''></a>\n\t\t\t</p>"
@@ -513,13 +573,13 @@
 				if (!$resa) {
 					echo "\n\t<p class='err'>Fehler bei Adressen</p>";
-					if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".$sqla."<br>$1=gml= '".$gmlpers."'</p>";}
+					if ($debug > 2) {echo "\n<p class='err'>SQL=<br>".str_replace("$1", "'".$gmlpers."'", $sqla)."</p>";}
 				}
 				$j=0;
 				while($rowa = pg_fetch_assoc($resa)) {
 					$j++;
-					if ($j == 1) { // erste ("jÃŒngste") Adresse anzeigen
+					if ($j === 1) { // erste ("jÃŒngste") Adresse anzeigen
 						$gmla=$rowa["gml_id"];
 						$plz=$rowa["plz"]; // integer
-						if($plz == 0) {
+						if($plz === 0) {
 							$plz="";
 						} else {
@@ -567,6 +627,6 @@
 		pg_free_result($resp);
 
-		if ($i == 0) { // KEINE Person. benennt ist leer. Das kommt vor hinter der Zeile "Erbengemeinschaft" und ist dann KEIN Fehler
-			if ($rechtsg == 9999) {
+		if ($i === 0) { // KEINE Person. benennt ist leer. Das kommt vor hinter der Zeile "Erbengemeinschaft" und ist dann KEIN Fehler
+			if ($rechtsg === 9999) {
 				if ($debug > 1) {echo "\n\t\t\t<p class='dbg'>Rechtsgemeinschaft = '".$rechtsg."'</p>";}
 			} else {
@@ -580,25 +640,22 @@
 	pg_free_result($resn);
 	return $n; 
-} // End function eigentuemer
-
-function werteliste ($element, $bezeichnung ,$sqlin) {
+}
+
+function werteliste ($bez ,$sqlin) {
 	// Eine oder mehrere EntschlÃŒsselungen in eine Zeile ausgeben.
-	// Dient dazu, SchlÃŒssel-ARRAYs auflÃ¶sen ohne die Zeile mehrfach aufzulisten (JOIN)
-	// Anwendung: FS-Nachweis BodenschÃ€tzung "Klimastufe + WasserverhÃ€ltnisse"
-	// 2018-11-09: Umstellung von "alkis_wertearten" auf individuelle Tabellen
-
+	// Dient dazu, SchlÃŒssel-ARRAYs auflÃ¶sen ohne die Zeile im JOIN mehrfach aufzulisten
+	// Anwendung: FS-Nachweis BodenschÃ€tzung
 	global $debug;
-	if ($element == 'ax_bodenschaetzung' AND $bezeichnung = 'entstehungsartoderklimastufewasserverhaeltnisse' ) {
-		$tabelle = 'ax_entstehungsartoderklimastufewasserverhaeltnisse_bodensc';
-	} elseif ($element == 'ax_bodenschaetzung' AND $bezeichnung = 'sonstigeangaben' ) {
-		$tabelle = 'ax_sonstigeangaben_bodenschaetzung';
-	}
+
+	if ($bez === 'e') {$tabelle = 'ax_entstehungsartoderklimastufewasserverhaeltnisse_bodensc';} 
+	elseif ($bez === 's') {$tabelle = 'ax_sonstigeangaben_bodenschaetzung';}
+
 	$sql="SELECT wert, beschreibung FROM ".$tabelle." WHERE wert IN (".$sqlin.") ORDER BY wert LIMIT $1 ;";
-	$v = array(100);
+	$v = array('9');
 	$res = pg_prepare("", $sql);
 	$res = pg_execute("", $v);
 	if (!$res) {
 		echo "\n<p class='err'>Fehler bei Werteliste.</p>";
-		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."<br>$1 = '".$sqlin."'</p>";}
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}
 		return;
 	}
@@ -609,5 +666,8 @@
 	}
 	pg_free_result($res);
-	if ($i == 0) {echo "(kein Treffer)";}
+	if ($i === 0) {
+		echo "(kein Treffer)";
+		if ($debug > 2) {echo "\n<p class='dbg'>SQL=<br>".htmlentities($sql, ENT_QUOTES, "UTF-8")."</p>";}
+	}
 	return;
 }
@@ -669,8 +729,8 @@
 	$arr=explode("-", $fskennz, 4); // zerlegen
 	$zgemkg=trim($arr[0]);
-	if (strlen($zgemkg) == 20 and !isset($arr[1])) {
+	if (strlen($zgemkg) === 20 and !isset($arr[1])) {
 		$fskzdb=$zgemkg; // ist schon Datenbank-Feldformat
 	} else { // Das Kennzeichen auseinander nehmen. 
-		if (strlen($zgemkg) == 6) {
+		if (strlen($zgemkg) === 6) {
 			$land=substr($zgemkg, 0, 2);
 			$zgemkg=substr($zgemkg, 2, 4);
@@ -687,5 +747,5 @@
 			$znenner="";
 		}
-		if (trim($znenner, " 0.") == "") { // kein Bruch oder nur Nullen
+		if (trim($znenner, " 0.") === "") { // kein Bruch oder nur Nullen
 			$znenner="____"; // in DB-Spalte mit Tiefstrich aufgefÃŒllt
 		} else {
