blob: 35f202da912ca6d178da4d660fa11e19341aa219 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// master/network.c - UDP-Handling
4//
5// $Id: network.c 8934 2014-09-10 21:57:12Z Zesstra $
6
MG Mud User88f12472016-06-24 23:31:02 +02007#define BBMASTER "/secure/bbmaster"
8
9/*
10#undef DEBUG
11#define DEBUG(x) if (call_sefun("find_player","zesstra")) \
12 tell_object(call_sefun("find_player","zesstra"),x);
13*/
14
15//ich will hieraus momentan kein Debug, ist zuviel. Zesstra
16
17#ifdef DEBUG
18#undef DEBUG
19#endif
20#define DEBUG(x)
21
22nosave int mails_last_hour;
23
24static string mail_normalize( string str )
25{
26 str = regreplace( str, "[^<]*<(.*)>[^>]*", "\\1", 0);
27 return regreplace( str, " *([^ ][^ ]*).*", "\\1", 0);
28}
29
30
31static string *mk_rec_list( string str )
32{
33 return map( explode( lower_case(str), "," ) - ({""}),
34 "mail_normalize", this_object() );
35}
36
37
38static int CheckPasswd( string name, string passwd ) {
39 mixed *uinf;
40
41 if (!stringp(passwd) || !sizeof(passwd))
42 return 0;
43 if ( sizeof(uinf = get_full_userinfo(name)) < 2 )
44 return 0;
45
46 string pwhash = uinf[USER_PASSWORD+1];
47 if (sizeof(pwhash) > 13) {
48 // MD5-Hash
49 passwd = md5_crypt(passwd, pwhash);
50 }
51 else if (sizeof(pwhash) > 2) {
52 // Crypt-Hash
53 passwd = crypt(passwd, pwhash[0..1]);
54 }
55 else return 0;
56
57 return (passwd == pwhash);
58}
59
MG Mud User88f12472016-06-24 23:31:02 +020060static void udp_query( string query, string host, int port )
61{
62#if __EFUN_DEFINED__(send_udp)
63 string *mess;
64 mixed *data;
65 int i, j;
66
67 mess = explode( query, " " );
Zesstraac1317a2019-09-27 16:14:44 +020068
MG Mud User88f12472016-06-24 23:31:02 +020069 switch ( mess[1] ){
70 case "wholist":
71 case "who":
Zesstrad872d182019-11-28 20:13:02 +010072 data = ({string*})"/obj/werliste"->QueryWhoListe();
MG Mud User88f12472016-06-24 23:31:02 +020073 break;
74
75 case "uptime":
76 data = ({ call_sefun("uptime") });
77 break;
78
79 case "finger":
80 if ( sizeof(mess) < 3 )
81 data = ({ "Error: Wen soll ich fingern ?" });
82 else
Zesstraac1317a2019-09-27 16:14:44 +020083 data = explode( "/p/daemon/finger"->
MG Mud User88f12472016-06-24 23:31:02 +020084 finger_single( lower_case(mess[2]), 0 ), "\n" );
85 break;
86
MG Mud User88f12472016-06-24 23:31:02 +020087 default:
88 data = ({ "Error: unknown request " + mess[1] + "\n" });
89 }
90
91
Zesstraac1317a2019-09-27 16:14:44 +020092 send_udp( host, port,
93 to_bytes(sprintf( "%s 0 %d", mess[0], sizeof(data)),
94 "ASCII//TRANSLIT"));
MG Mud User88f12472016-06-24 23:31:02 +020095
96 for ( i = 0, j = sizeof(data); i < j; i++ )
Zesstraac1317a2019-09-27 16:14:44 +020097 send_udp( host, port,
98 to_bytes(sprintf( "%s %d %s", mess[0], i+1, data[i]),
99 "ASCII//TRANSLIT") );
MG Mud User88f12472016-06-24 23:31:02 +0200100#endif
101}
102
103#define UDP_DEBUG(x)
104//#define UDP_DEBUG(x) (write_file("/log/ARCH/udp.log",(x)))
105
Zesstra3d090312019-09-30 21:26:34 +0200106void receive_udp(string host, bytes message, int port)
MG Mud User88f12472016-06-24 23:31:02 +0200107{
Zesstra3d090312019-09-30 21:26:34 +0200108 // Traditionell sind einkommende Nachrichten via UDP immer ASCII-pur
109 // gewesen. Davon geht auch aller hier gerufener Code aus. Daher wird jetzt
110 // hier zentral die Bytesequenz als ASCII interpretiert und in string
111 // gewandelt, der dann wie bislang auch verarbeitet wird.
Zesstrad872d182019-11-28 20:13:02 +0100112 string msg_text;
113 if (catch(msg_text = to_text(message, "ASCII");publish))
114 {
115 msg_text = to_text(message, "ISO8859-1");
116 log_file("UDP_INVALID",sprintf(
117 "Nachricht von %s mit nicht-ASCII-Zeichen: %s\n",
118 host, msg_text));
119 }
MG Mud User88f12472016-06-24 23:31:02 +0200120
Zesstra3d090312019-09-30 21:26:34 +0200121 UDP_DEBUG(sprintf("%s %s:%d: %s\n",strftime(),host,port,msg_text));
122
123 // Nicht mehr benutzt, zur Sicherheit abfangen vor dem inetd.
124 if (strstr(msg_text, "EXTREQ:") == 0
125 || strstr(msg_text, "IPNAME") == 0
126 || strstr(msg_text, "AUTH") == 0)
127 {
MG Mud User88f12472016-06-24 23:31:02 +0200128 return;
129 }
130
Zesstra3d090312019-09-30 21:26:34 +0200131 // Die folgenden Services sind keine Intermud-Dienste
132 if(strstr(msg_text, "IPLOOKUP\n") == 0)
133 {
134 "/p/daemon/iplookup"->update( msg_text );
MG Mud User88f12472016-06-24 23:31:02 +0200135 return;
136 }
137
Zesstra3d090312019-09-30 21:26:34 +0200138 if( strstr(msg_text, "DNSLOOKUP\n") == 0)
139 {
140 "/p/daemon/dnslookup"->update( msg_text );
MG Mud User88f12472016-06-24 23:31:02 +0200141 return;
142 }
143
Zesstra3d090312019-09-30 21:26:34 +0200144 if (strstr(msg_text, "udp_query:") == 0)
145 {
146 return udp_query(msg_text[10..],host,port);
MG Mud User88f12472016-06-24 23:31:02 +0200147 }
Zesstra3d090312019-09-30 21:26:34 +0200148 // Rest an inetd fuer Bearbeitung als Intermud-Nachricht.
149 "secure/inetd"->_receive_udp(host, msg_text);
MG Mud User88f12472016-06-24 23:31:02 +0200150}
151
152