<!-- Common Interface Language (CIL) Reference Guide -->
<!-- context_statement.xml -->
<sect1>
<title>Context Statement</title>
<para>Contexts are formed using previously declared parameters and may be named or anonymous where:</para>
<itemizedlist mark="none">
<listitem><para>Named - The context is declared with a context identifer that is used as a reference.</para></listitem>
<listitem><para>Anonymous - They are defined within the CIL labeling statement using user, role etc. identifiers.</para></listitem>
</itemizedlist>
<para>Each type is shown in the examples.</para>
<sect2 id="context">
<title>context</title>
<para>Declare an SELinux security context identifier for labeling. The range (or current and clearance levels) MUST be defined whether the policy is MLS/MCS enabled or not.</para>
<para><emphasis role="bold">Statement definition:</emphasis></para>
<programlisting><![CDATA[(context context_id (user_id role_id type_id levelrange_id)))]]></programlisting>
<para><emphasis role="bold">Where:</emphasis></para>
<informaltable frame="all">
<tgroup cols="2">
<colspec colwidth="2 *"/>
<colspec colwidth="6 *"/>
<tbody>
<row>
<entry>
<para><literal><link linkend="context">context</link></literal></para>
</entry>
<entry>
<para>The <literal><link linkend="context">context</link></literal> keyword.</para>
</entry>
</row>
<row>
<entry>
<para><literal>context_id</literal></para>
</entry>
<entry>
<para>The <literal><link linkend="context">context</link></literal> identifier.</para>
</entry>
</row>
<row>
<entry>
<para><literal>user_id</literal></para>
</entry>
<entry>
<para>A single previously declared <literal><link linkend="user">user</link></literal> identifier.</para>
</entry>
</row>
<row>
<entry>
<para><literal>role_id</literal></para>
</entry>
<entry>
<para>A single previously declared <literal><link linkend="role">role</link></literal> identifier.</para>
</entry>
</row>
<row>
<entry>
<para><literal>type_id</literal></para>
</entry>
<entry>
<para>A single previously declared <literal><link linkend="type">type</link></literal> or <literal><link linkend="typealias">typealias</link></literal> identifier.</para>
</entry>
</row>
<row>
<entry>
<para><literal>levelrange_id</literal></para>
</entry>
<entry>
<para>A single previously declared <literal><link linkend="levelrange">levelrange</link></literal> identifier. This entry may also be defined by anonymous or named <literal><link linkend="level">level</link></literal>, <literal><link linkend="sensitivity">sensitivity</link></literal>, <literal><link linkend="sensitivityalias">sensitivityalias</link></literal>, <literal><link linkend="category">category</link></literal>, <literal><link linkend="categoryalias">categoryalias</link></literal> or <literal><link linkend="categoryset">categoryset</link></literal> as discussed in the <link linkend="mls_labeling_statements">Multi-Level Security Labeling Statements</link> section and shown in the examples.</para>
</entry>
</row>
</tbody></tgroup>
</informaltable>
<para><emphasis role="bold">Examples:</emphasis></para>
<para>This example uses a named context definition:</para>
<programlisting><![CDATA[
(context runas_exec_context (u object_r exec low_low))
(filecon "/system/bin/run-as" file runas_exec_context)]]>
</programlisting>
<simpara>to resolve/build a <literal>file_contexts</literal> entry of (assuming MLS enabled policy):</simpara>
<programlisting><![CDATA[/system/bin/run-as -- u:object_r:runas.exec:s0-s0]]></programlisting>
<para>This example uses an anonymous context where the previously declared <literal><link linkend="user">user</link> <link linkend="role">role</link> <link linkend="type">type</link> <link linkend="levelrange">levelrange</link></literal> identifiers are used to specifiy two <literal><link linkend="portcon">portcon</link></literal> statements:</para>
<programlisting><![CDATA[
(portcon udp 1024 (test.user object_r test.process ((s0) (s1))))
(portcon tcp 1024 (test.user object_r test.process (system_low system_high)))]]>
</programlisting>
<para>This example uses an anonymous context for the first and named context for the second in a <literal><link linkend="netifcon">netifcon</link></literal> statement:</para>
<programlisting><![CDATA[
(context netif_context (test.user object_r test.process ((s0 (c0)) (s1 (c0)))))
(netifcon eth04 (test.user object_r test.process ((s0 (c0)) (s1 (c0)))) netif_context)]]>
</programlisting>
</sect2>
</sect1>