Verwendung von process_string eingeschraenkt.

Um das moegliche Ausmass von privilege escalations durch
process_string zu reduzieren, wird process_string() wird
nur noch ausgewertet, wenn der Aufrufer einen Level von
maximal 25 hat. Das schliesst alle Objekten in /d/, /p/
und den Gilden ein, aber verhindert es fuer alle hochstufigen
Magier und ihre Objekte.
Ausserdem erlauben wir keine Auswertung mehr fuer
Spielerobjekte, wenn sie mehr als Seher sind.

Change-Id: I787bf06c00d62ca17a61c97bb6cef08aa2a34d5e
diff --git a/secure/simul_efun/simul_efun.c b/secure/simul_efun/simul_efun.c
index d9c2a54..c6582c5 100644
--- a/secure/simul_efun/simul_efun.c
+++ b/secure/simul_efun/simul_efun.c
@@ -780,11 +780,27 @@
               return(efun::process_string(str));
 }
 
-nomask string process_string( mixed str )
+nomask string process_string( string|closure str )
 {
   string tmp, err;
   int flag; 
 
+  // process_string() wird nur noch ausgewertet, wenn der Aufrufer einen
+  // Level von maximal 25 hat. Das schliesst alle Objekten in /d/, /p/ und den
+  // Gilden ein, aber verhindert es fuer alle hochstufigen Magier und ihre
+  // Objekte. Ausserdem erlauben wir keine Auswertung mehr fuer
+  // Spielerobjekte, wenn sie mehr als Seher sind.
+  // TODO: aus Spielershells ausbauen
+  // TODO 2: ganz ausbauen.
+  if ( (query_once_interactive(previous_object())
+        && query_wiz_level(previous_object()) > SEER_LVL
+        )
+      || query_wiz_level(getuid(previous_object())) > DOMAINMEMBER_LVL)
+  {
+    raise_error("Illegale Benutzung von process_string(). Aufrufer "
+        "ist Magiershell oder Objekt mit Level > 25.\n");
+  }
+
   if ( closurep(str) ) {
       set_this_object( previous_object() );
       return funcall(str);
diff --git a/secure/simul_efun/spare/simul_efun.c b/secure/simul_efun/spare/simul_efun.c
index d9c2a54..c6582c5 100644
--- a/secure/simul_efun/spare/simul_efun.c
+++ b/secure/simul_efun/spare/simul_efun.c
@@ -780,11 +780,27 @@
               return(efun::process_string(str));
 }
 
-nomask string process_string( mixed str )
+nomask string process_string( string|closure str )
 {
   string tmp, err;
   int flag; 
 
+  // process_string() wird nur noch ausgewertet, wenn der Aufrufer einen
+  // Level von maximal 25 hat. Das schliesst alle Objekten in /d/, /p/ und den
+  // Gilden ein, aber verhindert es fuer alle hochstufigen Magier und ihre
+  // Objekte. Ausserdem erlauben wir keine Auswertung mehr fuer
+  // Spielerobjekte, wenn sie mehr als Seher sind.
+  // TODO: aus Spielershells ausbauen
+  // TODO 2: ganz ausbauen.
+  if ( (query_once_interactive(previous_object())
+        && query_wiz_level(previous_object()) > SEER_LVL
+        )
+      || query_wiz_level(getuid(previous_object())) > DOMAINMEMBER_LVL)
+  {
+    raise_error("Illegale Benutzung von process_string(). Aufrufer "
+        "ist Magiershell oder Objekt mit Level > 25.\n");
+  }
+
   if ( closurep(str) ) {
       set_this_object( previous_object() );
       return funcall(str);