Added public files
Roughly added all public files. Probably missed some, though.
diff --git a/p/daemon/dnslookup.c b/p/daemon/dnslookup.c
new file mode 100644
index 0000000..a952324
--- /dev/null
+++ b/p/daemon/dnslookup.c
@@ -0,0 +1,101 @@
+// MorgenGrauen MUDlib
+//
+// dnslookup.c - kleines DNS-Lookup-Objekt mit Cache.
+// Braucht externen DNS-Resolver, der per UDP ansprechbar ist.
+//
+// Autor: Zesstra
+
+/* Im Mudlibmaster in receive_udp() braucht es noch etwas a la:
+ if( message[0..9]=="DNSLOOKUP\n" ) {
+ "/p/daemon/dnslookup"->update( message );
+ return;
+ }
+
+ ext. Objekt erwartet ganz simpel <hostname>\n als Eingabe und sendet zurueck:
+ DNSLOOKUP\n<hostname>\n<ip-adresse>|UNKNOWN\n
+ (Das | steht fuer oder.)
+*/
+
+#pragma strong_types,rtt_checks
+
+// externer server, der den DNS-Resolve macht.
+#define IPLOOKUP_HOST "127.0.0.1"
+#define IPLOOKUP_PORT 8712
+
+mapping cache = ([]);
+
+mapping _query_cache() {return cache;}
+
+protected void create()
+{
+ seteuid(getuid());
+ set_next_reset(3600);
+}
+
+// ja... total simpel... nicht mehr aufwand als noetig.
+void reset()
+{
+ cache = ([]);
+ set_next_reset(10800);
+}
+
+// eigentliche Anfrage an den externen Resolver senden.
+protected void make_request(string hostname)
+{
+ send_udp( IPLOOKUP_HOST, IPLOOKUP_PORT, hostname+"\n" );
+ if (sizeof(cache) > 1000)
+ reset();
+ cache[hostname]=0; // cached request, but unknown result (yet)
+}
+
+// Hostnamen asynchron aufloesen.
+public string resolve( string hostname )
+{
+ if (member(cache, hostname))
+ return cache[hostname];
+ make_request( hostname );
+ return 0; // leider...
+}
+
+// Pruefung, ob von <ip> Verbindungen zu unserer IP nach <localport>
+// weitergeleitet werden.
+public int check_tor(string ip, int localport)
+{
+ string *arr=explode(ip,".");
+ if (!sizeof(arr)==4)
+ return 0;
+ string req =
+ sprintf("%s.%s.%s.%s.%d.60.24.79.87.ip-port.exitlist.torproject.org",
+ arr[3],arr[2],arr[1],arr[0],localport);
+
+ return resolve(req) == "127.0.0.2";
+}
+
+// Pruefung, ob <ip> auf einigen Blacklists steht.
+public int check_dnsbl(string ip)
+{
+ string *arr=explode(ip,".");
+ if (!sizeof(arr)==4)
+ return 0;
+ string req =
+ sprintf("%s.%s.%s.%s.dnsbl.dronebl.org",
+ arr[3],arr[2],arr[1],arr[0]);
+
+ return resolve(req) != 0;
+}
+
+/* wird vom master aufgerufen, wenn eine antwort vom externen
+ * iplookup dienst eintrudelt.
+ */
+public void update( string udp_reply )
+{
+ if( previous_object()!=master() ) return;
+ string *reply = explode(udp_reply,"\n");
+ if( sizeof(reply)<3 ) return;
+
+ if (reply[2] == "UNKNOWN")
+ cache[reply[1]] = 0;
+ else
+ cache[reply[1]] = reply[2];
+}
+