Dokumentation zu: zugriffsrechte(WL)

HR Image


KONZEPT
	Zugriffsrechte

BESCHREIBUNG
	Bei Problemen mit read_file(), write_file(), rm(), write_bytes(),
	write_log(), restore_object(), save_object(), sowie bei auftretenden
	Fehlern "Illegal use of save_object" oder Questobjekten, die einfach
	nicht speichern wollen bzw. nur manchmal nicht, dann sollte man sich
	die Zeit nehmen (!!!) und das hier lesen. Auch das Mysterium, warum
	es immer gerade dann geht, wenn man den Bug einem anderen Magier
	zeigen will und kaum dreht man den Ruecken, bugt es wieder, sollte
	hier etwas entzaubert werden.

ZUGRIFFSRECHTE IM WUNDERLAND
	Es gibt mehrere verschiedene Moeglichkeiten Zugriffsrechte, in einem
	Multi-User-System zu arrangieren. Vor langer langer Zeit hat jemand
	entschieden, dass das Wunderland User-IDs (uid) und effektive User-IDs
	(euid) benutzt. Man koennte darueber streiten, was besser waere, aber
	es ist nun einmal 'goettlicher' Wille gewesen und wir muessen uns dem
	fuegen.	Also sind Zugriffsrechte (Lese- und Schreibrechte) im
	Wunderland objektgebunden und basieren auf User-IDs (uids) aehnlich
	(!) zu einem Unix-Filesystem.

	Fuer die Insider: Der Driver laeuft im 'strict euids mode'.

