MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // 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 | |
| 25 | mapping cache = ([]); |
| 26 | |
| 27 | mapping _query_cache() {return cache;} |
| 28 | |
| 29 | protected void create() |
| 30 | { |
| 31 | seteuid(getuid()); |
| 32 | set_next_reset(3600); |
| 33 | } |
| 34 | |
| 35 | // ja... total simpel... nicht mehr aufwand als noetig. |
| 36 | void reset() |
| 37 | { |
| 38 | cache = ([]); |
| 39 | set_next_reset(10800); |
| 40 | } |
| 41 | |
| 42 | // eigentliche Anfrage an den externen Resolver senden. |
| 43 | protected 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. |
| 52 | public 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. |
| 62 | public 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. |
| 75 | public 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 | */ |
| 90 | public 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 | |