Permissions Reference
DjangoMOO replaces LambdaMOO’s UNIX-style R/W/X bits with a
customisable list of named permissions. The full list is declared in
settings.DEFAULT_PERMISSIONS and pre-created as Permission rows by
bootstrap.initialize_dataset().
Permission names
Permission |
Effect |
|---|---|
|
Wildcard — grants every other permission. |
|
Read essential attributes (an object’s contents and verb/property names; a property’s value; a verb’s source). |
|
Modify essential attributes; add or delete properties on an object. |
|
Invoke a verb. |
|
Change an object’s |
|
Add this object as a child of another (gives this object a new parent). |
|
Add a new child to this object (parents need this on themselves before children can |
|
Change an object’s, property’s, or verb’s |
|
Set or modify ACL rows on an object. Implicitly held by wizards and the object’s owner. |
grant, entrust, transmute, and derive only ever apply to
wizards or the owner of the object — they’re escalated permissions
that protect the permission system itself.
Granular permissions are independent of write
Each granular permission (move, entrust, transmute, derive)
is checked on its own. A caller granted move on an object can call
obj.moveto(target) without also holding write — and likewise for
entrust (change the owner), transmute (add a parent), and
derive (be added as a parent). write is only required when a
non-ACL field changes during the same save: name, unique_name,
obvious, placement_*, or site.
This lets you, for example, hand an automation account move rights
on a fleet of NPC objects so it can teleport them without giving it
permission to rename or reparent them.
Permission groups
ACL rows match against three group names. Resolution checks the caller’s role and falls through:
Group |
Matches |
|---|---|
|
The object’s |
|
Players whose |
|
Anyone else who passes the earlier groups. |
A grant to everyone applies to all callers; wizards and owners
narrow the audience.
Where each permission is enforced
Permissions fire automatically at the model layer. Verb code does not
need to check first; an AccessError propagates and the player sees a
clean error. (See How Permissions Work in Verbs for the just-attempt-it
pattern.)
Operation |
Permission |
Object the check is against |
|---|---|---|
|
|
the object |
|
|
the object |
|
|
the object |
|
|
the moving object |
|
|
child needs |
|
|
the object being searched |
|
|
the origin object |
|
|
the property |
|
|
the property |
|
|
the origin object |
|
|
the verb |
|
|
the verb |
|
|
the verb |
Reading |
|
the object |
Reading |
|
the property |
Default permissions on new objects
When an Object, Verb, or Property is created,
apply_default_permissions (in moo/core/utils.py) inserts three ACL
rows automatically:
wizardsare allowedanything.ownersare allowedanything.everyoneis allowedread(objects, properties) orexecute(verbs).
This runs natively rather than via a verb. Custom datasets can add
further grants in their bootstrap finalize script — see
How Permissions Work in Verbs for the canonical derive grant from
default/999_finalize.py.
See also
How Permissions Work in Verbs — caller-vs-player,
set_task_perms,is_wizard/ownspatterns, and granting in bootstrap vs. verb code.Verb Sandbox Security Reference — the model-layer enforcement details, attribute guards, and the
Property.valueread check.