blob: 1cfbbde4c39f1300bd998e1baa09dcaafb08c8b2 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>proton._transport &#8212; Qpid Proton Python API 0.32.0 documentation</title>
<link rel="stylesheet" href="../../_static/sphinxdoc.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>
<script async="async" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS-MML_HTMLorMML"></script>
<link rel="index" title="Index" href="../../genindex.html" />
<link rel="search" title="Search" href="../../search.html" />
</head><body>
<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="nav-item nav-item-0"><a href="../../index.html">Qpid Proton Python API 0.32.0 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../index.html" accesskey="U">Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">proton._transport</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for proton._transport</h1><div class="highlight"><pre>
<span></span><span class="c1">#</span>
<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
<span class="c1"># distributed with this work for additional information</span>
<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
<span class="c1"># with the License. You may obtain a copy of the License at</span>
<span class="c1">#</span>
<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
<span class="c1">#</span>
<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
<span class="c1"># software distributed under the License is distributed on an</span>
<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
<span class="c1"># KIND, either express or implied. See the License for the</span>
<span class="c1"># specific language governing permissions and limitations</span>
<span class="c1"># under the License.</span>
<span class="c1">#</span>
<span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_import</span>
<span class="kn">from</span> <span class="nn">cproton</span> <span class="kn">import</span> <span class="n">PN_EOS</span><span class="p">,</span> <span class="n">PN_OK</span><span class="p">,</span> <span class="n">PN_SASL_AUTH</span><span class="p">,</span> <span class="n">PN_SASL_NONE</span><span class="p">,</span> <span class="n">PN_SASL_OK</span><span class="p">,</span> <span class="n">PN_SASL_PERM</span><span class="p">,</span> <span class="n">PN_SASL_SYS</span><span class="p">,</span> <span class="n">PN_SASL_TEMP</span><span class="p">,</span> \
<span class="n">PN_SSL_ANONYMOUS_PEER</span><span class="p">,</span> <span class="n">PN_SSL_CERT_SUBJECT_CITY_OR_LOCALITY</span><span class="p">,</span> <span class="n">PN_SSL_CERT_SUBJECT_COMMON_NAME</span><span class="p">,</span> \
<span class="n">PN_SSL_CERT_SUBJECT_COUNTRY_NAME</span><span class="p">,</span> <span class="n">PN_SSL_CERT_SUBJECT_ORGANIZATION_NAME</span><span class="p">,</span> <span class="n">PN_SSL_CERT_SUBJECT_ORGANIZATION_UNIT</span><span class="p">,</span> \
<span class="n">PN_SSL_CERT_SUBJECT_STATE_OR_PROVINCE</span><span class="p">,</span> <span class="n">PN_SSL_MD5</span><span class="p">,</span> <span class="n">PN_SSL_MODE_CLIENT</span><span class="p">,</span> <span class="n">PN_SSL_MODE_SERVER</span><span class="p">,</span> <span class="n">PN_SSL_RESUME_NEW</span><span class="p">,</span> \
<span class="n">PN_SSL_RESUME_REUSED</span><span class="p">,</span> <span class="n">PN_SSL_RESUME_UNKNOWN</span><span class="p">,</span> <span class="n">PN_SSL_SHA1</span><span class="p">,</span> <span class="n">PN_SSL_SHA256</span><span class="p">,</span> <span class="n">PN_SSL_SHA512</span><span class="p">,</span> <span class="n">PN_SSL_VERIFY_PEER</span><span class="p">,</span> \
<span class="n">PN_SSL_VERIFY_PEER_NAME</span><span class="p">,</span> <span class="n">PN_TRACE_DRV</span><span class="p">,</span> <span class="n">PN_TRACE_FRM</span><span class="p">,</span> <span class="n">PN_TRACE_OFF</span><span class="p">,</span> <span class="n">PN_TRACE_RAW</span><span class="p">,</span> <span class="n">pn_error_text</span><span class="p">,</span> <span class="n">pn_sasl</span><span class="p">,</span> \
<span class="n">pn_sasl_allowed_mechs</span><span class="p">,</span> <span class="n">pn_sasl_config_name</span><span class="p">,</span> <span class="n">pn_sasl_config_path</span><span class="p">,</span> <span class="n">pn_sasl_done</span><span class="p">,</span> <span class="n">pn_sasl_extended</span><span class="p">,</span> \
<span class="n">pn_sasl_get_allow_insecure_mechs</span><span class="p">,</span> <span class="n">pn_sasl_get_mech</span><span class="p">,</span> <span class="n">pn_sasl_get_user</span><span class="p">,</span> <span class="n">pn_sasl_outcome</span><span class="p">,</span> \
<span class="n">pn_sasl_set_allow_insecure_mechs</span><span class="p">,</span> <span class="n">pn_ssl</span><span class="p">,</span> <span class="n">pn_ssl_domain</span><span class="p">,</span> <span class="n">pn_ssl_domain_allow_unsecured_client</span><span class="p">,</span> <span class="n">pn_ssl_domain_free</span><span class="p">,</span> \
<span class="n">pn_ssl_domain_set_credentials</span><span class="p">,</span> <span class="n">pn_ssl_domain_set_peer_authentication</span><span class="p">,</span> <span class="n">pn_ssl_domain_set_trusted_ca_db</span><span class="p">,</span> \
<span class="n">pn_ssl_get_cert_fingerprint</span><span class="p">,</span> <span class="n">pn_ssl_get_cipher_name</span><span class="p">,</span> <span class="n">pn_ssl_get_peer_hostname</span><span class="p">,</span> <span class="n">pn_ssl_get_protocol_name</span><span class="p">,</span> \
<span class="n">pn_ssl_get_remote_subject</span><span class="p">,</span> <span class="n">pn_ssl_get_remote_subject_subfield</span><span class="p">,</span> <span class="n">pn_ssl_init</span><span class="p">,</span> <span class="n">pn_ssl_present</span><span class="p">,</span> <span class="n">pn_ssl_resume_status</span><span class="p">,</span> \
<span class="n">pn_ssl_set_peer_hostname</span><span class="p">,</span> <span class="n">pn_transport</span><span class="p">,</span> <span class="n">pn_transport_attachments</span><span class="p">,</span> <span class="n">pn_transport_bind</span><span class="p">,</span> <span class="n">pn_transport_capacity</span><span class="p">,</span> \
<span class="n">pn_transport_close_head</span><span class="p">,</span> <span class="n">pn_transport_close_tail</span><span class="p">,</span> <span class="n">pn_transport_closed</span><span class="p">,</span> <span class="n">pn_transport_condition</span><span class="p">,</span> \
<span class="n">pn_transport_connection</span><span class="p">,</span> <span class="n">pn_transport_error</span><span class="p">,</span> <span class="n">pn_transport_get_channel_max</span><span class="p">,</span> <span class="n">pn_transport_get_frames_input</span><span class="p">,</span> \
<span class="n">pn_transport_get_frames_output</span><span class="p">,</span> <span class="n">pn_transport_get_idle_timeout</span><span class="p">,</span> <span class="n">pn_transport_get_max_frame</span><span class="p">,</span> \
<span class="n">pn_transport_get_pytracer</span><span class="p">,</span> <span class="n">pn_transport_get_remote_idle_timeout</span><span class="p">,</span> <span class="n">pn_transport_get_remote_max_frame</span><span class="p">,</span> \
<span class="n">pn_transport_get_user</span><span class="p">,</span> <span class="n">pn_transport_is_authenticated</span><span class="p">,</span> <span class="n">pn_transport_is_encrypted</span><span class="p">,</span> <span class="n">pn_transport_log</span><span class="p">,</span> \
<span class="n">pn_transport_peek</span><span class="p">,</span> <span class="n">pn_transport_pending</span><span class="p">,</span> <span class="n">pn_transport_pop</span><span class="p">,</span> <span class="n">pn_transport_push</span><span class="p">,</span> <span class="n">pn_transport_remote_channel_max</span><span class="p">,</span> \
<span class="n">pn_transport_require_auth</span><span class="p">,</span> <span class="n">pn_transport_require_encryption</span><span class="p">,</span> <span class="n">pn_transport_set_channel_max</span><span class="p">,</span> \
<span class="n">pn_transport_set_idle_timeout</span><span class="p">,</span> <span class="n">pn_transport_set_max_frame</span><span class="p">,</span> <span class="n">pn_transport_set_pytracer</span><span class="p">,</span> <span class="n">pn_transport_set_server</span><span class="p">,</span> \
<span class="n">pn_transport_tick</span><span class="p">,</span> <span class="n">pn_transport_trace</span><span class="p">,</span> <span class="n">pn_transport_unbind</span>
<span class="kn">from</span> <span class="nn">._common</span> <span class="kn">import</span> <span class="n">millis2secs</span><span class="p">,</span> <span class="n">secs2millis</span><span class="p">,</span> <span class="n">unicode2utf8</span><span class="p">,</span> <span class="n">utf82unicode</span>
<span class="kn">from</span> <span class="nn">._condition</span> <span class="kn">import</span> <span class="n">cond2obj</span><span class="p">,</span> <span class="n">obj2cond</span>
<span class="kn">from</span> <span class="nn">._exceptions</span> <span class="kn">import</span> <span class="n">EXCEPTIONS</span><span class="p">,</span> <span class="n">SSLException</span><span class="p">,</span> <span class="n">SSLUnavailable</span><span class="p">,</span> <span class="n">SessionException</span><span class="p">,</span> <span class="n">TransportException</span>
<span class="kn">from</span> <span class="nn">._wrapper</span> <span class="kn">import</span> <span class="n">Wrapper</span>
<span class="k">class</span> <span class="nc">TraceAdapter</span><span class="p">:</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tracer</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tracer</span> <span class="o">=</span> <span class="n">tracer</span>
<span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">trans_impl</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">tracer</span><span class="p">(</span><span class="n">Transport</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">trans_impl</span><span class="p">),</span> <span class="n">message</span><span class="p">)</span>
<div class="viewcode-block" id="Transport"><a class="viewcode-back" href="../../proton.html#proton.Transport">[docs]</a><span class="k">class</span> <span class="nc">Transport</span><span class="p">(</span><span class="n">Wrapper</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A network channel supporting an AMQP connection.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">TRACE_OFF</span> <span class="o">=</span> <span class="n">PN_TRACE_OFF</span>
<span class="sd">&quot;&quot;&quot; Turn logging off entirely. &quot;&quot;&quot;</span>
<span class="n">TRACE_DRV</span> <span class="o">=</span> <span class="n">PN_TRACE_DRV</span>
<span class="sd">&quot;&quot;&quot; Log driver-related events. &quot;&quot;&quot;</span>
<span class="n">TRACE_FRM</span> <span class="o">=</span> <span class="n">PN_TRACE_FRM</span>
<span class="sd">&quot;&quot;&quot; Log protocol frames going in and out of the transport. &quot;&quot;&quot;</span>
<span class="n">TRACE_RAW</span> <span class="o">=</span> <span class="n">PN_TRACE_RAW</span>
<span class="sd">&quot;&quot;&quot; Log raw binary data going in and out of the transport. &quot;&quot;&quot;</span>
<span class="n">CLIENT</span> <span class="o">=</span> <span class="mi">1</span>
<span class="sd">&quot;&quot;&quot; Transport mode is as a client. &quot;&quot;&quot;</span>
<span class="n">SERVER</span> <span class="o">=</span> <span class="mi">2</span>
<span class="sd">&quot;&quot;&quot; Transport mode is as a server. &quot;&quot;&quot;</span>
<span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">wrap</span><span class="p">(</span><span class="n">impl</span><span class="p">):</span>
<span class="k">if</span> <span class="n">impl</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">Transport</span><span class="p">(</span><span class="n">_impl</span><span class="o">=</span><span class="n">impl</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">_impl</span><span class="o">=</span><span class="n">pn_transport</span><span class="p">):</span>
<span class="n">Wrapper</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_impl</span><span class="p">,</span> <span class="n">pn_transport_attachments</span><span class="p">)</span>
<span class="k">if</span> <span class="n">mode</span> <span class="o">==</span> <span class="n">Transport</span><span class="o">.</span><span class="n">SERVER</span><span class="p">:</span>
<span class="n">pn_transport_set_server</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">mode</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">mode</span> <span class="o">==</span> <span class="n">Transport</span><span class="o">.</span><span class="n">CLIENT</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">TransportException</span><span class="p">(</span><span class="s2">&quot;Cannot initialise Transport from mode: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">str</span><span class="p">(</span><span class="n">mode</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_init</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_reactor</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_connect_selectable</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">def</span> <span class="nf">_check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">err</span><span class="p">):</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">exc</span> <span class="o">=</span> <span class="n">EXCEPTIONS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">TransportException</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">exc</span><span class="p">(</span><span class="s2">&quot;[</span><span class="si">%s</span><span class="s2">]: </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">pn_error_text</span><span class="p">(</span><span class="n">pn_transport_error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">))))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">err</span>
<span class="k">def</span> <span class="nf">_set_tracer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tracer</span><span class="p">):</span>
<span class="n">pn_transport_set_pytracer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">TraceAdapter</span><span class="p">(</span><span class="n">tracer</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_get_tracer</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">adapter</span> <span class="o">=</span> <span class="n">pn_transport_get_pytracer</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="k">if</span> <span class="n">adapter</span><span class="p">:</span>
<span class="k">return</span> <span class="n">adapter</span><span class="o">.</span><span class="n">tracer</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">tracer</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_tracer</span><span class="p">,</span> <span class="n">_set_tracer</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> A callback for trace logging. The callback is passed the transport</span>
<span class="s2"> and log message. For no tracer callback, value is ``None``.</span>
<span class="s2"> :type: Tracer callback function</span>
<span class="s2"> &quot;&quot;&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="Transport.log"><a class="viewcode-back" href="../../proton.html#proton.Transport.log">[docs]</a> <span class="k">def</span> <span class="nf">log</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Log a message using a transport&#39;s logging mechanism.</span>
<span class="sd"> </span>
<span class="sd"> This can be useful in a debugging context as the log message will</span>
<span class="sd"> be prefixed with the transport&#39;s identifier.</span>
<span class="sd"> :param message: The message to be logged.</span>
<span class="sd"> :type message: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pn_transport_log</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">message</span><span class="p">)</span></div>
<div class="viewcode-block" id="Transport.require_auth"><a class="viewcode-back" href="../../proton.html#proton.Transport.require_auth">[docs]</a> <span class="k">def</span> <span class="nf">require_auth</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set whether a non-authenticated transport connection is allowed.</span>
<span class="sd"> There are several ways within the AMQP protocol suite to get</span>
<span class="sd"> unauthenticated connections:</span>
<span class="sd"> - Use no SASL layer (with either no TLS or TLS without client certificates)</span>
<span class="sd"> - Use a SASL layer but the ANONYMOUS mechanism</span>
<span class="sd"> The default if this option is not set is to allow unauthenticated connections.</span>
<span class="sd"> :param bool: ``True`` when authenticated connections are required.</span>
<span class="sd"> :type bool: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pn_transport_require_auth</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">authenticated</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Indicate whether the transport connection is authenticated.</span>
<span class="sd"> .. note:: This property may not be stable until the :const:`Event.CONNECTION_REMOTE_OPEN`</span>
<span class="sd"> event is received.</span>
<span class="sd"> :type: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_transport_is_authenticated</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<div class="viewcode-block" id="Transport.require_encryption"><a class="viewcode-back" href="../../proton.html#proton.Transport.require_encryption">[docs]</a> <span class="k">def</span> <span class="nf">require_encryption</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">bool</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set whether a non encrypted transport connection is allowed</span>
<span class="sd"> There are several ways within the AMQP protocol suite to get encrypted connections:</span>
<span class="sd"> - Use TLS</span>
<span class="sd"> - Use a SASL with a mechanism that supports security layers</span>
<span class="sd"> The default if this option is not set is to allow unencrypted connections.</span>
<span class="sd"> :param bool: ``True`` if encryption is required on this transport, ``False`` otherwise.</span>
<span class="sd"> :type bool: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pn_transport_require_encryption</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="nb">bool</span><span class="p">)</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">encrypted</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Indicate whether the transport connection is encrypted.</span>
<span class="sd"> .. note:: This property may not be stable until the :const:`Event.CONNECTION_REMOTE_OPEN`</span>
<span class="sd"> event is received.</span>
<span class="sd"> :type: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_transport_is_encrypted</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">user</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The authenticated user.</span>
<span class="sd"> </span>
<span class="sd"> On the client it will return whatever user was passed in to the</span>
<span class="sd"> :attr:`Connection.user` attribute of the bound connection.</span>
<span class="sd"> The returned value is only reliable after the ``PN_TRANSPORT_AUTHENTICATED``</span>
<span class="sd"> event has been received.</span>
<span class="sd"> :type: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_transport_get_user</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<div class="viewcode-block" id="Transport.bind"><a class="viewcode-back" href="../../proton.html#proton.Transport.bind">[docs]</a> <span class="k">def</span> <span class="nf">bind</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Assign a connection to the transport.</span>
<span class="sd"> :param connection: Connection to which to bind.</span>
<span class="sd"> :type connection: :class:`Connection`</span>
<span class="sd"> :raise: :exc:`TransportException` if there is any Proton error.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">pn_transport_bind</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">connection</span><span class="o">.</span><span class="n">_impl</span><span class="p">))</span></div>
<div class="viewcode-block" id="Transport.bind_nothrow"><a class="viewcode-back" href="../../proton.html#proton.Transport.bind_nothrow">[docs]</a> <span class="k">def</span> <span class="nf">bind_nothrow</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">connection</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Assign a connection to the transport. Any failure is</span>
<span class="sd"> ignored rather than thrown.</span>
<span class="sd"> :param connection: Connection to which to bind.</span>
<span class="sd"> :type connection: :class:`Connection`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pn_transport_bind</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">connection</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span></div>
<div class="viewcode-block" id="Transport.unbind"><a class="viewcode-back" href="../../proton.html#proton.Transport.unbind">[docs]</a> <span class="k">def</span> <span class="nf">unbind</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Unbinds a transport from its AMQP connection.</span>
<span class="sd"> :raise: :exc:`TransportException` if there is any Proton error.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">pn_transport_unbind</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">))</span></div>
<div class="viewcode-block" id="Transport.trace"><a class="viewcode-back" href="../../proton.html#proton.Transport.trace">[docs]</a> <span class="k">def</span> <span class="nf">trace</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">n</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Update a transports trace flags.</span>
<span class="sd"> The trace flags for a transport control what sort of information is</span>
<span class="sd"> logged. The value may be :const:`TRACE_OFF` or any combination of</span>
<span class="sd"> :const:`TRACE_DRV`, :const:`TRACE_FRM`, :const:`TRACE_RAW` using</span>
<span class="sd"> a bitwise or operation.</span>
<span class="sd"> :param n: Trace flags</span>
<span class="sd"> :type n: ``int``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pn_transport_trace</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span></div>
<div class="viewcode-block" id="Transport.tick"><a class="viewcode-back" href="../../proton.html#proton.Transport.tick">[docs]</a> <span class="k">def</span> <span class="nf">tick</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">now</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Process any pending transport timer events (like heartbeat generation).</span>
<span class="sd"> This method should be called after all pending input has been</span>
<span class="sd"> processed by the transport and before generating output. It returns</span>
<span class="sd"> the deadline for the next pending timer event, if any are present.</span>
<span class="sd"> .. note:: This function does nothing until the first data is read</span>
<span class="sd"> from or written to the transport.</span>
<span class="sd"> :param now: seconds since epoch.</span>
<span class="sd"> :type now: ``float``</span>
<span class="sd"> :return: If non-zero, then the monotonic expiration time of the next</span>
<span class="sd"> pending timer event for the transport. The caller must invoke</span>
<span class="sd"> :meth:`tick` again at least once at or before this deadline</span>
<span class="sd"> occurs. If ``0.0``, then there are no pending events.</span>
<span class="sd"> :rtype: ``float``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">millis2secs</span><span class="p">(</span><span class="n">pn_transport_tick</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">secs2millis</span><span class="p">(</span><span class="n">now</span><span class="p">)))</span></div>
<div class="viewcode-block" id="Transport.capacity"><a class="viewcode-back" href="../../proton.html#proton.Transport.capacity">[docs]</a> <span class="k">def</span> <span class="nf">capacity</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the amount of free space for input following the transport&#39;s</span>
<span class="sd"> tail pointer.</span>
<span class="sd"> </span>
<span class="sd"> :return: Available space for input in bytes.</span>
<span class="sd"> :rtype: ``int``</span>
<span class="sd"> :raise: :exc:`TransportException` if there is any Proton error.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">pn_transport_capacity</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="k">if</span> <span class="n">c</span> <span class="o">&gt;=</span> <span class="n">PN_EOS</span><span class="p">:</span>
<span class="k">return</span> <span class="n">c</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">c</span><span class="p">)</span></div>
<div class="viewcode-block" id="Transport.push"><a class="viewcode-back" href="../../proton.html#proton.Transport.push">[docs]</a> <span class="k">def</span> <span class="nf">push</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">binary</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Pushes the supplied bytes into the tail of the transport.</span>
<span class="sd"> Only some of the bytes will be copied if there is insufficient</span>
<span class="sd"> capacity available. Use :meth:`capacity` to determine how much</span>
<span class="sd"> capacity the transport has.</span>
<span class="sd"> :param binary: Data to be pushed onto the transport tail.</span>
<span class="sd"> :type binary: ``bytes``</span>
<span class="sd"> :raise: - :exc:`TransportException` if there is any Proton error.</span>
<span class="sd"> - ``OverflowError`` if the size of the data exceeds the</span>
<span class="sd"> transport capacity.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">n</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">pn_transport_push</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">binary</span><span class="p">))</span>
<span class="k">if</span> <span class="n">n</span> <span class="o">!=</span> <span class="nb">len</span><span class="p">(</span><span class="n">binary</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">OverflowError</span><span class="p">(</span><span class="s2">&quot;unable to process all bytes: </span><span class="si">%s</span><span class="s2">, </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">binary</span><span class="p">)))</span></div>
<div class="viewcode-block" id="Transport.close_tail"><a class="viewcode-back" href="../../proton.html#proton.Transport.close_tail">[docs]</a> <span class="k">def</span> <span class="nf">close_tail</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Indicate that the input has reached End Of Stream (EOS).</span>
<span class="sd"> This tells the transport that no more input will be forthcoming.</span>
<span class="sd"> :raise: :exc:`TransportException` if there is any Proton error.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">pn_transport_close_tail</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">))</span></div>
<div class="viewcode-block" id="Transport.pending"><a class="viewcode-back" href="../../proton.html#proton.Transport.pending">[docs]</a> <span class="k">def</span> <span class="nf">pending</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the number of pending output bytes following the transport&#39;s</span>
<span class="sd"> head pointer.</span>
<span class="sd"> :return: The number of pending output bytes.</span>
<span class="sd"> :rtype: ``int``</span>
<span class="sd"> :raise: :exc:`TransportException` if there is any Proton error.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">pn_transport_pending</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="k">if</span> <span class="n">p</span> <span class="o">&gt;=</span> <span class="n">PN_EOS</span><span class="p">:</span>
<span class="k">return</span> <span class="n">p</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">p</span><span class="p">)</span></div>
<div class="viewcode-block" id="Transport.peek"><a class="viewcode-back" href="../../proton.html#proton.Transport.peek">[docs]</a> <span class="k">def</span> <span class="nf">peek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns ``size`` bytes from the head of the transport.</span>
<span class="sd"> It is an error to call this with a value of ``size`` that</span>
<span class="sd"> is greater than the value reported by :meth:`pending`.</span>
<span class="sd"> :param size: Number of bytes to return.</span>
<span class="sd"> :type size: ``int``</span>
<span class="sd"> :return: ``size`` bytes from the head of the transport, or ``None``</span>
<span class="sd"> if none are available.</span>
<span class="sd"> :rtype: ``bytes``</span>
<span class="sd"> :raise: :exc:`TransportException` if there is any Proton error.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">cd</span><span class="p">,</span> <span class="n">out</span> <span class="o">=</span> <span class="n">pn_transport_peek</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
<span class="k">if</span> <span class="n">cd</span> <span class="o">==</span> <span class="n">PN_EOS</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">cd</span><span class="p">)</span>
<span class="k">return</span> <span class="n">out</span></div>
<div class="viewcode-block" id="Transport.pop"><a class="viewcode-back" href="../../proton.html#proton.Transport.pop">[docs]</a> <span class="k">def</span> <span class="nf">pop</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Removes ``size`` bytes of output from the pending output queue</span>
<span class="sd"> following the transport&#39;s head pointer.</span>
<span class="sd"> Calls to this function may alter the transport&#39;s head pointer as</span>
<span class="sd"> well as the number of pending bytes reported by</span>
<span class="sd"> :meth:`pending`.</span>
<span class="sd"> :param size: Number of bytes to return.</span>
<span class="sd"> :type size: ``int``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pn_transport_pop</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span></div>
<div class="viewcode-block" id="Transport.close_head"><a class="viewcode-back" href="../../proton.html#proton.Transport.close_head">[docs]</a> <span class="k">def</span> <span class="nf">close_head</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Indicate that the output has closed.</span>
<span class="sd"> This tells the transport that no more output will be popped.</span>
<span class="sd"> :raise: :exc:`TransportException` if there is any Proton error.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">pn_transport_close_head</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">))</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">closed</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> ``True`` iff both the transport head and transport tail are closed</span>
<span class="sd"> using :meth:`close_head` and :meth:`close_tail` respectively.</span>
<span class="sd"> :type: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_transport_closed</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="c1"># AMQP 1.0 max-frame-size</span>
<span class="k">def</span> <span class="nf">_get_max_frame_size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">pn_transport_get_max_frame</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_set_max_frame_size</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="n">pn_transport_set_max_frame</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="n">max_frame_size</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_max_frame_size</span><span class="p">,</span> <span class="n">_set_max_frame_size</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> The maximum size for transport frames (in bytes).</span>
<span class="s2"> :type: ``int``</span>
<span class="s2"> &quot;&quot;&quot;</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">remote_max_frame_size</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The maximum frame size of a transport&#39;s remote peer (in bytes).</span>
<span class="sd"> :type: ``int``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_transport_get_remote_max_frame</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_get_channel_max</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">pn_transport_get_channel_max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_set_channel_max</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">if</span> <span class="n">pn_transport_set_channel_max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="k">raise</span> <span class="n">SessionException</span><span class="p">(</span><span class="s2">&quot;Too late to change channel max.&quot;</span><span class="p">)</span>
<span class="n">channel_max</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_channel_max</span><span class="p">,</span> <span class="n">_set_channel_max</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> The maximum channel number that may be used on this transport.</span>
<span class="s2"> .. note:: This is the maximum channel number allowed, giving a</span>
<span class="s2"> valid channel number range of ``[0 .. channel_max]``. Therefore the</span>
<span class="s2"> maximum number of simultaneously active channels will be</span>
<span class="s2"> channel_max plus 1.</span>
<span class="s2"> You can set this more than once to raise and lower</span>
<span class="s2"> the limit your application imposes on max channels for this</span>
<span class="s2"> transport. However, smaller limits may be imposed by Proton,</span>
<span class="s2"> or by the remote peer.</span>
<span class="s2"> After the ``OPEN`` frame has been sent to the remote peer,</span>
<span class="s2"> further calls to this function will have no effect.</span>
<span class="s2"> :type: ``int``</span>
<span class="s2"> :raise: :exc:`SessionException` if the ``OPEN`` frame has already</span>
<span class="s2"> been sent.</span>
<span class="s2"> &quot;&quot;&quot;</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">remote_channel_max</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The maximum allowed channel number of a transport&#39;s remote peer.</span>
<span class="sd"> :type: ``int``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_transport_remote_channel_max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="c1"># AMQP 1.0 idle-time-out</span>
<span class="k">def</span> <span class="nf">_get_idle_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">millis2secs</span><span class="p">(</span><span class="n">pn_transport_get_idle_timeout</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_set_idle_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">sec</span><span class="p">):</span>
<span class="n">pn_transport_set_idle_timeout</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">secs2millis</span><span class="p">(</span><span class="n">sec</span><span class="p">))</span>
<span class="n">idle_timeout</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_idle_timeout</span><span class="p">,</span> <span class="n">_set_idle_timeout</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> The idle timeout of the connection in seconds. A zero idle</span>
<span class="s2"> timeout means heartbeats are disabled.</span>
<span class="s2"> :type: ``float``</span>
<span class="s2"> &quot;&quot;&quot;</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">remote_idle_timeout</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the idle timeout for a transport&#39;s remote peer in</span>
<span class="sd"> seconds. A zero idle timeout means heartbeats are disabled.</span>
<span class="sd"> :type: ``float``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">millis2secs</span><span class="p">(</span><span class="n">pn_transport_get_remote_idle_timeout</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">))</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">frames_output</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the number of frames output by a transport.</span>
<span class="sd"> :type: ``int``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_transport_get_frames_output</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">frames_input</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the number of frames input by a transport.</span>
<span class="sd"> :type: ``int``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_transport_get_frames_input</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<div class="viewcode-block" id="Transport.sasl"><a class="viewcode-back" href="../../proton.html#proton.Transport.sasl">[docs]</a> <span class="k">def</span> <span class="nf">sasl</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the :class:`SASL` object associated with this transport.</span>
<span class="sd"> :return: SASL object associated with this transport.</span>
<span class="sd"> :rtype: :class:`SASL`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">SASL</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span></div>
<div class="viewcode-block" id="Transport.ssl"><a class="viewcode-back" href="../../proton.html#proton.Transport.ssl">[docs]</a> <span class="k">def</span> <span class="nf">ssl</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">domain</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">session_details</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the :class:`SSL` session associated with this transport. If</span>
<span class="sd"> not set, then a new session will be created using ``domain`` and</span>
<span class="sd"> ``session_details``.</span>
<span class="sd"> :param domain: An SSL domain configuration object</span>
<span class="sd"> :type domain: :class:`SSLDomain`</span>
<span class="sd"> :param session_details: A unique identifier for the SSL session.</span>
<span class="sd"> :type session_details: :class:`SSLSessionDetails`</span>
<span class="sd"> :return: SSL session associated with this transport.</span>
<span class="sd"> :rtype: :class:`SSL`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># SSL factory (singleton for this transport)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span> <span class="o">=</span> <span class="n">SSL</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">session_details</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span></div>
<span class="k">def</span> <span class="nf">_get_condition</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">cond2obj</span><span class="p">(</span><span class="n">pn_transport_condition</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">))</span>
<span class="k">def</span> <span class="nf">_set_condition</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cond</span><span class="p">):</span>
<span class="n">pn_cond</span> <span class="o">=</span> <span class="n">pn_transport_condition</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="n">obj2cond</span><span class="p">(</span><span class="n">cond</span><span class="p">,</span> <span class="n">pn_cond</span><span class="p">)</span>
<span class="n">condition</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_condition</span><span class="p">,</span> <span class="n">_set_condition</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> Get additional information about the condition of the transport.</span>
<span class="s2"> When a :const:`Event.TRANSPORT_ERROR` event occurs, this operation</span>
<span class="s2"> can be used to access the details of the error condition.</span>
<span class="s2"> See :class:`Condition` for more information.</span>
<span class="s2"> :type: :class:`Condition`</span>
<span class="s2"> &quot;&quot;&quot;</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">connection</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The connection bound to this transport.</span>
<span class="sd"> :type: :class:`Connection`</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">from</span> <span class="nn">.</span> <span class="kn">import</span> <span class="n">_endpoints</span>
<span class="k">return</span> <span class="n">_endpoints</span><span class="o">.</span><span class="n">Connection</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">pn_transport_connection</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_impl</span><span class="p">))</span></div>
<span class="k">class</span> <span class="nc">SASLException</span><span class="p">(</span><span class="n">TransportException</span><span class="p">):</span>
<span class="k">pass</span>
<div class="viewcode-block" id="SASL"><a class="viewcode-back" href="../../proton.html#proton.SASL">[docs]</a><span class="k">class</span> <span class="nc">SASL</span><span class="p">(</span><span class="n">Wrapper</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The SASL layer is responsible for establishing an authenticated</span>
<span class="sd"> and/or encrypted tunnel over which AMQP frames are passed between</span>
<span class="sd"> peers. The peer acting as the SASL Client must provide</span>
<span class="sd"> authentication credentials. The peer acting as the SASL Server must</span>
<span class="sd"> provide authentication against the received credentials.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">OK</span> <span class="o">=</span> <span class="n">PN_SASL_OK</span>
<span class="n">AUTH</span> <span class="o">=</span> <span class="n">PN_SASL_AUTH</span>
<span class="n">SYS</span> <span class="o">=</span> <span class="n">PN_SASL_SYS</span>
<span class="n">PERM</span> <span class="o">=</span> <span class="n">PN_SASL_PERM</span>
<span class="n">TEMP</span> <span class="o">=</span> <span class="n">PN_SASL_TEMP</span>
<div class="viewcode-block" id="SASL.extended"><a class="viewcode-back" href="../../proton.html#proton.SASL.extended">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">extended</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check for support of extended SASL negotiation.</span>
<span class="sd"> All implementations of Proton support ``ANONYMOUS`` and ``EXTERNAL`` on both</span>
<span class="sd"> client and server sides and ``PLAIN`` on the client side.</span>
<span class="sd"> Extended SASL implementations use an external library (Cyrus SASL)</span>
<span class="sd"> to support other mechanisms beyond these basic ones.</span>
<span class="sd"> :rtype: ``True`` if we support extended SASL negotiation, ``False`` if</span>
<span class="sd"> we only support basic negotiation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_sasl_extended</span><span class="p">()</span></div>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transport</span><span class="p">):</span>
<span class="n">Wrapper</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">transport</span><span class="o">.</span><span class="n">_impl</span><span class="p">,</span> <span class="n">pn_transport_attachments</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span> <span class="o">=</span> <span class="n">pn_sasl</span><span class="p">(</span><span class="n">transport</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">err</span><span class="p">):</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">exc</span> <span class="o">=</span> <span class="n">EXCEPTIONS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">SASLException</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">exc</span><span class="p">(</span><span class="s2">&quot;[</span><span class="si">%s</span><span class="s2">]&quot;</span> <span class="o">%</span> <span class="p">(</span><span class="n">err</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">err</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">user</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Retrieve the authenticated user. This is usually used at the the</span>
<span class="sd"> server end to find the name of the authenticated user.</span>
<span class="sd"> If :meth:`outcome` returns a value other than :const:`OK`, then</span>
<span class="sd"> there will be no user to return. The returned value is only reliable</span>
<span class="sd"> after the ``PN_TRANSPORT_AUTHENTICATED`` event has been received.</span>
<span class="sd"> :rtype: * If the SASL layer was not negotiated then ``0`` is returned.</span>
<span class="sd"> * If the ``ANONYMOUS`` mechanism is used then the user will be</span>
<span class="sd"> ``&quot;anonymous&quot;``.</span>
<span class="sd"> * Otherwise a string containing the user is</span>
<span class="sd"> returned.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_sasl_get_user</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">mech</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Return the selected SASL mechanism.</span>
<span class="sd"> The returned value is only reliable after the ``PN_TRANSPORT_AUTHENTICATED``</span>
<span class="sd"> event has been received.</span>
<span class="sd"> </span>
<span class="sd"> :rtype: The authentication mechanism selected by the SASL layer.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_sasl_get_mech</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">outcome</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Retrieve the outcome of SASL negotiation.</span>
<span class="sd"> </span>
<span class="sd"> :rtype: * ``None`` if no negotiation has taken place.</span>
<span class="sd"> * Otherwise the outcome of the negotiation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">outcome</span> <span class="o">=</span> <span class="n">pn_sasl_outcome</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span><span class="p">)</span>
<span class="k">if</span> <span class="n">outcome</span> <span class="o">==</span> <span class="n">PN_SASL_NONE</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">outcome</span>
<div class="viewcode-block" id="SASL.allowed_mechs"><a class="viewcode-back" href="../../proton.html#proton.SASL.allowed_mechs">[docs]</a> <span class="k">def</span> <span class="nf">allowed_mechs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mechs</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> SASL mechanisms that are to be considered for authentication.</span>
<span class="sd"> This can be used on either the client or the server to restrict</span>
<span class="sd"> the SASL mechanisms that may be used to the mechanisms on the list.</span>
<span class="sd"> **NOTE:** By default the ``GSSAPI`` and ``GSS-SPNEGO`` mechanisms</span>
<span class="sd"> are not enabled for clients. This is because these mechanisms have</span>
<span class="sd"> the problematic behaviour of &#39;capturing&#39; the client whenever they</span>
<span class="sd"> are installed so that they will be used by the client if offered by</span>
<span class="sd"> the server even if the client can&#39;t successfully authenticate this</span>
<span class="sd"> way. This can lead to some very hard to debug failures.</span>
<span class="sd"> **NOTE:** The ``GSSAPI`` or ``GSS-SPNEGO`` mechanisms need to be</span>
<span class="sd"> explicitly enabled if they are required (together with any other</span>
<span class="sd"> required mechanisms).</span>
<span class="sd"> :param mechs: A list of mechanisms that are allowed for authentication,</span>
<span class="sd"> either a string containing a space-separated list of mechs</span>
<span class="sd"> ``&quot;mech1 mech2 ...&quot;``, or a Python list of strings</span>
<span class="sd"> ``[&quot;mech1&quot;, &quot;mech2&quot;, ...]``.</span>
<span class="sd"> :type mechs: string</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">mechs</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
<span class="n">mechs</span> <span class="o">=</span> <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">mechs</span><span class="p">)</span>
<span class="n">pn_sasl_allowed_mechs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span><span class="p">,</span> <span class="n">unicode2utf8</span><span class="p">(</span><span class="n">mechs</span><span class="p">))</span></div>
<span class="k">def</span> <span class="nf">_get_allow_insecure_mechs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="n">pn_sasl_get_allow_insecure_mechs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">_set_allow_insecure_mechs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">insecure</span><span class="p">):</span>
<span class="n">pn_sasl_set_allow_insecure_mechs</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span><span class="p">,</span> <span class="n">insecure</span><span class="p">)</span>
<span class="n">allow_insecure_mechs</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_allow_insecure_mechs</span><span class="p">,</span> <span class="n">_set_allow_insecure_mechs</span><span class="p">,</span>
<span class="n">doc</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;</span>
<span class="s2">Allow unencrypted cleartext passwords (PLAIN mech)</span>
<span class="s2">&quot;&quot;&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="SASL.done"><a class="viewcode-back" href="../../proton.html#proton.SASL.done">[docs]</a> <span class="k">def</span> <span class="nf">done</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">outcome</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set the outcome of SASL negotiation. Used by the server to set the</span>
<span class="sd"> result of the negotiation process.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pn_sasl_done</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span><span class="p">,</span> <span class="n">outcome</span><span class="p">)</span></div>
<div class="viewcode-block" id="SASL.config_name"><a class="viewcode-back" href="../../proton.html#proton.SASL.config_name">[docs]</a> <span class="k">def</span> <span class="nf">config_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set the SASL configuration name. This is used to construct the SASL</span>
<span class="sd"> configuration filename. In the current implementation ``&quot;.conf&quot;`` is</span>
<span class="sd"> added to the name and the file is looked for in the configuration</span>
<span class="sd"> directory.</span>
<span class="sd"> If not set it will default to ``&quot;proton-server&quot;`` for a sasl server</span>
<span class="sd"> and ``&quot;proton-client&quot;`` for a client.</span>
<span class="sd"> :param name: The configuration name.</span>
<span class="sd"> :type name: string</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pn_sasl_config_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span></div>
<div class="viewcode-block" id="SASL.config_path"><a class="viewcode-back" href="../../proton.html#proton.SASL.config_path">[docs]</a> <span class="k">def</span> <span class="nf">config_path</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">path</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set the SASL configuration path. This is used to tell SASL where</span>
<span class="sd"> to look for the configuration file. In the current implementation</span>
<span class="sd"> it can be a colon separated list of directories.</span>
<span class="sd"> The environment variable ``PN_SASL_CONFIG_PATH`` can also be used</span>
<span class="sd"> to set this path, but if both methods are used then this</span>
<span class="sd"> :meth:`config_path` will take precedence.</span>
<span class="sd"> If not set, the underlying implementation default will be used.</span>
<span class="sd"> :param path: The configuration path, may contain colon-separated list</span>
<span class="sd"> if more than one path is specified.</span>
<span class="sd"> :type path: string</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">pn_sasl_config_path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_sasl</span><span class="p">,</span> <span class="n">path</span><span class="p">)</span></div></div>
<div class="viewcode-block" id="SSLDomain"><a class="viewcode-back" href="../../proton.html#proton.SSLDomain">[docs]</a><span class="k">class</span> <span class="nc">SSLDomain</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An SSL configuration domain, used to hold the SSL configuration</span>
<span class="sd"> for one or more SSL sessions.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">MODE_CLIENT</span> <span class="o">=</span> <span class="n">PN_SSL_MODE_CLIENT</span>
<span class="sd">&quot;&quot;&quot;Local connection endpoint is an SSL client.&quot;&quot;&quot;</span>
<span class="n">MODE_SERVER</span> <span class="o">=</span> <span class="n">PN_SSL_MODE_SERVER</span>
<span class="sd">&quot;&quot;&quot;Local connection endpoint is an SSL server.&quot;&quot;&quot;</span>
<span class="n">VERIFY_PEER</span> <span class="o">=</span> <span class="n">PN_SSL_VERIFY_PEER</span>
<span class="sd">&quot;&quot;&quot;Require peer to provide a valid identifying certificate.&quot;&quot;&quot;</span>
<span class="n">VERIFY_PEER_NAME</span> <span class="o">=</span> <span class="n">PN_SSL_VERIFY_PEER_NAME</span>
<span class="sd">&quot;&quot;&quot;Require valid certificate and matching name.&quot;&quot;&quot;</span>
<span class="n">ANONYMOUS_PEER</span> <span class="o">=</span> <span class="n">PN_SSL_ANONYMOUS_PEER</span>
<span class="sd">&quot;&quot;&quot;Do not require a certificate nor cipher authorization.&quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_domain</span> <span class="o">=</span> <span class="n">pn_ssl_domain</span><span class="p">(</span><span class="n">mode</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_domain</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">SSLUnavailable</span><span class="p">()</span>
<span class="k">def</span> <span class="nf">_check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">err</span><span class="p">):</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">exc</span> <span class="o">=</span> <span class="n">EXCEPTIONS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">SSLException</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">exc</span><span class="p">(</span><span class="s2">&quot;SSL failure.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">err</span>
<div class="viewcode-block" id="SSLDomain.set_credentials"><a class="viewcode-back" href="../../proton.html#proton.SSLDomain.set_credentials">[docs]</a> <span class="k">def</span> <span class="nf">set_credentials</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">cert_file</span><span class="p">,</span> <span class="n">key_file</span><span class="p">,</span> <span class="n">password</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Set the certificate that identifies the local node to the remote.</span>
<span class="sd"> This certificate establishes the identity for the local node for all :class:`SSL` sessions</span>
<span class="sd"> created from this domain. It will be sent to the remote if the remote needs to verify</span>
<span class="sd"> the identity of this node. This may be used for both SSL servers and SSL clients (if</span>
<span class="sd"> client authentication is required by the server).</span>
<span class="sd"> .. note:: This setting effects only those :class:`SSL` objects created after this call</span>
<span class="sd"> returns. :class:`SSL` objects created before invoking this method will use the domain&#39;s</span>
<span class="sd"> previous setting.</span>
<span class="sd"> :param cert_file: Specifier for the file/database containing the identifying</span>
<span class="sd"> certificate. For Openssl users, this is a PEM file. For Windows SChannel</span>
<span class="sd"> users, this is the PKCS#12 file or system store.</span>
<span class="sd"> :type cert_file: ``str``</span>
<span class="sd"> :param key_file: An optional key to access the identifying certificate. For</span>
<span class="sd"> Openssl users, this is an optional PEM file containing the private key</span>
<span class="sd"> used to sign the certificate. For Windows SChannel users, this is the</span>
<span class="sd"> friendly name of the self-identifying certificate if there are multiple</span>
<span class="sd"> certificates in the store.</span>
<span class="sd"> :type key_file: ``str``</span>
<span class="sd"> :param password: The password used to sign the key, else ``None`` if key is not</span>
<span class="sd"> protected.</span>
<span class="sd"> :type password: ``str`` or ``None``</span>
<span class="sd"> :return: 0 on success</span>
<span class="sd"> :rtype: ``int``</span>
<span class="sd"> :raise: :exc:`SSLException` if there is any Proton error</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">pn_ssl_domain_set_credentials</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_domain</span><span class="p">,</span>
<span class="n">cert_file</span><span class="p">,</span> <span class="n">key_file</span><span class="p">,</span>
<span class="n">password</span><span class="p">))</span></div>
<div class="viewcode-block" id="SSLDomain.set_trusted_ca_db"><a class="viewcode-back" href="../../proton.html#proton.SSLDomain.set_trusted_ca_db">[docs]</a> <span class="k">def</span> <span class="nf">set_trusted_ca_db</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certificate_db</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Configure the set of trusted CA certificates used by this domain to verify peers.</span>
<span class="sd"> If the local SSL client/server needs to verify the identity of the remote, it must</span>
<span class="sd"> validate the signature of the remote&#39;s certificate. This function sets the database of</span>
<span class="sd"> trusted CAs that will be used to verify the signature of the remote&#39;s certificate.</span>
<span class="sd"> .. note:: This setting effects only those :class:`SSL` objects created after this call</span>
<span class="sd"> returns. :class:`SSL` objects created before invoking this method will use the domain&#39;s</span>
<span class="sd"> previous setting.</span>
<span class="sd"> .. note:: By default the list of trusted CA certificates will be set to the system default.</span>
<span class="sd"> What this is is depends on the OS and the SSL implementation used: For OpenSSL the default</span>
<span class="sd"> will depend on how the OS is set up. When using the Windows SChannel implementation the default</span>
<span class="sd"> will be the users default trusted certificate store.</span>
<span class="sd"> :param certificate_db: Database of trusted CAs, used to authenticate the peer.</span>
<span class="sd"> :type certificate_db: ``str``</span>
<span class="sd"> :return: 0 on success</span>
<span class="sd"> :rtype: ``int``</span>
<span class="sd"> :raise: :exc:`SSLException` if there is any Proton error</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">pn_ssl_domain_set_trusted_ca_db</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_domain</span><span class="p">,</span>
<span class="n">certificate_db</span><span class="p">))</span></div>
<div class="viewcode-block" id="SSLDomain.set_peer_authentication"><a class="viewcode-back" href="../../proton.html#proton.SSLDomain.set_peer_authentication">[docs]</a> <span class="k">def</span> <span class="nf">set_peer_authentication</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">verify_mode</span><span class="p">,</span> <span class="n">trusted_CAs</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> This method controls how the peer&#39;s certificate is validated, if at all. By default,</span>
<span class="sd"> neither servers nor clients attempt to verify their peers (PN_SSL_ANONYMOUS_PEER).</span>
<span class="sd"> Once certificates and trusted CAs are configured, peer verification can be enabled.</span>
<span class="sd"> .. note:: In order to verify a peer, a trusted CA must be configured. See</span>
<span class="sd"> :meth:`set_trusted_ca_db`.</span>
<span class="sd"> .. note:: Servers must provide their own certificate when verifying a peer. See</span>
<span class="sd"> :meth:`set_credentials`.</span>
<span class="sd"> .. note:: This setting effects only those :class:`SSL` objects created after this call</span>
<span class="sd"> returns. :class:`SSL` objects created before invoking this method will use the domain&#39;s</span>
<span class="sd"> previous setting.</span>
<span class="sd"> :param verify_mode: The level of validation to apply to the peer, one of :const:`VERIFY_PEER`,</span>
<span class="sd"> :const:`VERIFY_PEER_NAME`, :const:`ANONYMOUS_PEER`, </span>
<span class="sd"> :type verify_mode: ``int``</span>
<span class="sd"> :param trusted_CAs: Path to a database of trusted CAs that the server will advertise.</span>
<span class="sd"> :type trusted_CAs: ``str``</span>
<span class="sd"> :return: 0 on success</span>
<span class="sd"> :rtype: ``int``</span>
<span class="sd"> :raise: :exc:`SSLException` if there is any Proton error</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">pn_ssl_domain_set_peer_authentication</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_domain</span><span class="p">,</span>
<span class="n">verify_mode</span><span class="p">,</span>
<span class="n">trusted_CAs</span><span class="p">))</span></div>
<div class="viewcode-block" id="SSLDomain.allow_unsecured_client"><a class="viewcode-back" href="../../proton.html#proton.SSLDomain.allow_unsecured_client">[docs]</a> <span class="k">def</span> <span class="nf">allow_unsecured_client</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Permit a server to accept connection requests from non-SSL clients.</span>
<span class="sd"> This configures the server to &quot;sniff&quot; the incoming client data stream,</span>
<span class="sd"> and dynamically determine whether SSL/TLS is being used. This option</span>
<span class="sd"> is disabled by default: only clients using SSL/TLS are accepted.</span>
<span class="sd"> :raise: :exc:`SSLException` if there is any Proton error</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">pn_ssl_domain_allow_unsecured_client</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_domain</span><span class="p">))</span></div>
<span class="k">def</span> <span class="fm">__del__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">pn_ssl_domain_free</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_domain</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSL"><a class="viewcode-back" href="../../proton.html#proton.SSL">[docs]</a><span class="k">class</span> <span class="nc">SSL</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> An SSL session associated with a transport. A transport must have</span>
<span class="sd"> an SSL object in order to &quot;speak&quot; SSL over its connection. </span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="SSL.present"><a class="viewcode-back" href="../../proton.html#proton.SSL.present">[docs]</a> <span class="nd">@staticmethod</span>
<span class="k">def</span> <span class="nf">present</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Tests for an SSL implementation being present.</span>
<span class="sd"> :return: ``True`` if we support SSL, ``False`` if not.</span>
<span class="sd"> :rtype: ``bool``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_ssl_present</span><span class="p">()</span></div>
<span class="k">def</span> <span class="nf">_check</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">err</span><span class="p">):</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">exc</span> <span class="o">=</span> <span class="n">EXCEPTIONS</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">err</span><span class="p">,</span> <span class="n">SSLException</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">exc</span><span class="p">(</span><span class="s2">&quot;SSL failure.&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="n">err</span>
<span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">transport</span><span class="p">,</span> <span class="n">domain</span><span class="p">,</span> <span class="n">session_details</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;Enforce a singleton SSL object per Transport&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">transport</span><span class="o">.</span><span class="n">_ssl</span><span class="p">:</span>
<span class="c1"># unfortunately, we&#39;ve combined the allocation and the configuration in a</span>
<span class="c1"># single step. So catch any attempt by the application to provide what</span>
<span class="c1"># may be a different configuration than the original (hack)</span>
<span class="n">ssl</span> <span class="o">=</span> <span class="n">transport</span><span class="o">.</span><span class="n">_ssl</span>
<span class="k">if</span> <span class="p">(</span><span class="n">domain</span> <span class="ow">and</span> <span class="p">(</span><span class="n">ssl</span><span class="o">.</span><span class="n">_domain</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">domain</span><span class="p">)</span> <span class="ow">or</span>
<span class="n">session_details</span> <span class="ow">and</span> <span class="p">(</span><span class="n">ssl</span><span class="o">.</span><span class="n">_session_details</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">session_details</span><span class="p">)):</span>
<span class="k">raise</span> <span class="n">SSLException</span><span class="p">(</span><span class="s2">&quot;Cannot re-configure existing SSL object!&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">obj</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">SSL</span><span class="p">,</span> <span class="bp">cls</span><span class="p">)</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="bp">cls</span><span class="p">)</span>
<span class="n">obj</span><span class="o">.</span><span class="n">_domain</span> <span class="o">=</span> <span class="n">domain</span>
<span class="n">obj</span><span class="o">.</span><span class="n">_session_details</span> <span class="o">=</span> <span class="n">session_details</span>
<span class="n">session_id</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">session_details</span><span class="p">:</span>
<span class="n">session_id</span> <span class="o">=</span> <span class="n">session_details</span><span class="o">.</span><span class="n">get_session_id</span><span class="p">()</span>
<span class="n">obj</span><span class="o">.</span><span class="n">_ssl</span> <span class="o">=</span> <span class="n">pn_ssl</span><span class="p">(</span><span class="n">transport</span><span class="o">.</span><span class="n">_impl</span><span class="p">)</span>
<span class="k">if</span> <span class="n">obj</span><span class="o">.</span><span class="n">_ssl</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">SSLUnavailable</span><span class="p">()</span>
<span class="k">if</span> <span class="n">domain</span><span class="p">:</span>
<span class="n">pn_ssl_init</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">_ssl</span><span class="p">,</span> <span class="n">domain</span><span class="o">.</span><span class="n">_domain</span><span class="p">,</span> <span class="n">session_id</span><span class="p">)</span>
<span class="n">transport</span><span class="o">.</span><span class="n">_ssl</span> <span class="o">=</span> <span class="n">obj</span>
<span class="k">return</span> <span class="n">transport</span><span class="o">.</span><span class="n">_ssl</span>
<div class="viewcode-block" id="SSL.cipher_name"><a class="viewcode-back" href="../../proton.html#proton.SSL.cipher_name">[docs]</a> <span class="k">def</span> <span class="nf">cipher_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the name of the Cipher that is currently in use.</span>
<span class="sd"> Gets a text description of the cipher that is currently active, or</span>
<span class="sd"> returns ``None`` if SSL is not active (no cipher).</span>
<span class="sd"> .. note:: The cipher in use may change over time due to renegotiation</span>
<span class="sd"> or other changes to the SSL state.</span>
<span class="sd"> :return: The cypher name, or ``None`` if no cipher in use.</span>
<span class="sd"> :rtype: ``str`` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">rc</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="n">pn_ssl_get_cipher_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span><span class="p">,</span> <span class="mi">128</span><span class="p">)</span>
<span class="k">if</span> <span class="n">rc</span><span class="p">:</span>
<span class="k">return</span> <span class="n">name</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="SSL.protocol_name"><a class="viewcode-back" href="../../proton.html#proton.SSL.protocol_name">[docs]</a> <span class="k">def</span> <span class="nf">protocol_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the name of the SSL protocol that is currently in use.</span>
<span class="sd"> Gets a text description of the SSL protocol that is currently active,</span>
<span class="sd"> or returns ``None`` if SSL is not active.</span>
<span class="sd"> .. note:: The protocol may change over time due to renegotiation.</span>
<span class="sd"> :return: The protocol name if SSL is active, or ``None`` if SSL connection</span>
<span class="sd"> is not ready or active.</span>
<span class="sd"> :rtype: ``str`` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">rc</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="n">pn_ssl_get_protocol_name</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span><span class="p">,</span> <span class="mi">128</span><span class="p">)</span>
<span class="k">if</span> <span class="n">rc</span><span class="p">:</span>
<span class="k">return</span> <span class="n">name</span>
<span class="k">return</span> <span class="kc">None</span></div>
<span class="n">SHA1</span> <span class="o">=</span> <span class="n">PN_SSL_SHA1</span>
<span class="sd">&quot;&quot;&quot;Produces hash that is 20 bytes long using SHA-1&quot;&quot;&quot;</span>
<span class="n">SHA256</span> <span class="o">=</span> <span class="n">PN_SSL_SHA256</span>
<span class="sd">&quot;&quot;&quot;Produces hash that is 32 bytes long using SHA-256&quot;&quot;&quot;</span>
<span class="n">SHA512</span> <span class="o">=</span> <span class="n">PN_SSL_SHA512</span>
<span class="sd">&quot;&quot;&quot;Produces hash that is 64 bytes long using SHA-512&quot;&quot;&quot;</span>
<span class="n">MD5</span> <span class="o">=</span> <span class="n">PN_SSL_MD5</span>
<span class="sd">&quot;&quot;&quot;Produces hash that is 16 bytes long using MD5&quot;&quot;&quot;</span>
<span class="n">CERT_COUNTRY_NAME</span> <span class="o">=</span> <span class="n">PN_SSL_CERT_SUBJECT_COUNTRY_NAME</span>
<span class="sd">&quot;&quot;&quot;Certificate country name 2-char ISO code&quot;&quot;&quot;</span>
<span class="n">CERT_STATE_OR_PROVINCE</span> <span class="o">=</span> <span class="n">PN_SSL_CERT_SUBJECT_STATE_OR_PROVINCE</span>
<span class="sd">&quot;&quot;&quot;Certificate state or province, not abbreviated&quot;&quot;&quot;</span>
<span class="n">CERT_CITY_OR_LOCALITY</span> <span class="o">=</span> <span class="n">PN_SSL_CERT_SUBJECT_CITY_OR_LOCALITY</span>
<span class="sd">&quot;&quot;&quot;Certificate city or place name, not abbreviated&quot;&quot;&quot;</span>
<span class="n">CERT_ORGANIZATION_NAME</span> <span class="o">=</span> <span class="n">PN_SSL_CERT_SUBJECT_ORGANIZATION_NAME</span>
<span class="sd">&quot;&quot;&quot;Certificate organization name&quot;&quot;&quot;</span>
<span class="n">CERT_ORGANIZATION_UNIT</span> <span class="o">=</span> <span class="n">PN_SSL_CERT_SUBJECT_ORGANIZATION_UNIT</span>
<span class="sd">&quot;&quot;&quot;Certificate organization unit or division within organization&quot;&quot;&quot;</span>
<span class="n">CERT_COMMON_NAME</span> <span class="o">=</span> <span class="n">PN_SSL_CERT_SUBJECT_COMMON_NAME</span>
<span class="sd">&quot;&quot;&quot;Certificate common name or URL&quot;&quot;&quot;</span>
<div class="viewcode-block" id="SSL.get_cert_subject_subfield"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_subject_subfield">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_subject_subfield</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subfield_name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Returns a string that contains the value of the sub field of</span>
<span class="sd"> the subject field in the ssl certificate. The subject field</span>
<span class="sd"> usually contains the following values:</span>
<span class="sd"> * :const:`CERT_COUNTRY_NAME`</span>
<span class="sd"> * :const:`CERT_STATE_OR_PROVINCE` </span>
<span class="sd"> * :const:`CERT_CITY_OR_LOCALITY`</span>
<span class="sd"> * :const:`CERT_ORGANIZATION_NAME`</span>
<span class="sd"> * :const:`CERT_ORGANIZATION_UNIT`</span>
<span class="sd"> * :const:`CERT_COMMON_NAME` </span>
<span class="sd"> :param subfield_name: The enumeration representing the required</span>
<span class="sd"> sub field listed above</span>
<span class="sd"> :type subfield_name: ``int``</span>
<span class="sd"> :return: A string which contains the requested sub field value which</span>
<span class="sd"> is valid until the ssl object is destroyed.</span>
<span class="sd"> :rtype: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">subfield_value</span> <span class="o">=</span> <span class="n">pn_ssl_get_remote_subject_subfield</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span><span class="p">,</span> <span class="n">subfield_name</span><span class="p">)</span>
<span class="k">return</span> <span class="n">subfield_value</span></div>
<div class="viewcode-block" id="SSL.get_cert_subject"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_subject">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_subject</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the subject from the peer&#39;s certificate.</span>
<span class="sd"> :return: A string containing the full subject.</span>
<span class="sd"> :rtype: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">subject</span> <span class="o">=</span> <span class="n">pn_ssl_get_remote_subject</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span><span class="p">)</span>
<span class="k">return</span> <span class="n">subject</span></div>
<span class="k">def</span> <span class="nf">_get_cert_subject_unknown_subfield</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># Pass in an unhandled enum</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_subject_subfield</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
<span class="c1"># Convenience functions for obtaining the subfields of the subject field.</span>
<div class="viewcode-block" id="SSL.get_cert_common_name"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_common_name">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_common_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method to get a string that contains the :const:`CERT_COMMON_NAME`</span>
<span class="sd"> sub field of the subject field in the ssl certificate.</span>
<span class="sd"> </span>
<span class="sd"> :return: A string containing the :const:`CERT_COMMON_NAME` sub field.</span>
<span class="sd"> :rtype: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_subject_subfield</span><span class="p">(</span><span class="n">SSL</span><span class="o">.</span><span class="n">CERT_COMMON_NAME</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSL.get_cert_organization"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_organization">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_organization</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method to get a string that contains the :const:`CERT_ORGANIZATION_NAME`</span>
<span class="sd"> sub field of the subject field in the ssl certificate.</span>
<span class="sd"> </span>
<span class="sd"> :return: A string containing the :const:`CERT_ORGANIZATION_NAME` sub field.</span>
<span class="sd"> :rtype: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_subject_subfield</span><span class="p">(</span><span class="n">SSL</span><span class="o">.</span><span class="n">CERT_ORGANIZATION_NAME</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSL.get_cert_organization_unit"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_organization_unit">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_organization_unit</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method to get a string that contains the :const:`CERT_ORGANIZATION_UNIT`</span>
<span class="sd"> sub field of the subject field in the ssl certificate.</span>
<span class="sd"> </span>
<span class="sd"> :return: A string containing the :const:`CERT_ORGANIZATION_UNIT` sub field.</span>
<span class="sd"> :rtype: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_subject_subfield</span><span class="p">(</span><span class="n">SSL</span><span class="o">.</span><span class="n">CERT_ORGANIZATION_UNIT</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSL.get_cert_locality_or_city"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_locality_or_city">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_locality_or_city</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method to get a string that contains the :const:`CERT_CITY_OR_LOCALITY`</span>
<span class="sd"> sub field of the subject field in the ssl certificate.</span>
<span class="sd"> </span>
<span class="sd"> :return: A string containing the :const:`CERT_CITY_OR_LOCALITY` sub field.</span>
<span class="sd"> :rtype: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_subject_subfield</span><span class="p">(</span><span class="n">SSL</span><span class="o">.</span><span class="n">CERT_CITY_OR_LOCALITY</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSL.get_cert_country"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_country">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_country</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method to get a string that contains the :const:`CERT_COUNTRY_NAME`</span>
<span class="sd"> sub field of the subject field in the ssl certificate.</span>
<span class="sd"> </span>
<span class="sd"> :return: A string containing the :const:`CERT_COUNTRY_NAME` sub field.</span>
<span class="sd"> :rtype: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_subject_subfield</span><span class="p">(</span><span class="n">SSL</span><span class="o">.</span><span class="n">CERT_COUNTRY_NAME</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSL.get_cert_state_or_province"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_state_or_province">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_state_or_province</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method to get a string that contains the :const:`CERT_STATE_OR_PROVINCE`</span>
<span class="sd"> sub field of the subject field in the ssl certificate.</span>
<span class="sd"> </span>
<span class="sd"> :return: A string containing the :const:`CERT_STATE_OR_PROVINCE` sub field.</span>
<span class="sd"> :rtype: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_subject_subfield</span><span class="p">(</span><span class="n">SSL</span><span class="o">.</span><span class="n">CERT_STATE_OR_PROVINCE</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSL.get_cert_fingerprint"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_fingerprint">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_fingerprint</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">fingerprint_length</span><span class="p">,</span> <span class="n">digest_name</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the fingerprint of the certificate. The certificate fingerprint</span>
<span class="sd"> (as displayed in the Fingerprints section when looking at a certificate</span>
<span class="sd"> with say the Firefox browser) is the hexadecimal hash of the entire</span>
<span class="sd"> certificate. The fingerprint is not part of the certificate, rather</span>
<span class="sd"> it is computed from the certificate and can be used to uniquely identify</span>
<span class="sd"> a certificate.</span>
<span class="sd"> :param fingerprint_length: Must be :math:`&gt;= 33` for md5, :math:`&gt;= 41`</span>
<span class="sd"> for sha1, :math:`&gt;= 65` for sha256 and :math:`&gt;= 129`</span>
<span class="sd"> for sha512.</span>
<span class="sd"> :type fingerprint_length: ``int``</span>
<span class="sd"> :param digest_name: The hash algorithm to use. Must be one of :const:`SHA1`,</span>
<span class="sd"> :const:`SHA256`, :const:`SHA512`, :const:`MD5`.</span>
<span class="sd"> :type digest_name: ``str``</span>
<span class="sd"> :return: Hex fingerprint in a string, or ``None`` if an error occurred.</span>
<span class="sd"> :rtype: ``str`` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">rc</span><span class="p">,</span> <span class="n">fingerprint_str</span> <span class="o">=</span> <span class="n">pn_ssl_get_cert_fingerprint</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span><span class="p">,</span> <span class="n">fingerprint_length</span><span class="p">,</span> <span class="n">digest_name</span><span class="p">)</span>
<span class="k">if</span> <span class="n">rc</span> <span class="o">==</span> <span class="n">PN_OK</span><span class="p">:</span>
<span class="k">return</span> <span class="n">fingerprint_str</span>
<span class="k">return</span> <span class="kc">None</span></div>
<span class="c1"># Convenience functions for obtaining fingerprint for specific hashing algorithms</span>
<span class="k">def</span> <span class="nf">_get_cert_fingerprint_unknown_hash_alg</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_fingerprint</span><span class="p">(</span><span class="mi">41</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
<div class="viewcode-block" id="SSL.get_cert_fingerprint_sha1"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_fingerprint_sha1">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_fingerprint_sha1</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method to get the :const:`SHA1` fingerprint of the</span>
<span class="sd"> certificate.</span>
<span class="sd"> </span>
<span class="sd"> :return: Hex fingerprint in a string, or ``None`` if an error occurred.</span>
<span class="sd"> :rtype: ``str`` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_fingerprint</span><span class="p">(</span><span class="mi">41</span><span class="p">,</span> <span class="n">SSL</span><span class="o">.</span><span class="n">SHA1</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSL.get_cert_fingerprint_sha256"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_fingerprint_sha256">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_fingerprint_sha256</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method to get the :const:`SHA256` fingerprint of the</span>
<span class="sd"> certificate.</span>
<span class="sd"> </span>
<span class="sd"> :return: Hex fingerprint in a string, or ``None`` if an error occurred.</span>
<span class="sd"> :rtype: ``str`` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># sha256 produces a fingerprint that is 64 characters long</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_fingerprint</span><span class="p">(</span><span class="mi">65</span><span class="p">,</span> <span class="n">SSL</span><span class="o">.</span><span class="n">SHA256</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSL.get_cert_fingerprint_sha512"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_fingerprint_sha512">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_fingerprint_sha512</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method to get the :const:`SHA512` fingerprint of the</span>
<span class="sd"> certificate.</span>
<span class="sd"> </span>
<span class="sd"> :return: Hex fingerprint in a string, or ``None`` if an error occurred.</span>
<span class="sd"> :rtype: ``str`` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># sha512 produces a fingerprint that is 128 characters long</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_fingerprint</span><span class="p">(</span><span class="mi">129</span><span class="p">,</span> <span class="n">SSL</span><span class="o">.</span><span class="n">SHA512</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSL.get_cert_fingerprint_md5"><a class="viewcode-back" href="../../proton.html#proton.SSL.get_cert_fingerprint_md5">[docs]</a> <span class="k">def</span> <span class="nf">get_cert_fingerprint_md5</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> A convenience method to get the :const:`MD5` fingerprint of the</span>
<span class="sd"> certificate.</span>
<span class="sd"> </span>
<span class="sd"> :return: Hex fingerprint in a string, or ``None`` if an error occurred.</span>
<span class="sd"> :rtype: ``str`` or ``None``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_cert_fingerprint</span><span class="p">(</span><span class="mi">33</span><span class="p">,</span> <span class="n">SSL</span><span class="o">.</span><span class="n">MD5</span><span class="p">)</span></div>
<span class="nd">@property</span>
<span class="k">def</span> <span class="nf">remote_subject</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> The subject from the peers certificate.</span>
<span class="sd"> :type: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_ssl_get_remote_subject</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span><span class="p">)</span>
<span class="n">RESUME_UNKNOWN</span> <span class="o">=</span> <span class="n">PN_SSL_RESUME_UNKNOWN</span>
<span class="sd">&quot;&quot;&quot;Session resume state unknown/not supported.&quot;&quot;&quot;</span>
<span class="n">RESUME_NEW</span> <span class="o">=</span> <span class="n">PN_SSL_RESUME_NEW</span>
<span class="sd">&quot;&quot;&quot;Session renegotiated - not resumed.&quot;&quot;&quot;</span>
<span class="n">RESUME_REUSED</span> <span class="o">=</span> <span class="n">PN_SSL_RESUME_REUSED</span>
<span class="sd">&quot;&quot;&quot;Session resumed from previous session.&quot;&quot;&quot;</span>
<div class="viewcode-block" id="SSL.resume_status"><a class="viewcode-back" href="../../proton.html#proton.SSL.resume_status">[docs]</a> <span class="k">def</span> <span class="nf">resume_status</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Check whether the state has been resumed.</span>
<span class="sd"> Used for client session resume. When called on an active session,</span>
<span class="sd"> indicates whether the state has been resumed from a previous session.</span>
<span class="sd"> .. note:: This is a best-effort service - there is no guarantee that</span>
<span class="sd"> the remote server will accept the resumed parameters. The remote</span>
<span class="sd"> server may choose to ignore these parameters, and request a</span>
<span class="sd"> re-negotiation instead.</span>
<span class="sd"> :return: Status code indicating whether or not the session has been</span>
<span class="sd"> resumed. One of:</span>
<span class="sd"> * :const:`RESUME_UNKNOWN`</span>
<span class="sd"> * :const:`RESUME_NEW`</span>
<span class="sd"> * :const:`RESUME_REUSED`</span>
<span class="sd"> :rtype: ``int``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="n">pn_ssl_resume_status</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span><span class="p">)</span></div>
<span class="k">def</span> <span class="nf">_set_peer_hostname</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">hostname</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">pn_ssl_set_peer_hostname</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span><span class="p">,</span> <span class="n">unicode2utf8</span><span class="p">(</span><span class="n">hostname</span><span class="p">)))</span>
<span class="k">def</span> <span class="nf">_get_peer_hostname</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">err</span><span class="p">,</span> <span class="n">name</span> <span class="o">=</span> <span class="n">pn_ssl_get_peer_hostname</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_ssl</span><span class="p">,</span> <span class="mi">1024</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="k">return</span> <span class="n">utf82unicode</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="n">peer_hostname</span> <span class="o">=</span> <span class="nb">property</span><span class="p">(</span><span class="n">_get_peer_hostname</span><span class="p">,</span> <span class="n">_set_peer_hostname</span><span class="p">,</span> <span class="n">doc</span><span class="o">=</span><span class="s2">&quot;&quot;&quot;</span>
<span class="s2"> Manage the expected name of the remote peer.</span>
<span class="s2"> The hostname is used for two purposes:</span>
<span class="s2"> </span>
<span class="s2"> 1. when set on an SSL client, it is sent to the server during the</span>
<span class="s2"> handshake (if Server Name Indication is supported)</span>
<span class="s2"> 2. it is used to check against the identifying name provided in the</span>
<span class="s2"> peer&#39;s certificate. If the supplied name does not exactly match a</span>
<span class="s2"> SubjectAltName (type DNS name), or the CommonName entry in the</span>
<span class="s2"> peer&#39;s certificate, the peer is considered unauthenticated</span>
<span class="s2"> (potential imposter), and the SSL connection is aborted.</span>
<span class="s2"> </span>
<span class="s2"> .. note:: Verification of the hostname is only done if</span>
<span class="s2"> :const:`SSLDomain.VERIFY_PEER_NAME` is set using</span>
<span class="s2"> :meth:`SSLDomain.set_peer_authentication`.</span>
<span class="s2"> :type: ``str``</span>
<span class="s2"> &quot;&quot;&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="SSLSessionDetails"><a class="viewcode-back" href="../../proton.html#proton.SSLSessionDetails">[docs]</a><span class="k">class</span> <span class="nc">SSLSessionDetails</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Unique identifier for the SSL session. Used to resume previous</span>
<span class="sd"> session on a new SSL connection.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">session_id</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_session_id</span> <span class="o">=</span> <span class="n">session_id</span>
<div class="viewcode-block" id="SSLSessionDetails.get_session_id"><a class="viewcode-back" href="../../proton.html#proton.SSLSessionDetails.get_session_id">[docs]</a> <span class="k">def</span> <span class="nf">get_session_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Get the unique identifier for this SSL session</span>
<span class="sd"> </span>
<span class="sd"> :return: Session identifier</span>
<span class="sd"> :rtype: ``str``</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_session_id</span></div></div>
</pre></div>
<div class="clearer"></div>
</div>
</div>
</div>
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<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>
</div>
</div>
<div class="clearer"></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="nav-item nav-item-0"><a href="../../index.html">Qpid Proton Python API 0.32.0 documentation</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="../index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">proton._transport</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2019, Apache Qpid Contributors.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 3.2.1.
</div>
</body>
</html>