GMCP in Magier darf kein process_string rufen.

Fall das Spielerobjekt ein Magier ist, darf es auf keinen
Fall process_string() rufen, sonst kann man das Magierobjekt
dazu bringen, beliebige oeffentliche Funktionen im Spiel zu
rufen... Und zwar direkt aus der Magiershell (dem
Interactive) heraus.
BTW: Bei Spielern ist das uebrigens auch totaler Mist und
man kann die zu allen moeglichen Dingen bringen, aber
immerhin haben die keine hoeheren Rechte... Und es gibt
soviele Stellen mit process_string, dass hier nicht mehr
drauf ankommt - aber langfristig soll das raus!

(ja, Magier bekommen per GMCP dann nicht mehr die richtige
Short. Ist mir egal. Vielleicht ein Anreiz fuer Magier, die
Gruetze auszubauen.)

Change-Id: I34016c1f85baa40b7910b8d37be05f792be81f13
diff --git a/std/player/protocols/gmcp.c b/std/player/protocols/gmcp.c
index 3d954da..e3e6d6c 100644
--- a/std/player/protocols/gmcp.c
+++ b/std/player/protocols/gmcp.c
@@ -11,6 +11,8 @@
 
 #include <regexp.h>
 #include <telnet.h>
+#include <wizlevels.h>
+#include <defines.h>
 
 #define NEED_PROTOTYPES
 #include <player/base.h>
@@ -505,7 +507,13 @@
   // sichtbare Ausgange und Objekte. Insofern: geht nicht.
   // Ist das letzte Zeichen kein Satzzeichen einen Punkt anhaengen, sonst nur
   // den \n.
-  string sh=process_string(environment()->QueryProp(P_INT_SHORT)||".");
+  // Falls das hier nen Magier ist, darf der auf keinen Fall process_string()
+  // rufen, sonst kann man das Magierobjekt dazu bringen, beliebige
+  // oeffentliche Funktionen im Spiel zu rufen... Und zwar direkt aus der
+  // Magiershell (dem Interactive) heraus.
+  string sh = (IS_LEARNER(ME) ? environment()->QueryProp(P_INT_SHORT) :
+                     process_string(environment()->QueryProp(P_INT_SHORT)))
+              || ".";
   switch(sh[<1])
   {
     case '.':