// MorgenGrauen MUDlib
//
// login.c -- Object for players just logging in
//
// $Id: login.c 9245 2015-06-04 13:04:39Z Arathorn $

 /*
 * secure/login.c
 *
 * This object is cloned for every user trying to log in
 * We are still running root.
 *
 * login.c looks up the username in the secure/PASSWD file. If it is
 * found, the password is checked. If the user is already logged in,
 * he will be reconnected to the running object. If the other object
 * is still interactive, that will be disconnected before the user is
 * reconnected to that object.
 *
 * If the user is not in PASSWD, a new entry with level 0 is created.
 * All PASSWD writing is done in secure/master.c.
 *
 */
#pragma strict_types
#pragma no_shadow
#pragma no_inherit
#pragma verbose_errors
#pragma combine_strings
//#pragma pedantic
//#pragma range_check
#pragma warn_deprecated

#include <config.h>
#include <properties.h>
#include <moving.h>
#include "/secure/wizlevels.h"

#include <telnet.h>
#include <defines.h>
#include <input_to.h>
#include <configuration.h>

inherit "/secure/mini_props.c";
inherit "/secure/telnetneg.c";

#define SSL_GRRETING "REMOTE_HOST="
#define PROXIES ({"127.0.0.1","87.79.24.60"})
#define GUESTMASTER "/secure/guestmaster"

#ifndef DEBUG
#define DEBUG(x) if(find_player("tiamak")) tell_object(find_player("tiamak"),x)
#define DEBUGM(x) if(find_player("muadib")) tell_object(find_player("muadib"),x)
#endif

/* Variables of the secure save file */
int level, loginfails, creation_date;
string password, name, shell, ep, ek, mq;
string ektips;
string fptips;
string *domains, *guilds, *uidstotakecare;

static int invis, neu;
static string loginname;
static string cap_name;
static string *userentry;
static string banish;
static mixed *races;
static int newbie;
static string realip;

// Prototypes
static void SendTelopts();
public nomask string loginname();
// the following 4 lfuns deal with real logins
public nomask int logon();
static void logon2( string str );
static int load_player_object( int guestflag );
static void load_player_ob_2( string obname, int guestflag );
static int check_illegal( string str );
static int valid_name( string str );
static int new_password( string str );
static int again_password( string str );
static int check_password( string str );
static void select_race();
static void ask_race_question();
static void get_race_answer( string str );

protected void create();
public string short();
public string query_real_name();
public nomask int query_prevent_shadow();
public int remove();
// the following 3 lfuns deal with dummy player creation
public mixed new_logon( string str);
static mixed new_load_player_object();
static mixed new_load_player_ob_2( string obname );
static void ask_mud_played_question();
static void get_mud_played_answer(string str);


public nomask string loginname()
{
    return loginname ? loginname : "";
}


public int remove()
{
    destruct( this_object() );
    return 1;
}


static int check_too_many_logons()
{
    object *u;
    string ip;

    ip = query_ip_number(this_object());
    // users() nehmen, falls nicht-interaktive Clones von login.c existieren.
    u = filter( users(), function status (object ob, string addr) {
        return load_name(ob) == "/secure/login"
               && query_ip_number(ob) == addr;
    }, ip );

    if ( sizeof(u) > 2) {
        write( "\nEs laufen schon zu viele Anmeldungen von Deiner Adresse "
               "aus.\nProbier es bitte in ein bis zwei Minuten noch "
               "einmal.\n" );

        log_file( "LOGIN_DENY", sprintf( "%s: >2 Logons von %-15s (%s)\n",
                                         ctime(time())[4..15],
                                         query_ip_number(this_object()),
                                         query_ip_name(this_object()) ) );
        return 1;
    }
    else
        return 0;
}

// Callback when a TLS connection negotiation was finished. This handler is
// called for negotiations startet by the telnet option START_TLS.
protected void tls_init_callback(int handshake_result)
{
  if (handshake_result < 0)
  {
    // Fehler im Vebindungsaufbau
    write(break_string(sprintf(
           "Can't establish a TLS/SSL encrypted connection: %s."
           "Disconnecting now. If this error persists, please "
           "disable the usage of TLS or STARTTLS in your client.",
           tls_error(handshake_result)),78));
    // Disconnect
    destruct(this_object());
    return;
  }
  // In this case, we will treat the newly negotiated TLS connection as as new
  // connection and just start over again by calling logon(). And re-enable
  // the telnet machine of the driver of course.
  configure_interactive(this_object(), IC_TELNET_ENABLED, 1);
  logon();
}

