SetProp(): neues Argument drop_priv

SetProp() wird durch AddToProp() intern gerufen, aber wenn dessen
Aufruf nicht intern ist, darf SetProp ihn auch nicht intern behandeln.
Daher muss AddToProp() durchreichen, ob es von extern gerufen wurde.
Das neue Argument hat als default extern_call().

Aber Achtung:
Es ist verfuehrerisch, das 'drop_priv||extern_call()' durch 'drop_priv'
zu ersetzen, weil extern_call() das default-argument fuer <drop_priv>
ist. Das ist keine gute Idee, weil <drop_priv> unter der Kontrolle des
Aufrufers ist und dieser 0 uebergeben kann. Sprich: wenn es 0 ist,
muessen wir dennoch selber pruefen. Wir glauben aber immer, wenn es 1
ist und der Aufrufer Privilegien abgeben will.

Change-Id: Ia2bd237f2faab4a3319a0cb573de72911cb961bd
diff --git a/doc/sphinx/lfun/SetProp.rst b/doc/sphinx/lfun/SetProp.rst
index 32883b3..8c603d2 100644
--- a/doc/sphinx/lfun/SetProp.rst
+++ b/doc/sphinx/lfun/SetProp.rst
@@ -5,7 +5,8 @@
 --------
 ::
 
-     public mixed SetProp(string name, mixed Value);
+     public mixed SetProp(string name, mixed Value,
+                          int drop_priv = extern_call());
 
 DEFINIERT IN
 ------------
@@ -20,6 +21,8 @@
 
      name	- Property, deren Wert veraendert werden soll.
      Value	- Wert, auf den der Inhalt der Property gesetzt werden soll
+     drop_priv  - Interne Verwendung, wenn Aufrufer Privilegien abgibt,
+                  z.B. objekt-interner Aufruf extern zaehlen soll.
 
 BESCHREIBUNG
 ------------
diff --git a/std/thing/properties.c b/std/thing/properties.c
index 1e7cdad..fb70913 100644
--- a/std/thing/properties.c
+++ b/std/thing/properties.c
@@ -142,7 +142,7 @@
 }
 
 // Property setzen unter Verwendung evtl. vorhandener Zugriffsfunktionen
-public mixed SetProp( string name, mixed Value )
+public mixed SetProp( string name, mixed Value, int drop_priv)
 {
   mixed result;
 
@@ -173,7 +173,7 @@
     {
       prop[F_SET_METHOD]-=([name]);
     }
-      
+
     // Wenn closure_call gesetzt wurde, wieder loeschen
     if (flag) closure_call = 0;
 
@@ -181,12 +181,18 @@
     return result; 
   }
 
-  // _set_*-Methode vorhanden? falls ja, aufrufen.i
+  // _set_*-Methode vorhanden? falls ja, aufrufen.
   if (call_resolved(&result,this_object(),"_set_"+name,Value ))
         return result;
 
   // Letzte Moeglichkeit: Muss eine 'normale' Property sein
-  return Set( name, Value, F_VALUE, extern_call() );
+  // Es ist verfuehrerisch, das 'drop_priv||extern_call()' durch 'drop_priv'
+  // zu ersetzen, weil extern_call() das default-argument fuer <drop_priv>
+  // ist. Das ist keine gute Idee, weil <drop_priv> unter der Kontrolle des
+  // Aufrufers ist und dieser 0 uebergeben kann. Sprich: wenn es 0 ist,
+  // muessen wir dennoch selber pruefen. Wir glauben aber immer, wenn es 1
+  // ist und der Aufrufer Privilegien abgeben will.
+  return Set( name, Value, F_VALUE, drop_priv||extern_call() );
 }
 
 
diff --git a/sys/thing/properties.h b/sys/thing/properties.h
index 6e26337..2ccf20e 100644
--- a/sys/thing/properties.h
+++ b/sys/thing/properties.h
@@ -47,7 +47,7 @@
 public mixed Query(string name, int Type = F_VALUE);
 
 // filtered property access
-public mixed SetProp(string name, mixed Value);
+public mixed SetProp(string name, mixed Value, int drop_priv = extern_call());
 public mixed QueryProp(string name);
 
 // global property handling