Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/secure/memory.c b/secure/memory.c
new file mode 100644
index 0000000..797ad1c
--- /dev/null
+++ b/secure/memory.c
@@ -0,0 +1,299 @@
+/*!
+// MorgenGrauen Mudlib
+//
+// secure/memory.c  -- zum Speichern von Daten ueber die gesamte Mud-Uptime
+//
+// Memory speichert seine Daten als Pointer in der extra-wizinfo. Andere 
+// Programme koennen Ihre Daten im Memory ablegen. Die Daten bleiben dadurch 
+// auch ueber ein Update/Reload der Blueprint erhalten.
+//
+// Die Daten werden auf Klassenebene behandelt. Jeder Clone eines Programms
+// (Blueprint) darf auf die gespeicherten Daten des Programms schreibend und
+// lesend zugreifen. Andere Programme haben keinen Zugriff auf diese Daten.
+//
+// Nur Objekte in /secure/memory_lib bzw. /secure/memory_nolib eingetragen 
+// sind, haben Rechte den Memory zu nutzen.
+//
+// Die Idee, sensible Daten in der extra_wizinfo abzuspeichern entstammt 
+// /secure/memory.c aus der Wunderland Mudlib von Holger@Wunderland
+*/
+#include <config.h>
+#include <wizlevels.h>
+#include <files.h>
+
+#pragma strict_types
+#pragma no_clone
+#pragma no_shadow
+#pragma no_inherit
+#pragma verbose_errors
+#pragma combine_strings
+#pragma pedantic
+//#pragma range_check
+#pragma warn_deprecated
+
+
+/* Global variable declaration */
+/*! \brief Liste mit Programmen, die den Memory nutzen duerfen 
+ Die Variable wird entweder im create() oder durch manuellen Aufruf 
+ von RereadProgramLists() aus /secure/memory_lib und /secure/memory_nolib
+ befuellt.
+ */
+string *known_programs;
+
+/* Function declaration - public interface */
+void create();
+
+// Payload Interface
+int   Save  (string key, mixed data);
+mixed Load  (string key);
+int   Remove(string key);
+int   HaveRights();
+
+// Administrative Interface
+varargs int RereadProgramLists(int silent);
+
+// Debugging Interface
+varargs void ShowData(string user, string key);
+
+/* Function definition */ 
+/*! Objekt initialisieren */
+void create() {
+  mapping info;
+  seteuid(getuid(this_object()));
+
+  // Wizinfo-Pointer holen
+  if(!pointerp(info=get_extra_wizinfo(0)))
+    raise_error("WIZINFO nicht lesbar. secure/simul_efun muss neu geladen werden.!\n");
+
+  // Mein Feld der Wizinfo bei Bedarf initialisieren
+  if(!mappingp(info[MEMORY_BUFF]))
+    info[MEMORY_BUFF]=([]);
+
+  RereadProgramLists(1);
+}
+
+/*!
+ Wenn das aufrufende Programm fuer die Speichernutzung zugelassen ist,
+ wird hier der Hash zurueckgegeben unter dem seine Daten abgespeichert
+ sind. Der Hash ist derzeit der Filename des Blueprint.
+*/
+private string get_caller_hash() {
+  if (member(known_programs, program_name(previous_object())[..<3]) != -1) 
+    return program_name(previous_object())[..<3];
+  else 
+    return 0;
+}
+
+/*! 
+ Die Hilfsfunktion liest eine Liste mit Dateinamen und gibt die Programme 
+ als Array of Strings zurueck. Alle Zeilen die nicht mit einem Slash 
+ anfangen, werden dabei ignoriert.
+ \param file Die auszulesende Datei.
+*/
+private mixed read_list(string file)
+{
+  mixed data;
+  if (!stringp(file) || file_size(file) == FSIZE_NOFILE )
+    return ({});
+
+  // Daten laden
+  data = explode(read_file(file)||"", "\n");
+
+  // Alle Zeilen die nicht mit / beginnen entfernen ...
+  data=regexp(data,"^/.+");
+
+  // ".c" und eventuelle Leerzeichen in jeder Zeile werden entfernt
+  data= map(data, 
+     function string (string x) {return regreplace(x,"(.c)* *$","",1);});
+  return data;
+}
+
+/*! 
+ Wenn die Liste mit Programmen geaendert wurde, kann sie hier per Hand
+ neu eingelesen werden.
+ \param silent Varargs Flag, um Bildschirmausgabe zu unterdruecken
+*/
+varargs int RereadProgramLists(int silent)
+{
+  // Objekte laden, die zur Mudlib gehoeren
+  known_programs = read_list("/secure/memory_lib");
+
+  // Objekte laden, die nicht zur Mudlib gehoeren
+  known_programs+=read_list("/secure/memory_nolib");
+
+  if(!silent) printf ("%O\n", known_programs);
+
+  return sizeof(known_programs);
+}
+
+/*! Zeiger auf den Speicher holen */
+private mapping get_memory_pointer(){
+  mixed info;
+
+  // Die Fehlermeldungen sind etwas ausfuehrlicher, um dem Debugger
+  // einen Hinweis auf Reparaturmoeglichkeiten zu geben
+  if(!pointerp(info=get_extra_wizinfo(0)))
+    raise_error("Wizinfo nicht ladbar. Entweder ich hab keine Rechte "
+                "oder das Mud hat ein echtes Problem!\n");
+
+  if(!mappingp(info[MEMORY_BUFF]))
+    raise_error("Ich finde meine Daten in der Wizinfo nicht. Ein EM kann "
+                "versuchen, mich neu zu laden, aber was die alten Daten "
+                "betrifft, frei nach Catty: Keine Arme, keine Kekse!\n");
+  // Da info[MEMORY_BUFF] immer ein Mapping ist (siehe Create), wird hier ein 
+  // Pointer uebergeben. Dadurch werden Details zum Aufbau der extra_wizinfo
+  // nur in dieser Funktion benoetigt.
+  return info[MEMORY_BUFF]; 
+}
+
+/*!
+  Pruefen, ob previous_object() Nutzungsrechte fuer den Memory hat.
+  \return Gibt 1 zurueck, wenn der Aufrufende berechtigt ist, das 
+          Objekt zu nutzen, sonst 0
+*/
+int HaveRights(){
+  return stringp(get_caller_hash());
+}
+
+/*!
+ Daten im Memory ablegen
+ \param key ID unter der die Daten gespeichert werden
+ \param var Zu speicherndes Datum
+*/
+int Save(string key, mixed var) {
+  string who;
+  mapping memory;
+
+  // Hash des Aufrufers holen. Hat der keinen, ist er nicht befugt,
+  // den Memory zu nutzen.
+  if(!stringp(who=get_caller_hash())) return 0;
+
+  // Wenn kein Key uebergeben wird, kann auch nichts gespeichert werden.
+  if(!stringp(key)) return 0;
+
+  // (hoffentlich) globalen memory_pointer holen
+  memory = get_memory_pointer();
+
+  // Wenn keine Daten da sind, muss man auch nichts anlegen. Rueckgabewert
+  // ist dennoch 1, weil Load bei unbekannten Keys auch 0 liefert, die 
+  // Null wird also korrekt gespeichert, irgendwie. Das muss aber nach dem
+  // get_memory_pointer() passieren, da sonst das Korrekte Funktionieren von
+  // Load nicht sichergestellt ist.
+  if(var==0) return 1;
+
+  // Erster Aufruf durch PO? Dann muss sein Speicherbereich initialisiert 
+  // werden
+  if(!member(memory,who))
+    memory[who]=([]);
+
+  // Endlich! Daten koennen gespeichert werden.
+  memory[who][key]=var;
+
+  return 1;
+}
+
+/*!
+ Daten ausgeben/referenzieren
+ \param key Id unter der die Daten gespeichert sind.
+*/
+mixed Load(string key) {
+  string who;
+  mapping memory;
+
+  // Hash des Aufrufers holen. Hat der keinen, ist er nicht befugt,
+  // den Memory zu nutzen.
+  if(!stringp(who=get_caller_hash())) return 0;
+
+  // Wenn kein Key uebergeben wird, kann auch nichts gespeichert werden.
+  if(!stringp(key)) return 0;
+
+  // (hoffentlich) globalen memory_pointer holen
+  memory = get_memory_pointer();
+
+  // Das Objekt hat noch nie Save() aufgerufen.
+  if(!member(memory,who))
+    return 0;
+
+  // Unter diesem Key ist noch nichts gespeichert.
+  if(!member(memory[who],key))
+    return 0;
+
+  // Gespeicherten Wert zurueckgeben
+  return memory[who][key];
+}
+
+/*! 
+ Ein Eintrag oder alle Eintraege werden geloescht
+ \param key Id unter der die Daten gespeichert sind. 
+            Wird kein Key uebergeben, werden alle Daten des Objekts 
+            geloescht.
+*/
+varargs int Remove(string key) {
+  string who;
+  mapping memory;
+
+  // Hash des Aufrufers holen. Hat der keinen, ist er nicht befugt,
+  // den Memory zu nutzen.
+  if(!stringp(who=get_caller_hash())) return 0;
+
+  // (hoffentlich) globalen memory_pointer holen
+  memory = get_memory_pointer();
+
+  // Das Objekt hat noch nie Save() aufgerufen.
+  if(!member(memory,who)) return 0;
+
+  // Wenn kein Key uebergeben wird, wird alles zum Objekt gehoerende geloescht.
+  if(stringp(key)){
+    // Unter diesem Key ist nichts gespeichert.
+    if(!member(memory[who],key)) return 0;
+
+    // Wert unter Key fuer das File loeschen
+    m_delete(memory[who], key);
+
+  } else {
+    // Alles fuer das File loeschen
+    m_delete(memory, who);
+  }
+
+  return 1; 
+}
+
+varargs void ShowData(string user, string key)
+{
+  // Bekannte Objekte
+  if (!ELDER_SECURITY )
+    printf("I'm fine. Thanks for asking.\n");
+  else {
+    printf("known_programs:\n%O\n\n", known_programs);
+    // EM duerfen sich auch noch zuscrollen lassen, wenn sie wollen
+    if (ARCH_SECURITY && user)
+    {
+      mapping data = get_memory_pointer();
+      if (!member(data,user))
+        printf("memory: Keine Daten fuer %s vorhanden.\n",user);
+      else if (user && key)
+        printf("memory: Daten fuer User %s, Key %s:\n%O\n",user, key,
+                  data[user][key]);
+      else
+        printf("memory: Daten fuer User %s:\n%O\n",user,data[user]);
+    }
+    else
+    {
+      mapping memory;
+      memory = get_memory_pointer();
+      // Andere bekommen eine anonymisierte Version
+      printf("memory: (Nur Feldnamen, keine Daten)\n");
+      foreach (string program, mapping data: memory ) {
+        if ( mappingp(data) && sizeof(data) ){
+          printf(break_string(
+                   implode(m_indices(data),";\n"), 78,  
+                   sprintf("  %-50s: ",program)),1);
+        }
+        else
+        printf("  %-50s: - leer -\n", program);
+      }
+    }
+  }
+  return;
+}
+