blob: a952324e34f07947544bf313470847dfc64b8670 [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{
45 send_udp( IPLOOKUP_HOST, IPLOOKUP_PORT, hostname+"\n" );
46 if (sizeof(cache) > 1000)
47 reset();
48 cache[hostname]=0; // cached request, but unknown result (yet)
49}
50
51// Hostnamen asynchron aufloesen.
52public string resolve( string hostname )
53{
54 if (member(cache, hostname))
55 return cache[hostname];
56 make_request( hostname );
57 return 0; // leider...
58}
59
60// Pruefung, ob von <ip> Verbindungen zu unserer IP nach <localport>
61// weitergeleitet werden.
62public int check_tor(string ip, int localport)
63{
64 string *arr=explode(ip,".");
65 if (!sizeof(arr)==4)
66 return 0;
67 string req =
68 sprintf("%s.%s.%s.%s.%d.60.24.79.87.ip-port.exitlist.torproject.org",
69 arr[3],arr[2],arr[1],arr[0],localport);
70
71 return resolve(req) == "127.0.0.2";
72}
73
74// Pruefung, ob <ip> auf einigen Blacklists steht.
75public int check_dnsbl(string ip)
76{
77 string *arr=explode(ip,".");
78 if (!sizeof(arr)==4)
79 return 0;
80 string req =
81 sprintf("%s.%s.%s.%s.dnsbl.dronebl.org",
82 arr[3],arr[2],arr[1],arr[0]);
83
84 return resolve(req) != 0;
85}
86
87/* wird vom master aufgerufen, wenn eine antwort vom externen
88 * iplookup dienst eintrudelt.
89 */
90public void update( string udp_reply )
91{
92 if( previous_object()!=master() ) return;
93 string *reply = explode(udp_reply,"\n");
94 if( sizeof(reply)<3 ) return;
95
96 if (reply[2] == "UNKNOWN")
97 cache[reply[1]] = 0;
98 else
99 cache[reply[1]] = reply[2];
100}
101