USER-ID
	Jedes Objekt besitzt eine fest vorgegebene User-ID (als String), die
	vom Master (/secure/master.c) jedem Objekt bzw. jedem File zugeteilt
	wird. Spieler/Magier bekommen immer ihren Namen als UID, ebenso die
	Objekte in den Homeverzeichnissen der Magier in /players. Andere
	Objekte bekommen meist eine vom Master festgelegte UID, die Teile
	des Pfades oder den Regionsnamen oder etwas aehnliches enthaelt.
	Bei der Abenteurergilde beispielsweise: "gilden:abenteurer". Objekte
	in /obj und /std haben die sogenannte Backbone-ID, das heisst, beim
	Clonen solcher Objekte bekommen diese immer die UID des Cloners.
	Wichtig vor allem fuer die Tools in /obj/tools/*. Objekte in /secure
	haben die Root-ID.

	Die UID kann man bei ls -l in der dritten Spalte von links sehen
	oder mit getuid(E) erfragen, aber wie gesagt, der Master legt das
	fest und es kann auch davon abweichen (also ls eine andere Form
	liefern als getuid).

EFFEKTIVE USER-ID
	Die USER-ID allein bewirkt noch keine Lese- oder Schreibrechte. Sie
	legt quasi nur den 'Rahmen' fest. Entscheidend ist vielmehr die
	'effektive USER-ID' (EUID). Diese ist wiederum entweder ein String,
	im Regelfall "NOBODY", theoretisch auch 0. Welche Rechte ein Objekt
	mit einer bestimmten EUID konkret hat, haengt davon ab, welche
	Rechte man dieser gibt. Dazu aber mehr im naechsten Punkt, wichtig
	ist erstmal nur, dass die Zugriffsrechte primaer von der EUID eines
	Objekts abhaengen. (Die Euid kann (normal) immer nur weniger bis
	gleich viel Rechte bieten, wie die Uid das tut. Die Uid ist also
	das Maximum an Rechten, die ein Objekt bekommen kann. Welche es
	wirklich hat regelt ausschliesslich die Euid.)

	Spieler/Magier haben die gleiche EUID wie ihre UID. Also Magier
	Bluelight hat die UID "bluelight" und auch die EUID "bluelight".
	Bei geclonten Objekten aus /obj und /std ist die EUID wiederum
	die UID des Cloners. Clont Bluelight ein /obj/fackel, dann ist
	die EUID der Fackel "bluelight". Nicht verstanden? Nochmal lesen! :)

	Ist die UID eines Objekts gleich der EUID des Cloners, dann bekommt
	das Objekt auch die EUID des Cloners, andernfalls "NOBODY". Zum
	Beispiel hat [/players/gilbert/fackel] die UID "gilbert". Wenn
	Gilbert die Fackel clont, hat die Fackel auch die EUID "gilbert".
	Wenn aber Bluelight die gleiche Fackel clont, hat die Fackel die
	EUID "NOBODY". Das soll nicht heissen, dass Bluelight ein NOBODY
	ist. :-) Wenn aber die Schreibrechte von der EUID abhaengen, dann
	ist es keine gute Idee, zu viele Objekte mit 'maechtigen' EUIDS
	entstehen zu lassen. Etwas kompliziert? Einfach merken: Tools
	gehoeren nicht in das Homeverzeichnis, wenn man halbwegs sicher
	sein will, dass damit nicht zu viel Unfug getrieben wird...

	Wenn man den letzten Abschnitt genau gelesen und verstanden hat,
	dann wird auch das am Anfang genannte Mysterium etwas klarer.
	Ein Magier X schreibt sich (in /players) ein Objekt, was mit
	save_object() arbeitet. Solange er (selbst) das Objekt selbst
	laedt/clont, funktioniert das auch einwandfrei. Magier X freut sich
	tierisch und laesst andere Leute das testen. Doch da bugt es dann
	irgendwann, spaetestens dann, wenn die Tester die Objekte selber
	laden oder clonen. Dann entsteht naemlich ein "NOBODY"-Objekt und
	das kann nunmal NIX. Da die UID des Objekts allenfalls im Homedir
	des Magiers gleich der EUID des Cloners sein kann, sollte dieses
	Problem nur dort auftreten. Wie man das loest, steht im uebernaechs-
	ten Absatz.

	In den Regionenverzeichnissen wird (seit einiger Zeit) die UID
	des Magiers mit einem davorgehangenen 'd:' (fuer [d]omain) gesetzt.
	Objekte in /d/berge/rayone/* bekommen die UID "d:rayone". Das be-
	deutet, die EUID des Cloners kann eigentlich nie mit der UID der
	Objekte dort uebereinstimmen, die Objekte bekommen ergo _immer_ die
	EUID "NOBODY". Sie haben also niemals irgendein Schreibrecht. Will
	man also save_object() oder write_file() etc. benutzen, muss man
	eine EUID setzen, sonst: "Illegal use of save_object" oder es geht
	stillschweigend nicht, weil der Returnwert von write_file()
	geflissentlich ignoriert wird...

	Ein Objekt kann mittels seteuid(E) immer nur die eigene UID als EUID
	setzen. Das sieht dann so aus: seteuid(getuid());. Hab ich da eben
	ein leises AAHA gehoert? Ein Objekt [/d/berge/rayone/obj/bla] hat
	die UID "d:rayone" und EUID "NOBODY", bis es (selbst!) 
	seteuid(getuid()); aufruft, dann hat es auch als EUID "d:rayone".
	(NPCs und Raeume setzen ihre EUID normal immer (!) auf ihre UID,
	hier muss man es also nicht machen!)

	Die wesentlichen Zusammenhaenge zwischen UID und EUID sollten klar
	geworden sein. Wenn doch nicht, dann merk Dir einfach, dass Du 
	seteuid(getuid()) machen MUSST, wenn Du eine Funktion benutzt, die
	etwas schreiben koennen soll. (Siehe Ausnamen oben. Dieser
	Absatz gilt also nur vor (nehmbare) Dinge und eigene Master usw,
	halt alles was weder NPC (Netti, Mnpc) oder Raeum ist.)

LESERECHTE
	Wir handhaben die Leserechte im Wunderland recht (oder eher zu?)
	grosszuegig. Jeder Magier kann schon von Beginn an fast alle Ver-
	zeichnisse einsehen und Files lesen. Verwirklicht wird das durch
	den Master (/secure/master.c), der fast allen EUIDs Leserechte
	auf fast alles gibt. Ein paar Sachen wie die News, Mails, Secure-
	Savefiles und andere 'Kleinigkeiten' werden restriktiver behandelt;
	warum sollte klar sein.

	Der Master ueberprueft also anhand der EUID das Leserecht eines
	Objekts. Um ein paar Luecken (siehe oben) zu stopfen, prueft der
	auch noch etwas mehr, aber dies nur, um Missbrauch zu verhindern.

SCHREIBRECHTE
	Das gleiche gilt grundsaetzlich auch fuer die Schreibrechte. Hier
	sind wir natuerlich nicht so grosszuegig und ich seh auch schon,
	wie Du beim Lesen dieser Zeilen heftig nickst. :-) Nichtsdestotrotz
	das Prinzip ist das gleiche, die EUID spielt die erste Geige, wenn
	es um Schreibrechte geht. Ein Objekt ohne EUID oder mit der EUID
	"NOBODY" hat keinerlei Schreibrechte.
	(Ausnahme save_object() ins selbe Verzeichnis, wo das File auch ist.)

	Grundsaetzlich hat ein Objekt immer dort Schreibrechte, wo dessen
	EUID mit der UID der Files uebereinstimmt. Da ein Magier auch nur
	ein 'Objekt' ist, gilt das natuerlich fuer die genauso. Alle anderen
	Schreibrechte muessen in den 'access_rights.c'-Files vergeben wer-
	den. Die Funktion save_object(E) und ein paar andere werden etwas
	spezieller gehandhabt in einigen Teilen der Lib, aber das ist hier
	nicht so wichtig.

	Magier(-Objekte) haben neben diesen 'Grundrechten' noch ein paar
	weitere, die mal 'grob' aufgelistet werden sollen. Hoehere Level
	schliessen natuerlich die Rechte der niederen jeweils mit ein:

	Magierlevel	| Rechte
	----------------+---------------------------------------------------
	ab Level 10	| + /tmp
			| + Homedir in /players (wenn vorhanden)
			| + Homedir in den Regionen (wenn vorhanden)
			| + Verzeichnisse "alle" oder "common" in einer
			|   Region, wenn Magier dort auch ein Homedir hat.
			| + in den Unterverzeichnissen von /log
	ab Level 30	| + /doc
	ab Level 40	| + gesamte Region (wenn als RM eingetragen)
			| + Leserechte im LORD-Verzeichnis, sowie das Recht
			|   dort FPs an/abzumelden  (nur wenn als RM einge-
			|   tragen)
			| + Recht Skills an-/abzumelden (nur mit Absprache)
	ab Level 50	| + Lese-/Schreibrechte in allen Regionen, Gilden,
			|   Spellbooks, Homedirs und in /p
	ab Level 60	| + Leserechte in ARCH-Verzeichnissen
			| + /global, /save
			| + Recht Homedirs und Regionen anzulegen/loeschen

	Alle anderen Level gibts nur fuers persoenliche Ego, besondere
	Zugriffsrechte ergeben sich daraus nicht! Zusaetzliche Rechte
	koennen, wie bereits erwaehnt, ueber die access_rights.c-Files
	eingeraeumt werden.

SIEHE AUCH
	uids(C), getuid(E), seteuid(E), geteuid(E), save_object(E)


Start » Magierhandbuch » Docu » Konzepte » Zugriffsrechte Letzte Generierung: 25.04.2021, 01:58
Email an: mud@wl.mud.de
Valid HTML 4.01!