Set+Query: default argument statt varargs
Die Funktionen sind varargs aufgrund der letzten Argumente,
die anderen sind nicht optional. Daher bietet sich ein default
fuer diese Argumente an statt varargs fuer die ganze Funktion,
zumal diese gar nicht pruefen, ob die anderen Argumente
uebergeben werden.
Ausserdem das Argument 'extern' in 'drop_priv' umbenannt, weil das
besser beschreibt, um was es geht: den Aufruf trotz internem Call
*nicht* als privilegiert zu behandeln.
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: I90cecbfc1ed36a3ed5e3614bca7cc51e78b85b72
diff --git a/doc/sphinx/lfun/Query.rst b/doc/sphinx/lfun/Query.rst
index 0a27959..31f2ce0 100644
--- a/doc/sphinx/lfun/Query.rst
+++ b/doc/sphinx/lfun/Query.rst
@@ -5,7 +5,7 @@
--------
::
- public varargs mixed Query(string name, int Type);
+ public mixed Query(string name, int Type = F_VALUE);
DEFINIERT IN
------------
diff --git a/doc/sphinx/lfun/Set.rst b/doc/sphinx/lfun/Set.rst
index ffca76a..bf2dbad 100644
--- a/doc/sphinx/lfun/Set.rst
+++ b/doc/sphinx/lfun/Set.rst
@@ -5,7 +5,8 @@
--------
::
- public varargs mixed Set(string name, mixed Value, int Type, int extern);
+ public mixed Set(string name, mixed Value,
+ int Type = F_VALUE, int drop_priv = extern_call())
DEFINIERT IN
------------
@@ -21,8 +22,8 @@
name - Property, die manipuliert werden soll
Value - der zu setzende/aendernde Wert
Type - die Eigenschaft der Property, die manipuliert werden soll
- extern - Interne Verwendung:
- Wurde Set ueber SetProp von aussen gerufen.
+ drop_priv - Interne Verwendung, wenn Aufrufer Privilegien abgibt,
+ z.B. objekt-interner Aufruf extern zaehlen soll.
BESCHREIBUNG
------------
@@ -170,5 +171,5 @@
Konzept: properties, /std/thing/properties.c
Sonstiges: P_AUTOLOADOBJ
-06. Jan 2008 Arathorn
+8.9.2021, Zesstra
diff --git a/std/thing/properties.c b/std/thing/properties.c
index e97983f..1e7cdad 100644
--- a/std/thing/properties.c
+++ b/std/thing/properties.c
@@ -64,27 +64,34 @@
// Set() -- provides direct access to a property, no filters
-public varargs mixed Set( string name, mixed Value, int Type, int extern )
+// Type=F_VALUE und drop_priv=extern_call() by default
+public mixed Set(string name, mixed Value, int Type, int drop_priv)
{
-
if (!objectp(this_object()))
return 0;
// Properties, die SECURED oder PROTECTED sind, duerfen nur vom Objekt
- // selber, EM+ oder ROOT veraendert werden
+ // selber, EM+ oder ROOT veraendert werden.
+ // 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.
if ((prop[F_MODE][name]&(PROTECTED|SECURED))&&
- (closure_call||extern||extern_call()) &&
+ (closure_call||drop_priv||extern_call()) &&
previous_object() != this_object() && !allowed())
return -1;
-
+
// Das SECURED-Flag darf bei Properties nicht mehr geloescht werden
if ((prop[F_MODE][name]&SECURED)&&
(Type==F_MODE||Type==F_MODE_AD)&&(Value & SECURED))
return -2;
-
+
// Setzen duerfen das SECURED-Flag nur das Objekt selber, EM+ oder ROOT
+ // 'drop_priv||extern_call()' ist Absicht, s.o.
if ((Type==F_MODE||Type==F_MODE_AS)&&(Value&SECURED)&&
- (closure_call ||extern || extern_call()) &&
+ (closure_call || drop_priv || extern_call()) &&
previous_object() != this_object() && !allowed() )
return -3;
@@ -127,7 +134,8 @@
// Direktes Auslesen der Property ohne Filter ...
-public varargs mixed Query( string name, int Type )
+// Type = F_VALUE by default
+public mixed Query( string name, int Type )
{
if (pointerp(prop)) return prop[Type][name];
return 0;
diff --git a/sys/thing/properties.h b/sys/thing/properties.h
index 9feed60..6e26337 100644
--- a/sys/thing/properties.h
+++ b/sys/thing/properties.h
@@ -42,8 +42,9 @@
// prototypes
// direct property access
-public varargs mixed Set(string name, mixed Value, int Type, int extern);
-public varargs mixed Query(string name, int Type);
+public mixed Set(string name, mixed Value,
+ int Type = F_VALUE, int drop_priv = extern_call());
+public mixed Query(string name, int Type = F_VALUE);
// filtered property access
public mixed SetProp(string name, mixed Value);