// Called from the telnetneg handler for TELOPT_STARTTLS to initiate the TLS
// connection negotiation.
protected void init_tls()
{
  ::init_tls();
  configure_interactive(this_object(), IC_TELNET_ENABLED, 0);
  tls_init_connection(this_object(), #'tls_init_callback);
}

/*
 * This is the function that gets called by /secure/master for every user
 */
public nomask int logon()
{
    set_next_reset(300); // Timeout fuer Loginverfahren
    loginname = "logon";
    newbie=0;
    realip=0;

    SendTelopts();
    // In theory, we should not send anything if SendTelops() offers
    // TELOPT_STARTTLS. However, some clients to not answer unknown telnet
    // options and it would introduce a delay in any case. Therefore we send
    // the welcome message anway, unless we received a WILL from the Client.

    // Es wird ein Lookup gemacht, ob die Quelladresse ein Tor-Exitnode ist,
    // der erlaubt, zu uns zu kommunizieren. Das Lookup ist asynchron und
    // braucht eine Weile, wenn das Ergebnis noch nicht gecacht ist.
    // An dieser Stelle wird das Ergebnis nicht ausgewertet. Achja, wie
    // machen das natuerlich nicht fuer die IP vom Mudrechner...
    if (query_ip_number(this_object()) != "87.79.24.60")
    {
      "/p/daemon/dnslookup"->check_tor(query_ip_number(this_object()),
          query_mud_port());
      "/p/daemon/dnslookup"->check_dnsbl(query_ip_number(this_object()));
    }

    // ggf. muss TLS (initiiert durch STARTTLS) noch ausverhandelt werden.
    if (check_tls_negotiation())
      return 1; // Verbindung behalten

    printf("HTTP/1.0 302 Found\n"
         "Location: http://mg.mud.de/\n\n"
         "NetCologne, Koeln, Germany. Local time: %s\n\n"
         MUDNAME" LDmud, NATIVE mode, driver version %s\n\n",
         strftime("%c"), __VERSION__);

    if ( check_too_many_logons() ){
        destruct(this_object());
        return 0;
    }

    // ist die Verbindung schon wieder weg?
    if (!objectp(this_object()) || !interactive(this_object()))
      return 0;


    cat( "/etc/WELCOME" );
    input_to( "logon2", INPUT_PROMPT,
        "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? ");
    return 1;
}


static int check_too_many_from_same_ip()
{
    object *u;
    string ip;

    ip = query_ip_number(this_object());
    u = filter(users(), function status (object ob, string addr, int a) {
        return query_ip_number(ob) == addr
               && ob->QueryProp(P_AGE) < a;
    }, ip, 12*60*60); // 24h in heart_beats

    if ( sizeof(u) > 25 ){
        write( "\nDa anscheinend gerade jemand von Deiner Adresse aus "
               "versucht, das \n"MUDNAME" mit neuen Charakteren zu "
               "ueberschwemmen, werden momentan \nnur aeltere Charaktere "
               "von dieser Adresse zugelassen.\nWenn Du meinst, dass es "
               "sich um einen Fehler handelt, logg Dich bitte als \n"
               "Gast ein und sprich einen Erzmagier oder Gott an.\n" );
        
        log_file( "LOGIN_DENY", sprintf( "%s: >10 Spieler von %-15s (%s)\n",
                                         ctime(time())[4..15],
                                         query_ip_number(this_object()),
                                         query_ip_name(this_object()) ) );
        
        destruct(this_object());
        return 1;
    }
    else
        return 0;
}


static int check_illegal( string str )
{
    string res;

    res = ({string})master()->QuerySBanished(query_ip_number(this_object()));
    if (!res)
    {
      // check connection from Tor exit node
      string eff_ip = (sizeof(realip) ? realip
                                      : query_ip_number(this_object()));
      if ("/p/daemon/dnslookup"->check_tor(eff_ip, query_mud_port())
          || "/p/daemon/dnslookup"->check_dnsbl(eff_ip))
        res = 
            "\nSorry, von Deiner Adresse kamen ein paar Idioten, die "
            "ausschliesslich\nAerger machen wollten. Deshalb haben wir "
            "die Moeglichkeit,\neinfach neue Charaktere "
            "anzulegen, fuer diese Adresse gesperrt.\n\n"
            "Falls Du bei uns spielen moechtest, schicke bitte eine Email "
            "an\n\n                         mud@mg.mud.de\n\n"
            "mit der Bitte, einen Charakter fuer Dich anzulegen.\n" ;
    }

    if ( res )
    {
        write( res );
        log_file( "LOGIN_DENY", sprintf( "%s: %-11s %-15s (%s)\n",
                                         ctime(time())[4..15], str,
                                         query_ip_number(this_object()),
                                         query_ip_name(this_object()) ) );
        remove();
        return 1;
    }

    return 0;
}


/*
 * Check that a player name is valid. Only allow
 * lowercase letters.
 */
static int valid_name( string str )
{
    int i;

    if ( str == "logon" ){
        write( "Der Name wuerde nur Verwirrung stiften.\n" );
        return 0;
    }

    i = sizeof(str);

    if ( i > 11 ){
        write( "Dein Name ist zu lang, nimm bitte einen anderen.\n" );
        return 0;
    }

    for ( ; i--; )
        if ( str[i] < 'a' || str[i] > 'z' ) {
            write( "Unerlaubtes Zeichen '" + str[i..i] + "' im Namen: " + str
                            + "\n" );
            write( "Benutze bitte nur Buchstaben ohne Umlaute.\n" );
            return 0;
        }

    return 1;
}

static void logon2( string str )
{
    int i, arg;
    mixed txt;

    // ggf. muss TLS (initiiert durch STARTTLS) noch ausverhandelt werden.
    if (check_tls_negotiation())
      return;

    if ( !str || str == "" ){
        write( "Abbruch!\n" );
        destruct( this_object() );
        return;
    }

    if(strstr(str,SSL_GRRETING)==0)
    {
      if( member(PROXIES,query_ip_number(this_object()))>-1 )
      {
        realip=str[sizeof(SSL_GRRETING)..];
      } // andere IPs werden einfach ignoriert. -> log/PROXY.REQ ?
      // ggf. Lookup fuer Torexits anstossen.
      "/p/daemon/dnslookup"->check_tor(realip,query_mud_port());
      "/p/daemon/dnslookup"->check_dnsbl(realip);

      input_to( "logon2", INPUT_PROMPT,
          "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? ");
      return;
    }
    
    if ( loginname != "logon" ) {
        log_file( "ILLEGAL", sprintf( "%s Illegal patch of login: "
                                      "loginname = %O\n",
                                      dtime(time()), loginname ) );
        destruct( this_object() );
        return;
    }

    str = lower_case(str);
    cap_name = capitalize(str);

    if ( str == "neu" && !neu ){
        cat( "/etc/WELCOME_NEW" );
        neu = 1;
        input_to( "logon2", INPUT_PROMPT, "Name: ");
        return;
    }

    if ( !valid_name(str) ){
        string pr;
        if ( !neu )
            pr= "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? ";
        else
            pr= "Bitte gib Dir einen anderen Namen: ";

        input_to( "logon2", INPUT_PROMPT, pr );
        return;
    }

    if ( sscanf( str, "gast%d", arg ) == 1 ){
        write( "Du meinst wohl 'Gast' ...\n" );
        str = "gast";
    }

    loginname = str;

    /* read the secure save file to see if character already exists */
    string ssavef=master()->secure_savefile(loginname);
    if ( loginname != "gast"
         && (!ssavef || !sizeof(ssavef) || !restore_object(ssavef) ))
    {
        object *user;

        if ( !neu )
        {
            write( "Es existiert kein Charakter mit diesem Namen.\n" );
            write( "Falls Du einen neuen Charakter erschaffen moechtest, "
                   "tippe bitte \"neu\" ein.\n" );

            loginname = "logon";
            input_to( "logon2", INPUT_PROMPT,
                "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? ");
            return;
        }

        for ( i = sizeof(user = users() - ({ 0, this_object() })); i--; )
            if ( object_name(user[i])[0..12] == "/secure/login" &&
                 (({string})user[i]->loginname()) == loginname ){
                write( "Eine Anmeldung fuer diesen Namen laeuft bereits.\n" );
                destruct( this_object() );
                return;
            }

        // Site-Banish checken
        if ( check_illegal(loginname))
            return;

        if ( check_too_many_from_same_ip() )
            return;

        /* new character */
        if ( sizeof(loginname) < 3 ){
            write( "Der Name ist zu kurz.\n" );
            loginname = "logon";
            input_to( "logon2", INPUT_PROMPT,
                "Versuch einen anderen Namen: ");
            return;
        }

        
        if ( (txt = ({string})master()->QueryBanished(loginname)) ){
            if ( txt != "Dieser Name ist gesperrt." )
                txt = sprintf("Hoppla - dieser Name ist reserviert oder gesperrt "
                    "(\"gebanisht\")!\nGrund: %s\n",txt);
            else
                txt = "Hoppla - dieser Name ist reserviert oder gesperrt "
                    "(\"gebanisht\")!\n";
            write(txt);
            loginname = "logon";
            input_to( "logon2", INPUT_PROMPT,
                "Bitte gib Dir einen anderen Namen: ");
            return;
        }

        /* Initialize the new secure savefile */
        name = loginname;
        password = "";
        level = 0;
        domains = ({ });
        guilds = ({ }); 
        shell = "";
        ep = "";
        ek = "";
        mq = "";
        ektips="";
        fptips="";
        creation_date = time();

        input_to( "new_password", INPUT_NOECHO|INPUT_PROMPT,
            "Waehle ein Passwort: ");
        return;
    }
    else {
        if ( loginname == "gast" ){
            if ( check_illegal(loginname) )
                return;

            load_player_object(1);
            return;
        }

        if ( neu ){
            write( "Es existiert bereits ein Charakter dieses Namens.\n" );
            loginname = "logon";
            input_to( "logon2", INPUT_PROMPT,
                "Gib Dir einen anderen Namen: ");
            return;
        }

        if ( ({int})master()->check_late_player(loginname) )
        {
            write( "Dieser Spieler hat uns leider fuer immer verlassen.\n" );
            loginname = "logon";
            input_to( "logon2", INPUT_PROMPT,
                "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? ");
            return;
        }

        if ( txt = ({string})master()->QueryTBanished(loginname) ){
            write( txt );
            loginname = "logon";
            input_to( "logon2", INPUT_PROMPT,
                "Wie heisst Du denn (\"neu\" fuer neuen Spieler)? ");
            return;
        }

        if ( creation_date > (time() - 30*24*60*60)
             && check_too_many_from_same_ip() )
            return;

        write( "Schoen, dass Du wieder da bist, "+capitalize(loginname)+"!\n" );

        if ( !stringp(password) || password == "" ) {
            write( "Du hast KEIN PASSWORD!\n" );
            write( "Benutze den \"password\"-Befehl, um das zu aendern !\n" );
            load_player_object(0);
            return;
        }

        input_to( "check_password", INPUT_NOECHO|INPUT_PROMPT,
            "Passwort: ");
        return;
    }
}


static int new_password( string str )
{
    write( "\n" );

    if ( !str || str == "" )
        return remove();

    password = str;

    if ( !master()->good_password( str, loginname ) ) {
        input_to( "new_password", INPUT_NOECHO|INPUT_PROMPT,
            "Bitte gib ein Passwort an: ");
        return 1;
    }

    write( "\nZur Erinnerung: Es ist  v e r b o t e n, andere Spieler "
           "anzugreifen!\n" );
    write( "Das gilt auch fuer Froesche, bei denen \"Ein Frosch namens "
           "XXXXX\" steht.\n\n" );
    input_to( "again_password", INPUT_NOECHO|INPUT_PROMPT,
        "Passwort bitte nochmal eingeben: ");
    return 1;
}

static int again_password( string str )
{
    write( "\n" );

    if ( str != password ){
        write( "Die Passwoerter stimmten nicht ueberein!\n" );
        destruct( this_object() );
        return 1;
    }

    set_next_reset(600);
    password = md5_crypt( password, 0 );
    save_object( SECURESAVEPATH + loginname[0..0] + "/" + loginname );
    master()->RemoveFromCache( loginname );

    load_player_object(0);
    return 1;
}

static int check_password( string str )
{
    write( "\n" );

    // Invis einloggen?
    if (sizeof(str) > 1 && str[0] == '-') {
        invis = 1;
        str = str[1..];
    }

    // welcher Hash ists denn?
    if (sizeof(password) > 13) {
        // MD5-Hash
        str = md5_crypt(str, password);
    }
    else if (sizeof(password) > 2) {
        // Crypt-Hash
        str = crypt(str, password[0..1]);
    }
    else {
        // keiner von beiden Hashes -> ungueltiges PW
        str = 0;
    }

    if ( !stringp(str) || str != password ) {
      // Hashes stimmen nicht ueberein -> und schluss...
      write( "Falsches Passwort!\n");
      if ( loginfails > 2 )
        write(break_string(
          "Solltest Du weiterhin Probleme mit dem Einloggen haben, kannst "
          "Du Dein Passwort zuruecksetzen lassen, indem Du Dich als Gast "
          "anmeldest und einen Erzmagier ansprichst, oder indem Du Dich "
          "mittels einer E-Mail an mud@mg.mud.de mit uns in Verbindung "
          "setzt.",78));
    
      log_file( (level < 60 ? "LOGINFAIL" : "ARCH/LOGINFAIL"),
        sprintf( "PASSWORD: %-11s %s, %-15s (%s)\n",           
                  loginname, ctime(time())[4..15],
                  query_ip_number(this_object()),           
                  query_ip_name(this_object()) ), 200000 );
      
      loginfails++;
      save_object( SECURESAVEPATH + loginname[0..0] + "/" + loginname );
      master()->RemoveFromCache( loginname );
      destruct( this_object() );
      return 1;
    }

    if ( loginfails ) {
        write( loginfails + " fehlgeschlagene" + (loginfails == 1 ? "r" : "") +
               " Login-Versuch" + (loginfails == 1 ? "" : "e") +
               " seit dem letzten erfolgreichen Login.\n" );
        loginfails = 0;
    }

    save_object( SECURESAVEPATH + loginname[0..0] + "/" + loginname );
    master()->RemoveFromCache( loginname );

    load_player_object(0);
    return 1;
}


static void select_race()
{
    int i;
    string race;
    int selectable;

    races = get_dir( "/std/shells/*.c" );

    // Mensch soll immer als erstes in der Auswahlliste stehen.
    if (member(races,"human.c")!=-1)
            races=({"human.c"})+(races-({"human.c"}));
    
    for ( i = sizeof(races); i--; ){
        races[i] = "/std/shells/" + races[i][0..<3];
        selectable = 0;
        race = 0;
        if ( catch(selectable = ({int})call_other( races[i],
                   "QueryAllowSelect" ); publish) 
            || !selectable)
            selectable = 0;
        else if ( catch(race = ({string})call_other(races[i],
                "QueryProp", P_RACE );publish) )
            race = 0;

        if ( !selectable || !sizeof(race) )
            races[i..i] = ({});
        else
            races[i] = ({ races[i], race });
    }

    if ( sizeof(races) == 1 ){
        write( "Es gibt nur eine Rasse, Du hast also keine Wahl.\n" );

        shell = races[0][0];
        master()->set_player_object( loginname, shell );

        return load_player_ob_2( shell, 0 );
    }

    return ask_mud_played_question();
}

static void ask_mud_played_question()
{
        write(break_string(
                "\nWenn Du ein absoluter Neuling in diesem Spiel bist moechten "
                "wir Dir mit einigen Tips zu Beginn beiseite stehen.\n\n",78,
                0,BS_LEAVE_MY_LFS));
        input_to( "get_mud_played_answer", INPUT_PROMPT,
            "Hast Du schon einmal in einem MUD gespielt? (ja,nein): ");
        return;
}

static void ask_race_question()
{
    int i, j;

    write( break_string( "Du musst Dich jetzt entscheiden, welcher Rasse Du "
                         "in dieser Welt angehoeren moechtest. Alle Rassen "
                         "haben verschiedene Vor- und Nachteile, insgesamt "
                         "aber gleich gute Chancen. Auch das Startgebiet "
                         "haengt von der ausgewaehlten Rasse ab. Im "
                         "Normalfall kann die Rasse nicht mehr gewechselt "
                         "werden, nachdem sie einmal ausgewaehlt wurde. "
                         "Ueberlege Dir Deine Entscheidung also gut. Derzeit "
                         "stehen folgende Rassen zur Auswahl:\n\n", 78 ) );

    for ( i = 0, j = sizeof(races); i < j; i++ )
        printf( "% 2d. %-30s   %s", i+1, capitalize(races[i][1]),
                (i % 2 ? "\n" : "| ") );

    if ( sizeof(races) % 2 )
        write( "\n" );

    write( break_string( "\nDurch Eingabe einer Ziffer waehlst Du die Rasse "
                         "aus, durch Eingabe eines \"\?\" gefolgt von einer "
                         "Ziffer erhaeltst Du naehere Informationen ueber "
                         "eine Rasse. Ein \"\?\" allein wiederholt diese "
                         "Liste.", 78, 0, 1 ) );

    if (newbie)
    {
            write(break_string("\nAls Neuling solltest Du Dich NICHT fuer "
                                    "die Dunkelelfen entscheiden. Diese "
                                    "Rasse hat einige Probleme im Umgang "
                                    "mit den anderen Rassen und mit dem "
                                    "Sonnenlicht.",78,0,BS_LEAVE_MY_LFS));
    }

    input_to( "get_race_answer", INPUT_PROMPT,
        "\nWas willst Du tun: ");
    return;
}


static void get_race_answer( string str )
{
    int num;

    if ( str == "?" )
        return ask_race_question();

    if ( sscanf( str, "?%d", num ) ){
        if ( num < 1 || num > sizeof(races) ){
            write( "Das geht nicht.\n\n");
            input_to( "get_race_answer", INPUT_PROMPT,
                "Was willst Du tun: ");
            return;
        }

        write( call_other( races[num - 1][0], "QueryProp", P_RACE_DESCRIPTION ));
        input_to( "get_race_answer", INPUT_PROMPT,
            "\nWas willst Du tun: ");
        return;
    }

    if ( sscanf( str, "%d", num ) && num >= 1 && num <= sizeof(races) ){
        write( "Ok, Du bist jetzt ein "
            + capitalize(races[num-1][1]) + ".\n" );

        shell = races[num-1][0];
        master()->set_player_object( loginname, shell );
        return load_player_ob_2( shell, 0 );
    }

    write("Wie bitte?\n\n" );
    input_to( "get_race_answer", INPUT_PROMPT,
        "Was willst Du tun: ");
}

static void get_mud_played_answer (string str)
{
        if ( str == "ja" || str=="j")
                {
                newbie=0;
                return ask_race_question();
                }
        if ( str != "nein" && str!="n")
        {
                write("\n\nAntworte bitte mit ja oder nein.\n\n");
                                
                return ask_mud_played_question();
        }
        newbie=1;
        write("\n\nEine kleine Einfuehrung in das "MUDNAME" bekommst "
                        "Du auch hier:\n\n"
                        "http://mg.mud.de/newweb/hilfe/tutorial/inhalt.shtml\n\n");
        return ask_race_question();
        
}

static int load_player_object( int guestflag )
{
    object ob;
    string fname;
    int was_interactive;

    if ( sizeof(users()) >= 195 && !IS_WIZARD(loginname) ){
        write( "Die maximale Spielerzahl wurde bereits erreicht!!!\n"
               "Aus technischen Gruenden duerfen sich nur noch Magier "
               "einloggen.\nVersuch es spaeter noch einmal ...\n" );
        destruct( this_object() );
        return 1;
    }
    else if ( sizeof(users()) >= 198 && !IS_ARCH(loginname) ){
        write( "Die maximale Spieler- und Magierzahl wurde bereits erreicht!!!"
               "\nAus technischen Gruenden duerfen sich nur noch Erzmagier "
               "einloggen.\nVersuch es spaeter noch einmal ...\n" );
        destruct( this_object() );
        return 1;
    }

    if ( file_size("/etc/NOLOGIN")>=0 )
    {
      if (file_size("/etc/NOLOGIN.info")>0) {
        //NOLOGIN.info enthaelt evtl. weitergehende Informationen fuer 
        //Spieler, z.B. vorrauss. Wiederverfuegbarkeit.
        write(break_string(read_file("/etc/NOLOGIN.info"),78,"",
              BS_LEAVE_MY_LFS|BS_SINGLE_SPACE));
      }
      else {
        //sonst Standardmeldung ausgeben.
        write ("\nAufgrund von technischen Problemen ist das Einloggen ins "
                MUDNAME" zur \nZeit nicht moeglich. Bitte versuch es "
                      "spaeter noch einmal.\n\n");
      }
      if ( IS_ARCH(loginname) || 
           member(explode(read_file("/etc/NOLOGIN")||"","\n"),
                  loginname)!=-1 )
      {
        write("Im Moment koennen nur Erzmagier einloggen. Um Spieler "
              "wieder ins Spiel zu lassen, muss die Datei '/etc/NOLOGIN' "
              "geloescht werden.\n\n ");
      } else {
        destruct( this_object() );
        return 1;                        
      }
    }

    if ( guestflag ){
        if ( catch(guestflag = ({int})GUESTMASTER->new_guest();publish) 
             || !guestflag ){
            write( "Derzeit ist kein Gastlogin moeglich!\n" );
            destruct( this_object() );
            return 1;
        }

        loginname = "gast" + guestflag;
        cap_name = capitalize(loginname);
        name = cap_name;

        if ( !(ob = find_player(loginname) || find_netdead(loginname)) ){
            object *user;
            int i;

            // gegen Horden von Gast1 - wenn ein Gast noch am Prompt fuer
            // das Geschlecht haengt, ist er ueber find_player() noch nicht
            // zu finden ...
            for ( i = sizeof(user = users() - ({ 0, this_object() })); i--; )
                if ( object_name(user[i])[0..11] == "/std/shells/" &&
                     getuid(user[i]) == loginname ){
                    ob = user[i];
                    break;
                }
        }

        if ( ob ){
            tell_object( ob, "Ein anderer Spieler moechte diesen Gastzugang "
                         "jetzt benutzen. Wenn es Dir hier\ngefallen hat, "
                         "ueberleg Dir doch einen Charakternamen und komm "
                         "unter diesem\nNamen wieder!\n" );
            destruct(ob);
        }

        load_player_ob_2( "std/shells/human", guestflag );

        return 1;
    }
    else {
        /* Test if we are already playing */
        was_interactive = 0;
        ob = find_player(loginname) || find_netdead(loginname);

        if (ob) {
            write( "Du nimmst schon am Spiel teil!\n" );
            write( "Verwende Deine alte sterbliche Huelle ...\n" );

            if ( interactive(ob) )
            {
                /* The other object is still interactive; reconnect that "soul"
                   to a dummy object and destruct that, thus disconnecting the
                   other probably linkdead user. The real "body" is still
                   there for reconnecting by login.c */
                remove_interactive(ob);
                was_interactive = 1;
            }
            // Wenn Invislogin, P_INVIS setzen.
            if ( invis && IS_WIZARD(ob) )
            {
                ob->SetProp( P_INVIS, ob->QueryProp(P_AGE) );
                tell_object( ob, "DU BIST UNSICHTBAR!\n" );
            }
            /* Now reconnect to the old body */
            exec( ob, this_object() );
            ob->set_realip(realip);
            if ( (({int})ob->QueryProp(P_LEVEL)) == -1 )
                ob->start_player( cap_name );
            else
                ob->Reconnect( was_interactive );

            call_out( "remove", 2 );
            return 1;
        }
    }

    /* read player object from passwd file */
    if ( stringp(shell) && shell != "" )
        load_player_ob_2 ( shell, 0 );
    else
        select_race();

    return 1;
}


static void load_player_ob_2( string obname, int guestflag )
{
    object blueprint;
    string err, ob_name;
    object ob, old_ob;

    if (!interactive()) {
      destruct(this_object());
      return;
    }
    /* start player activity */
    log_file( "syslog/shell/ENTER", sprintf( "%-11s %s, %-15s (%s).\n",
                                capitalize(name), ctime(time())[4..15],
                                query_ip_number(this_object()),
                                query_ip_name(this_object()) ), 200000 );

    seteuid(loginname);

    /* load the "real" player object */
    /* If some asshole has moved the blueprint */
    if ( objectp(blueprint = find_object(obname))  && environment(blueprint) )
        destruct(blueprint);

    if ( err = catch(ob = clone_object(obname);publish) ){
        log_file( "SHELLS", "Failed to load shell " + obname + ", " +
                  dtime(time()) + ", " + loginname + "\n" + err + "\n\n" );

        write( "Konnte das passende Playerobjekt nicht laden. Lade "
               "stattdessen\ndas Objekt Mensch. BITTE ERZMAGIER "
               "BENACHRICHTIGEN !\n" );
        err = catch(ob = clone_object("/std/shells/human");publish);
    }

    if ( !ob || err ) {
        write( "Error on loading " + shell + "\nError = " + err + "\n" );
        destruct( this_object() );
        return;
    }

    if ( guestflag )
        catch( GUESTMASTER->set_guest( guestflag, ob );publish );

    ob_name = explode( object_name(ob), "#" )[0];

    if ( sizeof(ob_name) > 11 && ob_name[0..11] == "/std/shells/" )
        ob_name = ob_name[11..];

    ob_name = ob_name + ":" + loginname;

  if( !guestflag )
  {
      if ( old_ob = find_object(ob_name) )
      {
          catch(old_ob->remove();publish);

          if ( old_ob )
              destruct( old_ob );
      }
      rename_object( ob, ob_name );
      ob->__reload_explore();
  }
  exec( ob, this_object() );
  ob->set_realip(realip);
  ob->start_player( cap_name );
  // Hinweis: Das Spielerobjekt holt sich in updates_after_restore() von hier
  // den Status von invis und setzt ggf. P_INVIS, ausserdem den Status der
  // Telnet Negotiations.

  // wenn der Spieler noch nicht im Mud gespielt hat, wird die aktuelle Zeit
  // in die entsprechende Prop geschrieben. Die Prop ist transient und wird
  // absichtlich nicht gespeichert.
  if (newbie)
    ob->SetProp("_lib_mud_newbie", creation_date);

  destruct( this_object() );
}


/*
 *   With arg = 0 this function should only be entered once!
 */
protected void create()
{
    loginname = "logon";
    creation_date = -1;
    catch( load_object( "/secure/merlin");publish );
    loginfails = 0;
    if (clonep())
      set_next_reset(900);
    else
      set_next_reset(-1);
}

void reset()
{
  if (clonep())
  {
    if (interactive(this_object()))
      tell_object(this_object(),"Time out!");
    remove();
  }
}

public string short()
{
    return "<Einloggender Teilnehmer>.\n";
}


public string query_real_name()
{
    return "<logon>";
}


public nomask int query_prevent_shadow()
{
    return 1;
}


// Wird von simul_efuns benutzt, um nen dummy-Spielerobjekt zu erzeugen. Nicht
// im Loginprozess involviert.
public mixed new_logon( string str)
{
    seteuid(getuid()); // sonst funkt ARCH_SECURITY nicht

    if ( !ARCH_SECURITY || process_call() ){
        write( "Nur fuer Erzmagier erlaubt!\n" );
        destruct( this_object() );
        return -1;
    }

    if ( !str || str == "" ){
        write( "Kein Name angegeben!\n" );
        destruct( this_object() );
        return 0;
    }

    str = lower_case(str);
    cap_name = capitalize(str);

    loginname = str;
    seteuid(ROOTID);

    /* read the secure save file to see if character already exists */
    if ( !restore_object( master()->secure_savefile(loginname) ) ){
        write( "Kein solcher Spieler!\n" );
        destruct( this_object() );
        return 0;
    }
    else {
        write( "Ok, der Spieler " + capitalize(str) + " existiert!\n" );
        return new_load_player_object();
    }
}

// Wird von simul_efuns benutzt, um nen dummy-Spielerobjekt zu erzeugen. Nicht
// im Loginprozess involviert.
static mixed new_load_player_object()
{
    if ( find_player(loginname) || find_netdead(loginname) ){
        write( "Der Spieler ist bereits online oder netztot!\n" );
        destruct( this_object() );
        return 2;
    }

    /* read player object from passwd file */
    if ( stringp(shell) && shell != "" )
        return new_load_player_ob_2( shell );
    else {
        write( "Keine Shell angegeben!\n" );
        destruct( this_object() );
        return 0;
    }
}

// Wird von simul_efuns benutzt, um nen dummy-Spielerobjekt zu erzeugen. Nicht
// im Loginprozess involviert.
static mixed new_load_player_ob_2( string obname )
{
    object blueprint;
    string err, ob_name;
    object ob, old_ob;

    seteuid(loginname);

    /* load the "real" player object */
    /* If some asshole has moved the blueprint */
    if ( objectp(blueprint = find_object(obname)) && environment(blueprint) )
        destruct( blueprint );

    err = catch(ob = clone_object(obname);publish);

    if ( err ){
        log_file( "SHELLS", "Failed to load shell " + obname + ", " +
                  dtime(time()) + ", " + loginname + "\n" + err + "\n\n" );

        write( "Konnte das passende Playerobjekt nicht laden. "
               "Lade stattdessen\ndas Objekt Mensch!\n" );

        err = catch(ob = clone_object( "std/shells/human" );publish );
    }

    if ( !ob || err ){
        write( "Error on loading " + shell + "\nError = " + err + "\n" );
        destruct( this_object() );
        return 0;
    }

    ob_name = explode( object_name(ob), "#" )[0];

    if ( sizeof(ob_name) > 11 && ob_name[0..11] == "/std/shells/" )
        ob_name = ob_name[11..];

    ob_name = ob_name + ":" + loginname;

    if ( old_ob = find_object(ob_name) ){
        catch( old_ob->remove(); publish );

        if ( old_ob )
            destruct( old_ob );
    }

    rename_object( ob, ob_name );
    ob->__reload_explore();
    ob->set_realip(realip);
    ob->start_player(cap_name);
    ob->SetProp( "creation_date", creation_date );
    ob->Set( "creation_date", SAVE|SECURED|PROTECTED, F_MODE_AS );

    ob->move( "/room/nowhere", M_NOCHECK );
    set_object_heart_beat( ob, 0 );
    destruct( this_object() );

    return ob;
}

public string query_realip()
{
  return realip ? realip : 0;
}

int query_invis()
{
  return invis;
}

