<spanid="evennia-locks-lockhandler"></span><h1>evennia.locks.lockhandler<aclass="headerlink"href="#module-evennia.locks.lockhandler"title="Link to this heading">¶</a></h1>
<p>A <em>lock</em> defines access to a particular subsystem or property of
Evennia. For example, the “owner” property can be impmemented as a
lock. Or the disability to lift an object or to ban users.</p>
<p>A lock consists of three parts:</p>
<blockquote>
<div><ulclass="simple">
<li><p>access_type - this defines what kind of access this lock regulates. This
just a string.</p></li>
<li><p>function call - this is one or many calls to functions that will determine
if the lock is passed or not.</p></li>
<li><p>lock function(s). These are regular python functions with a special
set of allowed arguments. They should always return a boolean depending
on if they allow access or not.</p></li>
</ul>
</div></blockquote>
<p>A lock function is defined by existing in one of the modules
listed by settings.LOCK_FUNC_MODULES. It should also always
<p>The accessing object is the object wanting to gain access.
The accessed object is the object this lock resides on
args and kwargs will hold optional arguments and/or keyword arguments
to the function as a list and a dictionary respectively.</p>
<pclass="rubric">Example</p>
<dl>
<dt>perm(accessing_obj, accessed_obj, <ahref="#id5"><spanclass="problematic"id="id6">*</span></a>args, <ahref="#id7"><spanclass="problematic"id="id8">**</span></a>kwargs):</dt><dd><p>“Checking if the object has a particular, desired permission”
if args:</p>
<blockquote>
<div><p>desired_perm = args[0]
return desired_perm in accessing_obj.permissions.all()</p>
</div></blockquote>
<p>return False</p>
</dd>
</dl>
<p>Lock functions should most often be pretty general and ideally possible to
re-use and combine in various ways to build clever locks.</p>
<p>Lock definition (“Lock string”)</p>
<p>A lock definition is a string with a special syntax. It is added to
each object’s lockhandler, making that lock available from then on.</p>
<emclass="property"><spanclass="k"><spanclass="pre">class</span></span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">evennia.locks.lockhandler.</span></span><spanclass="sig-name descname"><spanclass="pre">LockHandler</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">obj</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler"title="Link to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">__init__</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">obj</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.__init__"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.__init__"title="Link to this definition">¶</a></dt>
<dd><p>Loads and pre-caches all relevant locks and their functions.</p>
<spanclass="sig-name descname"><spanclass="pre">cache_lock_bypass</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">obj</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.cache_lock_bypass"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.cache_lock_bypass"title="Link to this definition">¶</a></dt>
<dd><p>We cache superuser bypass checks here for efficiency. This
needs to be re-run when an account is assigned to a character.
We need to grant access to superusers. We need to check both
directly on the object (accounts), through obj.account and using
the get_account() method (this sits on serversessions, in some
rare cases where a check is done before the login process has
<spanclass="sig-name descname"><spanclass="pre">add</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">lockstring</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">validate_only</span></span><spanclass="o"><spanclass="pre">=</span></span><spanclass="default_value"><spanclass="pre">False</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.add"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.add"title="Link to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">validate</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">lockstring</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.validate"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.validate"title="Link to this definition">¶</a></dt>
<dd><p>Validate lockstring syntactically, without saving it.</p>
<spanclass="sig-name descname"><spanclass="pre">replace</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">lockstring</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.replace"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.replace"title="Link to this definition">¶</a></dt>
<ddclass="field-odd"><p><aclass="reference internal"href="#evennia.locks.lockhandler.LockException"title="evennia.locks.lockhandler.LockException"><strong>LockException</strong></a>– If a critical error occurred.
<spanclass="sig-name descname"><spanclass="pre">get</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">access_type</span></span><spanclass="o"><spanclass="pre">=</span></span><spanclass="default_value"><spanclass="pre">None</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.get"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.get"title="Link to this definition">¶</a></dt>
<dd><p>Get the full lockstring or the lockstring of a particular
<spanclass="sig-name descname"><spanclass="pre">all</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.all"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.all"title="Link to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">remove</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">access_type</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.remove"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.remove"title="Link to this definition">¶</a></dt>
<dd><p>Remove a particular lock from the handler</p>
<spanclass="sig-name descname"><spanclass="pre">delete</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">access_type</span></span></em><spanclass="sig-paren">)</span><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.delete"title="Link to this definition">¶</a></dt>
<dd><p>Remove a particular lock from the handler</p>
<spanclass="sig-name descname"><spanclass="pre">clear</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.clear"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.clear"title="Link to this definition">¶</a></dt>
<spanclass="sig-name descname"><spanclass="pre">reset</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.reset"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.reset"title="Link to this definition">¶</a></dt>
<dd><p>Set the reset flag, so the the lock will be re-cached at next
checking. This is usually called by @reload.</p>
<spanclass="sig-name descname"><spanclass="pre">append</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">access_type</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">lockstring</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">op</span></span><spanclass="o"><spanclass="pre">=</span></span><spanclass="default_value"><spanclass="pre">'or'</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.append"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.append"title="Link to this definition">¶</a></dt>
<dd><p>Append a lock definition to access_type if it doesn’t already exist.</p>
<spanclass="sig-name descname"><spanclass="pre">check</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">accessing_obj</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">access_type</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">default</span></span><spanclass="o"><spanclass="pre">=</span></span><spanclass="default_value"><spanclass="pre">False</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">no_superuser_bypass</span></span><spanclass="o"><spanclass="pre">=</span></span><spanclass="default_value"><spanclass="pre">False</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.check"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.check"title="Link to this definition">¶</a></dt>
<dd><p>Checks a lock of the correct type by passing execution off to
<spanclass="sig-name descname"><spanclass="pre">check_lockstring</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">accessing_obj</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">lockstring</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">no_superuser_bypass</span></span><spanclass="o"><spanclass="pre">=</span></span><spanclass="default_value"><spanclass="pre">False</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">default</span></span><spanclass="o"><spanclass="pre">=</span></span><spanclass="default_value"><spanclass="pre">False</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">access_type</span></span><spanclass="o"><spanclass="pre">=</span></span><spanclass="default_value"><spanclass="pre">None</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockHandler.check_lockstring"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockHandler.check_lockstring"title="Link to this definition">¶</a></dt>
<dd><p>Do a direct check against a lockstring (‘atype:func()..’),
without any intermediary storage on the accessed object.</p>
<emclass="property"><spanclass="k"><spanclass="pre">exception</span></span><spanclass="w"></span></em><spanclass="sig-prename descclassname"><spanclass="pre">evennia.locks.lockhandler.</span></span><spanclass="sig-name descname"><spanclass="pre">LockException</span></span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#LockException"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.LockException"title="Link to this definition">¶</a></dt>
<spanclass="sig-prename descclassname"><spanclass="pre">evennia.locks.lockhandler.</span></span><spanclass="sig-name descname"><spanclass="pre">check_perm</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">obj</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">permission</span></span></em>, <emclass="sig-param"><spanclass="n"><spanclass="pre">no_superuser_bypass</span></span><spanclass="o"><spanclass="pre">=</span></span><spanclass="default_value"><spanclass="pre">False</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#check_perm"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.check_perm"title="Link to this definition">¶</a></dt>
<dd><p>Shortcut for checking if an object has the given <strong>permission</strong>. If the
permission is in <strong>settings.PERMISSION_HIERARCHY</strong>, the check passes
if the object has this permission or higher.</p>
<p>This is equivalent to calling the perm() lockfunc, but without needing
<spanclass="sig-prename descclassname"><spanclass="pre">evennia.locks.lockhandler.</span></span><spanclass="sig-name descname"><spanclass="pre">get_all_lockfuncs</span></span><spanclass="sig-paren">(</span><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#get_all_lockfuncs"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.get_all_lockfuncs"title="Link to this definition">¶</a></dt>
<spanclass="sig-prename descclassname"><spanclass="pre">evennia.locks.lockhandler.</span></span><spanclass="sig-name descname"><spanclass="pre">validate_lockstring</span></span><spanclass="sig-paren">(</span><emclass="sig-param"><spanclass="n"><spanclass="pre">lockstring</span></span></em><spanclass="sig-paren">)</span><aclass="reference internal"href="../_modules/evennia/locks/lockhandler.html#validate_lockstring"><spanclass="viewcode-link"><spanclass="pre">[source]</span></span></a><aclass="headerlink"href="#evennia.locks.lockhandler.validate_lockstring"title="Link to this definition">¶</a></dt>
<dd><p>Validate so lockstring is on a valid form.</p>