blob: 31a59b39a736d770db55549018cd3ae6daeb3160 [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.
Zesstra40d1afd2020-04-10 11:01:57 +0200112 // Fuer Nachrichten von unserem eigenen IP-Lookup-Dienst gibts aber eine
113 // Ausnahme.
Zesstrad872d182019-11-28 20:13:02 +0100114 string msg_text;
Zesstra40d1afd2020-04-10 11:01:57 +0200115
116 if (host=="127.0.0.1" && port==8711)
Zesstrad872d182019-11-28 20:13:02 +0100117 {
Zesstra40d1afd2020-04-10 11:01:57 +0200118 if (catch(msg_text = to_text(message, "UTF-8");publish))
119 {
120 msg_text = to_text(message, "ISO8859-1");
121 log_file("UDP_INVALID",sprintf(
122 "Nachricht von %s:%d mit nicht-UTF8-Zeichen: %s\n",
123 host, port, msg_text));
124 }
125 }
126 else
127 {
128 if (catch(msg_text = to_text(message, "ASCII");publish))
129 {
130 msg_text = to_text(message, "ISO8859-1");
131 log_file("UDP_INVALID",sprintf(
132 "Nachricht von %s:%d mit nicht-ASCII-Zeichen: %s\n",
133 host, port, msg_text));
134 }
Zesstrad872d182019-11-28 20:13:02 +0100135 }
MG Mud User88f12472016-06-24 23:31:02 +0200136
Zesstra3d090312019-09-30 21:26:34 +0200137 UDP_DEBUG(sprintf("%s %s:%d: %s\n",strftime(),host,port,msg_text));
138
139 // Nicht mehr benutzt, zur Sicherheit abfangen vor dem inetd.
140 if (strstr(msg_text, "EXTREQ:") == 0
141 || strstr(msg_text, "IPNAME") == 0
142 || strstr(msg_text, "AUTH") == 0)
143 {
MG Mud User88f12472016-06-24 23:31:02 +0200144 return;
145 }
146
Zesstra3d090312019-09-30 21:26:34 +0200147 // Die folgenden Services sind keine Intermud-Dienste
148 if(strstr(msg_text, "IPLOOKUP\n") == 0)
149 {
150 "/p/daemon/iplookup"->update( msg_text );
MG Mud User88f12472016-06-24 23:31:02 +0200151 return;
152 }
153
Zesstra3d090312019-09-30 21:26:34 +0200154 if( strstr(msg_text, "DNSLOOKUP\n") == 0)
155 {
156 "/p/daemon/dnslookup"->update( msg_text );
MG Mud User88f12472016-06-24 23:31:02 +0200157 return;
158 }
159
Zesstra3d090312019-09-30 21:26:34 +0200160 if (strstr(msg_text, "udp_query:") == 0)
161 {
162 return udp_query(msg_text[10..],host,port);
MG Mud User88f12472016-06-24 23:31:02 +0200163 }
Zesstra3d090312019-09-30 21:26:34 +0200164 // Rest an inetd fuer Bearbeitung als Intermud-Nachricht.
165 "secure/inetd"->_receive_udp(host, msg_text);
MG Mud User88f12472016-06-24 23:31:02 +0200166}
167
168