<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>HelpOnSessions</title></articleinfo><section><title>How sessions work in MoinMoin</title><para><!--The macro TableOfContents doesn't work with the DocBook formatter.--> Sessions in <ulink url="https://wiki.math.uzh.ch/public/HelpOnSessions/public/MoinMoin#">MoinMoin</ulink> are implemented using a special session service that can be configured in <code>cfg.session_service</code>. </para><para>Code using the session framework currently includes: </para><itemizedlist><listitem><para>the superuser &quot;change user&quot; functionality, see <ulink url="https://wiki.math.uzh.ch/public/HelpOnSessions/public/HelpOnSuperUser#">HelpOnSuperUser</ulink> </para></listitem><listitem><para>the visited pages trail </para></listitem></itemizedlist><section><title>Session related configuration</title><informaltable><tgroup cols="3"><colspec colname="col_0"/><colspec colname="col_1"/><colspec colname="col_2"/><tbody><row rowsep="1"><entry colsep="1" rowsep="1"><para> cookie_name     </para></entry><entry colsep="1" rowsep="1"><para> <code>None</code>    </para></entry><entry colsep="1" rowsep="1"><para> Part of the session cookie name. None means to create the name from some url parts, 'siteidmagic' means use cfg.siteid (name of config file),  anything else will be just used as is.</para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> cookie_domain   </para></entry><entry colsep="1" rowsep="1"><para> <code>None</code>    </para></entry><entry colsep="1" rowsep="1"><para> Domain used in the session cookie. </para></entry></row><row rowsep="1"><entry colsep="1" rowsep="1"><para> cookie_lifetime </para></entry><entry colsep="1" rowsep="1"><para> <code>(0, 12)</code> </para></entry><entry colsep="1" rowsep="1"><para> Cookie lifetime in hours, can be fractional. First tuple element is for anonymous sessions, second tuple element is for logged-in sessions. For anonymous sessions, t=0 means that they are disabled, t&gt;0 means that many hours. For logged-in sessions, t&gt;0 means that many hours, or forever if user checked 'remember_me', t&lt;0 means -t hours and ignore user 'remember_me' setting - you usually don't want to use t=0, it disables logged-in sessions. </para></entry></row></tbody></tgroup></informaltable><section><title>Single wiki</title><para>Likely the only interesting item is <code>cookie_lifetime</code>. </para></section><section><title>Multiple separate wikis under same domain, all using wikiconfig (not farmconfig)</title><para>The default <code>cookie_name = None</code> creates a different cookie name and separate sessions for each wiki. </para><para>If you want separate sessions for your wikis, you can't use <code>cookie_name = 'siteidmagic'</code> because that always would set the name to MOIN_SESSION_wikiconfig. So either explicitly set a unique cookie_name for each wiki or use <code>cookie_name = None</code>. </para></section><section><title>Wiki farm, host based farming</title><para>E.g. wiki1.example.org and wiki2.example.org. </para><para>If you like shared sessions, shared user profiles, use this in your farmconfig: </para><programlisting format="linespecific" language="highlight" linenumbering="numbered" startinglinenumber="1"><![CDATA[    ]]><methodname><![CDATA[cookie_domain]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[.example.org]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# cookie domain matches for all wikis]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[cookie_name]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[myfarm]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# cookie name is same for all wikis]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[session_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/same_session_dir]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# use same storage for session files]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[user_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/same_user_dir]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# use same storage for user profiles]]></lineannotation>
</programlisting></section><section><title>Wiki farm, path based farming</title><para>E.g. example.org/wiki1 and example.org/wiki2. </para><para>If you like shared sessions, shared user profiles, use this in your farmconfig: </para><programlisting format="linespecific" language="highlight" linenumbering="numbered" startinglinenumber="1"><![CDATA[    ]]><methodname><![CDATA[cookie_name]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[myfarm]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# cookie name is same for all wikis]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[session_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/same_session_dir]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# use same storage for session files]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[user_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/same_user_dir]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# use same storage for user profiles]]></lineannotation>
</programlisting></section><section><title>Wiki farm, port based farming</title><para>E.g. example.org:8000 and example.org:8001. </para><para>If you like shared sessions, shared user profiles, use this in your farmconfig: </para><programlisting format="linespecific" language="highlight" linenumbering="numbered" startinglinenumber="1"><![CDATA[    ]]><methodname><![CDATA[cookie_name]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[myfarm]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# cookie name is same for all wikis]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[session_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/same_session_dir]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# use same storage for session files]]></lineannotation>
<![CDATA[    ]]><methodname><![CDATA[user_dir]]></methodname><![CDATA[ = ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[/same_user_dir]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><lineannotation><![CDATA[# use same storage for user profiles]]></lineannotation>
</programlisting></section></section><section><title>Session example code</title><para>As an extension programmer, in order to use session variables, you can use <code>request.session</code> like a dict, values stored there are automatically saved and restored if a session is available. </para><para>Here's an example macro using the session code: </para><programlisting format="linespecific" language="highlight" linenumbering="numbered" startinglinenumber="1"><lineannotation><![CDATA[# -*- coding: iso-8859-1 -*-]]></lineannotation>

<phrase><![CDATA["""]]></phrase>
<phrase><![CDATA[    Tests session state.]]></phrase>
<phrase><![CDATA["""]]></phrase>

<methodname><![CDATA[Dependencies]]></methodname><![CDATA[ = []]><phrase><![CDATA[']]></phrase><phrase><![CDATA[time]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[]]]>

<token><![CDATA[def]]></token><![CDATA[ ]]><methodname><![CDATA[execute]]></methodname><![CDATA[(]]><methodname><![CDATA[macro]]></methodname><![CDATA[, ]]><methodname><![CDATA[args]]></methodname><![CDATA[):]]>
<![CDATA[    ]]><token><![CDATA[if]]></token><![CDATA[ ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[request]]></methodname><![CDATA[.]]><methodname><![CDATA[session]]></methodname><![CDATA[.]]><methodname><![CDATA[is_new]]></methodname><![CDATA[:]]>
<![CDATA[        ]]><token><![CDATA[return]]></token><![CDATA[ ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[formatter]]></methodname><![CDATA[.]]><methodname><![CDATA[text]]></methodname><![CDATA[(]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[Not storing any state until you send a cookie.]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[)]]>
<![CDATA[    ]]><token><![CDATA[if]]></token><![CDATA[ ]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[test]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[ ]]><token><![CDATA[in]]></token><![CDATA[ ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[request]]></methodname><![CDATA[.]]><methodname><![CDATA[session]]></methodname><![CDATA[:]]>
<![CDATA[        ]]><token><![CDATA[return]]></token><![CDATA[ ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[formatter]]></methodname><![CDATA[.]]><methodname><![CDATA[text]]></methodname><![CDATA[(]]><phrase><![CDATA["]]></phrase><phrase><![CDATA[Loaded value ]]></phrase><phrase><![CDATA[%d]]></phrase><phrase><![CDATA["]]></phrase><![CDATA[ % ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[request]]></methodname><![CDATA[.]]><methodname><![CDATA[session]]></methodname><![CDATA[[]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[test]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[])]]>
<![CDATA[    ]]><token><![CDATA[import]]></token><![CDATA[ ]]><methodname><![CDATA[random]]></methodname>
<![CDATA[    ]]><methodname><![CDATA[value]]></methodname><![CDATA[ = ]]><methodname><![CDATA[random]]></methodname><![CDATA[.]]><methodname><![CDATA[randint]]></methodname><![CDATA[(1, 100000)]]>
<![CDATA[    ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[request]]></methodname><![CDATA[.]]><methodname><![CDATA[session]]></methodname><![CDATA[[]]><phrase><![CDATA[']]></phrase><phrase><![CDATA[test]]></phrase><phrase><![CDATA[']]></phrase><![CDATA[] = ]]><methodname><![CDATA[value]]></methodname>
<![CDATA[    ]]><token><![CDATA[return]]></token><![CDATA[ ]]><methodname><![CDATA[macro]]></methodname><![CDATA[.]]><methodname><![CDATA[formatter]]></methodname><![CDATA[.]]><methodname><![CDATA[text]]></methodname><![CDATA[(]]><phrase><![CDATA["]]></phrase><phrase><![CDATA[Set to value ]]></phrase><phrase><![CDATA[%d]]></phrase><phrase><![CDATA["]]></phrase><![CDATA[ % ]]><methodname><![CDATA[value]]></methodname><![CDATA[)]]>
</programlisting></section></section></article>