continue = FAIL => Session-Zwangslogout, Abbruchmeldung und Schlußverarbeitung + Prüfung auf Wartungsstatus = OK => continue = FAIL => Abbruchmeldung und Schlußverarbeitung + Verarbeitung der Submit-Aktionen (POST), Anzeige des Anmeldeformulars */ // this script needs following additional server modules for PHP // (none) // write HTTP header (anti-cache) header('Expires: Sun, 31 Dec 1989 23:59:59 GMT'); header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0'); header('Pragma: no-cache'); // recall session session_cache_limiter('nocache'); session_cache_expire(1); session_start(); //deactivate automatic use of addslashes // set_magic_quotes_runtime(0); // define general server constants define( "SERVER_SITE_MAINTENANCE", true ); // maintenance state, set to TRUE to lock this page temporarily define( "SERVER_LOCALHOST_IP", "127.0.0.1" ); // localhost IP, which does not need authentication define( "SERVER_PROTOCOL_HTTPS", "HTTPS" ); // HTTPS protocol name // define server file constants define( "SERVER_FILE_TEMPLATE", "template.shtml" ); // template file define( "SERVER_FILE_HEADER", "ssi_site_header.html" ); // SSI file for site header define( "SERVER_FILE_INTRO", "ssi_site_intro.html" ); // SSI file for site intro define( "SERVER_FILE_EXTRO", "ssi_site_extro.html" ); // SSI file for site extro define( "SERVER_FILE_AUTOGEN", "ssi_site_autogen.html" ); // SSI file for site autogeneration warning define( "SERVER_FILE_ANMELDUNGSLISTE", "anmeldung-data/anmeldung.csv" ); // path and file for registered participants // define display constants define( "DISPLAY_TEXT_NONE", " " ); define( "DISPLAY_VALUE_SEPARATOR", chr(9)); // init instance variables $intnow = time(); $bolauthloggedin = false; $strmsg = ''; // (status/error/etc.) message to user $bolauthabort = false; // auth check will be aborted: show auth warning $bolauthlogoutnow = false; // user will be logged out $strnomailconfirmation = ''; $bolok = true; // action feedback, triggers confirmation if true or warning if false // function library function addmsg ($straddmsg) { // adds $straddmsg to $strmsg global $strmsg; if ( $straddmsg != '' ) { $strmsg = $strmsg . '
  • ' . $straddmsg . '
  • '; } } function showmsg () { // shows messages in $strmsg if available global $strmsg, $bolok; if ( $strmsg != '' ) { echo'

    Feedback

    '; $strmsg = ''; $bolok = false; } } // prepare input variables in six steps // 1. init internal variable, e.g.: $strparam = ''; // 2. execute step 3 up to 6 only if external variable exists, e.g.: if ( isset($_GET['txt_param']) ) // 3. convert to correct type, e.g.: $gstrparam = (string) $_GET['param']; // 4. defuse dangerous content, e.g.: $gstrparam = trim( addslashes( htmlentities( urldecode( $gstrparam ), ENT_QUOTES ))); // 5. limit allowed size, e.g.: if ( strlen( $gstrparam ) > 255 ) $gstrparam = substr( $gstrparam, 0, 255 ); // 6. on demand evaluate content and overwrite respective internal variables, e.g. $strparam = $gstrparam; $strnick = ''; if ( isset($_POST['txt_nick']) ) { $pstrnick = (string) $_POST['txt_nick']; $pstrnick = str_replace( chr(13) . chr(10), '\n', $pstrnick ); $pstrnick = str_replace( chr(13), '\n', $pstrnick ); $pstrnick = str_replace( chr(10), '\n', $pstrnick ); $pstrnick = str_replace( chr(9), '\t', $pstrnick ); $pstrnick = trim( stripslashes( htmlentities( $pstrnick, ENT_QUOTES ))); if ( strlen( $pstrnick ) > 255 ) $pstrnick = substr( $pstrnick, 0, 255 ); $strnick = $pstrnick; if ( $strnick == '' ) { addmsg ( 'Bitte wähle einen Nickname, mit dem Du auf dem Easterhegg angesprochen werden möchtest.' ); $bolok = false; } } $stremail = ''; if ( isset($_POST['txt_email']) ) { $pstremail = (string) $_POST['txt_email']; $pstremail = str_replace( chr(13) . chr(10), '\n', $pstremail ); $pstremail = str_replace( chr(13), '\n', $pstremail ); $pstremail = str_replace( chr(10), '\n', $pstremail ); $pstremail = str_replace( chr(9), '\t', $pstremail ); $pstremail = trim( stripslashes( htmlentities( $pstremail, ENT_QUOTES ))); if ( strlen( $pstremail ) > 255 ) $pstremail = substr( $pstremail, 0, 255 ); $stremail = $pstremail; } $strstatus = 'Normal'; if ( isset($_POST['opt_status']) ) { $pstrstatus = (string) $_POST['opt_status']; $pstrstatus = trim( stripslashes( htmlentities( $pstrstatus, ENT_QUOTES ))); if ( strlen( $pstrstatus ) > 255 ) $pstrstatus = substr( $pstrstatus, 0, 255 ); $strstatus = $pstrstatus; // zusätzliche Engelprüfung, falls jemand die Sperre gehackt hat if ( $strstatus == 'Engel' ) { addmsg ( 'Eine Anmeldung als Engel ist nicht mehr möglich.
    Falls Du der Meinung bist, dass dies in Deinem speziellen Fall nicht klug ist, wende Dich bitte an die Organisatoren.' ); $strstatus = 'Hacker'; $bolok = false; } // validate -> schöner (und aufwendiger) wären dynamische Arrays, aber das funktioniert auch so gut genug... if ( $strstatus != 'Normal' && $strstatus != 'Mitglied' && $strstatus != 'Engel' && $strstatus != 'Ermaeszigt' ) { $strstatus = 'Hacker'; } // Look! Hacker ;-) if ( $strstatus == 'Hacker' ) { addmsg ( 'Aufgrund Deiner (fast) erfolgreichen Hackversuche gehen wir davon aus, dass Du bereits CCC-Mitglied bist. ;-)' ); $strstatus = 'Mitglied'; } } $intwurst = 0; if ( isset($_POST['txt_wurst']) ) { $pintwurst = (integer) $_POST['txt_wurst']; if ( $pintwurst > 65535 ) $pintwurst = 0; if ( $pintwurst >= 0 and $pintwurst <= 9 ) { $intwurst = $pintwurst; } else { addmsg ( 'Bitte korrigiere die Anzahl der Wurstbrötchen, eine einstellige Zahl sollte genügen. ;-)' ); $bolok = false; } } $intkaese = 0; if ( isset($_POST['txt_kaese']) ) { $pintkaese = (integer) $_POST['txt_kaese']; if ( $pintkaese > 65535 ) $pintkaese = 0; if ( $pintkaese >= 0 and $pintkaese <= 9 ) { $intkaese = $pintkaese; } else { addmsg ( 'Bitte korrigiere die Anzahl der Käsebrötchen, eine einstellige Zahl sollte genügen. ;-)' ); $bolok = false; } } $intmarmelade = 0; if ( isset($_POST['txt_marmelade']) ) { $pintmarmelade = (integer) $_POST['txt_marmelade']; if ( $pintmarmelade > 65535 ) $pintmarmelade = 0; if ( $pintmarmelade >= 0 and $pintmarmelade <= 9 ) { $intmarmelade = $pintmarmelade; } else { addmsg ( 'Bitte korrigiere die Anzahl der Marmeladenbrötchen, eine einstellige Zahl sollte genügen. ;-)' ); $bolok = false; } } $bolobst = false; if ( isset($_POST['chk_obst']) ) { $pbolobst = (bool) $_POST['chk_obst']; $bolobst = $pbolobst; } $bolmuesli = false; if ( isset($_POST['chk_muesli']) ) { $pbolmuesli = (bool) $_POST['chk_muesli']; $bolmuesli = $pbolmuesli; } $bolanmeldung = false; if ( isset($_POST['cmd_anmeldung']) ) { $pbolanmeldung = (bool) $_POST['cmd_anmeldung']; $bolanmeldung = $pbolanmeldung; } if ( // localhost access ( // direkter Aufruf von localhost htmlspecialchars( $_SERVER['HTTP_X_FORWARDED_FOR'], ENT_QUOTES ) == '' && htmlspecialchars( $_SERVER['REMOTE_ADDR'], ENT_QUOTES ) == constant("SERVER_LOCALHOST_IP") ) || ( // indirekter Aufruf (z.B. transparenter SSL-Proxy) mit übergebenem localhost htmlspecialchars( $_SERVER['HTTP_X_FORWARDED_FOR'], ENT_QUOTES ) == constant("SERVER_LOCALHOST_IP") ) ) { // localhost ist immer eingeloggt $sbolauthloggedin = true; } else { // check protocol and timeout // check secure connection // possible results: // - secure => continue // - insecure => force logout ($bolauthlogoutnow), show error page and prepare message ($strmsg) if ( ( // direct connection without HTTPS $_SERVER['HTTPS'] == '' && $_SERVER['HTTP_X_FORWARDED_PROTO'] == '' ) || ( // indirect connection without local HTTPS proxy, e.g. orenosp strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) != strtolower(constant("SERVER_PROTOCOL_HTTPS")) && $_SERVER['HTTP_X_FORWARDED_PROTO'] != '' ) ) { // insecure connection -> abort if ( !$bolauthlogoutnow && $sbolauthloggedin ) { // active login over insecure connection -> force logout $bolauthlogoutnow = true; addmsg ( 'Du wirst ausgeloggt, da Deine Verbindung unsicher (unverschlüsselt) geworden ist.' ); } addmsg ( 'Dein Verbindungsprotokoll ist HTTP. Bitte verwende für die Anmeldung Verschlüsselung mittels HTTPS.' ); $bolauthabort = true; $bolok = false; } // check auth timeout // possible results: // - auth active => continue // - auth timeout => force logout ($bolauthlogoutnow), prepare message ($strmsg) and continue if ( $sbolauthloggedin && !$bolauthlogoutnow ) { // write message on user authentication expired -> also fire a logout ($bolauthlogoutnow) // echo '
    Du wurdest ausgeloggt wegen mehr als ' . constant("AUTH_TIMEOUT_MINUTES") . ' Minuten Inaktivität.

    '; $bolauthlogoutnow = true; addmsg ( 'Du wirst ausgeloggt wegen mehr als ' . constant("AUTH_TIMEOUT_MINUTES") . ' Minuten Inaktivität.' ); } // restart timeout $sintauthprevtime = $intnow; } if ( $bolauthlogoutnow || $bollogout ) { // logout if ( $bolauthlogoutnow ) { addmsg ( 'Du wurdest automatisch ausgeloggt. Bitte gegebenenfalls erneut einloggen.' ); } $sbolauthloggedin = false; } // check maintenance state if ( constant("SERVER_SITE_MAINTENANCE") ) { // cancel because of maintenance $strmsg = ''; addmsg ( 'Die Anmeldung ist zurzeit deaktiviert.' ); $bolok = false; $bolauthabort = true; } // Well, Checkpoint. // Now a defined and normal state of checking has been reached. // Possible states are now: // - $sbolauthloggedin = true: user has successfully authenticated and is still logged in // - $sbolauthloggedin = false: user is either not (yet) authenticated or authentication has been expired // If there were any messages on the way up to here, they are stored as list items (
  • ) in variable $strmsg. // check auth phrase if user tries to login if ( !$bolauthabort ) { // login accepted $sbolauthloggedin = true; } // prepare page // assume that all ssi files are there. No, I won't check _that_ explicitely. // If they ain't there, the user gets a partial page. ...so what? ;o) readfile( constant("SERVER_FILE_HEADER") ); echo' Easterhegg 2007 - Anmeldung '; readfile( constant("SERVER_FILE_INTRO") ); echo' '; echo '

    Anmeldung

    '; showmsg(); if ( !$sbolauthloggedin ) { // show anmeldung page and then die if ( !$bolauthabort ) { // show login page } // close page and stoprun. echo' '; readfile( constant("SERVER_FILE_EXTRO") ); die(); } // Well, Checkpoint. // Now the user is proofed to be successfully logged in. (All others are wiped out.) // From here on the user is authorized to enjoy all the following features. // default sequence within each chapter: // 1. headline // 2. submit action // 3. showmsg(); // 4. user forms // 5. showmsg(); // 6. five empty rows to separate from next chapter ;) // show anmeldung chapter if ( $bolanmeldung ) { if ( $bolok ) { // prüfen, ob die Anmeldungsliste überhaupt vorhanden und beschreibbar ist if ( !is_writable( constant("SERVER_FILE_ANMELDUNGSLISTE") )) { addmsg ( 'Die Anmeldungsliste ist zurzeit nicht verfügbar bzw. gesperrt.
    Falls Du das Gefühl hast, daß dies nicht okay ist, kontaktiere bitte die Orga-Crew. Danke Dir.'); $bolok = false; } } if ( $bolok ) { // prüfen, ob dieser Nickname bereits angemeldet ist $strfile = file_get_contents( constant("SERVER_FILE_ANMELDUNGSLISTE") ); if ( stripos( $strfile, chr(10) . html_entity_decode( $strnick, ENT_QUOTES ) . chr(9) ) !== false ) { // Nickname existiert bereits addmsg ( 'Mit diesem Nickname ist bereits ein Teilnehmer angemeldet.
    Bitte wähle einen anderen Nickname.' ); $bolok = false; } } if ( $bolok ) { // Anmeldung speichern if ( $intfileid = fopen( constant("SERVER_FILE_ANMELDUNGSLISTE"), "a" )) { if ( !fwrite( $intfileid, html_entity_decode( $strnick, ENT_QUOTES ) . chr(9) . $strstatus . chr(9) . html_entity_decode ( $stremail, ENT_QUOTES ) . chr(9) . $intwurst . chr(9) . $intkaese . chr(9) . $intmarmelade . chr(9) . (integer) $bolobst . chr(9) . (integer) $bolmuesli . chr(9) . date( "Y.m.d-H:i:s", $intnow ) . chr(10) )) { $bolok = false; }; if ( !fclose( $intfileid )) { $bolok = false; } } else { $bolok = false; } if ( $bolok ) { if ( $stremail != '' ) { $strnomailconfirmation = '
    Hinweis: Es wird keine zusätzliche Bestätigungsmail verschickt.'; } addmsg ( 'Deine Anmeldung ist hiermit erfolgt. (' . date( "d.m.Y H:i:s", $intnow ) . ')' . $strnomailconfirmation ); addmsg ( 'Vielen Dank für Dein Interesse - Bis bald in Hamburg.' ); } else { addmsg ( 'Deine Anmeldung konnte nicht gespeichert werden!
    Bitte kontaktiere die Orga-Crew! Du bist nicht angemeldet!' ); } } } showmsg(); echo '

    Dein Nickname: Deine Emailadresse (optional):

    Du zahlst einmalig für den gesamten Zeitraum (vier Tage): 50 Euro als Normalsterblicher 35 Euro als CCC-Mitglied 25 Euro als Engel (freiwillige Helfer) - Es haben sich ausreichend Engel angemeldet -> Danke!Falls speziell Du unbedingt noch zu den Engeln gehören solltest, wende Dich bitte an die Organisatoren. 25 Euro als Schüler, erwerbslos etc. (nur gegen gültigen Nachweis)

    Im Preis enthalten ist eine Easterhegg-Tasse sowie ein tägliches Frühstück (Brötchen, Wurst, Obst, Käse, Müsli) als auch jederzeit Tee und Kaffee (Flatrate).

    Zur Kalkulation der benötigten Nahrungsmenge teile uns bitte mit, was und wieviel Du täglich zum Frühstück benötigst.

    '; echo ' Wurstbrötchen: Käsebrötchen: Marmeladenbrötchen: '; echo ' Obst '; echo ' Müsli '; echo '

    '; showmsg(); // close page and stoprun. echo ' '; readfile( constant("SERVER_FILE_EXTRO") ); die(); ?>