evennia/docs/3.x/api/evennia.server.throttle.html
2023-12-21 00:12:31 +01:00

302 lines
No EOL
17 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />
<title>evennia.server.throttle &#8212; Evennia 3.x documentation</title>
<link rel="stylesheet" href="../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/language_data.js"></script>
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="evennia.server.validators" href="evennia.server.validators.html" />
<link rel="prev" title="evennia.server.signals" href="evennia.server.signals.html" />
</head><body>
<div class="admonition important">
<p class="first admonition-title">Note</p>
<p class="last">You are reading an old version of the Evennia documentation. <a href="https://www.evennia.com/docs/latest/index.html">The latest version is here</a></p>.
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="evennia.server.validators.html" title="evennia.server.validators"
accesskey="N">next</a> |</li>
<li class="right" >
<a href="evennia.server.signals.html" title="evennia.server.signals"
accesskey="P">previous</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">Evennia 3.x</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../Evennia-API.html" >API Summary</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="evennia-api.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-3"><a href="evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-4"><a href="evennia.server.html" accesskey="U">evennia.server</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.server.throttle</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<p class="logo"><a href="../index.html">
<img class="logo" src="../_static/evennia_logo.png" alt="Logo"/>
</a></p>
<div id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" />
<input type="submit" value="Go" />
</form>
</div>
</div>
<script>$('#searchbox').show(0);</script>
<h4>Previous topic</h4>
<p class="topless"><a href="evennia.server.signals.html"
title="previous chapter">evennia.server.signals</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="evennia.server.validators.html"
title="next chapter">evennia.server.validators</a></p>
<div role="note" aria-label="source link">
<!--h3>This Page</h3-->
<ul class="this-page-menu">
<li><a href="../_sources/api/evennia.server.throttle.md.txt"
rel="nofollow">Show Page Source</a></li>
</ul>
</div><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<section id="module-evennia.server.throttle">
<span id="evennia-server-throttle"></span><h1>evennia.server.throttle<a class="headerlink" href="#module-evennia.server.throttle" title="Permalink to this headline"></a></h1>
<dl class="py class">
<dt id="evennia.server.throttle.Throttle">
<em class="property">class </em><code class="sig-prename descclassname">evennia.server.throttle.</code><code class="sig-name descname">Throttle</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/throttle.html#Throttle"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.throttle.Throttle" title="Permalink to this definition"></a></dt>
<dd><p>Bases: <code class="xref py py-class docutils literal notranslate"><span class="pre">object</span></code></p>
<p>Keeps a running count of failed actions per IP address.</p>
<p>Available methods indicate whether or not the number of failures exceeds a
particular threshold.</p>
<p>This version of the throttle is usable by both the terminal server as well
as the web server, imposes limits on memory consumption by using deques
with length limits instead of open-ended lists, and uses native Django
caches for automatic key eviction and persistence configurability.</p>
<dl class="py attribute">
<dt id="evennia.server.throttle.Throttle.error_msg">
<code class="sig-name descname">error_msg</code><em class="property"> = 'Too many failed attempts; you must wait a few minutes before trying again.'</em><a class="headerlink" href="#evennia.server.throttle.Throttle.error_msg" title="Permalink to this definition"></a></dt>
<dd></dd></dl>
<dl class="py method">
<dt id="evennia.server.throttle.Throttle.__init__">
<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/throttle.html#Throttle.__init__"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.throttle.Throttle.__init__" title="Permalink to this definition"></a></dt>
<dd><p>Allows setting of throttle parameters.</p>
<dl class="field-list simple">
<dt class="field-odd">Keyword Arguments</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>name</strong> (<em>str</em>) Name of this throttle.</p></li>
<li><p><strong>limit</strong> (<em>int</em>) Max number of failures before imposing limiter. If <strong>None</strong>,
the throttle is disabled.</p></li>
<li><p><strong>timeout</strong> (<em>int</em>) number of timeout seconds after
max number of tries has been reached.</p></li>
<li><p><strong>cache_size</strong> (<em>int</em>) Max number of attempts to record per IP within a
rolling window; this is NOT the same as the limit after which
the throttle is imposed!</p></li>
</ul>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt id="evennia.server.throttle.Throttle.get_cache_key">
<code class="sig-name descname">get_cache_key</code><span class="sig-paren">(</span><em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/throttle.html#Throttle.get_cache_key"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.throttle.Throttle.get_cache_key" title="Permalink to this definition"></a></dt>
<dd><p>Creates a prefixed key containing arbitrary terms to prevent key
collisions in the same namespace.</p>
</dd></dl>
<dl class="py method">
<dt id="evennia.server.throttle.Throttle.touch">
<code class="sig-name descname">touch</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">key</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/throttle.html#Throttle.touch"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.throttle.Throttle.touch" title="Permalink to this definition"></a></dt>
<dd><p>Refreshes the timeout on a given key and ensures it is recorded in the
key register.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>key</strong> (<em>str</em>) Key of entry to renew.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt id="evennia.server.throttle.Throttle.get">
<code class="sig-name descname">get</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ip</span><span class="o">=</span><span class="default_value">None</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/throttle.html#Throttle.get"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.throttle.Throttle.get" title="Permalink to this definition"></a></dt>
<dd><p>Convenience function that returns the storage table, or part of.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>ip</strong> (<em>str</em><em>, </em><em>optional</em>) IP address of requestor</p>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><p><em>storage (dict)</em> </p>
<dl class="simple">
<dt>When no IP is provided, returns a dict of all</dt><dd><p>current IPs being tracked and the timestamps of their recent
failures.</p>
</dd>
<dt>timestamps (deque): When an IP is provided, returns a deque of</dt><dd><p>timestamps of recent failures only for that IP.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt id="evennia.server.throttle.Throttle.update">
<code class="sig-name descname">update</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ip</span></em>, <em class="sig-param"><span class="n">failmsg</span><span class="o">=</span><span class="default_value">'Exceeded threshold.'</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/throttle.html#Throttle.update"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.throttle.Throttle.update" title="Permalink to this definition"></a></dt>
<dd><p>Store the time of the latest failure.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>ip</strong> (<em>str</em>) IP address of requestor</p></li>
<li><p><strong>failmsg</strong> (<em>str</em><em>, </em><em>optional</em>) Message to display in logs upon activation
of throttle.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>None</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt id="evennia.server.throttle.Throttle.remove">
<code class="sig-name descname">remove</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ip</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/throttle.html#Throttle.remove"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.throttle.Throttle.remove" title="Permalink to this definition"></a></dt>
<dd><p>Clears data stored for an IP from the throttle.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>ip</strong> (<em>str</em>) IP to clear.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt id="evennia.server.throttle.Throttle.record_ip">
<code class="sig-name descname">record_ip</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ip</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/throttle.html#Throttle.record_ip"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.throttle.Throttle.record_ip" title="Permalink to this definition"></a></dt>
<dd><p>Tracks keys as they are added to the cache (since there is no way to
get a list of keys after-the-fact).</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>ip</strong> (<em>str</em>) IP being added to cache. This should be the original
IP, not the cache-prefixed key.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt id="evennia.server.throttle.Throttle.unrecord_ip">
<code class="sig-name descname">unrecord_ip</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ip</span></em>, <em class="sig-param"><span class="o">*</span><span class="n">args</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/throttle.html#Throttle.unrecord_ip"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.throttle.Throttle.unrecord_ip" title="Permalink to this definition"></a></dt>
<dd><p>Forces removal of a key from the key registry.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>ip</strong> (<em>str</em>) IP to remove from list of keys.</p>
</dd>
</dl>
</dd></dl>
<dl class="py method">
<dt id="evennia.server.throttle.Throttle.check">
<code class="sig-name descname">check</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">ip</span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/evennia/server/throttle.html#Throttle.check"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#evennia.server.throttle.Throttle.check" title="Permalink to this definition"></a></dt>
<dd><p>This will check the sessions address against the
storage dictionary to check they havent spammed too many
fails recently.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>ip</strong> (<em>str</em>) IP address of requestor</p>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p><p><em>throttled (bool)</em> </p>
<dl class="simple">
<dt>True if throttling is active,</dt><dd><p>False otherwise.</p>
</dd>
</dl>
</p>
</dd>
</dl>
</dd></dl>
</dd></dl>
</section>
</div>
</div>
</div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="right" >
<a href="evennia.server.validators.html" title="evennia.server.validators"
>next</a> |</li>
<li class="right" >
<a href="evennia.server.signals.html" title="evennia.server.signals"
>previous</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">Evennia 3.x</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../Evennia-API.html" >API Summary</a> &#187;</li>
<li class="nav-item nav-item-2"><a href="evennia-api.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-3"><a href="evennia.html" >evennia</a> &#187;</li>
<li class="nav-item nav-item-4"><a href="evennia.server.html" >evennia.server</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">evennia.server.throttle</a></li>
</ul>
</div>
<div class="admonition important">
<p class="first admonition-title">Note</p>
<p class="last">You are reading an old version of the Evennia documentation. <a href="https://www.evennia.com/docs/latest/index.html">The latest version is here</a></p>.
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2023, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>