| // MorgenGrauen MUDlib |
| // |
| // master/network.c - UDP-Handling |
| // |
| // $Id: network.c 8934 2014-09-10 21:57:12Z Zesstra $ |
| |
| #pragma strict_types,rtt_checks,pedantic |
| |
| #include "/secure/master.h" |
| #define BBMASTER "/secure/bbmaster" |
| |
| /* |
| #undef DEBUG |
| #define DEBUG(x) if (call_sefun("find_player","zesstra")) \ |
| tell_object(call_sefun("find_player","zesstra"),x); |
| */ |
| |
| //ich will hieraus momentan kein Debug, ist zuviel. Zesstra |
| |
| #ifdef DEBUG |
| #undef DEBUG |
| #endif |
| #define DEBUG(x) |
| |
| nosave int mails_last_hour; |
| |
| static string mail_normalize( string str ) |
| { |
| str = regreplace( str, "[^<]*<(.*)>[^>]*", "\\1", 0); |
| return regreplace( str, " *([^ ][^ ]*).*", "\\1", 0); |
| } |
| |
| |
| static string *mk_rec_list( string str ) |
| { |
| return map( explode( lower_case(str), "," ) - ({""}), |
| "mail_normalize", this_object() ); |
| } |
| |
| |
| static int CheckPasswd( string name, string passwd ) { |
| mixed *uinf; |
| |
| if (!stringp(passwd) || !sizeof(passwd)) |
| return 0; |
| if ( sizeof(uinf = get_full_userinfo(name)) < 2 ) |
| return 0; |
| |
| string pwhash = uinf[USER_PASSWORD+1]; |
| if (sizeof(pwhash) > 13) { |
| // MD5-Hash |
| passwd = md5_crypt(passwd, pwhash); |
| } |
| else if (sizeof(pwhash) > 2) { |
| // Crypt-Hash |
| passwd = crypt(passwd, pwhash[0..1]); |
| } |
| else return 0; |
| |
| return (passwd == pwhash); |
| } |
| |
| static void udp_query( string query, string host, int port ) |
| { |
| #if __EFUN_DEFINED__(send_udp) |
| string *mess; |
| mixed *data; |
| int i, j; |
| |
| mess = explode( query, " " ); |
| |
| switch ( mess[1] ){ |
| case "wholist": |
| case "who": |
| data = ({string*})"/obj/werliste"->QueryWhoListe(); |
| break; |
| |
| case "uptime": |
| data = ({ call_sefun("uptime") }); |
| break; |
| |
| case "finger": |
| if ( sizeof(mess) < 3 ) |
| data = ({ "Error: Wen soll ich fingern ?" }); |
| else |
| data = explode( "/p/daemon/finger"-> |
| finger_single( lower_case(mess[2]), 0 ), "\n" ); |
| break; |
| |
| default: |
| data = ({ "Error: unknown request " + mess[1] + "\n" }); |
| } |
| |
| |
| send_udp( host, port, |
| to_bytes(sprintf( "%s 0 %d", mess[0], sizeof(data)), |
| "ASCII//TRANSLIT")); |
| |
| for ( i = 0, j = sizeof(data); i < j; i++ ) |
| send_udp( host, port, |
| to_bytes(sprintf( "%s %d %s", mess[0], i+1, data[i]), |
| "ASCII//TRANSLIT") ); |
| #endif |
| } |
| |
| #define UDP_DEBUG(x) |
| //#define UDP_DEBUG(x) (write_file("/log/ARCH/udp.log",(x))) |
| |
| void receive_udp(string host, bytes message, int port) |
| { |
| // Traditionell sind einkommende Nachrichten via UDP immer ASCII-pur |
| // gewesen. Davon geht auch aller hier gerufener Code aus. Daher wird jetzt |
| // hier zentral die Bytesequenz als ASCII interpretiert und in string |
| // gewandelt, der dann wie bislang auch verarbeitet wird. |
| string msg_text; |
| if (catch(msg_text = to_text(message, "ASCII");publish)) |
| { |
| msg_text = to_text(message, "ISO8859-1"); |
| log_file("UDP_INVALID",sprintf( |
| "Nachricht von %s mit nicht-ASCII-Zeichen: %s\n", |
| host, msg_text)); |
| } |
| |
| UDP_DEBUG(sprintf("%s %s:%d: %s\n",strftime(),host,port,msg_text)); |
| |
| // Nicht mehr benutzt, zur Sicherheit abfangen vor dem inetd. |
| if (strstr(msg_text, "EXTREQ:") == 0 |
| || strstr(msg_text, "IPNAME") == 0 |
| || strstr(msg_text, "AUTH") == 0) |
| { |
| return; |
| } |
| |
| // Die folgenden Services sind keine Intermud-Dienste |
| if(strstr(msg_text, "IPLOOKUP\n") == 0) |
| { |
| "/p/daemon/iplookup"->update( msg_text ); |
| return; |
| } |
| |
| if( strstr(msg_text, "DNSLOOKUP\n") == 0) |
| { |
| "/p/daemon/dnslookup"->update( msg_text ); |
| return; |
| } |
| |
| if (strstr(msg_text, "udp_query:") == 0) |
| { |
| return udp_query(msg_text[10..],host,port); |
| } |
| // Rest an inetd fuer Bearbeitung als Intermud-Nachricht. |
| "secure/inetd"->_receive_udp(host, msg_text); |
| } |
| |
| |