blob: 1808f97f82953bd70a374ba82e400b9dc7af2b5a [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// dnslookup.c - kleines DNS-Lookup-Objekt mit Cache.
4// Braucht externen DNS-Resolver, der per UDP ansprechbar ist.
5//
6// Autor: Zesstra
7
8/* Im Mudlibmaster in receive_udp() braucht es noch etwas a la:
9 if( message[0..9]=="DNSLOOKUP\n" ) {
10 "/p/daemon/dnslookup"->update( message );
11 return;
12 }
13
14 ext. Objekt erwartet ganz simpel <hostname>\n als Eingabe und sendet zurueck:
15 DNSLOOKUP\n<hostname>\n<ip-adresse>|UNKNOWN\n
16 (Das | steht fuer oder.)
17*/
18
19#pragma strong_types,rtt_checks
20
21// externer server, der den DNS-Resolve macht.
22#define IPLOOKUP_HOST "127.0.0.1"
23#define IPLOOKUP_PORT 8712
24
25mapping cache = ([]);
26
27mapping _query_cache() {return cache;}
28
29protected void create()
30{
31 seteuid(getuid());
32 set_next_reset(3600);
33}
34
35// ja... total simpel... nicht mehr aufwand als noetig.
36void reset()
37{
38 cache = ([]);
39 set_next_reset(10800);
40}
41
42// eigentliche Anfrage an den externen Resolver senden.
43protected void make_request(string hostname)
44{
Zesstra5ce91172019-11-05 23:57:34 +010045 send_udp( IPLOOKUP_HOST, IPLOOKUP_PORT,
46 to_bytes(hostname+"\n","ASCII") );
MG Mud User88f12472016-06-24 23:31:02 +020047 if (sizeof(cache) > 1000)
48 reset();
49 cache[hostname]=0; // cached request, but unknown result (yet)
50}
51
52// Hostnamen asynchron aufloesen.
53public string resolve( string hostname )
54{
55 if (member(cache, hostname))
56 return cache[hostname];
57 make_request( hostname );
58 return 0; // leider...
59}
60
61// Pruefung, ob von <ip> Verbindungen zu unserer IP nach <localport>
62// weitergeleitet werden.
63public int check_tor(string ip, int localport)
64{
65 string *arr=explode(ip,".");
Zesstra45c9e9f2016-10-17 20:31:57 +020066 if (sizeof(arr)!=4)
MG Mud User88f12472016-06-24 23:31:02 +020067 return 0;
68 string req =
69 sprintf("%s.%s.%s.%s.%d.60.24.79.87.ip-port.exitlist.torproject.org",
70 arr[3],arr[2],arr[1],arr[0],localport);
71
72 return resolve(req) == "127.0.0.2";
73}
74
75// Pruefung, ob <ip> auf einigen Blacklists steht.
76public int check_dnsbl(string ip)
77{
78 string *arr=explode(ip,".");
Zesstra45c9e9f2016-10-17 20:31:57 +020079 if (!sizeof(arr)!=4)
MG Mud User88f12472016-06-24 23:31:02 +020080 return 0;
81 string req =
82 sprintf("%s.%s.%s.%s.dnsbl.dronebl.org",
83 arr[3],arr[2],arr[1],arr[0]);
84
85 return resolve(req) != 0;
86}
87
88/* wird vom master aufgerufen, wenn eine antwort vom externen
89 * iplookup dienst eintrudelt.
90 */
91public void update( string udp_reply )
92{
93 if( previous_object()!=master() ) return;
94 string *reply = explode(udp_reply,"\n");
95 if( sizeof(reply)<3 ) return;
96
97 if (reply[2] == "UNKNOWN")
98 cache[reply[1]] = 0;
99 else
100 cache[reply[1]] = reply[2];
101}
102