
          ,,_
        o"   )~
         '' ''
        +----------------------------------------------------------------------+
          adresSQL
        +----------------------------------------------------------------------+
          Copyright (c) 2009 Matthias Nitzschke (mn-portal.at)
          Version: see vars/version.var
          Web: http://www.mn-portal.at
        +----------------------------------------------------------------------+
          Author: Matthias Nitzschke &lt;office@mn-portal.at&gt;
        +----------------------------------------------------------------------+

    ##########################################################################################################################################

    Stand: April.2026
    Diese Textversion ist in UTF-8 kodiert

    ##########
    # INHALT #
    ##########

    A.  Haftungsausschluss und allgemeine Hinweise

        1. Haftungsausschluss
        2. Spenden
        3. Software Dritter
        4. Tests

           a. Der sql_mode "ONLY_FULL_GROUP_BY" und "STRICT_TRANS_TABLE"
           b. Die Funktion get_header_path()
           c. Cookie-Namen
           d. Mailversandt

        5. Zusatz-Module
        6. Sicherheit (login Passwort verloren?)

            a. apache2 und pam-auth

        7. Dateirechte
        8. GLOBAL in Funktionen

    B.  Notwendige Programme und Webserver-Module

		1. Systemprogramme

    C.  Installation und erstes Login

        1. Welchen Editor verwenden
        2. Quick and dirty install
        3. Schritt für Schritt install

              i. connect.php anpassen
             ii. conf.php anpassen
            iii. Hochladen aller Dateien, Verzeichnisse und deren Inhalte
             iv. Rechte setzen
              v. install.php aufrufen
            vii. Config neu einlesen

        4. Online Update
        5. Manuelles Update

	D. 	Einstellungen, Module, Hilfe ....

        1. Eigene Felder/DROPDOWN anlegen
        2. User Konfiguration ändern
        3. Karteien/Subdatenblätter ein/ausblenden
        4. User-Uploads
        5. Bildergalerie
        6. Events
        7. Hilfe
        8. Security-Modul

    E.  Zentral/Filialdatenbank

    F.  Häufige Fragen und Probleme

        1. Beim Speichern der Sprachdatei werden die Einstellungen nicht übernommen
        2. Kann man die Feldnamen der Adressentabelle umdefinieren
        3. Wie kann man den Mailer des Scripts aufrufen
        4. Accesskeys loggen mich aus
        5. Manche Einstellungen ziehen nach dem Ändern nicht
        6. ImageMagick "not authorized" PDF errors

    G.  Tricks

        1. Adressfelder ausblenden
        2. Accesskeys im Firefox umstellen
        3. Charset, Kodierung ändern
        4. Ort an eine online-Kare übergeben
        5. Zusätzliche Links in den Datenfeldern
        6. Suche mit oder ohne preg_quote()
        7. Anzeigefelder in Adressverknüpfung
        8. PHP 7.3 Fehlermeldung bei PDF-Vorschau
        9. Datensätze klonen und weiter bearbeiten

    H.  Kurze eigene Bemerkungen

        1. Wichtige Nebensächlichkeiten
        2. Kleinkram und Erwähnenswertes

    I.  Wawi-Modul
    J.  Windows als Server
    K.  Gibt`s noch etwas
    L.  Rerservierte Variablen und Dateinamen
    M.	php7 und mariadb auf dem Server
    N.  ssmtp um Mails zu versenden

    ##########################################################################################################################################

    A. Haftungsausschluss und allgemeine Hinweise
    ---------------------------------------------

        1 Haftungsausschluss
        --------------------

        Die Nutzung des Scripts geschieht immer auf eigenes Risko und eigene Gefahr. Der Author hat den Code nach bestem Wissen erstellt,
        was die 100%'ige Fehlerlosigkeit natürlich nicht gewährleistet.
        Für Schäden, die durch die Nutzung oder Installation des Scripts entstehen oder entstanden sind, wird keinerlei Haftung übernommen
        und es können keine Rechtsansprüche, welcher Art auch immer, abgeleitet werden.

            IN KEINEM WIE AUCH IMMER GELAGERTEN FALL KANN DER AUTOR FÜR IRGENDWELCHE DIREKTEN ODER INDIREKTEN, ZUFÄLLIGEN,
            BESONDEREN ODER BEISPIELHAFTEN SCHÄDEN (EINSCHLIESSLICH ABER NICHT AUSSCHLIESSLICH DER LIEFERUNG VON ERSATZGÜTERN ODER DIENSTEN;
            VERLUST DER NUTZBARKEIT, DER DATEN ODER DER GEWINNE ODER ETWAIGEN VERDIENSTAUSFALL-ENTSCHÄDIGUNGEN) HAFTBAR GEMACHT WERDEN, WIE
            AUCH IMMER SIE VERURSACHT WURDEN UND WELCHE HAFTUNGSMÖGLICHKEIT ZUGRUNDE GELEGT WIRD, SEI ES DURCH VERTRAG, VERBINDLICHKEIT ODER
            SCHADEN (EINSCHLIESSLICH FAHRLÄSSIGKEIT), DIE AUS DER VERWENDUNG DIESER SOFTWARE ERWÄCHST, SELBST WENN AUF DIE MÖGLICHKEIT
            SOLCHER SCHÄDEN HINGEWIESEN WURDE.

        Das Script steht in der ausgelieferten, (auf mn-portal.at downloadbaren) aktuellen Version unter der Lizenz der GPL (GNU GENERAL
        PUBLIC LICENSE) Version 3. Näheres siehe docs/license.txt und docs/COPYING oder https://www.gnu.org/licenses/gpl-3.0.html

        Die Weitergabe des Scriptes adresSQL unter eigenem Namen, ohne den Author als Urheber zu nennen, ist ausgeschlossen, ebenso ist die
        entgeltliche Weitergabe in jeglicher Form (Vermietung, Verkauf, Download etc.) nur mit ausdrücklicher Genehmigung der Authors möglich.
        Diese Version ist in diesem Umfang ausdrücklich kostenlos und es dürfen keinerlei Gebühren für die Nutzung verlangt werden.

        Die Copyrighthinweise (das Logo) und der Link zu Homepage des Autors dürfen aus der Kostenlosen Version nicht entfernt werden.

        Sie können das Script beliebig selbst anpassen, erweitern oder verändern.

        Es kann kein Anspruch auf Fehlerkorrekturen am Code erhoben werden.

        Die Lizenz (GPL) betrifft NICHT kostenpflichtige Module die von mn-portal zur Verfügung gestellt werden. Diese Module werden
        (wenn nicht anders angegeben) gegen einen einmaligen Unkostenbeitrag per Mail zugesandt und können danach zu eigenen Zwecken
        beliebig oft installiert und verwendet werden.

        Die kostenlose Weitergabe beauftragter und/oder käuflich erworbener Module an Dritte ist verboten. Ich behalte mir vor, extra
        angefertigte (kostenpflichtige) Module in späteren Versionen des Scriptes kostenlos zur Verfügung zu stellen.

        Abweichende Eigentums und Weitergabe Ansprüche müssen schriftlich vereinbart werden.


        2. Spenden
        ----------

        MEINE EIGENEN 2 CENT ZUM THEMA

        Ich bin eine one-man Show sprich, ich mache alles selber und im Alleingang. Ich denke mir aus, code, teste und behebe Fehler.
        Das kostet relativ viel Zeit und ist nicht gerade unerheblicher Aufwand. Hohe Kosten entstehen naturgemäss kaum, sieht man einmal von
        meiner Hardware ab, die alle paar Jahre erneuert werden muss und dann wäre da ja auch noch der Webspace, wo man den Code
        herunterladen kann. Meine Webseite ist werbefrei finanziert, ich trage die Kosten zu 100% selbst.
        Ich werde zwar nicht arm bei diesem Projekt, jedoch auch nicht reich.

        Ich würde mich in jedem Falle, wenn Euch das Script gefällt, über eine Spende sehr freuen. Verwendet wird die Spende um die Herrin
        des Hauses milde zu stimmen, was ich dadurch zu erreichen gedenke, indem ich mich, für ihre Geduld und Nachsicht für den Zeitaufwand,
        mit einer Einladung zum Essen bedanke.

        Spenden kann man über

            paypal an die Adresse sysop@mn-portal.de

        problemlos über die Internetverbindung (auch Sonn und Feiertags). Ich freue mich über jeden Cent, DANKE...

        PS.
        Ab sofort warte ich die Bildergalerie, den Userupload, die Events und die Verknüpfung von Adressen nur noch für Spender, die mir ein
        Mail an sysop@mn-portal.at oder sysop@mn-portal.de mit einer Spendenbestätigung senden. Der Grund ist einfach, freiwillig kommt da eher
        selten etwas und zumindest die Grundkosten sollten mit dem Script einspielbar sein.



        3. Software Dritter
        -------------------

        Verwendete Software Dritter um dieses Script zu verwirklichen:

        * tinymce (Javascript Editor)
        * jodconverter (Schnittstelle zu OpenOffoffice um Dokumente ins PDF-Format zu konvertieren)
        * JQery (Javascript Libary für Animationen, Kalender und andere hübsche Funktionen)
        * wz_tooltip von Walter Zorn
        * jquery.tablednd von Denis Howlett

        Recht herzlichen Dank an die Programmierer, die ihre Arbeit kostenlos zur Verfügung gestellt haben.
        Die genannten Scripte waren zum Zeitpunkt der Erstellung von adresSQL frei. Rechtliche Anderungen (z.B. Lizenzänderungen)
        durch Updates oder Austausch dieser Scripte, sind nicht ausgeschlossen und Updates erfolgen auf eigene Gefahr.


        4. Tests
        --------

        Das Script wurde zwar bei einer eher ungewöhnlich hohen Auflösung von 1600x1200 erstellt, aber mit einem Viewport von 1200x860
        getestet und bietet in seiner derzeitigen Fassung natürlich bei einer Auflösung in diesem Bereich den besten Bedien-Kompfort.
        Anpassungen können über die CSS Datei erfolgen.

        Getestet wurde mit den Browsern Palemoon, Iceweasel, Firefox, Opera, Galeon, Chromium, Vivaldi und Konqueror ohne nennenswerte
        Unterschiede Der Internetexplorer (bis vers 8) macht wie immer bei Kleinigkeiten "männchen", wird von mir aber wegen nichtkonformen
        W3C Verhaltens ignoriert. Wer auf den IE nicht verzichten kann, muss Kleinigkeiten in der CSS-Datei selber anpassen oder vielleicht
        regelt sich das ja durch Updates selber :-)
        Gecoded wurde das Script auf:

        Debian-Jessie mit MYSQL-Server 5.5.43-0+deb8u1 und PHP 5.6.14-0+deb8u1
        Debian Jessie 5.5.5-10.0.23-MariaDB-0+deb8u1
        Debian Stretch 5.5.5-10.1.26-MariaDB-0+deb9u1 und PHP 7.0.30-0+deb9u1 und dem Scripteigenen mysqli-wrapper
        Debian Buster 5.5.5-10.3.31-MariaDB-0+deb10u1 und PHP 7.3.31-1~deb10u1 und dem Scripteigenen mysqli-wrapper
		Debian Trixi 6.12.63+deb13-MariaDB-11.8.3 und PHP 7.4.33 und dem Scripteigenen mysqli-wrapper

        Da PHP ab PHP-Version 7 voraussichtlich die mysql-extension auflassen wird, wurde dem Script ein mysqli-wrapper
        hinzugefügt und getestet. Der wrapper schaltet sich automatisch zu, sollte die mysql-extension nicht gefunden werden. es muss also
        keine besondere Einstellung vorgenommen werden.
        Ebenfalls enthalten ist ein ereg_wrapper von JoungKyun.Kim der die verwendeten alten ereg-funktionen ersetzt. Auch hier ist eigentlich
        kein Eingreifen  des Anwenders notwendig.

        Dem Script wurde weiters ein sql-wrapper hinzugefügt, über den z.B. eine Anbindung an eine Postgres Datenbank verwirklicht
        werden könnte (ich habe das nicht getestet). Ob und welche SQL-Statements angepasst werden müssen, ist jedoch noch nicht dokumentiert.

        Dem Script (ab Version 1.3029) wurde ein komplett neuer Datei-Cache verabreicht, der wesentlich weniger Leseprozesse an Datein
        vornimmt. Natürlich habe ich das getestet, aber hin und wieder stolpere ich noch immer über kleinere "Problemchen".
        Sollte es zu massiven Problemen kommen, kann man den Cache löschen, indem man sich einfach ausloggt, die logout.php direkt aufruft
        oder in der Datensatzübersicht, unter Config den Button "Filecache Reset" betätigt.

        Seit Version 1.3031 ist die Erstellung von Vorschaubildern für PDF-Dateien auch zentral verwaltbar, was erhebliche Geschwindigkeits-
        vorteile bringt und natürlich auch Platzersparnis. Diese Möglichkeit ist per Default voreingestellt, kann aber über die Konfiguration
        rückgängig gemacht werden.

        Obwohl ich das Script als Adressverwaltung im Netz bereit stelle, kann es natürlich auch für viele andere Zwecke eingesetzt werden.
        Ich selbst nutze adresSQL z.B. zusätzlich als Inventardatenbank für IT-Geräte. Dazu sind nur einige Übersetzungen nötig und schon
        heissen die Felder anders, ein paar Felder hinzufügen und schon ist eine zusätzliche Anforderung abgedeckt.
        Andere (mir bekannte) User habe das Script z.B. als Zimmerverwaltung, als Nachschlage-Datenbank für Texte, als Bildindex für Fotografen
        und als Vereinssoftware (Kleingartenvereine) im Einsatz.
        Was ich damit sagen möchte ist, dass der Einsatz des Scripts nicht auf die Verwaltung von Adressen beschränkt ist oder bleiben muss.
        Wer das Script anpasst und zu etwas anderem umbaut, darf mir gerne einen Link schicken und ich Lege einen Verweis auf meiner Seite an.

        Wer selber Hand anlegen möchte, sollte die GZIP Komprimierung abschalten, es kann sonst sein, dass bei Fehlern die Anzeige nicht
        funktioniert.

        Erschrecken Sie nicht auf Grund der grossen Anzahl an Verzeichnissen und Unterverzeichnissen, ich lege gerne Ordner an ;-)
        Verzeichmisse nehmen keinen Platz auf der Platte ein und Strukturen lassen sich über Verzeichnnisse besser abbilden.


            4.a
            Der sql_mode "ONLY_FULL_GROUP_BY" und "STRICT_TRANS_TABLE"
            (https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sql-mode-strict)
            -----------------------------------------------------------------------

            Neuere Versionen von Mysql arbeiten in diesem Mode und erlauben SQL-Statemenst in der Form "SELECT * FROM blablabla... GROUP BY..."
            nicht mehr und werfen einen Fehler wegen des SELECT *.
            Mariadb arbeitet seit Neuem mit STRICT_TRANS_TABLE und/oder STRICT_ALL_TABLES und macht deswegen auch bei SELECT * Probleme, man
            kann keine Daten ohne Standardwerte setzen etc. Es ist also nötig da etwas zu unternehmen!

            Will man die Konfiguration auf Dauer änderen, ist es ratsam, die Konfiguration von mysql/mariaDB anzupassen und in der Datei my.cnf
            folgenden Eintrag hinzuzufügen/ändern!

                    [mysqld]
                    sql_mode = "NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

            Dann starten Sie mysql neu. Nun wird mysql immer im "alten" Modus gestartet. Im Anhang M finden Sie auch eine Lösung, wenn Sie sich
            nicht mehr als root an der Datenbank anmelden können.

            Oder man nutzt adresSQL um die Werte vorübergehend (für die SESSION) zu ändern.

                HINWEIS!
                -------
                adresSQL arbeitet mit SELECT *, was sich logisch daraus ergibt, dass jeder Anwender beliebig viele Felder selbst anlegen kann
                und  man ohne SELECT * permanent die Scripts anpassen müsste.
                Entweder man lebt also damit und bringt Mysql dazu das zu akzeptieren und ändert die DB-Konfiguration entsprechend, oder
                Man sucht alle Feldnamen heraus, frickelt sich dann mit einer Funktion ein SQL-Statement mit allen Feldnamen zusammen und
                verwendet dieses an Stelle des *.
                Klingt aufwendig und fehleranfällig und das ist es vermutlich auch, nichts desto trotz ist das eine der beiden Optionen die
                adresSQL als Lösungsansatz anbietet. Hier also beide Varainten, um Fehlern vorzubeugen!"

            Variante 1.
            Man bleibt bei SELECT * und entfernt einfach problematische Parameter aus der Datenbankkonfiguration! Dazu verwenden MariaDB
            und MySQL den Paramter SQL_MODE.
            Ich rate dringend davon ab, den SQL_MODE komplett auf leer (also "") zu setzen, wie es einige Webseiten empfehlen, da viele der Vor-
            einstellungen durchaus sinnvoll sind. Genaueres kann man hier nachlesen:

                    https://www.it-swarm.dev/de/mysql/deaktivieren-sie-only-full-group-by/1047576785/

                Ich nutze Mariadb erfolgreich mit einem SQL_MODE=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

                Mit der Anlage einer Textdatei "vars/SQL_MODE" kann man auf 2 Arten das Problem mit SELECT * über adresSQL zu beheben!

                a.
                Legt man eine leere Datei an, liest adresSQL den aktuellen Wert von sql_mode aus, entfernt nur ONLY_FULL_GROUP_BY und setzt die
                restlichen  Einstellungen wieder.

                    Bsp: sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES

                nach dem entfernen von ONLY_FULL_GROUP_BY wird mittels Query sql_mode für die Session mit

                    sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

                wieder neu gesetzt.

                b.
                Schreibt man in die Datei die zu setzenden Werte (z.B. NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION) wird der Inhalt der Datei
                mittels Query  an die Datenbank gesendet.

                !! WICHTIG !!
                -------------

                Der Befehl gilt immer für die Session und wird mittels

                    @sql_query("SET SESSION sql_mode = '".$smode."'");

                gesendet.
                !! Das ist wichtig zu verstehen, da hier keine Konfiguration an den Server-Konfig-Dateien vorgenommen wird und der Server ausser
                in dieser einen Session, mit seinen Einstellungen vor der Änderung arbeitet!
                Nach dem Schliessen des Browsers sind alle Einstellungen wieder so, wie sie vorher waren. Die geänderten Einstellungen betreffen
                andere Scripts oder andere Programme also nicht.

                Ich habe die Übergabe mit Mysql und Mariadb erfolgreich getestet.
                Achten Sie darauf, dass die Art der Parameterübergabe vor jedem Verbindungsaufbau mit der Datenbank gesendet wird und nur für
                die aktuelle  Session gilt. Um die Parameter permanent zu setzen ist es zielführendet die Konfigurationsdateien anzupassen und
                die adresSQL-Datei "vars/SET_MODE" zu löschen.

            Variante 2.
            Man lässt adresSQL SELECT * FROM durch die Tabellen Spaltenbezeichner ersetzen. Dazu verwende ich eine neue (experimentelle) Funk-
            tion die SQL-Statements auf SELECT * untersucht und durch die passenden Tabellenspalten Bezeichner ersetzt.
            Um die Funktion zu aktivieren, legt man im Verzeichnis vars einfach eine leere Datei mit dem Namen CLEAN_QUERY an.
            Per Default ist diese Funktion NICHT aktiv.

            !!
            Bitte beachten Sie, dass es bei dieser Variante u.U. zu Komplikationen und Fehlern kommen kann, ich habe noch nicht alle Spielarten,
            die im Laufe der Zeit zusammengekommen sind, getestet, ausserdem habe ich durch die freie Definition vieler Parameter keinen
            Einfluss auf die verwendeten SQL-Statements (man denke z.B. nur an Berichte oder den Serienbrief).
            Aktuell läuft meine eigene Datenbank mit eben diesem Parameter, so ich etwas übersehen habe, werden sich sicher bald Fehler
            einstellen.

            Den Fehler "Feld XX enthält keine Standardwerte..." kann  man mit dieser Variante jedoch nicht ausmerzen, dazu muss man aus dem
            SQL_MODE alle STRICT Werte entfernen. Ähnliches gilt für NULL als Datumswert, oder "Division by zero" Fehlern und und...


            4.b
            Die Funktion get_header_path()
            ------------------------------

            adresSQL verarbeitet Formulareingaben vereinzelt mit der Funktion header() und erzwingt mit dieser Funktion, dass neue Einstellungen
            neu geladen werden oder leitet nach der Verarbeitung von Informationen mit header() zu einem anderen Script weiter.
            Um Manipulationen dieser Weiterleitung zu verhindern, errechnet die Funktion get_header_path() den absoluten Pfad des Scripts.
            adresSQL errechnet einen absoluten Pfad (also mit http(s)://.....) was verhindert, dass man scripts local auf einem Rechner aus-
            führen und dann auf eine andrere URL als die Unrsprüngliche umleiten kann. Solche Features sind durchaus sicherheitsrelevant können
            aber manchmal zu unerwünschten Nebeneffekten führen, so dass z.B. das aufgerufene Script nicht gefunden werden kann, weil die URL
            nicht korrekt ist.

            Sollten Probleme auftreten oder sollten Sie nur lokal mit adresSQL arbeiten können Sie den Aufruf in der Konfiguration unter
            Pfaden ändern, indem Sie den Parameter $config['use_abs_path'] auf 0 (NULL) setzen. Danach verwendet adresSQL die relativen
            Pfade.

            Erstellen Sie im root-Verzeichnis eine Datei "LOG_HEADER_PATH" dann wird unter /vars/headerpath.var eine Logdatei erstellt,
            die das Datum, den errechneteten Pfad und die aufrufende Datei loggt.

            Mehr zum Thema relative und absolute Pfade findet man auf php.net.


            4.c
            Cookie-Namen
            ------------

            Wer mehrere Instanzen nebeneinander laufen lassen möchte (gemeint ist z.B. als Adressverwaltung UND als Inventardatenbank gleich-
            zeitig)
            sollte nicht vergessen, in der Konfiguration den Cookienamen anzupassen und jeder Instanz einen anderen Namen geben, da sich die
            Instanzen sonst die Sessions u.U. teilen und es zu unerwünschten Nebeneffekten kommt, z.B. nutzt die Adressverwaltung den Cache
            der Inventardatenbank, angelegte Felder verschwinden etc.
            Seit Version 1.4202 wird der adresSQL-Cache mit der session_id als Index angelegt und es sollte keine Varaibelenüberschneidungen
            geben, aber Entwickler von Browsern gehen da offenbar andere Wege und ich habe immer wieder mal Sessions, die sich überscheiden,
            obwohl sie das eigentlich nicht sollten.

            !! ACHTUNG !!
            Die hier, unter Punkt 4 genannten Punkte, haben Einfluss auf die Sicherheit, sollten daher mit Bedacht geändert oder angepasst
            werden.


            4.d
            Mailversandt
            ------------

            adresSQL kann Mails senden. Um Missbrauch zu verhinderen, habe ich für die Verwendung der mail() Funktion eigene Tamplates gebaut,
            jedoch kann, mag und will ich nicht alle Mailclients warten bzw Handy und Co sind unausgereift und fehlerhaft und somit nicht mein
            Job.
            Manche zeigen beim Versandt von HTML-Mails attachments an die leer sind, andere lesen die Textalternative aus und zeigen diese
            zusätzlich zum HTML-Inhalt an, es gibt da Variationen wie Sand am Meer. Insbesondere Apple und MS kochen da ihre eigenen Süppchen.

            Liebe User:
            Nur weil in irgend einem Apfeltool leere Attachments mit einer Grösse von 0 Byte angezeigt werden, ist ein Mail noch kein Spam.
            Ich nutze und teste thunderbird als Mailprogramm und kann unter Linux manche gemeldete Probleme (die sehr oft keine sind) nicht
            nachvollziehen.

                Spam/Junk siehe hier: https://de.wikipedia.org/wiki/Spam


        5. Zusatz-Module
        ----------------

        *   Das Warenwirtschafts-Modul erlaubt es die Adressdatenbank zu einer kleinen WAWI zu machen und Aufträge, Rechnungen und Liefer-
			scheine damit zu erstellen und sein Mahnwesen und Lager zu vereinfachen. Zugegeben, dieses Modul ist nicht frei (€70) aber es
            erleichtert den Arbeitsalltag doch sehr.
        *   Die "eigene Übersichtsanzeige" erlaubt die Suche nach einer Auftrags/Lieferschein oder Rechnungsnummer und gibt einen Link zum
            entsprechenden Datensatz aus.
        *   Die Zeiterfassung erlaubt es über ein simples Login/Logout die Anwesenheitszeiten aller User zu erfassen und auszuwerten.
        *   seit Version 1.4202 können Zeiten (Gutstunden/Fehlstunden) aus Vorperioden mitgenommen werden.
        *   Der Netzwerk-Scan kann Netzwerkfähige Scanner ins Script inkludieren und basiert auf PHP-sane. Ixch nutze einen Kyocera M5521cdn
			der komplett, ohne Treiber etc erkannt wird.
        *   Die Umkreissuche erlaubt es aus einer Postleitzahlen-Tabelle alle User in einem Umkreis von frei definierbaren XX Kilometeren zu
            suchen und eine Datei mit diesen Usern "downzuloaden".
            Ich unterstütze derzeit die Länder Deutschalnd, Österreich, Schweiz, Belgien und Lichtenstein, fehlende/neue PLZ können selbst
            nachgetragen werden. Wie das geht reiche ich nach.
        *   Die Admin-Tools erweitern das Script um mehrere Funktionen, die entweder die Administration erleichtern oder neue Funtionen dem
            Script hinzufügen. Hier sei insbesondere die Bindung der Nutzung an feste IP`s genannt, die dem Script zusätzliche Sicherheit
            verleihen. Die Admin-Tools sind Personen vorbehalten, die sich durch eine Spende hervorgetan haben, das Plugin
            "Crypt Metghoden listen" wurde mir kostenlos zur Verfügung gestellt.
        *   Der Serienbrief erlaubt es, wie der Name schon sagt, Serienbriefe zu generieren und eigene Adressabfragen dafür zu nutzen, das
            Ergebnis kann mit anderen Usern über Textbausteine geteilt werden.
        *   Libreoffice kann als Hintergrunddienst laufen und die automatische Konvertierung von diversen Datei-Uploads ins PDF-Format
			vornehmen.
        *   Die Bildergalerie liest EXIF-Informationen der Bilder aus und erlaubt es z.B. per Klick den Aufnahmeort auf einer Karte anzeigen
            zu lassen.
        *   Das Klonen von Datensätzen vereinfacht die Anlage ähnlicher Daten.

        Ich fertige natürlich auch gerne auf Anfrage ein Modul an.


        6. Sicherheit
        -------------

        Sensible Daten müssen (eventuell mit einer Firewall) vor Zugriffen geschützt werden!

        Das bedeutet:
        Eine öffentlich zugängige Installation hat natürlich ihre Schwächen. Eine falsche Konfiguration des Webservers bzw des Mysql-
        Servers kann Angreifern den Zugriff auf Ihre Daten ermöglichen.

        Das soll nicht bedeuten, dass das Script an sich unsicher ist. Das Script selbst nutzt PHP und alle damit verbundenen Dienste.
        Sind diese Dienste abgesichert, sollte auch das Script sicher sein.

        Mein Haupt Augenmerk liegt natürlich auf der Funktionsweise des Scripts, was nicht bedeutet, dass ich Sicherheitsrelevante  Regeln
        ausser Acht gelassen habe. Nur teste ich meine Scripte vorwiegend auf Funktinalität, nicht auf hohe Sicherheit oder wie man das Script
        austricksen kann, soll heissen, ich bin mir sicher, wenn jemand es bewusst darauf anlegt an adresSQL-Daten heran zu kommen, wird es es
        vermutlich auch schaffen.

        Wer sensible Daten mit dem Script verwalten möchte, sollte sich mit den Möglichkeiten der Absicherung beschäftigen, unter Punkt 4 habe
        ich bereits  den einen oder anderen Hinweis gegeben.
        Ein einfache und gängige Methode ist z.B. .htaccess, die auch von allen guten Servern unterstützt wird. adresSQL nutzt diese Grund-
        funktion der Webserver um schützenswerte Daten in Dateien abzulegen, die der Server allein durch Wahl eines entsprechenden Datenamens
        schützt.

        Spender bekommen für den security-Mod ein Admin-Tool, mit dessen Hilfe man eine Datei aus IP-Adressen erstellen kann, die beim Login
        abgefragt werden. Entspricht die IP beim Login keiner der dort angelegten IP-Adressen, wird ein Login verweigert. Das Tool bedient sich
        dabei der .htaccess Funktionalität des Webservers, der die Anzeige und Auslieferung aller Datein, die mit .ht beginnen, verweigert.
        Natürlich kann die Datei auch manuell erstellt und hochgeladen werden, siehe dazu auch Punkt D Unterpunkt 8

        Bitte verwechseln Sie diese Möglichkeit nicht mit der Einschränkung mittels Passwort über .htaccess. Die Absicherung über .htaccess wird
        vom Webserver geprüft, die Admin-Tool Variante wird per Script geprüft und ist unabhängig vom Webserver.

        Als Beispiel für .htaccess diene ein Upload einer Datei.
        Uploads werden in Unterverzeichnissen des Scripts (/templates/adressenscript/uploads) angelegt, wo ein Verzeichnis für jede
        Userid der Adressdaten existiert (wenn Dateien zu dieser ID hochgeladen wurden).
        Wer externen Zugriff auf diese Verzeichnisse erlaubt, erlaubt es auch, Dateien aus diesem Verzeichnis über eine URL zu laden und zu
        betrachten.
        .htaccess kann nun z.B. über die Direktive "Order allow,deny" dazu genutzt werden, um dem Webserver mitzuteilen, dass dieses Verzeich-
        nis gesperrt ist und so auf dieses Verzeichnis nicht mehr direkt zugegriffen werden kann. Definiert man nun eine Ausnahme für einen
        IP-Adressbereich wäre das Uploadverzeichnis geschützt und nur für ausgewählte User doch zugreifbar.

        Der volle Funktionsumfang des Scripts kann imho ohnedies nur genützt werden, wenn man einen eigenen Server einsetzt bzw wenn man ein
        paar Grundkenntnisse für Webserver mitbringt. Damit sollte es auch kein Problem sein, den Server vor Zugriffen zu schützen, bzw Regeln
        zu definieren, die nur ausgewählten Usern Zugriff erlauben.
        Wer es ganz streng mag, kann .htaccess dazu nutzen vor der Nutzung des Scripts abzufragen, ob der User den Server überhaupt nutzen darf
        und dann erst als zweites das Userlogin abzufragen.

        Ich selbst nutze pam Authentifizierung am apache2 und nutze den security-mod und gebe nur bestimmte IP-Adressen für die Nutzung des
        Scripts frei, alle nicht eingetragenen IP-Adressen werden so ohne weitere Nachfrage geblockt.

            6.a
            apache2 und pam-auth
            --------------------

            Noch härter wird der Server indem man ein Verzeichnis mit pam-auth schützt und die Nutzung auf User beschränkt, die auch im Linux
            System angelegt sind. Eine Anleitung wie ich sie selbst verwende findet man hier:

                https://www.server-world.info/en/note?os=Debian_10&p=httpd&f=10


        Seit Version 1.3031 gibt es nun in der Administration ein Script, dass die Erstellung einer solchen .htaccess-Datei erleichtern
        soll. Damit können Sie simple Restriktionen und Einschränkungen auf bestimmte IP-Adressen mit wenigen Klicks generieren.
        Der Admin-Bereich ist seit Version 1.30xx durch eine eigene .htaccess-Datei zusätzlich geschützt und erlaubt keinen direkten Aufruf
        der eigentlichen Scripte, die im Verzeichnis /templates/admin/adminform untergebracht sind. .htaccess muss dafür installiert, konfi-
        guriert und lauffähig sein. Durch diese Datei können die enthaltenen Scripte nur mehr von PHP aufgherufen werden, so kann eine Kon-
        trolle des  Logins nicht mehr so ohne weiteres umgangen werden.

        Im Installationverzeichnis und einigen Unterverzeichnissen diverser Module liegt eine Datei .htaccess, die das direkte Listen der
        Verzeichnisse b.z.w den direkten Aufruf unterbindet, sofern Ihr Server .htaccess unterstützt. Der apache2 vererbt diese Rechte, wenn
        eine Datei im roots-Verzeichnis liegt, andere machen das nicht und der Schutz ist in jedem Verzeichnis extra anzugeben.
        Sie können hier weitere Einschränkungen vornehmen.

            ./.htaccess
            ./templates/admin/backup/.htaccess

        Bei Problemen können Sie diese Datei(en) auch löschen, Sie verlieren aber den .htaccess-Schutz.

        Bei Dateien, die sensible Daten beinhalten könnten, verlasse ich mich darauf, dass der Webserver .ht Dateien besonders schützt und
        versehe diese Dateien im Namen mit dem Präfix .ht. Der Apache verweigert auf Dateien, mit diesem Präfix, den direkten Zugriff, der
        Inhalt wird nicht ausgeliefert.


		Blablabla, wie geht das nun....

        Um adresSQL mit .htaccess sicher zu machen ist der einfachste Weg eine Passwortabfrage über .htaccess zu machen und User ohne
        Zugangsdaten erst garnicht auf den Server bzw das Script zugreifen zu lassen. Dazu findet man im Internet z.B unter

            https://wiki.selfhtml.org/wiki/Webserver/htaccess/Passwortschutz

        eine recht aufschlussreiche Quelle. Kurz gesagt, man muss eine Datei .htaccess im Baseverzeichnis mit folgendem Inhalt erstellen:

            AuthType Basic
            AuthName "Geschützter Bereich - Bitte geben Sie ein Passwort ein!"
            Require valid-user
            AuthUserFile /var/www/adressql/.htpasswd

        Weiters braucht man eine Datei .htpasswd in der die User und Ihre verschlüsselten Passwörter liegen. Der Webserver muss natürlich
        .htaccess unterstützen.
        Ruft man nun die URL von adresSQL auf, wird nach einem User und einem Passwort gefragt. Nur wer einen gültigen Zugang hat bekommt
        Zugriff, allen anderen wird der Zugang komplett verweigert.

            Ein Wort zum Login!

                Du kannst dich an das Login Passwort nicht mehr erinnern?
                Nun, wer phpmyadmin oder ein anderes Tool im Einsatz hat, kann das schnell wieder ändern. Es gib ein paar Möglichkeiten.
                Wer viele User angelegt hat geht zu Punkt 2, das setzt aber eine fehlerfreie Installation von php und Zugriff auf eine Konsole
                voraus. die folgende Lösung funktioniert, wenn man nur Zugriff auf ein Wartungstool hat, löscht aber alle anderen User!

                1.
                Verbinde dich mit phpmyadmin und leere die Tabelle 'user' und führe dananch folgenden SQL-Befehl aus!

                INSERT INTO `user` (`user_id`, `anmeldename`, `vorname`, `nachname`, `passwort`, `is_admin`, `zusatz`, `einstellung`, `l_login`, `e_mail`, `language`, `readonly`)
                    VALUES (1,	'Keine_Anmeldung',	'Keine',	'--',	'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababaxxx8976q',	0,	'',	NULL,	'',	'',	'de',	0),
                    (2,	'admin',	'Administrator',	'Erstzugang',	'21232f297a57a5a743894a0e4a801fc3',	1,	'Erstzugang',	'20,2,3,4,5,6,7,8,9*6,8',	'1772636063',	'',	'de',	0);
                    -- 2026-06-16 06:11:29 UTC

                Es wird der User admin mit dem Passwort admin neu angelegt.
                danach kann man sich einloggen und wie nach einer Neuinstallation vorgehen, also user anlegen und admin löschen.
                Aufpassen, es gehen alle anderen user verloren, wer also mehrere User angelegt hat, muss diese wieder anlegen.

                2.
                Ich verwende als Standard md5 als Schlüssel für die Zugänge. Generiere also ein neues Passwort. Wenn php korrekt installiert
                ist kann man auf der Konsole mit folgendem Befehl ein neues Passwort generieren:

                    php -r "echo md5('Dein_Neues_Passwort');"

                Die Ausgabe sollte für das Passwort admin so aussehen:

                    21232f297a57a5a743894a0e4a801fc3


                Verbinde dich mit phpmyadmin oder adminer und gehe auf die Tabelle user. Ändere den gewünschten user und trage das generierte
                Passwort in die Spalte 'passwort' ein. und speichere das Ganze und nun sollte ein Login mit Username und dem neuen Passwort
                funktionieren.

                3.
                Lege ein PHP-Script als test.php in dein adresSQL Verzeichnis mit folgendem Inhalt:

                    <?php
                    $config['use_crypt_method'] = 'md5';
                    $config['use_crypt_option'] = '';
                    require_once('function.php');
                    echo use_pwd_hash('Dein_Neues_Passwort');

                ersetze vorher "Dein_Neues_Passwort" mit deinem Wunschpasswort. Starte das Script und kopiere die Ausgabe!

                Verbinde dich mit phpmyadmin oder adminer und gehe auf die Tabelle user. Ändere den gewünschten user und trage das generierte
                Passwort in die Spalte 'passwort' ein. und speichere das Ganze und nun sollte ein Login mit Username und dem neuen Passwort
                funktionieren.

                Danach unbedingt die test.php Datei wieder löschen, sonst kann jeder dein neues Passwort sehen.

        7. Dateirechte
        --------------

        In der Administration finden Sie in den Tools ein Script, dass die Script-Konsistenz prüft. Klicken Sie auf den Button "Rechte und
        Module überprüfen", wird im Verzeichnis /vars eine Datei (.httobig) erstellt, die Ihnen Auskunft über zu hoch gesetzte Rechte gibt.
        In diesem File sind Alle Dateien mit Ihren aktuellen (zu hohen) Rechten und den zu setzenden Rechten aufgelistet.

        Generell gilt, dass Dateien mit der Endung .php keine Ausführungsrechte benötigen. Normaler Weise sollten dieser Datein die Rechte
        640 (bzw 644) reichen (Eigentümer darf lesen/schreiben, Gruppe dürfen nur lesen, Andere kein Zugriff oder lesen).
        Da PHP die Datei mit dem User www-data ausführt muss www-data eigentlich nur in der Gruppe der Berechtigten sein.

        AdresSQL macht im Normalfall nur bei Verzeichnissen eine Ausnahme von der Regel.
        Da ich über Scripte Daten in Verzeichnisse schreibe ist in manchen Fällen ein chmod 777 notwendig um Zugriff zu den Verzeichnissen
        zu erhalten. Bei Script-Fehlern nach einer Neuinstalltion sind meistens Rechte die Ursache.


        8. GLOBAL in Funktionen
        -----------------------

        PHP erlaubt es in Funktionen Variablen als "global" zu definieren, was sie auch ausserhalb der Funktion verfügbar macht. Das ist zwar
        in der gesamten Internet-Gemeinde verpönt (nicht zu unrecht wird auf Gefahren hingewiesen), jedoch sollte man nicht gleich in Hyper-
        vetilation verfallen, wenn man meinen Code liest und den Begriff "global $error, $config" findet.
        Zum Einen nutze ich diese Möglichkeit sehr bewusst, zum anderen hat man sich bei der Möglichkeit "global" ja etwas gedacht.

        Ich verwende diese Eiganschaft z.B. um Rückgabewerte auswertbar zu machen (z.B. in welchem Script ein Fehler passiert) oder um nicht
        jedes mal die gesamte Konfiguration neu einlesen zu müssen, weil ich in einer Funktion eine Konfig-Variable auswerten möchte. Auf
        Sicherheit habe ich dabei durchaus geachtet.
        Global hat, wenn man auf die Anwendung achtet durchaus auch Vorteile, sollte also jemand etwas finden, ich stehe für Anregungen zur
        Verfügung und scheue mich auch nicht zu diskutieren oder zu streiten...

        ...so don`t panic!


    B.  Notwendige Programme und Webserver-Module
    ---------------------------------------------

        1. Systemprogramme
        ------------------

        Um das Script im vollen Umfang und zu 100% nutzen zu können sind folgende Programme/Module notwendig:

        * Webserver (ideal apache2 auf Linux)
        * PHP 5 oder höher (mit GD Mudul) (PHP 4 wurde nicht explizit getestet, sollte aber sogar noch funktionieren)
        * PHP-Cli, falls Cronjobs mit den beigelegten Shell-Scripten aufgerufen werden sollen.
        * Mysql Datenbank (Server) oder besser noch mariadb (Server).
        * Für den Betrieb mit baikal ist der baikal-Server erforderlich. Zur Installation mit baikal-Unterstützung siehe zusätzlich
          die README_WITH_BAIKAL_CLDAV_SERVER. Der baikal-Server ist nicht inkludiert!

            !! ACHTUNG !!
            php 8 macht männchen, weil einige Funktionen wie zb utf8_encode nicht mehr existieren. Ich habe das Script NICHT entsprechend
            angepasst

        Um Vorschaubilder für PDF Dateien anzeigen zu können benötigt das Script

        *  imagemagick/graphicsmagick auf Systemebene
        convert tool zum Konvertieren von Dateiformaten (Shell Befehl)

        *  Imagick Modul PHP
           PHP-Wrapper fuer ImageMagick

        *  Open/Libreoffice um als Konvertierungsdienst gestartet zu werden oder alternativ
           abiword zum Konvertieren von Text (Word) Dateien -&gt; PDF (siehe dazu die eigene Readme umter some_help/o_office_dienst_de.txt)

        *  Einen MYSQL User mit entspechenden Rechten
           Der User, der sich mit der Datenbank verbindet braucht alle Rechte um Datenbanken und Tabellen erzeugen und
           verändern zu können.

        *  wget, wenn man von der Möglichkeit des Online-Updates gebrauch machen möchte. Updates können aber auch manuell über die
           Administration eingespielt werden.

        *  PHP-Zip-Unterstützung, um Module/Updates auspacken zu können oder um z.B. das File-Backup der Admin-Tools nutzen zu können

        *  Die eine oder andere Einstellung in der php.ini, z.B. u.U. allow_url_fopen, post_max_size etc. Vieles kann über .htaccess angepasst
           werden.

        Sie können die Verfügbarkeit aller notwendigen Programme und Module testen, indem Sie aus der Administration das Tool zum Testen
        der Script-Konsistenz aufrufen und dort den Punkt Rechte und Module überprüfen anwählen.
        Die Anzeige von Fehlern besagt nicht, dass adresSQL nicht funktioniert, das Script läuft mit einem Standard-Webserver problemlos,
        nur können Sie dann verschiedene Dienste des Scriptes (z.B. das Konvertieren von Dateien zu PDF) nicht nutzen.

        in der php.ini solten folgende Einträge angepasst werden:

            max_execution_time = 120
            max_input_time = 120
            max_input_vars = 5000
            post_max_size = 128M
            memory_limit = 256M

        individuelle Anpassungen können abweichen. Für die Server-Konfiguration sehe ich mich nicht verantwortlich.


    C.  Installation und erstes Login
    ---------------------------------

        Die aktuellste Version von adresSQL kann unter folgender URL als ZIP-File geladen werden.

            http://www.mn-portal.at/index.php?qwid=2


        1. Welchen Editor verwenden
        ---------------------------

        Sie müssen zumindest eine Datei (connect.php) in einem Editor anpassen.
        Achten Sie darauf, dass ihr Editor KEIN Unicode-Boom schreibt. Windows-Editoren sind da sehr eigen. Verwenden Sie einen
        geeigneten Editor wie z.B. geany oder PSPad o.Ä.

        Sollten Sie doch versehentlich ein Unicode-Bomm geschrieben haben, wird das Script wahrscheinlich mit dem Fehler

            Warning: Cannot modify header information - headers already sent by (output started at ... scriptname)

        seinen Dienst quittieren.


        2. Quick and dirty install
        --------------------------

        Wem es nicht schnell genug gehen kann, hier eine wirkliche Quick Anleitung:

            a. ZIP entpacken und im Verzeichnis docs die Readme lesen.

            b. connect.php, Einstellungen für den Datenbankzugriff festlegen
               Die Zugangsdaten zur Datenbank stellt der Provider zur Verfügung.

            c. Alle Dateien und Verzeichnisse ins Wunschverzeichnis hochladen und Rechte setzen.

            d.  install.php aufrufen.
                Das Script installiert sich eigentlich von allein, legt eine Datenbank an, erstellt alle Tabellen und man kann loslegen.

            e. Das erste Login erfolgt mit User=admin und Passwort=admin. Ändern Sie das Passwort und legen Sie sich einen neuen User mit
               Adminrechten an! Wenn Sie das Passwort nicht ändern, kann jeder mit Adminrechten in ihre Datenbank!


        3. Schritt für Schritt install
        ------------------------------

            i. connect.php anpassen
            -----------------------

            VOR dem Upload ist es notwendig die Datei connect.php mit den notwendigen Zugangsdaten zu versehen.
            Alle notwendigen Daten sind in der Datei connect.php einzutragen. Die Daten könnnen beim ISP/Service-Anbieter erfragt werden.
            Notwendig sind:

                Host (meistens localhost)  Var $db_host
                User                       Var $db_user
                Passwort                   Var $db_pass
                Datenbankname              Var $db_name

            Die anderen Einstellungen der connect.php müssen nicht bearbeitet werden.

            ACHTUNG !!
            Ich rate dringend davon ab, den Zeichensatz der Datenbank umzustellen. Wollen Sie dennoch eine andere Kodierung, lesen Sie
            Den Abschnitt G (Punkt 3.), dort steht beschrieben, wie sie eine spezielle Kodierung einstellen können.
            Ist einmal eine Wahl getroffen macht eine Umstellung während des Betriebes sicher Probleme, sollte man also die Codierung ändern
            wollen, ist es ratsam alles von neuem zu beginnen.

            MYISAM oder InnoDB?

            Die Frage stellt sich vor allem dann, wenn viele User auf die Datenbank zugreifen sollen. MYISAM ist bei einem Zugriff von
            3-4 Usern schneller, InnoDB ist aber "sicherer" , vor allem dann, wenn während eines Zugriffs die Verbindung zur Datenbank
            abbricht. Bei sehr vielen gleichzeitigen Zugriffen wird InnoDB wahrscheinlich auch schneller sein als MYISAM. Ein Vorteil
            von InnoDB ist auch das lock, das nicht die gesamte Tabelle betrifft sondern Datensatzweise geschehen kann.
            MariaDB ist meine erste Wahl, wenn man mit MyIsam arbeitet, da hier viele Fehler von Mysql gefixed wurden.

            Wie auch immer, vor der Installation sollten Sie entscheiden, welche Datenbankverbindung sie wünschen und den Eintrag in
            der connect.php entsprechend korrigieren.


            ii. conf.php anpassen
            ---------------------

            BEVOR SIE NUN WEITERMACHEN !

            In der conf.php habe ich die wesentlichen Usereinstellungen (ganz oben) extra zusammengefasst. Diese sollte man anpassen!

            Passen Sie die Verschlüsselungsmethode für Ihr Passwort Ihren Bedürfnissen an. Derzeit ist MD5 als Methode eingestellt.
            Die beiden Parameter die die Verschlüsselung einstellen sind:

                $config['use_crypt_method']             = 'md5';
                $config['use_crypt_option']             = '';

            Wenn Sie die Methode ändern wollen, gehen Sie wie folgt vor:

                Wollen Sie z.B. BLOWFISH als Passwortverschlüsselung verwenden ist in der conf.php ein Beispiel unterhalb der aktiven
                Parameter vorhanden.

                1.
                Entfernen Sie die REM`s (das sind die beiden Slashes vor den Parametern) und setzen Sie ein REM vor die aktiven Einstel-
                lungen.

                2.
                Ersetzen Sie den String "adressqlsomesillystringsalt" im Parameter $config['use_crypt_option'] durch einen belibigen
                String, der aus 22 Zeichen ("./0-9A-Za-z") besteht!

            Hinweise wie verschiedene Methoden eingestellt werden können finden Sie unter:

                http://us1.php.net/manual/de/function.crypt.php

            !!!!!!!!!!!!!!
            !! VORSICHT !!
            !!!!!!!!!!!!!!

            Eine Nachträgliche Umstellung der Verschlüsselungsmethode ist mit Handarbeit und der Gefahr verbunden,
            dass Sie sich nicht mehr einloggen können. Ohne direkte Datenbank-Zugriffe sperren Sie sich dann aus.

            Dass Passwort-Feld in der Tabelle "user" kann maximal 255 Zeichen speichern.

            Md5 wird im Netz häufig als "unsicher" bezeichnet, da es theoretisch möglich ist, mit unterschiedlichen Zugangsdaten einen
            Key zu erzeugen, der mit einem anderen identisch ist.

            Die tatsächliche Unsicherheit bezieht sich genau betrachtet auf gestohlene Daten aus der Datenbank. Für MD5-Passwörter gibt es im
            Netz Nachschlage-Tabellen, wo bekannte Passwörter gesammelt und schnell abgeglichen werden können.

            Wenn Sie Ihre Userdaten nicht weiter geben, ist ein Login mit falschen Daten aber sehr, sehr unwahrscheinlich, ich nutze eine
            Kombination aus mehreren Informationen um ein erfolgreiches Login zu verifizieren, selbst wenn also ein MD5 Passwort mit einem
            anderen übereinstimmt kommt in adresSQL damit noch kein erfolgreiches Login zustande.

            Nichts desto Trotz!
            Nutzen Sie ein sichers Passwort aus mindestens 8 Zeichen, kombiniert aus Ziffern, Gros/Kleinbuchstaben und Sonderzeichen.
            Prinzipiell gilt: Je länger das Passwort um so sicherer!

                Interessant  dazu : https://checkdeinpasswort.de/


            iii. Hochladen aller Dateien, Verzeichnisse und deren Inhalte
            -------------------------------------------------------------

            HINWEIS !!
            Ich habe im Stamm-Verzeichniss eine .htaccess Datei, die ein direktes Listing verhindert. Dazu muss der Webserver
            .htaccess unterstützen. Das ist deshalb wichtig, damit niemand ein Verzeichnis dirkekt über die URL listen kann.
            Zumindest im Stammverzeichnis sollte diese Datei enthalten sein. Das Verbot wird bei korrekter Konfiguration des Servers
            (apache2) auf die Unterverzeichnisse vererbt.

            Der Inhalt der .htaccess Datei um ein direktes Listen der Daten zu verhindern lautet:

                Options -Indexes

            Eine weitere .htaccess Datei liegt in manchen Verzeichnissen und soll einen direkten Aufruf der enthaltenen Scripte verhindern.
            Der Inhalt:

                Order deny,allow
                Deny from all

            verweigert zwar einen Aufruf über den Browser, erlaubt aber einen Aufruf per include etc. über die PHP-Scripte, die wiederum auf
            Rechte wie z.B. Adminrechte prüfen. Als Ergebnis eines direkten Aufrufs sollte ein FORBIDDEN-Fehler ausgegeben werden.


            iv. Rechte setzen
            -----------------

            Verzeichnisse können mit chmod 777 und Datein sollten mit chmod 644 versehen werden. PHP benötigt keine Ausführungsrechte
            um Scripts zu parsen.

            Die Verzeichnisse (UND deren Unterverzeichnisse) MÜSSEN zumindest Lese, Schreib und Betreten-Rechte besitzen (chmod 777)

            Alle anderen Verzeichnisse und Dateien sollten zumindest Leserechte und Betreten-Rechte besitzen. Ein chmod 777 auf alle
            VERZEICHNISSE ist keine sicherheitstechnische Katastrophe. Die Dateien selbst sollten aber NICHT mit Ausführungsrechten (7)
            versehen werden.

            Die Dateien im Verzeichnis /vars und /language müssen zumindest Lese und Schreibrechte (chmod 0666) besitzen, sonst kann man
            sie nicht online editieren und es kommen Schreibfehler.

            Die Dateien im Verzeichnis /vars, die mit .ht beginnen sollten auf chmod 666 oder sogar auf 777 gestellt werden, da der
            Apache2 sonst u.U. den Zugriff verweigert und ein Forbidden ausgibt. Das Präfix .ht* verhindert eine Ausgabe des Inhalts

            HINWEIS..
            Um den direkten Aufruf von einigen Dateien und deren Inhalt zu verhindern, sind diese Dateien im Dateinamen mit dem Präfix .ht
            versehen. Auf Linux-Servern macht der führende Punkt Dateien unsichtbar. Der Webserver verweigert die direkte Anzeige von
            Dateien die mit .ht beginnen. Eventuell muss das FTP-Programm zur Anzeige dieser Dateien entsprechend eingestellt werden.

            Bei der Installation prüfe ich die Rechte der Dateien. Eventuell kann es zu Warnungen kommen. Das bedeutet NICHT zwangsläufig,
            dass ihre Installation nicht funktioniert, Vielmehr ist die Ausgabe der Fehler/Warnungen ein Hinweis, wenn Probleme auftreten.
            Ob und welche Probleme aus falschen Rechten auftreten hängt doch sehr von der Serverkonfiguration ab. Dateien/Verzeichnisse in die
            geschrieben wird (z.B. errorlogs) ohne Schreibrechte machen natürlich keinen Sinn und es werden Fehler geworfen.

            TIP!
            Sollte das Script nicht funktionieren wie erwartet, schalten Sie das error_reporting des Scriptes ein.
            Standardmässig werden Warnungen und Fehler aus Sicherheitsfründen unterdrückt. Schaltet man die Anzeige ein, kann PHP eventuell
            über das Error-Reporting weiter helfen.

            Im Adminbereich "Konfiguration bearbeiten" im Punkt Sicherheit können Sie über $config[display_errors]
            die Sensibilität von adresSQL konfigurieren und so Fehler ausgeben lassen.

            Nach der Behebung aller Fehler sollte Sie die Fehleranzeige wieder abschalten um Angreifern keine Informationen zum Server
            anzubieten.


            v. install.php aufrufen
            -----------------------

            Nachdem alle Einstellungen vorgenommen und alle Daten hochgeladen wurden, wird im Browser die URL gefolgt von install.php
            aufgerufen. Das Script erstellt die Datenbank und legt alle Tabellen an.
            Dass install-Script prüft alle Rechte und gibt eventuelle Fehler aus. Die Behebung der angezeigten Fehler ist nicht zwingend und
            kann übergangen werden, das kann aber u.U die Funktion von adresSQL einschränken. Achten Sie vor allem auf Rechtefehler.


            vi. Erstes Login und Admincenter
            --------------------------------

            Nach der Installation kann ein erstes Login erfolgen (User=admin, Passwort=admin). Nun das Admincenter aufrufen und einen neuen
            User anlegen und Adminrechte erteilen. Danach wieder ausloggen und mit dem neuen User anmelden.

            !! WICHTIG !!
            Wieder ins Admincenter und dort den User=admin löchen bzw das Passwort ändern, sonst kann sich jeder mit dessen Zugangsdaten
            anmelden und erreicht Adminrechte!

            Die install.php sollte nach erfolgreicher Installation entfernt (gelöscht) werden. Ein erneuter Aufruf sollte die Datenbank zwar
            nicht beschädigen, wenn Sie dem User admin ein neues Passwort zuordnen, wird dieses auch nicht überschrieben, aber man sollte
            keine Angriffsfläche für böse Menschen liefern.


            vii. Config neu einlesen
            ------------------------

            Das Script nutzt Anfangs die Datei conf.php um alle wichtigen Einstellungen vorzunehmen. Um das Script online einstellbar zu
            machen, muss die conf.php in die Datenbank eingelesen werden.
            Nachdem der Punkt "Config neu einlesen" aus der Adminstration abgearbeitet wurde kann nun im Admincenter umter dem Punkt
            "Konfiguration bearbeiten" das Script nach den eigenen Bedürfnissen angepasst werden.

                Ich rate dringend dazu, für Deutsch, die UTF8-Codierung ($config['use_utf8']) nicht umzustellen und den Parameter auf 1 zu
                belassen. Der Parameter verursacht, dass Ausgaben durch eine Funktion geleitet werden, die Texte zu UTF8 konvertiert. Für
                Windows-User ist das fast schon ein Muss...

            Der Aufruf des Punktes Config neu einlesen ist seit Version 1.2230 so voreingestellt, dass er nur NEUE Parameter in der Datenbank
            hinzufügt und alle bestehenden Einstellungen unberührt lässt. Bereits geänderte Einstellungen gehen also nicht mehr verloren.
            Alle Versionen Vor 1.2230 überschreiben bestehende Einstellungen und übernehmen die Werte der Datei conf.php. Möchte man in diesen
            Versionen die Einstellungen dauerhaft sichern, sollte die conf.php mit den gewünschten Werten gewartet werden.

            Um wieder mit den Einstellungen der conf.php zu starten, wird die Tabelle config geleert (ACHTUNG Tabelle nicht löschen !!).
            Sind keine Einträge in dieser Tabelle (ist sie leer), greift das Script automatisch auf die conf.php zurück.

            HINWEIS!!

            Alternativ kann adresSQL so konfiguriert werden, dass vor dem Einlesen der conf.php die Konfigurationstabelle geleert wird:
            Setzen Sie in der Konfiguration unter Sicherheit den Parameter

                $config['truncate_conf_table']  = 1
                $config['update_conf_table_only'] = 0

            danach werden aber jedes Mal, wenn man die Konfig neu einlesen muss, wieder die Werte aus der conf.php verwendet und online
            eingestellte Werte werden überschrieben.

            WICHTIG !!
            Das einlesen der conf.php legt alle Daten in einer Tabelle ab. Erst wenn diese Tabelle befüllt ist, können online, über den
            Browser Einstellungen verändert werden. Die Datei kann jeder Zeit verändert und neu eingelesen werden. Ohne die Daten einzulesen
            bleibt das Fenster für die Einstellungen leer!

            Bitte die Mailadresse ändern, damit Mails auch unter der eigenen Adresse versendet werden. Solange ein User keine eigene Mail-
            adresse  angegeben hat ist die Standard-Adresse die Absende/Antwort-Adresse des Scripts.

            adresSQL ist nun fertig installiert....

            Hinweise zur Bedienung, können der integrierten Hilfe (z.B. in der Übersichtskartei der Punkt Script-Hilfe) entnommen werden.

            Als Administrator sollten Sie sie unbedingt in der Administration unter "Sonstiges und Hilfe" den Punkt "Hilfe zum Admincenter"
            komplett durchlesen. Hier werden viele einzelnen Punkte der Administration genauer beschrieben.


        4. Online Update
        ----------------

        Wenn Sie vom Online-Update gebrauch machen möchten, ist neu, das Sie per Default an einer anonymen Statistik teilnehmen, die einen
        Zähler hoch setzt und die vorher installierte Versionsnummer speichert. Persönliche Daten (wie z.B. IP-Ardesse etc.) werden NICHT!
        erfasst, ich nutze die Statistik nur, um die Anzahl verwendeter Installationen und Update-Versuche zu dokumentieren. Das soll helfen,
        die Updates besser und eventuell häufiger zu gestalten bzw heraus zu finden, welche Versionen von adresSQL aktuell im Netz verwendet
        werden.

        Wer an dieser Statistik nicht teilnehmen möchte, kann in der Administration -&gt; Konfiguration bearbeiten -&gt; Script-Tools
        den Parameter

            $config['participate_statistics'] = 1

        auf 0 (Null) Stellen und so die Teilnahme unterbinden. Ist in Ihrer Version dieser Parameter garnicht vorhanden, wird die Statistik
        NICHT! geschrieben.

        Unter "Administration -&gt; Auswertungen und Tools -&gt; Script Konsistenz prüfen" gibt es ab Version 1.2221 einen Punkt "Auf Update
        überprüfen", der versucht von mn-portal Updates zu laden und zu installieren.

        Folgende Probleme können bei einem Online-Update entstehen:

            Nun, zunächst kann Ihre Version schon veraltet sein, so dass ich keine Updates mehr zur Verfügumng stelle. Da ich in "relativ"
            kurzen und regelmässigen Abständen Updates heraus bringe, speichere ich nicht alle alten Versionen auf meinem Webspace. Für
            gewöhnlich behalte ich bis zu drei Vorgängerversionen und deren Updates. Ältere Versionen müssen dann händisch aktualisiert werden.

            Es kann nach dem Donwload zu einer Fehlermeldung kommen, dass das chmod nicht erfolgen kann, da keine ausreichenden Rechte bestehen.
            Das liegt daran, dass der Webserver (meist www-data) keine Berechtigung hat, die Dateirechte vom User zu verändern. Der Kopier-
            vorgang sollte dennoch funktionieren. Viele Webserver erlauben es die Rechte über ein Tool neu zu setzen.

            Der Server verweigert aus Sicherheitsgründen die Verbindung zu mn-portal. Das öffnen von externen URL's kann aus Sicherheitsgründen
            vom Anbieter verboten sein.

        Man sollte dringend kontrollieren, ob der Webserver den Kopiervorgang erfolgreich abgeschlossen hat. Eine Teilweise Aktualisierung wird
        wahrscheinlich zu Fehleren und Problemen führen.

        Werden die Dateirechte auf chmod 666, b.z.w 777 gestellt, sollte in den meisten Fällen das Kopieren funktionieren, Garantie
        gebe ich keine.

        LÖSUNG:
        In der Konfiguration kann der Parameter

            $config['unlink_on_update'] = 0;

        auf 1 gestellt werden, dann versucht das Script vor einem Update die bestehende Datei zu löschen. Ist der Vorgang erfolgreich
        wird der Webserver Eigentümer der neu kopierten Datei, was dazu führen kann, dass man den FTP-Zugriff auf die Datei verliert,
        wenn die Rechte zu restriktiv gesetzt werden.

        Das Update gibt immer eine Zusammenfassung was passiert ist und ob Kopierprozesse funktioniert haben oder nicht. Bitte nicht in
        MS-Manier einfach alles weg-klicken sondern kontrollieren, ob es Fehler gab und welcher Art diese Fehler waren.


        5. Manuelles Update
        -------------------

        Machen Sie ein Bachup Ihrer Datenbank!!!

        Für Updates laden Sie sich die neueste Version von adresSQL herunter und gehen Sie wie bei einer Neuinstallation vor. Rufen Sie
        auch die install.php auf, es werden zwar einige Fehler geworfen (z.B. dass Tabellen bereits vorhanden sind oder dass Daten schon
        eingetragen sind) aber das Script sollte fehlende Tabellen und Daten anlegen und alle bestehenden Daten in Ruhe lassen.

        Danach können Sie sich wie gewohnt einloggen und sollten die neueste Version nutzen. Importieren Sie die config neu, es könnten
        neue Parameter dazu gekommen sein.

        Mutige löschen vor einem manuellen Update alle adresSQL-Dateien damit keine Leichen herum liegen, achten Sie darauf, dass Uploads
        und Bilder in eigenen Unterverzeichnissen abgelegt werden.



    D. Einstellungen, Module, Hilfe ....
    ------------------------------------

        1. Eigene Felder/DROPDOWN anlegen
        ---------------------------------

        Um eigene Felder anzulegen, ist in der Administration ein eigenes Tool vorhanden, wo Sie eigene Felder definieren und wieder löschen
        können. Neu ist, dass man auch Dropdown-Felder erstellen kann. Ich habe 2 Arten von Dropdown-Feldern vorgesehen, ENUM und SET.

        Normalerweise ist in SET-Feldern eine Mehrfach-Auswahl möglich, ich habe SET`s anders definiert. SET`s sind einfache Auswahlfel-
        der, sind aber Muss-Felder, sprich es MUSS ein Wert gesetzt sein. ENUM-Felder können auch leer bleiben.
        Die Voreinstellung kommt zum Zuge, wenn man neue Daten anlegt bzw. Daten editiert. SET`s setzen dann als Vorauswahl den ersten
        Eintrag, ENUM`s sind als Vorauswahl leer.

        Wenn Sie Felder über z.B. phpmyadmin anlegen, werden diese Felder zwar erkannt, es könnte aber sein, dass adresSQL kein Handling
        für spezielle Felder (z.B. Mehrfachauswahl etc.) anbieten kann. Ich fange solche Funktionalitäten unter Umständen ab.


        2. User Konfiguration ändern
        ----------------------------

        Neben den persönlichen Usereinstellungen ist es seit Version 1.3026 möglich, als User die Grund-Parameter des Scriptes, die bisher
        nur dem Admin vorbehalten waren, zu ändern.

        Ich weise extra darauf hin, dass diese Option mit Bedacht zu aktivieren ist, der User können die gesamte Funktionalität des Scriptes
        beeinträchtigen und Daten nachhaltig beschädigen!

        Viele Parameter, die bisher nur in der Administration gesetzt werden konnten, können nun je User übersteuert werden. Sich wider-
        sprechende Konfigurationen führe u.U. schnell dazu, dass das Script nicht mehr korrekt läuft.

        Manche Einstellungen sind Globale, werden also für das gesamte Script gesetzt bzw. setzen Parameter für externe Aufrufe. Paramter, die
        Globale sind, können, je nachdem, ob sie vom User aufgerufen werden, katastrophale Folgen haben, da veränderte Einstellungen auch für
        andere User wirksam werden könnten.
        Um dieses Debakel einzuschränken, kann jeder Parameter einzeln freigegeben werden. Sie sollten sich dabei auf Parameter beschränken,
        die z.B. das Aussehen steuern oder Funktionen wie "Blätterfunktion oben/unten anzeigen" festlegen.

        Von der Übersteuerung sind alle Parameter ausgenommen, die sich im Bereich Sicherheit und Pfade befinden. Ausserdem muss über
        die Rechteverwaltung einem User zuerst das Recht gewährt werden, die Konfiguration zu übersteueren.

        Vorgangsweise:

        * Zuerst muss diese Funktion einmal freigeschaltet werden (default ist 0=aus, also keine Übersteuereung möglich).
          Setzen Sie unter Sicherheit, den Parameter $config['allow_config_user_rewrite'] auf 1 (eins) und schalten Sie die Funktion frei.

        * Stellen Sie sicher, dass in der Rechteverwaltung der User ein Häkchen beim Punkt r14 (Darf Konfiguration übersteueren) gesetzt
          hat.

        * Legen Sie im Admincenter unter Auswertungen und Tools im User Rewrite-Engine eine Liste mit den Parametern an, die vom User neu
          belegt werden dürfen. Jeder Parameter ist einzeln auswählbar. Die Ergebnisliste ist eine Globale, das bedeutet, sie können keine
          Userspezifische Liste erstellen. Freigegebene Parameter gelten immer für ALLE User.

        * Gehen Sie (als User angemeldet) in der Adressenkartei in ihren Config-Bereich, wo Sie auch die Sprache, eigene Mailadresse etc
          verwalten können. Dort sollte nun ein weiterer Punkt "Konfig Einstellungen" sichtbar sein, in dem Sie die gültigen Admineinstellungen
          für Ihre ausgewählten Parameter, neu definieren können. Die Einstellungen aus dem Adminbereich werden als Vorgabewerte angezeigt.

        ACHTUNG!!
        Dieser Punkt ermöglicht es theoretisch die gesamte Grundkonfiguration für jeden User neu anzulegen. Daraus ergeben sich
        natürlich eine Vielzahl an Fehleinstellungsmöglichkeiten, die im schlimmsten Falle, die Funktion des Scriptes unmöglich machen.
        Auch wenn ich die Bereiche Sicherheit und Pfade von der Konfiguration ausgenommen habe, bleiben noch eine Unmenge an Para-
        metern übrig, die eine "Zertrümmerung" der Daten ermöglichen (z.B. eine abweichende Kodierung, oder eine Veränderung der Para-
        meter im Konverter, Mail oder Upload Bereich).

        Ergo:
        Fragen, die aus einer Falschkonfiguration resultieren, werde ich ausser Acht lassen und nicht beantworten. Ich
        zitiere mich selbst aus der Hilfe (in eigener Sache) im Adminbereich.

            Wer Administrator ist, sollte wissen was er tut......

        Daher sollten Sie vor der Freigabe eines Parameters genau nachdeneken und es im Zweifelsfall lieber unterlassen den User mit
        den Grundeinstellungen spielen zu lassen.

        Nach der Freiegabe und Konfiguration durch den User passiert dann folgendes, der User meldet sich an, alle Grundparameter werden mit
        den Standardwerten belegt und danach werden die Usereinstellungen über die Grundkonfiguration geladen.
        Theoretisch ist so also für jeden User eine "gefahrlose", eigene, separate Konfiguration möglich.


        3. Karteien/Subdatenblätter ein/ausblenden
        ---------------------------

        Der Vorgang ist für Karteien und Subdatenblätter identisch, ich erkläre daher nur anhand von Karteien den Vorgang.

            1. Administration -&gt; Grundeinstellungen -&gt; Nav-Karteikarten anpassen.
            2. Suchen Sie die betreffende Kartei z.b. userupl oder galerie und klicken Sie auf Edit.
            3. Setzen/entfernen Sie das Kontrollkästchen bei Aktiv und speichern Sie

        Je nach Häkchen wird die Kartei (un)sichtbar.

        ACHTUNG!!

            Die Deaktivierung eines Eintrags bedeutet nicht, dass der Aufruf über die URL nun unmöglich ist, sprich eine Deaktivierung
            hat mit dem Kapitel Sicherheitseinstellungen nichts zu tun. Wer Einträge absichern möchte, muss das über die Rechte und
            deren Abfrage regeln.


        4. User-Uploads
        ---------------

        User-Uploads Sind Uploads, die dem eingeloggten User direkt zugeordnet und nur für ihn sichtbar und aufrufbar sind. Nur mit dem
        entsprechenden Login sehen Sie die hochgeladenen Daten. Das Verzeichnis befindet sich unter

            templates/adressenscript/temp/USERHASH/upload

        wobei der USERHASH vom Script auf Basis der Logindaten errechnet wird. Den Hash zu erraten erscheint zwar fast unmöglich, jedoch
        sollte der Hash nicht aus der Hand gegeben werden, sonst sind u.U direkte Downloads über die URL möglich.
        Der Hash ist kein Sicherheits-feature eher eine Sicherheit in Sinne von "security by obscurit" !!

        Der Zugriff kann über die Rechteverwaltung deaktiviert werden. Deaktivieren Sie dazu den Parameter r15 in den Userrechten.

        Die Upoloads besitzen eine Konfigurationsdatei (/templates/userupload/userupl_conf.php) in der verschiedene Parameter als Vorgaben
        abgelegt sind.
        Normaler Weise wird kaum Bedarf bestehen, dieses Datei zu ändern, eventuell möchten Sie aber eigene Einstellungen vornehmen, was über
        den Button Konfiguration geschehen kann. Die Konfiguration wird dann im Userverzeichnis gespeichert und übersteuert die Vorgabe-Datei.
        !! ACHTUNG !!
        Eine Änderung der Konfiguration gilt für ALLE User, es werden keine Userspezifischen Konfigs angelegt.

        Uploads werden direkt in das momentan aktive Verzeichnis vorgenommen. Klicken Sie auf Uploads verwalten, um das aktive Verzeichnis zu
        administrieren oder ein weiteres Verzeichnis anzulegen.

        Ein neues Verzeichnis wird fortlaufend nummeriert der Name des Verzeichnisses wird der neuen Nummer zugeordnet. Das bedeutet, dass Sie
        keine Verzeichnisse mit dem eingetragenen Namen finden werden, nur Verzeichnisse mit einer Nummer als Namen.


        5. Bildergalerie
        -----------------

        Die Bildergalerie steht allen Usern geicher Massen zur Verfügung. Lediglich der Upload von Bildern könnte durch das setzen des Read-
        only-Flags beim User verhindert werden.

        Auch die Bildergalerie verfügt über eine Vorgabe-Konfigurationsdatei (templates/galerie/gall_config.php) in der Parameter
        den eigenen Bedürfnissen angepasst werden können. Wie für die User-Uploads lässt sich auch hier je User eine eigene Konfig erstellen.

        Die Administration der Bildergalerie erreicht man durch einen Klick auf "Ordner verwalten". Wählen Sie ein Unterverzeichnis
        aus der Liste aus oder erstellen Sie einen neuen Ordner.

        Die Administration eines Verzeichnisses ist (hoffentlich) sowohl in der Bildergalerie als auch den User-Uploads selbsterklärend. Die
        eingestellte Sortierung der galerie wird auch als Sortierung in der Administration verwendet.


        6. Events
        ---------

        Die Anzeig von Adressen und Terminen ist an ein Login gebunden. Nun möchte man nicht jedem Zugriff auf die Daten geben und
        trotzdem eingetragene Veranstaltungen veröffentlichen. Dazu dient der Event-Kalender. Dem Script ist eine Datei zur Ver-
        öffentlichung eingetragener Events OHNE dass ein Login benötigt wird beigelegt (ext_events.php).
        Wollen Sie die externe Eventanzeige verhinderen, löschen sie einfach die ext_events.php.

        Im Verzeichnis extern befindet sich eine index.php als Vorlage, die es erlaubt von "Aussen" auf das Script zuzugreifen.
        Die Datei funktioniert, wenn in der php.ini allow_url_include = On gesetzt ist.
        Der Parameter erlaubt es PHP eine Datei über einen HTTP-Aufruf zu includen, die Datei muss sich dafür nicht auf dem eigenen
        Webspace befinden und kann bei einem anderen Hoster liegen.
        Die Datei include_ext_events.php zeigt, wie man die Events auf dem eigenen Webspace per include einbinden kann.

        Beide Dateien verstehen sich als Vorlage und müssen vor der Verwendung in einem Editor angepasst werden (Pfadangaben etc).

        Ist allow_url_include = Off kann aber alternativ die Datei ext_events.php direkt verlinkt oder included werden.
        Auch dafür ist eine Beispieldatei im Verzeichnis extern vorhanden (include_ext_events.php).

            Termine vs. Kalender

            Warum Terminkalender und Events separat?
            Nun natürlich zum Einen wegen der Anzeige ohne Login, aber natürlich gibt es noch andere Gründe. Termine können an
            Adressdaten gebunden angelegt werden, Events haben keinerlei Adressdaten Bezug. Weiters erlaubt der Terminkalender
            eine Anbindung an einen Baikal Server und so einen Terminabgleich mit z.B. einem Handy-Kalender und kann als Cron an
            Termine erinnern. Dafür können sich die Events über mehrere Tage erstrecken und werden farblich hervorgehoben.

            In Summe ist die Trennung von Termin und Event logisch.


        7. Hilfe
        --------

        Sowohl Anwendern als auch Admins steht in vielen Fällen eine Onlinehilfe zur Verfügung die Tips und Kurzanleitungen gibt.
        Für Adminstratoren sind aber auch die Readmes im Verzeichnis docs massgeblich. Nicht zuletzt finden sich viele Hinweise im
        Internet.


        8. Security-Modul
        -----------------

        Das Security-Modul erlaubt es den Zugriff auf adresSQL auf bestimmte IP-Adressen zu beschränken. Das setzt natürlich feste
        IP-Adressen voraus, bei dynamischen Adressen hat man keinen Einfluss auf die zugewiesene IP.

        Unter templates/admin/safetyvar befindet sich eine Datei .htsafety in der Zeilenweise alle IP`s eingetragen werden, denen der
        Zugriff auf adresSQL erlaubt ist.
        Im Verzeichnis vars erstellt man nun eine Datei ENABLE_SAFETY (achten Sie auf Gross/Kleinschreibung) um das Security-Modul zu
        aktivieren. adresSQL prüft nun, ob $_SERVER['REMOTE_ADDR'] in der Datei enthalten ist, normalerweise wird in dieser Variablen
        die Client-IP des Besuchers eingetragen.

        ACHTUNG!!
        Prüfen Sie, ob ihr Server ihre IP korrekt erkennt, Sie sperren sich sonst selbst aus.

            Für dieses Modul gibt es für spendende User in der Adminstration in den Admintools ein eigenes Plugin, dass Ihnen die
            Administration erleichert und es Ihnen erlaubt das Modul ein/aus zu schalten. Ausserdem zeigt Ihnen das Plugin ihre
            Aktive IP an und checked so, ob der Server Ihre IP korrekt erkennt.

        Ich nutze eine eigene Funktion (get_client_ip_env()) die verschiedene Informationen zur identifikation der IP nutzt, wird Ihre
        IP nicht korrekt erkannt, sind die Standardabfragen zur IP gescheitert.


    E.  Zentral/Filialdatenbank
    ---------------------------

        Bitte lesen Sie die eigene Readme README_FILIALE_ZENTRALE im Verzeichnis docs.


    F.  Häufige Fragen und Probleme
    -------------------------------

        1. Beim Speichern der Sprachdatei werden die Einstellungen nicht übernommen
        ---------------------------------------------------------------------------

        Bei der Installation auf Debain Squeeze sind einige Probleme aufgetreten, die auf den PHP Suhosin-Patch zurückgehen. Insbe-
        sondere die $_POST und $_GET Beschränkungen können zu Problemen führen. folgende Einstellungen in der suhosin.ini haben
        geholfen:

            suhosin.cookie.max_array_depth=4096
            suhosin.cookie.max_array_index_length=2048
            suhosin.cookie.max_name_length=2048
            suhosin.cookie.max_value_length=650000
            suhosin.cookie.max_vars=4096
            suhosin.request.max_array_depth=4096
            suhosin.request.max_array_index_length=2048
            suhosin.request.max_name_length=2048
            suhosin.request.max_value_length=650000
            suhosin.request.max_vars=4096
            suhosin.post.max_array_depth=8048
            suhosin.post.max_array_index_length=1024
            suhosin.post.max_name_length=2048
            suhosin.post.max_totalname_length=8048
            suhosin.post.max_vars=4096

        Bei Debian Wheezy sind diese Einstellungen wieder in der php.ini und zwar

            ; How many GET/POST/COOKIE input variables may be accepted
            max_input_vars = 5000

            ; Maximum size of POST data that PHP will accept.
            post_max_size = 64M

        Weiters sollte der memory_limit Wert etwas erhöht werden.

            ; Maximum amount of memory a script may consume (128MB)
            ; http://php.net/memory-limit
            memory_limit = 256M

        Kleinere Werte können dazu führen, dass nicht alle Konfigurationsdaten gesichert werden oder z.B. die Sprachdateien nicht korrekt
        übersetzt werden.


        2. Kann man die Feldnamen (Feldname=Spaltenname) der Adressentabelle umdefinieren
        ---------------------------------------------------------------------------------

        Ja, man kann in der Datei sql_constants.php (NUR) die Feldnamen der Adressentabelle definieren. Die ersten drei Einträge
        sehen z.B. so aus:

        define('ADR_ID','adr_id');
        define('ANREDE','anrede');
        define('VORNAME','vorname');

        Die Grossbuchstaben sind Konstanten, die NICHT verändert werden dürfen, die Kleinbuchstaben definieren, mit welchen Feld-
        namen die Tabelle angelegt wird. Eine Übersetzung sähe also z.B. so aus:

        define('ADR_ID','feld1');
        define('ANREDE','feld2');
        define('VORNAME','feld3');

        Die Anpassung muss VOR der Installation erfolgen, das Install-Script liest die Einstellungen aus und legt eine Tabelle mit
        den definierten Werten an. Im Nachhinein ist händisches Ändern der Feldnamen notwendig. Diese Einstellung erlaubt es mit etwas
        Geschick auf eine bestehende Tabelle zuzugreifen und Fremdtabellen als Datenquelle zu verwenden. So könnten z.B. 2 Programme
        sich eine Datenquelle teilen.

        Die Tabelle selbst MUSS `adressen` heissen, in manchen Abfragen wird neben den Spaltennamen auch der Tabellenname zur eindeutigen
        identifikation verwendet.

        Um eine korrekte Übersetzung der Feldnamen sicher zu stellen, ist es notwendig die Feldnamen und ihre Übersetzung in die
        Sprachdatei(en) einzutragen. Dazu legen sie einfach neue Parameter (Language Codewörter) mit den neuen Feldnamen und deren
        Übersetzung (Administration -&gt; Scriptspache anpassen) an. Für das Beispile oben also z.B.

        Übersetzung                     Language Codewort
        ID                              feld1
        Anrede                          feld2
        Vorname                         feld3

        u.s.w

        Die aktuellen Übersetzungen findet man in der Administration -&gt; Grundeinstellung -&gt; Scriptsprache indem man dort adresSQL
        auswählt.


        3. Wie kann man den Mailer des Scripts aufrufen
        -----------------------------------------------

        Prinzipiell ist das integrierte Mailscript an eine Mailadresse gebunden. Damit das Mailarchiv gesendete Mails speichern kann
        muss es wissen, welchem Datensatz die Mails zugeordnet werden müssen. Der Mailer versteht sich nicht als Mailinterface um an
        Freunde Mails zu versenden sondern ist ein fester Bestandteil der Adressenverwaltung. Ist bei einer Adresse eine Mailadresse
        angelegt, kann man den Mailer mit einem Klick auf die Mailadresse aufrufen. Der Mailer merkt sich die Adresse und speichert
        versandte Mails gebunden an die Adresse.
        Dass man die Mailadresse im Mailer ändern kann ist ein Feature um Korrekturen vornehmen zu können. "Normale" Mails sollten mit
        einem ordentlichen Mailprogramm versendet werden.


        4. Accesskeys loggen mich aus
        -----------------------------

        Das kommt vor, wenn mehrere Sessions in verschiedenen Browser-Fenstern gestartet wurden. Schliessen Sie den Browser (ALLE Fenster)
        und loggen Sie sich neu ein, damit sollte das Problem behoben sein. Ansonsten schalten sie die Verwendung von Accesskey einfach ab.
        Accesskeys werden von jedem Browser anders gahandhabt, daher ist eine einheitliche Vorgangsweise nicht möglich. Entsprechend reagieren
        Browser unterschiedlich und senden manchmal seltsame Steuercodes.


        5 Manche Einstellungen ziehen nach dem Ändern nicht
        ---------------------------------------------------

        Auch das kann vorkommen. Ich setze alle Dateiinhalte in einen eigenen Cache mit Sessions, damit nicht ständig aus Dateien gelesen
        werden muss. Der dafür benötigte Speicher muss also entsprechend gross genug konfiguriert sein.
        Normaler Weise lese ich gecache`te Daten, wenn sich etwas ändert, neu ein. Natürlich kann ich das auch irgendwo übersehen haben.
        In Ihrer Userkonfiguration finden Sie einen Button "Filecache Reset", mit dem Sie ihren Cache komplett leeren und ein erneutes
        Einlesen erzwingen können. Danach  sollten alle Dateiinhalte verfügbar sein.
        Bitte schreiben Sie mir, sollte der Fehler reproduzierbar sein. Ich habe bei Änderungen eine Möglichkeit geschaffen,
        den Cache neu einzulesen und möglicher Weise nur eine Codezeile übersehen, wo das notwendig ist.


        6. ImageMagick "not authorized" PDF errors
        ------------------------------------------

        Manche Dateien sind böse, deshalb kommt das neue Imagemagick mit relativ strengen Einstellungen daher. Fehler wie folgende sind dann
        die Folge:

            "...operation not allowed by the security policy `PDF' @..."

        Das lässt sich recht einfach beheben, indem man die Datei /etc/ImageMagick/policy.xml bearbeitet und die Einträge für Coder entsprechend
        ändert.

            aus z.B

                &lt;policy domain="coder" rights="none" pattern="PDF" /&gt;

            wird

                &lt;policy domain="coder" rights="read|write" pattern="PDF" /&gt;

            die Datei sieht also nach der Bearbeitung für coder wie folgt aus:

                &lt;policy domain="coder" rights="read|write" pattern="PS" /&gt;
                &lt;policy domain="coder" rights="read|write" pattern="PS2" /&gt;
                &lt;policy domain="coder" rights="read|write" pattern="PS3" /&gt;
                &lt;policy domain="coder" rights="read|write" pattern="EPS" /&gt;
                &lt;policy domain="coder" rights="read|write" pattern="PDF" /&gt;
                &lt;policy domain="coder" rights="read|write" pattern="XPS" /&gt;



    G.  Tricks
    ----------

        1. Adressfelder ausblenden
        --------------------------

        Adressen sind erst vollständig, wenn man bestimmte Felder einer Adresse ausfüllt. Ich gebe einige Felder vor. Die Felder kann
        man nach belieben erweitern (Felder hinzufügen) und ergänzen. In der Administration findet sich dafür ein eigener Menü-
        Punkt (Adress-Felder +/-).

        Eventuell werden aber auch einige vorgegebene Felder nicht benötigt. Diese Felder kann man zwar nicht löschen, aber man kann
        sie ausblenden.

        In der Sprachdatei (Administration -&gt; Grundeinstellungen -&gt; Scriptsprache anpassen) finden sich die Übersetzungen für die Feld-
        Namen auf die adresSQL zugreift. Dort steht z.B

            Mobil               handy1
            Ansprechpartner     abteilung
            Beruf               beruf

        Der erste Eintrag ist die eigentliche Übersetzung, der zweite ist der Index nach dem das Script sucht. Ersetzt man nun die
        Übersetzung eines Indexes mit "Unsichtbar" wird dieses Feld ausgeblendet. Editiert man die Einträge wie folgt

            Mobil               handy1
            Unsichtbar          abteilung
            Unsichtbar          beruf

        Werden die Felder "abteilung" und "beruf" nun im Adressformular nicht mehr angezeigt.

            ACHTUNG!! blendet man auf diese Art Mussfelder aus, kann man keine Daten mehr anlegen.

        Da ich das Script so flexibel wie möglich halten möchte ist der Wert, der das Ausblenden bewirkt (also hier das Wort "Unsicht-
        bar") ebenfalls frei definierbar.
        In der Sprachdatei ist ein Index "field_invisible" der mit diesem Wert "Unsichtbar" belegt ist. Ersetzt man diesen Wert z.B.
        mit "ABCDEFG" müssten obige Einträge wie folgt editiert werden um ausgeblendet zu werden:

            Mobil               handy1
            ABCDEFG             abteilung
            ABCDEFG             beruf

        Die Felder sind in der Adresstabelle nach wie vor vorhanden, wurden sie vor dem Ausblenden befüllt, bleiben die Inhalte auch erhalten.
        Ein Ausblenden hat also keinen Datenverlust bestehender Daten zur Folge, man kann nur keine neuen Daten hinzufügen.


        2. Accesskeys im Firefox umstellen
        ----------------------------------

        Um in Firefox problemlos Accesskeys nutzen zu können muss man den Firefox etwas modifizieren. Firefox will [Alt]+[Shift]+Key
        als Standardeingabe für Accesskeys. Um auf [Alt]+Key umzuschalten gehen Sie wie folgt vor:
        Rufen Sie in einem leeren Browserfenster

            about:config auf

        Als Suchbegriff geben sie access ein. Suchen Sie die beiden Einträge ui.key.menuAccessKey (Standard 18) und
        ui.key.generalAccessdKey (Standard -1) und vertauschen Sie die beiden Werte.
        Nun können Sie auch die Karteikarten mit Accesskeys (Alt+Input) steuern. Dabei Werden die Karteikarten von 1 bis 9 durchnummeriert.

        Firefox setzt nun allerdings überall dort, wo Accesskeys sich mit Steuerungen überschneiden, die Steuereung für die Menüs
        ausser Kraft, sie können also, ist der Accesskey "D" aktiv, z.B. mit [Alt]+D nicht mehr das Menü Datei aufrufen.

        Prinzipiell gillt:
        Alle Browser kochen ihr eigenes Süppchen, wenn es um Accesskeys geht. Jeder Browser will anders gesteuert werden und eine
        einheitliche Steuerung gibt es nicht.
        Da ich das Script mit Firefox und Palemoon getestet habe kann ich hier auch nur auf Eigenheiten des Firefox eingehen.

        An einer erweiterten Verwendung von Accesskeys wird gearbeitet.


        3. Charset, Kodierung ändern
        ---------------------------

        Mancher hat Probleme, die Datenbank dazu zu bringen, Umlaute korrekt anzeigen zu lassen, bzw. zu einer bestimmten Kodierung zu
        bewegen. Für die korrekte Kodierung sind 3 Voraussetzungen nötig:

            I. Der Browser sendet korrek kodierte Daten (Header)
           II. Die Kommunikation zur Datenbank (Client) ist korrekt kodiert
          III. Die Datenbank selber nutzt eine korrekte Kodierung.

        Für Punkt I ist Der Header der Ausgabe zuständig, der lässt sich in AdresSQL in der Administration unter Formate einstellen.
        Dieser Parameter sollte auf jeden Fall den Bedürfnissen angepasst werden. Punkt II und III müssen extra an die Datenbank ge-
        sendet werden. Dazu besteht in der Datei connect.php die Variable $db_caracter_set, in die die gewünschte Kodierung eingetragen
        wird, um an die Punkte A und B (unten) die Kodierung zu übergeben.

        Das meiste Geraffel entsteht unter Windows, da MS nicht UTF-8 sondern das eigene Kauderwelsch nutzt um Sonderzeichen und Umlaute
        darzustellen.
        AdresSQL sollte das Problem für die Sprache Deutsch und entsprechenden Umlaute eigentlich problemlos lösen, möchte man Mysql
        dennoch dazu bewegen, eine bestimmte feste Kodierung zu verwenden, lässt sich das wie folgt realisieren:


        A) Mit der Funktion mysql_set_charset/mysqli_set_charset (Punkt III), um Die Datenbank zur Verwendung eine bestimmten Kodier-
        ung einzustellen.

            1. Im Verzeichnis /vars wird eine Datei "DB_SET_CHARSET" (achten Sie auf die Grossschreibung) erstellt. Die Datei kann leer
            bleiben.

            Was Passiert dann?

            Die Einstellung $db_caracter_set aus der connect.php wird an die Funktion mysql_set_charset() bzw. mysqli_set_charset()
            übergeben und bei einem Connect gesendet.


        B) Ein Query mit "SET_NAMES" senden (Punkt II) um die Kommunikation zur Datenbank mit einer bestimmten Kodierung einzustellen.

           1. Im Verzeichnis /vars eine Dastei "DB_SET_NAMES" (Grossschreibung beachten) erstellen. Die Datei kann leer bleiben.

            Was passiert nun hier?

            Die Einstellung $db_caracter_set aus der connect.php wird nun mittels Query an die Datenbank gesendet. Das bewirkt, dass
            die Kommunikation zwischen Datenbank und Client auf die gewünschte Kodierung eingestellt wird.
            Ist die Datei DB_SET_NAMES nicht vorhanden, wird das Query nicht gesendet.


        Wer die Kodierung umstellen möchte, wird im Normalfall beide Dateien anlegen.

        i.
        Sie sollten den Parameter $config['use_utf8'] in der conf.php bzw. in der Administration auf 0 stellen, damit ein Durchlauf
        der PHP-Funktion utf8_encode/decode verhindert wird.

        ii.
        Weiters sollte in der conf.php der Parameter $config['header_char_set'] auf die gültige kodierung gestellt werden, um sicher
        zu stellen, dass der Header im Browser auch korrekt kodiert wird.

        iii.
        Alle Server lassen in ihren Konfigurationsdateien eine Default-Einstellung zu. Dazu muss man ein wenig die Beschreibungen der
        jeweiligen Server lesen, Mariadb läuft etwas anders als Mysql, aber wenn man diese Einstellungen ändert, startet der Server
        bereits mit der gewünschten Kodierung.


        4. Ort an eine online-Karte übergeben
        ------------------------------------

        Seit Vers. 1.3037 stehen alle notwendigen Einstellungen in der Datei vars/maps.var. Die Datei hat folgenden Inhalt:

            https://www.openstreetmap.org/search?query={ORT}+{STRASSE}
            +
            1000
            600
            60
            60
            1

        Die erste Zeile beinhaltet den zu verwendenen Link mit den Platzhaltern {ORT} und {STRASSE}. Je nachdem, welche URL man
        verwendet, sind die beiden Platzhalter durch ein Zeichen verbunden, bei Google ist das z.B. für gewöhnlich ein Beistrich.
        Dieses Zeichen ist in Zeile 2 einzugeben. Die 5 weiteren Zeilen beinhalten Fenstereigenschaften wie Width, Height, TOP, LEFT
        und SCROLL

        Wer spendet, bekommt über die Admin-Tools ein Sccript, mit dem diese Datei angepasst werden kann



        5. Zusätzliche Links in den Datenfeldern
        ----------------------------------------

        In der Administration gibt es ein Tool, mit dem man Links auf Adressfelder anlegen kann (Sonstige und Hilfe -&gt; Adressfeld-Links).
        Man kann Wahlweise eigene Scripte aufrufen oder Weblinks legen. Das Tool soll es ermöglichen, allen Daten gemeinsame Scripte hinter-
        legen zu können, die z.B. die Informationen aufbereiten.
        Dabei wird unterschieden, ob man nun im Edit, Neuanlage oder normalen Ansichtsmodus ist.
        Den Zusatzlinks wird automatisch der GET-Parameter zid= und die ID des Datensatzees hinzugefügt. So kann man die Daten des be-
        treffenden Datensatzes in separaten Scripten erneut auslesen.

        Als Bsp. diene hier die Möglichkeit eine Telefonnummer direkt aus der Datensatzansicht zu wählen. Dazu ist dem Feld "Telefon" in der
        Detailansicht ein Script "waehle_telefonnr.php" hinterlegt. Das Script MUSS sich im Verzeichnis "templates/links/templates" befinden.


        6. Suche mit oder ohne preg_quote()
        ----------------------------------

        In Datenbanken zu suchen ist so eine Sache, da Datenbanken relativ empfindlich auf Sonderzeichen reagieren. Nun kombinieren ich
        die Suche auch noch mit einer Funktion, die die Suchbegriffe farblich hervorhebt.

        Was hier eher banal klingt, kann sich schnell zu einem echten Disaster ausweiten, indem man nach speziellen Sonderzeichen sucht,
        die zusätzlich durch mehrere PHP-Funktionen geschleust werden müssen. Oft ist der Slash der Bösewicht, da dem Slash und dem Backslash
        spezielle Bedeutung in Programmiersprachen und Datenbanken zugewiesen wird.
        Lange Rede, ich habe für solche Fälle versucht vorzubeugen und man kann die Funktion preg_quote() für solche Probleme ein bzw.
        abschalten.
        Zu finden ist die Möglichkeit in der Administration und dort zum Thema Datenbank Kodierung.

        Manuell lässt sich preg_quote() einschalten, indem man im Verzeichnis vars eine leere Datei USEPREGQUOTE erstellt.


        7. Anzeigefelder in Adressverknüpfung
        -------------------------------------

        Wer adresSQL nicht als Adressdatenbank verwendet, möchte bei der Anzeige verknüpfter Daten eventuell andere Felder verwenden als
        die voreingestellten Namensfelder der Datenbank.
        Das kann man sehr leicht erreichen, indem man im Verzeichnis templates/connected/vars eine Datei NAME_TO_SHOW anlegt in die man alle
        anzuzeigenden Felder durch Kommata getrennt ablegt. Die einzelnen Feldindizes kann man sich anzeigen lassen, indem man entweder einen
        Datensatz im Detail amnzeigen lässt und mit der Maus auf die einzelnen Felder zeigt, die Feldnummer erscheint dann als mouseover Text,
        oder indem man z.B. unter sonstiges und Hilfe das Konfig-tool "Formulareingabe ändern" aufruft, dort werden die Feldnummern als erste
        Spalte angezeigt.


        8. PHP ab 7.3 Fehlermeldung bei PDF-Vorschau
        --------------------------------------------

        Seit einem Fehler in Ghostscript ist die PDF-Vorschau für .pdf-Dateien bei Imagemagick aus Sicherheitsgründen verboten. Die Vorschau
        lässt sich wie gewohnt erstellen indem man in /etc/ImageMagickxxx in der poilicy.xml den Eintrag

            &lt;policy domain="coder" rights="none" pattern="PDF" /&gt;

        entweder löscht oder zwischen &lt;!-- und --&gt; (REM`s) stellt.


        9. Datensätze klonen und weiter bearbeiten
        ------------------------------------------

        Erstellen Sie im Verzeichnis vars eine Datei mit dem Namen ENABLE_CLONE und im Pagefooter der Datailansicht wird ein weiterer Button
        zum Klonen eines Datensatzes angezeigt. Alle Einträge werden übernommen und können weiter bearbeitet werden.
        Man landet nach einem Klick direkt in der Kartei für die Neuanlage eines Datensatzes.
        Beachten Sie, dass die Prüfung auf doppelte Datensätze u.U den Fehler wirft, dass es den Datensatz bereits gibt. Änderen Sie also
        eines der Mussfelder um den neuen Datensatz speichern zu können.

        Mit dem File "vars/CLONE_NO_HEADER" kann verhindert werden, dass die Funktion header("Location:xxx") verwendet wird um die Daten an das
        Formular zu übergeben, es wird statt dessen mittels '&lt;meta http-equiv="refresh"....&gt; aktualisiert.
        Das kann relevant werden, wenn die Funktion get_header_path zur Errechnug des absoluten Pfades verwendet wird.


    H.  Kurze eigene Bemerkungen
    ----------------------------

        1. Wichtige Nebensächlichkeiten
        -------------------------------

        Das Script versteht sich als Nachfolger der File-Based Version und soll vor allem Firmen mit einer großen Anzahl an Daten dienen.
        Der Einsatz in Firmen mit vielen Anwendern ist also durchaus erwünscht.

        Als "One-Man-Show" bin ich Coder, Tester und Anwender, wodurch mir sicherlich der eine oder andere Fehler entgeht. Wer Fehler
        findet und rekonstruieren kann, kann, darf und vor allem SOLL mir diese bitte mit einer Beschreibung zusenden. In der
        Administration ist zu diesem Zweck ein Mailformular eingerichtet, dass an die Mail-Adresse "office@mn-portal.at" ein
        Mail versendet. Ist der Fehler rekonstruierbar, werde ich ihn natürlich so bald als möglich beheben.
        Danke an dieser Stelle allen, die mir beim Bugfixen geholfen haben und von der Möglichkeit des Bug-Mails gebrauch gemacht haben.

        Die Dateien crontabt.php und cron_backup.php sind Scripte die über einen Cronjob gestartet werden können.

        crontabt.php sollte dabei alle 10 Minuten ausgeführt werden. Das Script überprüft eingetragene Termine und versendet zur ein-
        gestellten Uhrzeit ein Mail an die hinterlegte Mailadresse. Dabei untersucht das Script, ob ein User dem Termin zugeordnet ist
        und verwendet die Usermailadresse. Ist KEIN User hinterlegt, wird die Mailadresse der conf.php (b.z.w der Einstellung in der
        Datenbank verwendet.

        cron_backup.php sollte täglich gestartet werden. Voraussetzung ist, dass mysqldump per shell ausführbar ist. Das Script sichert
        die Datenbank ins Backup-Verzeichnis. Die Sicherung kann aus der Administration wieder hergestellt werden oder kann mit dem
        mysql Befehl als Restore verwendet werden.
        Das passende Shell-Script zum Sichern findet man unter /bash/backup_adressql. Das Script ruft die passende php-Datei in einer
        CLI auf und kann so Zeitbeschränkungen umgehen (ändern Sie dazu die php.ini für die CLI).

        !!! ACHTUNG  !!!

        Alle Shell-Scripte in /bash müssen mit korrekten Pfadangaben versehen werden.
        Die Sicherungen stellen bei einem Restore einen Datenstand zu einem bestimmten Zeitpunkt wieder her und löschen alle anderen
        Daten. Tabellen werden vor dem wieder Herstellen der Daten komplett geleert. Die Backups verstehen sich also mehr als Snapshot
        und geben den Datenbestand zu einem Zeitpunkt wieder.

        Achten Sie auch darauf, dass Backups mit der Zeit natürlich einiges an Platz belegen. Sie können alte Backups über die Adminis-
        tration löschen.


        2. Kleinkram und Erwähnenswertes
        --------------------------------

        * Ich habe wirklich viel gestetet, aber wie schon erwähnt, ich mache alles alleine, daher kann es natürlich vorkommen, dass
          man "betriebsblind" wird und über Fehler ständig hinweggeht. Manches ist noch recht simpel, was ich aber durch Updates
          zu verändern gedenke.
          Das Script soll dabei natürlich so einfach als irgend möglich bleiben.

        * Derzeit steht nur die Sprache Deutsch zur Verfügung.
          An anderen Sprachen wird nur sehr zögerlich gearbeitet, davon verstehe ich schlicht zu wenig. Sollte sich jemand die Mühe
          gemacht haben und eine Übersetzung haben, bin ich für ein  Mail mit der entsprechenden Language-Datei dankbar.

          Die Sprachen liegen unter language/Modul (z.B. adressql/de.var oder admin/de.var)

        * Termine, die an einen User gebunden sind, können von anderen Usern NICHT übernommen werden. Nur der Admin hat 2 Möglich-
          keiten den Datensatz wieder frei zu geben.

          1. Als Admin setze ich das Flag zum Binden eines Termines an den User (der Termin gehört nun dem Admin).
             Danach löscht der Admin das Flag, indem er es wieder deaktiviert und gibt den Datensatz so für alle frei.
          2. Im Admincenter unter Termine verwalten können Termine einem anderen User direkt zugewiesen werden.

        * Im docs/some_help Verzeichnis findet sich eine Datei "sql_tabellenkram" in der kleine SQL-Beispiele angeführt werden.

        * In der Administration unter "Sonsiges und Hilfe" kann man über SQL+Phpinfo alle Tabellen, ihre Indizes und ihre Einstellungen
          auflisten.

        * Dem Apache Server sollte das Listen von Verzeichnisinhalten generell verboten werden. Dazu wird der Eintrag

            "- Indexes"

          in den entsprechenden Serverkonfigurationen hinzugefügt.
          Ich lege in den wichtigsten Verzeichnissen eine entsprechende .htaccess Datei ab, die das unterbinden sollte.

        * Das Script ist Modular aufgebaut. Wer eigene Funktionen einbauen möchte, sollte das in Form eines eigenen Moduls machen, damit
          das Script weiterhin updatefähig ist. Wer an den Dateien Änderungen vornimmt, verliert diese bei einem Update, da ich die
          Script-Dateien komplett tausche.

          Wien man eigene Module erstellen kann steht in der Datei language/admin/doc/de_module.txt oder kann in der Administration direkt
          über "Sonstiges und Hilfe -&gt; Hilfe zum Admincenter -&gt; Erweiterete Funktionen / Readme / License" aufgerufen werden.
          Das Werk ist sicher nicht komplett und gibt nur einen kurzen Überblick.
          Auch wenn der erste Eindruck vielleicht "das ist ja ur kompliziert" ist, es ist einfacher als man zunächst glauben mag.

        * Bisher undokumentierte Dateien, die Aktionen setzen/starten/verhindern

          adresSQL

            vars/CONVERTLOG                 Aktiviert das Logging für die Erstellung von Vorschaubildern von PDF-Dateien
            ./LOG_HEADER_PATH               Aktiviert das Logging aller http header Aufrufe nach vars/headerpath.var


          Im Verzeichnnmis templates/

          galerie

            galerie/var/DEBUG              Startet eine Debug-Ausgabe für Admins von Exif-Daten in Bildern

          Scanner

            sane/DEVICE_IP                  Legt über die IP den zu verwendenden Scanner im Netzwerk fest

          In der Wawi

            wawi/pdf/LANGUAGE               Legt die Sprache für die PDF-Klasse fest
            wawi/pdf/ORIENTATION            Legt Hoch oder Querformat für die PDF-Klasse fest
            wawi/pdf/PAGEFORMAT             Legt das Seitenformat für die PDF-Klasse fest
            wawi/subdat/conf/DESC           Legt die Sortierreihenfolge für Wawi-Belege auf absteigend fest
            wawi/subdat/conf/JAHROFF        Deaktiviert den Filter für die Anzeige von Belegen nur für das aktuelle Jahr
            wawi/subdat/CHECKTIMESTAMP      Aktiviert einen Filter auf das in der Datenbank gespeicherte Erstellungsdatum eines Beleges
                                            Ansonsten wird das Erstellungsdatum aus dem Zeitstempel der Datei gelesen.


    I.  Wawi-Modul
    --------------

        Das Modul erlaubt es Aufträge, Lieferscheine, Rechnungen zu allen bestehenden Datensätzen anzulegen, Fertige Berichte über offene
        Aufträge, stornierte Aufträge und offene Rechnungen sind enthalten und das Mahnwesen erlaubt es einen freien Mahntext zu drucken.

        Das Modul versteht sich NICHT als umfangreiche Warenwirtschaft, wie sie von Handelsfirmen benötigt wird, sondern richtet sich
        speziell an kleine (1-10 Personen) Firmen, deren Wawi entweder aus Word, Excel und Co besteht, oder die keine tausende Euro aus-
        geben können/wollen.

        Insbesondere für das Wawi-Modul wird natürlich keine Haftung übernommen. Ich erhebe nicht den Anspruch alle rechtlichen Voraus-
        setzungen für eine 100% ordentliche Warenwirtschaft im Sinne der Finanz zu erfüllen. Für mich hat das Modul mehrere Jahre Selbständig-
        keit gereicht.

        Der Unkostenbeitrag für die Wawi beträgt €50 und wird nur per Mailanfrage zugesandt. Dafür helfe ich auch bei der Installation
        und schicke bei Updates per Mail die neuen Scripte.

        Bei Interesse, eine Mail an office@mn-portal.at mit dem Betreff "adressql-wawi", wir werden uns sicher einig.


    J.  Windows als Server
    ----------------------

        Viele laden sich den XAMPP (WAMPP)-Server für Windows herunter und installieren adresSQL. Sehen Sie bei Problemen mit XAMPP im
        XAMPP-Forum nach, dort gibt es Hinweise zur Problembehebung oder posten Sie einen entsprechenden Eintrag.

        Es sei jedoch erwähnt, dass Windows allein schon seine eigenen Tücken hat und XAMPP als Entwicklungsumgebung konzipiert ist,
        der Server also in seiner Grundkonfiguratuion nicht für den Produktiveinsatz konzipiert ist. Suchen Sie nach XAMPP härten um
        den XAMPP für den Produktiveinsatz herzurichten.

        Getestet wurde im März 2016 Xampp mit php7

        Nun wünsche ich noch viel Spass mit adresSQL. Wer mit dem Tool spielt, wird viele Funktionen finden, die ich nicht extra im De-
        tail besprochen habe..


    K.  Gibt`s noch etwas
    ---------------------

        Natürlich gibt es immer offene Fragen, folglich ein blöder Punkt! Daher bitte ich, sich aktiv zu beteiligen und mir zu helfen,
        adresSQL besser zu machen.

        Das Script entspringt einem Softwaranwender-Geist, ich versuche also komplizierte Vorgänge vom Anwender fern zu halten und
        Lösungen zu finden, die man braucht und wo man nicht Stundenlang herumpfuschen muss, um zum Ziel zu kommen. Der Einsatz von
        adresSQL ist mittlerweile recht umfangreich und es gibt sicher noch viel mehr Ideen, also immer her damit...

        *
        Ein Wort, wieso die Dateien im Verzeichnis gets und posts Nummerische sind. Zahlen lassen sich unter Linux problemlos sortieren und so
        kann man recht einfach die Reihenfolge der Abarbeitung festlegen.

        *
        Die Dateien /vars/edit_focus und vars/newdata_focus sind 2 Dateien, die festlegen, auf welches Feld im Edit-Modus bzw beim Formular der
        Neuanlage der Focus gesetzt werden soll. Nach dem Aufruf von New bzw Edit steht der Cursor in diesen Felderen.

        *
        Diverse Plugins des Admintools haben (noch) keine Hilfe, das kommt daher, dass ich mir alle Plugins zunächst dafür baue, um mir beim
        Programmieren Konfig-Dateien erstellen zu können und ich weiss ja, was welcher Parameter tut.
        Eine Hilfe für jedes Plugin wird folgen, versprochen. ;-)


    L.  Rerservierte Variablen und Dateinamen
    -----------------------------------------

        Im Laufe der Bugfixes und kosmetischen Operationen an adresSQL habe ich festgestellt, dass mir Kleinigkeiten, wie zB. das nachladen
        von zusätzlichen Styles oder Java-Scripten Mühe machen. Dafür habe ich nun eine "Lösung" gefunden, reservierte Variablen an diversen
        Stellen. Z.B ist es nun möglich weitere Stylesheets an den header zu überggeben. Hier also meine kleine Liste reservierter Variablen.
        Ich meine nicht SESSION-Variablen, sondern Variablen, die nach beenden des Scripts ihre Gültigkeit automatisch verlieren.


        reservierte Varaibalen:
        -----------------------

        $adressql_added_style

            Diese Variable braucht nur vor dem Aufruf von adr_head.tpl befüllt werden und schon werden weitere Styles im header geladen.

        $adressql_jsscript

            Wird z.B. in der Bildergalerie im pagefooter verwendet um im Body-bereich ein JS zu laden. Dabei wird der Pfad zu einem Script
            an den Pagefooter übergeben, der das Script in einem JS-Tag einbindet

        $adressql_code

            Ähnlich $adressql_jsscript wird hier aber kompletter Code übergeben, der vor dem &lt;/body&gt; Tag mit einem echo ausgegeben wird.
            Technisch ist alles  erlaubt, was man vor dem &lt;/body&gt; laden und ausführen darf.


        reservierte DATEIEN:
        --------------------

        vars/.htfileright               Ist der Parameter $config['use_ht_fileright'] auf 1 gesetzt, werden Dateirechte bei Schreibprozessen
                                        zu setzende Rechte aus der Datei vars/.htfileright gelesen. Die Datei hat per Dafault den Inhalt 0644^1
                                        und besteht aus 2 Parametern getrennt durch ein Dach.
                                        Der erste Parameter bedeutet dass Dateien, die vom Sctipt geschriben werden mit den Linuxrechten
                                        chmod 644 versehen werden, der zweite Parameter (hier die 1) bedeutet, dass jeder Schrweibprozess #
                                        zwingend ein chmod zur Folge hat.

        vars/RENEW_FILE_RIGHT           Diese Datei legt fest, dass der Inhalt der Datei .htfileright NICHT gecached wird. Die Datei wird bei
                                        jeder Verwendung neu von der Platte gelesen.

        vars/CLEAN_QUERY                Leere Datei schaltet die Funktion clean_query ein
        vars/DEBUG_CLEAN_QUERY          Leere Datei aktiviert das Debugging in ein Log (vars/.htdebug_clean_qurey) wenn die Funktion clean_query
                                        genutzt wird

        vars/CONVERTLOG                 Leere Datei aktiviert das Logging für die PDF-Konvertierung und schreibt alle Konvertierungen in das
                                        File logs/convert/.htMONAT

        vars/DELETE_SPACES              Datei beinhaltet eine Liste aller Adress-Felder, aus denen Leerzeichen entfernt werden sollen.
        vars/ENABLE_CLONE               Leere Datei schaltet die Anzeige des Klonen-Buttons an wenn die Funktion clone vorhanden ist
        vars/ENABLE_HIGHLIGHT_SHUFFlE   Leere Datei schaltet das automatische Neumischen der Datei highlight.var bei jedem Login ein.
        vars/ENABLE_SAFETY              Leere Datei schaltet das Savety-Modul ein mit dem die Zugriffe auf bestimmte IP`s beschränkt werden
                                        kann.
        vars/SEARCHDELIM                Datei beinhaltet das Trennzeichen für die Trennung mehrerer Suchbegriffe
        vars/SET_MY_UID                 Leere Datei schaltet die Anzeige der SetUID Buttons in der Detailansicht ein/aus
        vars/SEPERATOR                  Datei beinhaltet das Trennzeochen für CSV-Dateien, wenn nicht vorhanden ist das Tennzeichen ein "^"
                                        Achte Sie darauf, dass Semikolon oder Komma unerwünschte Effekte haben können, wenn die Zeichen in
                                        Texten oder Felderen verwendet werden.

        vars/SHOW_EVENTS                Leere Datei schaltet die Eventanzeige beim Login ein.
        vars/SQL_MODE                   Siehe Punkit 4a dieser Readme
        vars/TO_LOWER                   Datei beinhaltet die Felder, die auf Kleinschreibung umgestellt werden
        vars/UC_FIRST                   Datei beinhatet die Felder, deren Inhalte auf "erster Buchstabe des Strings in Grossbuchstaben" gesetzt
                                        werden.

        vars/UC_WORDS                   Date beinhaltet die Felder, deren Inhalte auf "erster Buchtabe jedes Wortes im String auf Grossbuchstabe
                                        gesetzt werden

        vars/DWNLOAD_PAGING             Leere Datei stellt sicher, dass der Download aus der Übersicht (Symbol neben dem Logo in der Karteileiste)
                                        nur die Daten der aktuellen Seite anbietet, fehlt diese Datei, wird immer der gesamte Datenbestand her-
                                        untergeladen.

        vars/dwnload_debug              Schaltet das Debugging für den Download der Wawi Aufträge/rechnungen ein/aus.
        vars/.htpossibleexp             Legt feste, welche Karteien einen Downloadbutton anbieten, um die angezeigten Daten als CSV herunter zu
                                        laden. Die ID`s der betreffenden Karteien sind jeweils in einer eigenen Zeile gesetzt.

        vars/farben.var                 Datei enthält Beispiel-Farbcodes (HEX) um über das Tool "Farbcode-File erstellen" der Admin-tools eine
                                        neue highlight.var zu erstellen.
                                        Das ist hilfreich, wenn man z.B. helle Farbcodes zum Hervorheben in dunklen Desingns oder umgekehrt
                                        verwenden möchte.

        vars/highlight.var              Die Datei enthält alle Farbcodes, die z.B. für die Farbmarkierungen der Events oder das Highlight der
                                        Suche verwendet werden.

        vars/DEBUG_BAIKAL               Schlatet eine Debugging-Ausgabe für Baikal-Importe ein/aus
        vars/FILE_COUNTER               Schaltet bei Leseprozessen von Dateien eine Ausgabe der Dateiname ein/aus. So lässt sich verfolgen,
                                        welche Dateien aus dem Cache gelesen und welche Dateien neu von der Platte eingelesen werden.

        templates/sane/DUMP_SANE        Schaltet für das sane-Modul die Ausgabe des verwendeten scanimage-Befehls ein/aus.


        Für fast alle Dateien gibt es ein Tool zum setzen der Datei und eine kurze Beschreibung was dann passiert. Die meisten Tools sind
        jedoch in den Admin-Tools enthalten und so Personen vorbehalten, die mir eine Spende haben zukommen lassen.
        Manche Dateien sind leer und es wird nur geprüft, ob es die Datei überghaupt gibt, manchwe Dateien beinhalten Einstellungen. Seien Sie
        daher vorsichtig, wenn Sie Dateien löschen oder Inhalte ändern.
        Bitte beachten Sie auch, dass Linux "case-sensitive" ist, also Gross und Kleinschreibung durchaus eine Rolle spielen.


  	M.  php7 und mariadb auf dem Server
    -----------------------------------

        Leichtere Umlaut-Probleme hatte ich mit einer Neuinstallation auf Debain-stretch und mariadb!
        Die Lösung war recht einfach.
        Die Datei /etc/mysql/mariadb.conf.d/50-server.cnf öffnen und ca in Zeile 111,112 folgende Einträge deaktivieren

            #character-set-server = utf8mb4_general_ci
            #collation-server = utf8mb4_general_ci

        Danach den mariadb-server neu starten.

			Ab mariadb-11 funktionierten die Umlaute, als ich die Dateien DB_SET_CHARSET und DB_SET_NAMES im vars verzeichnis
			angelegt habe, beide mit dem Inhalt "latin1".

        Das Script lief ohne Fehler mit php7, sollten dennoch Probleme auftreten, bitte eine kurze Nachricht, ich setze
        mich so bald als möglich daran.


        Sollte ein root-login mit mariadb nicht mehr wie unter mysql funktionieren, gibt es eine einfache Lösung:

        a.)
        Ist kein Passwort in der mysql.user Tabelle vorhanden, muss eines definiert werden (im Bsp. geheim):

            mysql -u root

            MariaDB [(none)]&gt; update mysql.user set password=password('geheim') where user='root';
            MariaDB [(none)]&gt; flush privileges;

        b.)
        Soll sich mariadb so verhalten wie früher mysql, sprich ein root-login erlauben:

            mysql -u root -p
            Enter password: *******

            select user,host,password,plugin from mysql.user;
              +------+-----------+------------------------+-------------+
              | user | host      | password               | plugin      |
              +------+-----------+------------------------+-------------+
              | root | localhost | *geheimerhashcode      | unix_socket |
              | root | 127.0.0.1 | *geheimerhashcode      | unix_socket |
              | root | ::1       | *geheimerhashcode      | unix_socket |
              +------+-----------+------------------------+-------------+

        hier muss nun die Verbindung unix_socket für root entfernt werden:

            update mysql.user set plugin='' where user='root';
            flush privileges;

        Ab nun funktioniert das root-login wieder.


        c.)
        Soll statt dessen ein Ersatzuser 'root2' den Zugriff bekommen:

            mysql -u root -p
            Enter password: *******

            grant all on *.* to root2@localhost identified by 'geheim' with grant option;

        Mehr Info unter https://kofler.info/root-login-problem-mit-mariadb/



        d.)
        Soll der MariaDB-Server im Netz verfügbar sein (also auf der Netzwerkkarte lauschen) müssen noch ein paar Einstellungen
        vorgenommen werden.

            1.
            Edit der Datei /etc/mysql/mariadb.conf.d/50-server.cnf
            Dort muss der Parameter bind-address mit der öffentlichen IP des Servers konfiguriert werden.

            2.
            Die Konfiguration der User in der Tabelle mysql.user muss so angepasst werden, dass aus denm Netz zugegrffen werden
            darf. Ich mache das, indem ich ein ganzes Subnetz für einen user freigebe.

            also anmelden mit

                mysql -u root -p

            dann

                grant all on *.* to USER@'xxx.yyy.zzz.%'  identified by 'DAS_GEHEIME_PASSWORT' with grant option;
                flush privileges;

            User, IP (xxx.yyy.zzz.%) und Passwort natürlich ersetzen und das Prozentzeichen bitte lassen.

            Bsp:
                grant all on *.* to dbuser@'192.168.10.%'  identified by 'Das_Geheime_passwd47?#' with grant option;

            legt den user "dbuser" so an dass mit diesem User aus dem  Netz 192.168.10.0/24 von allen Geräten
            zugegriffen werden darf und dabei das Passwort "Das_Geheime_passwd47?#" verwendet werden muss.


                select user,host,password,plugin from mysql.user;

            zeigt nun z.B.

              +-------+--------------------+------------------------+-------------+
              | user  | host               | password               | plugin      |
              +-------+--------------------+------------------------+-------------+
              | dbuser| 192.168.10.%       | *3EDB8D3CB7C01C071AD77 |             |
              +-------+--------------------+------------------------+-------------+


            Mit dem Aufruf des Befehls mysql_secure_installation auf der Konsole kann die Installation gehärtet werden.
            Es folgen dann einige Fragen, die mit Ja/Nein beantwortet werden müssen.



  	N.  ssmtp um Mails zu versenden

    -----------------------------------

        Man muss nicht immer einen eigenen Mailserver betreiben um Mails über php versenden zu können.
        Unter Linux kann man ssmtp verwenden und sich mit einem bestehenden Konto verbinden und Mails zu forwarden. Das
        hat den Vorteil, dass der eigene Server ncht so ohne weiteres als Spam-Schleuder verwendet werden kann und man sich um die
        Sicherheit des eigenen Mailservers keine Gedanken machen braucht.

        Ich nutze Debian, entsprechend installiere ich:

            * apt-get install mailutils ssmtp

            * in der php.ini folgende sendmail-Pfad eintragen:

                sendmail_path = /usr/sbin/ssmtp -i

            in /etc /ssmtp/ssmtp.conf (hier als Bsp. gmail.com)

                # The user that gets all the mails (UID &lt; 1000, usually the admin)
                root=username@gmail.com
                mailhub=smtp.gmail.com:587
                rewriteDomain=gmail.com
                hostname=yourlocalhost.yourlocaldomain.tld
                UseTLS=Yes
                UseSTARTTLS=Yes
                AuthUser=username
                AuthPass=password
                AuthMethod=LOGIN
                FromLineOverride=yes

            * in /etc/ssmtp/revaliases

                root:username@gmail.com:smtp.gmail.com:587


            Schon kann man Mails über den gmailaccount username@gmail.com versenden.


    ##########################################################################################
    #                                                                                        #
    #    Nun viel Erfolg, Vergnügen, Spass, oder was auch immer ihr mit adresSQL vor habt..  #
    #    Euer sysop (Matthias Nitzschke)                                                     #
    #                                                                                        #
    ##########################################################################################



