Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-txtorcon for openSUSE:Factory 
checked in at 2024-01-03 12:23:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-txtorcon (Old)
 and      /work/SRC/openSUSE:Factory/.python-txtorcon.new.28375 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-txtorcon"

Wed Jan  3 12:23:32 2024 rev:15 rq:1135604 version:23.11.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-txtorcon/python-txtorcon.changes  
2023-09-20 13:34:01.889053198 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-txtorcon.new.28375/python-txtorcon.changes   
    2024-01-03 12:23:34.792390100 +0100
@@ -1,0 +2,10 @@
+Fri Dec 29 09:02:35 UTC 2023 - Dirk Müller <dmuel...@suse.com>
+
+- update to 23.11.0:
+ * Fix test-failures on Python 3.12
+ * Particular GETINFO hanging
+   (ultra-long lines over 16KiB caused problems in the protocol)
+ * Use built-in `mock` only
+ * Remove `incremental`
+
+-------------------------------------------------------------------

Old:
----
  txtorcon-23.5.0.tar.gz

New:
----
  txtorcon-23.11.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-txtorcon.spec ++++++
--- /var/tmp/diff_new_pack.rnRzrE/_old  2024-01-03 12:23:35.600419632 +0100
+++ /var/tmp/diff_new_pack.rnRzrE/_new  2024-01-03 12:23:35.600419632 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           python-txtorcon
-Version:        23.5.0
+Version:        23.11.0
 Release:        0
 Summary:        Twisted-based asynchronous Tor control protocol implementation
 License:        MIT
@@ -29,7 +29,6 @@
 Requires:       python-Automat
 Requires:       python-Twisted-tls >= 15.5.0
 Requires:       python-cryptography
-Requires:       python-incremental
 Requires:       python-six
 Requires:       python-zope.interface >= 3.6.1
 BuildArch:      noarch
@@ -38,7 +37,6 @@
 BuildRequires:  %{python_module Automat}
 BuildRequires:  %{python_module Twisted-tls >= 15.5.0}
 BuildRequires:  %{python_module cryptography}
-BuildRequires:  %{python_module incremental}
 BuildRequires:  %{python_module six}
 BuildRequires:  %{python_module zope.interface >= 3.6.1}
 %python_subpackages
@@ -62,8 +60,6 @@
 %python_expand %fdupes %{buildroot}%{$python_sitelib}
 
 %check
-# https://github.com/meejah/txtorcon/issues/368
-sed -i 's:from mock:from unittest.mock:' test/*.py
 # looks more like integration tests
 # Async tests don't work with pytest gh#crossbario/autobahn-python#1235
 %{python_expand export PYTHONPATH=%{buildroot}%{$python_sitelib}

++++++ txtorcon-23.5.0.tar.gz -> txtorcon-23.11.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/Makefile 
new/txtorcon-23.11.0/Makefile
--- old/txtorcon-23.5.0/Makefile        2023-05-19 03:13:45.000000000 +0200
+++ new/txtorcon-23.11.0/Makefile       2023-11-20 08:48:37.000000000 +0100
@@ -1,6 +1,6 @@
 .PHONY: test html counts coverage sdist clean install doc integration diagrams
 default: test
-VERSION = 23.5.0
+VERSION = 23.11.0
 
 test:
        PYTHONPATH=. trial --reporter=text test
@@ -124,7 +124,7 @@
 
 
 venv:
-       virtualenv venv
+       python -m venv venv
        ./venv/bin/pip install -r requirements.txt
        ./venv/bin/pip install -r dev-requirements.txt
        @echo "created venv"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/PKG-INFO 
new/txtorcon-23.11.0/PKG-INFO
--- old/txtorcon-23.5.0/PKG-INFO        2023-05-19 03:21:31.507377600 +0200
+++ new/txtorcon-23.11.0/PKG-INFO       2023-11-20 08:48:41.153334100 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: txtorcon
-Version: 23.5.0
+Version: 23.11.0
 Summary:      Twisted-based Tor controller client, with state-tracking and     
configuration abstractions.     https://txtorcon.readthedocs.org     
https://github.com/meejah/txtorcon 
 Home-page: https://github.com/meejah/txtorcon
 Author: meejah
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/dev-requirements.txt 
new/txtorcon-23.11.0/dev-requirements.txt
--- old/txtorcon-23.5.0/dev-requirements.txt    2020-04-20 04:58:02.000000000 
+0200
+++ new/txtorcon-23.11.0/dev-requirements.txt   2023-11-20 07:11:22.000000000 
+0100
@@ -10,7 +10,6 @@
 twine
 pyflakes
 pycodestyle
-mock
 ipaddress>=1.0.16
 geoip
 readme_renderer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/docs/conf.py 
new/txtorcon-23.11.0/docs/conf.py
--- old/txtorcon-23.5.0/docs/conf.py    2022-06-17 21:32:04.000000000 +0200
+++ new/txtorcon-23.11.0/docs/conf.py   2023-08-11 09:41:38.000000000 +0200
@@ -165,7 +165,7 @@
 
 # The name for this set of Sphinx documents.  If None, it defaults to
 # "<project> v<release> documentation".
-html_title = 'timaq4ygg2iegci7.onion: txtorcon documentation'
+html_title = 'fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion: 
txtorcon documentation'
 
 # A shorter title for the navigation bar.  Default is the same as html_title.
 html_short_title = 'txtorcon docs'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/docs/guide.rst 
new/txtorcon-23.11.0/docs/guide.rst
--- old/txtorcon-23.5.0/docs/guide.rst  2020-04-20 04:58:02.000000000 +0200
+++ new/txtorcon-23.11.0/docs/guide.rst 2023-08-11 09:41:38.000000000 +0200
@@ -361,7 +361,7 @@
 registers a ``tor:`` plugin. This also implies that any Twisted-using
 program that supports configuring endpoint strings gets Tor support
 "for free". For example, passing a string like
-``tor:timaq4ygg2iegci7.onion:80`` to `clientFromString`_ will return
+``tor:fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion:80`` to 
`clientFromString`_ will return
 an endpoint that will connect to txtorcon's onion-service
 website. Note that these endpoints will use the "global to txtorcon"
 Tor instance (available from :meth:`.get_global_tor`). Thus,
@@ -428,7 +428,7 @@
   part);
    - these keys can be on disk (in the "hidden service directory");
    - or, they can be "ephemeral" (only in memory);
-- the "host name" is a hash of the public-key (e.g. 
``timaq4ygg2iegci7.onion``);
+- the "host name" is a hash of the public-key (e.g. 
``fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion``);
 - a "Descriptor" (which tells clients how to connect) must be
   published (to a "Hidden Service Directory", or HSDir);
 - a service has a list of port-mappings (public -> local):
@@ -534,7 +534,7 @@
 Factors to consider when deciding whether to use "authenticated"
 service or not:
 
- - if you want anyone with e.g. the URL http://timaq4ygg2iegci7.onion
+ - if you want anyone with e.g. the URL 
http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion
    to be able to put it in `Tor Browser Bundle
    <https://www.torproject.org/download/download.html.en>`_ and see a
    Web site, you **do not want** authentication;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/docs/installing.rst 
new/txtorcon-23.11.0/docs/installing.rst
--- old/txtorcon-23.5.0/docs/installing.rst     2018-05-31 20:59:02.000000000 
+0200
+++ new/txtorcon-23.11.0/docs/installing.rst    2023-08-11 09:41:38.000000000 
+0200
@@ -89,11 +89,11 @@
 -----------
 
 Most people will use the code from https://github.com/meejah/txtorcon
-The canonical URI is http://timaq4ygg2iegci7.onion
+The canonical URI is 
http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion
 I sign tags with my public key (:download:`meejah.asc <../meejah.asc>`)
 
 - ``git clone https://github.com/meejah/txtorcon.git``
-- ``torsocks git clone git://timaq4ygg2iegci7.onion/meejah/txtorcon.git``
+- ``torsocks git clone 
git://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/meejah/txtorcon.git``
 
 Rendered documentation for the latest release is at `txtorcon.readthedocs.org 
<https://txtorcon.readthedocs.org/en/latest/>`_.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/docs/introduction.rst 
new/txtorcon-23.11.0/docs/introduction.rst
--- old/txtorcon-23.5.0/docs/introduction.rst   2022-04-12 00:21:37.000000000 
+0200
+++ new/txtorcon-23.11.0/docs/introduction.rst  2023-08-11 09:41:38.000000000 
+0200
@@ -99,6 +99,14 @@
 .. literalinclude:: ../examples/readme.py
 
 
+.. _testimonials:
+
+Testimonials
+------------
+
+- `@thegrugq <https://twitter.com/thegrugq/status/359495805025001472>`_: "Holy 
fucking shit, the awesomeness of this project cannot be denied!" (July 2013)
+
+
 .. _known_users:
 
 Known Users
@@ -112,7 +120,7 @@
 - `foolscap <https://github.com/warner/foolscap/>`_ RPC system inspired by 
Twisted's built-in "Perspective Broker" package.
 - `bwscanner <https://github.com/TheTorProject/bwscanner>`_ next-gen bandwidth 
scanner for Tor network
 - `unmessage <https://github.com/AnemoneLabs/unmessage>`_ Privacy enhanced 
instant messenger
-- `APAF <https://github.com/globaleaks/APAF>`_ anonymous Python application 
framework
+- `GlobaLeaks <https://github.com/globaleaks/GlobaLeaks>`_ Free and open 
source software enabling anyone to easily set up and maintain a secure 
whistleblowing platform
 - `OONI <https://ooni.torproject.org/>`_ the Open Observatory of Network 
Interference
 - `exitaddr <https://github.com/arlolra/exitaddr>`_ scan Tor exit addresses
 - `txtorhttpproxy <https://github.com/david415/txtorhttpproxy>`_ simple HTTP 
proxy in Twisted
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/docs/release-checklist.rst 
new/txtorcon-23.11.0/docs/release-checklist.rst
--- old/txtorcon-23.5.0/docs/release-checklist.rst      2023-05-19 
03:20:48.000000000 +0200
+++ new/txtorcon-23.11.0/docs/release-checklist.rst     2023-08-11 
09:41:38.000000000 +0200
@@ -21,7 +21,6 @@
 * update docs/releases.rst to reflect upcoming reality
    * blindly make links to the signatures
    * update heading, date
-   * commit it all
 
 * on both signing-machine and build-machine shells:
    * export VERSION=22.0.0
@@ -74,8 +73,8 @@
 
            Releases are also available from the hidden service:
 
-              http://timaq4ygg2iegci7.onion/txtorcon-0.12.0.tar.gz
-              http://timaq4ygg2iegci7.onion/txtorcon-0.12.0.tar.gz.asc
+              
http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.12.0.tar.gz
+              
http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.12.0.tar.gz.asc
 
            Or via a "version 3" service:
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/docs/releases.rst 
new/txtorcon-23.11.0/docs/releases.rst
--- old/txtorcon-23.5.0/docs/releases.rst       2023-05-19 03:18:27.000000000 
+0200
+++ new/txtorcon-23.11.0/docs/releases.rst      2023-11-20 08:34:46.000000000 
+0100
@@ -15,8 +15,18 @@
 
 See also :ref:`api_stability`.
 
-`git main <https://github.com/meejah/txtorcon>`_ *will likely become v23.6.0*
+`git main <https://github.com/meejah/txtorcon>`_ *will likely become v24.1.0*
 
+v23.11.0
+--------
+
+November 20, 2023
+
+ * Fix test-failures on Python 3.12
+ * Particular GETINFO hanging (`#389 
<https://github.com/meejah/txtorcon/issues/389>`_)
+   (ultra-long lines over 16KiB caused problems in the protocol)
+ * Use built-in `mock` only (from `jelly <https://github.com/jelly>`_)
+ * Remove `incremental` (from `gdrosos <https://github.com/gdrosos>`_)
 
 
 v23.5.0
@@ -88,7 +98,7 @@
 
 September 10, 2019
 
- * `txtorcon-19.1.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-19.1.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/19.1.0>`_ (:download:`local-sig 
</../signatues/txtorcon-19.1.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-19.1.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v19.1.0.tar.gz>`_)
+ * `txtorcon-19.1.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-19.1.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/19.1.0>`_ (:download:`local-sig 
</../signatues/txtorcon-19.1.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-19.1.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v19.1.0.tar.gz>`_)
 
  * `TorControlProtocol.on_disconnect` is deprecated in favour of
    :func:`TorControlProtocol.when_disconnected`
@@ -107,7 +117,7 @@
 
 January 15, 2019
 
- * `txtorcon-19.0.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-19.0.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/19.0.0>`_ (:download:`local-sig 
</../signatues/txtorcon-19.0.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-19.0.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v19.0.0.tar.gz>`_)
+ * `txtorcon-19.0.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-19.0.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/19.0.0>`_ (:download:`local-sig 
</../signatues/txtorcon-19.0.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-19.0.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v19.0.0.tar.gz>`_)
  * add :func:`TorControlProtocol.when_disconnected` (will replace 
`.on_disconnect`)
  * add `detach=` kwarg to :func:`Tor.create_onion_service`
  * add `purpose=` kwarg to :func:`TorState.build_circuit`
@@ -116,14 +126,14 @@
 v18.3.0
 -------
 
- * `txtorcon-18.3.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-18.3.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/18.3.0>`_ (:download:`local-sig 
</../signatues/txtorcon-18.3.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.3.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.3.0.tar.gz>`_)
+ * `txtorcon-18.3.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-18.3.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/18.3.0>`_ (:download:`local-sig 
</../signatues/txtorcon-18.3.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.3.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.3.0.tar.gz>`_)
  * add `singleHop={true,false}` for endpoint-strings as well
 
 
 v18.2.0
 -------
 
- * `txtorcon-18.2.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-18.2.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/18.2.0>`_ (:download:`local-sig 
</../signatues/txtorcon-18.2.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.2.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.2.0.tar.gz>`_)
+ * `txtorcon-18.2.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-18.2.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/18.2.0>`_ (:download:`local-sig 
</../signatues/txtorcon-18.2.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.2.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.2.0.tar.gz>`_)
  * add `privateKeyFile=` option to endpoint parser (ticket 313)
  * use `privateKey=` option properly in endpoint parser
  * support `NonAnonymous` mode for `ADD_ONION` via `single_hop=` kwarg
@@ -134,7 +144,7 @@
 
 September 26, 2018
 
- * `txtorcon-18.1.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-18.1.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/18.1.0>`_ (:download:`local-sig 
</../signatues/txtorcon-18.1.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.1.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.1.0.tar.gz>`_)
+ * `txtorcon-18.1.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-18.1.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/18.1.0>`_ (:download:`local-sig 
</../signatues/txtorcon-18.1.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.1.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.1.0.tar.gz>`_)
  * better error-reporting (include REASON and REMOTE_REASON if
    available) when circuit-builds fail (thanks `David Stainton
    <https://github.com/david415>`_)
@@ -153,7 +163,7 @@
 
 July 2, 2018
 
- * `txtorcon-18.0.2.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-18.0.2.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/18.0.2>`_ (:download:`local-sig 
</../signatues/txtorcon-18.0.2.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.0.2.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.0.2.tar.gz>`_)
+ * `txtorcon-18.0.2.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-18.0.2.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/18.0.2>`_ (:download:`local-sig 
</../signatues/txtorcon-18.0.2.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.0.2.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.0.2.tar.gz>`_)
  * Python3.4 doesn't support async-def or await
 
 
@@ -162,7 +172,7 @@
 
 June 30, 2018
 
- * `txtorcon-18.0.1.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-18.0.1.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/18.0.1>`_ (:download:`local-sig 
</../signatues/txtorcon-18.0.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.0.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.0.1.tar.gz>`_)
+ * `txtorcon-18.0.1.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-18.0.1.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/18.0.1>`_ (:download:`local-sig 
</../signatues/txtorcon-18.0.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.0.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.0.1.tar.gz>`_)
  * fix a Python2/3 regression when parsing onion services
 
 
@@ -171,7 +181,7 @@
 
 June 21, 2018
 
- * `txtorcon-18.0.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-18.0.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/18.0.0>`_ (:download:`local-sig 
</../signatues/txtorcon-18.0.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.0.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.0.0.tar.gz>`_)
+ * `txtorcon-18.0.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-18.0.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/18.0.0>`_ (:download:`local-sig 
</../signatues/txtorcon-18.0.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-18.0.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v18.0.0.tar.gz>`_)
 
  * `await_all_uploads` options when creating Onions
  * properly re-map progress percentages (including descriptor uploads)
@@ -245,7 +255,7 @@
 
 February 22, 2018
 
- * `txtorcon-0.20.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.20.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.20.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.20.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.20.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.20.0.tar.gz>`_)
+ * `txtorcon-0.20.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.20.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.20.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.20.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.20.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.20.0.tar.gz>`_)
 
  * doc fixes from `hotelzululima <https://twitter.com/hotelzululima>`_
  * fix endpoints so `.connect` on them works properly more than once
@@ -266,7 +276,7 @@
 
 May 24, 2017
 
- * `txtorcon-0.19.3.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.19.3.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.19.3>`_ (:download:`local-sig 
</../signatues/txtorcon-0.19.3.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.3.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.19.3.tar.gz>`_)
+ * `txtorcon-0.19.3.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.19.3.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.3>`_ (:download:`local-sig 
</../signatues/txtorcon-0.19.3.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.3.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.19.3.tar.gz>`_)
 
  * Incorrect parsing of SocksPort options (see `Issue 237 
<https://github.com/meejah/txtorcon/issues/237>`_)
 
@@ -276,7 +286,7 @@
 
 May 11, 2017
 
- * `txtorcon-0.19.2.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.19.2.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.19.2>`_ (:download:`local-sig 
</../signatues/txtorcon-0.19.2.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.2.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.19.2.tar.gz>`_)
+ * `txtorcon-0.19.2.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.19.2.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.2>`_ (:download:`local-sig 
</../signatues/txtorcon-0.19.2.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.2.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.19.2.tar.gz>`_)
 
  * Work around a bug in `incremental` (see `Issue 233 
<https://github.com/meejah/txtorcon/issues/233>`_)
  * Fix for `Issue 190 <https://github.com/meejah/txtorcon/issues/190>`_ from 
Felipe Dau.
@@ -288,7 +298,7 @@
 
 April 26, 2017
 
- * `txtorcon-0.19.1.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.19.1.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.19.1>`_ (:download:`local-sig 
</../signatues/txtorcon-0.19.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.19.1.tar.gz>`_)
+ * `txtorcon-0.19.1.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.19.1.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.1>`_ (:download:`local-sig 
</../signatues/txtorcon-0.19.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.19.1.tar.gz>`_)
 
  * Fix a regression in ``launch_tor``, see `Issue 227 
<https://github.com/meejah/txtorcon/issues/227>`_
 
@@ -298,7 +308,7 @@
 
 April 20, 2017
 
- * `txtorcon-0.19.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.19.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.19.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.19.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.19.0.tar.gz>`_)
+ * `txtorcon-0.19.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.19.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.19.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.19.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.19.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.19.0.tar.gz>`_)
 
  * Full Python3 support
  * Drop `txsocksx` and use a custom implementation (this also
@@ -342,7 +352,7 @@
 
 January 11, 2017
 
- * `txtorcon-0.18.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.18.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.18.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.18.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.18.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.18.0.tar.gz>`_)
+ * `txtorcon-0.18.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.18.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.18.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.18.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.18.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.18.0.tar.gz>`_)
  * `issue 200 <https://github.com/meejah/txtorcon/issues/200>`_: better 
feedback if the cookie data can't be read
 
 
@@ -351,7 +361,7 @@
 
 *October 4, 2016*
 
- * `txtorcon-0.17.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.17.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.17.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.17.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.17.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.17.0.tar.gz>`_)
+ * `txtorcon-0.17.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.17.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.17.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.17.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.17.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.17.0.tar.gz>`_)
  * `issue 187 <https://github.com/meejah/txtorcon/issues/187>`_: fix 
unix-socket control endpoints
  * sometimes mapping streams to hostnames wasn't working properly
  * backwards-compatibility API for `socks_hostname` was incorrectly named
@@ -362,7 +372,7 @@
 
 *August 31, 2016*
 
- * `txtorcon-0.16.1.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.16.1.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.16.1>`_ (:download:`local-sig 
</../signatues/txtorcon-0.16.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.16.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.16.1.tar.gz>`_)
+ * `txtorcon-0.16.1.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.16.1.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.16.1>`_ (:download:`local-sig 
</../signatues/txtorcon-0.16.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.16.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.16.1.tar.gz>`_)
  * `issue 172 <https://github.com/meejah/txtorcon/issues/172>`_: give 
`TorProcessProtocol` a `.quit` method
  * `issue 181 <https://github.com/meejah/txtorcon/issues/181>`_: enable 
SOCKS5-over-unix-sockets for TorClientEndpoint (thanks to `david415 
<https://github.com/david415>`_
 
@@ -376,7 +386,7 @@
 v0.15.1
 -------
 
- * `txtorcon-0.15.1.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.15.1.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.15.1>`_ (:download:`local-sig 
</../signatues/txtorcon-0.15.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.15.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.15.1.tar.gz>`_)
+ * `txtorcon-0.15.1.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.15.1.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.15.1>`_ (:download:`local-sig 
</../signatues/txtorcon-0.15.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.15.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.15.1.tar.gz>`_)
  * fix `issue 179 <https://github.com/meejah/txtorcon/issues/179>`_ with 
`Circuit.age`.
 
 
@@ -385,7 +395,7 @@
 
 *July 26, 2016*
 
- * `txtorcon-0.15.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.15.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.15.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.15.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.15.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.15.0.tar.gz>`_)
+ * `txtorcon-0.15.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.15.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.15.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.15.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.15.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.15.0.tar.gz>`_)
  * added support for NULL control-port-authentication which is often
    appropriate when used with a UNIX domain socket
  * switched to `ipaddress
@@ -422,7 +432,7 @@
 
 *December 2, 2015*
 
- * `txtorcon-0.14.2.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.14.2.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.14.2>`_ (:download:`local-sig 
</../signatues/txtorcon-0.14.2.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.14.2.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.14.2.tar.gz>`_)
+ * `txtorcon-0.14.2.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.14.2.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.14.2>`_ (:download:`local-sig 
</../signatues/txtorcon-0.14.2.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.14.2.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.14.2.tar.gz>`_)
  * compatibility for Twisted 15.5.0 (released on 0.14.x for `OONI 
<http://ooni.io/>`_)
 
 
@@ -440,14 +450,14 @@
 
 *September 26, 2015*
 
- * `txtorcon-0.14.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.14.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.14.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.14.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.14.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.14.0.tar.gz>`_)
+ * `txtorcon-0.14.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.14.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.14.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.14.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.14.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.14.0.tar.gz>`_)
  * :class:`txtorcon.interface.IStreamAttacher` handling was missing ``None`` 
and ``DO_NOT_ATTACH`` cases if a Deferred was returned.
  * add ``.is_built`` Deferred to :class:`txtorcon.Circuit` that gets 
`callback()`d when the circuit becomes BUILT
  * `david415 <https://github.com/david415>`_ ported his ``tor:``
    endpoint parser so now both client and server endpoints are
    supported. This means **any** Twisted program using endpoints can
    use Tor as a client. For example, to connect to txtorcon's Web site:
-   ``ep = clientFromString("tor:timaq4ygg2iegci7.onion:80")``.
+   ``ep = 
clientFromString("tor:fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion:80")``.
    (In the future, I'd like to automatically launch Tor if required, too).
  * Python3 fixes from `isis <https://github.com/isislovecruft>`_ (note: needs 
Twisted 15.4.0+)
 
@@ -457,7 +467,7 @@
 
 *May 10, 2015*
 
- * `txtorcon-0.13.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.13.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.13.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.13.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.13.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.13.0.tar.gz>`_)
+ * `txtorcon-0.13.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.13.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.13.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.13.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.13.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.13.0.tar.gz>`_)
  * support ``basic`` and ``stealth`` hidden service authorization, and parse 
``client_keys`` files.
  * 2x speedup for TorState parsing (mostly by lazy-parsing timestamps)
  * can now parse ~75000 microdescriptors/second per core of 3.4GHz Xeon E3
@@ -474,7 +484,7 @@
 
 *February 3, 2015*
 
- * `txtorcon-0.12.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.12.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.12.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.12.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.12.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.12.0.tar.gz>`_)
+ * `txtorcon-0.12.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.12.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.12.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.12.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.12.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.12.0.tar.gz>`_)
  * doc, code and import cleanups from `Kali Kaneko 
<https://github.com/kalikaneko>`_
  * HiddenServiceDirGroupReadable support
  * Issue #80: honour ``ControlPort 0`` in incoming TorConfig
@@ -501,9 +511,9 @@
 
 *August 16, 2014*
 
- * September 6, 2015. bugfix release: `txtorcon-0.11.1.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.11.1.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.11.1>`_ (:download:`local-sig 
</../signatues/txtorcon-0.11.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.11.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.11.1.tar.gz>`_)
+ * September 6, 2015. bugfix release: `txtorcon-0.11.1.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.11.1.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.11.1>`_ (:download:`local-sig 
</../signatues/txtorcon-0.11.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.11.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.11.1.tar.gz>`_)
  * fixed Debian bug `797261 
<https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=797261>`_ causing 3 tests to 
fail
- * `txtorcon-0.11.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.11.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.11.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.11.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.11.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.11.0.tar.gz>`_) 
+ * `txtorcon-0.11.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.11.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.11.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.11.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.11.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.11.0.tar.gz>`_) 
  * More control for ``launch_tor``: access stdout, stderr in real-time
    and control whether we kill Tor on and stderr output. See issue #79.
  * Warning about ``build_circuit`` being called without a guard first
@@ -518,7 +528,7 @@
 
 *July 20, 2014*
 
- * `txtorcon-0.10.1.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.10.1.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.10.1>`_ (:download:`local-sig 
</../signatues/txtorcon-0.10.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.10.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.10.1.tar.gz>`_) 
+ * `txtorcon-0.10.1.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.10.1.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.10.1>`_ (:download:`local-sig 
</../signatues/txtorcon-0.10.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.10.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.10.1.tar.gz>`_) 
  * fix bug incorrectly issuing RuntimeError in brief window of time on 
event-listeners
  * issue #78: Add tox tests and fix for Twisted 12.0.0 (and prior), as this is 
what Debian squeeze ships
  * issue #77: properly expand relative and tilde paths for 
``hiddenServiceDir`` via endpoints
@@ -529,7 +539,7 @@
 
 *June 15, 2014*
 
- * `txtorcon-0.10.0.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.10.0.tar.gz>`_ (`PyPI 
<https://pypi.python.org/pypi/txtorcon/0.10.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.10.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.10.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.10.0.tar.gz>`_)
+ * `txtorcon-0.10.0.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.10.0.tar.gz>`_
 (`PyPI <https://pypi.python.org/pypi/txtorcon/0.10.0>`_ (:download:`local-sig 
</../signatues/txtorcon-0.10.0.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.10.0.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.10.0.tar.gz>`_)
  * In collaboration with `David Stainton <https://github.com/david415>`_ after 
a pull-request, we
    have endpoint parser plugins for Twisted! This means code like
    ``serverFromString("onion:80").listen(...)`` is enough to start a
@@ -544,7 +554,7 @@
 
 *April 23, 2014*
 
- * `txtorcon-0.9.2.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.9.2.tar.gz>`_ (:download:`local-sig 
</../signatues/txtorcon-0.9.2.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.9.2.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.9.2.tar.gz>`_)
+ * `txtorcon-0.9.2.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.9.2.tar.gz>`_
 (:download:`local-sig </../signatues/txtorcon-0.9.2.tar.gz.asc>` or 
`github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.9.2.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.9.2.tar.gz>`_)
  * add ``on_disconnect`` callback for TorControlProtocol (no more 
monkey-patching Protocol API)
  * add ``age()`` method to Circuit
  * add ``time_created`` property to Circuit
@@ -567,7 +577,7 @@
 
 *January 20, 2014*
 
- * `txtorcon-0.9.1.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.9.1.tar.gz>`_ (:download:`local-sig 
</../signatues/txtorcon-0.9.1.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.9.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.9.1.tar.gz>`_)
+ * `txtorcon-0.9.1.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.9.1.tar.gz>`_
 (:download:`local-sig </../signatues/txtorcon-0.9.1.tar.gz.asc>` or 
`github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.9.1.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.9.1.tar.gz>`_)
  * put test/ directory at the top level
  * using "`coverage <http://nedbatchelder.com/code/coverage/>`_" tool instead 
of custom script
  * using `coveralls.io <https://coveralls.io/r/meejah/txtorcon>`_ and 
`travis-ci <https://travis-ci.org/meejah/txtorcon>`_ for test coverage and 
continuous integration
@@ -591,7 +601,7 @@
 
 *November 22, 2013*
 
- * `txtorcon-0.8.2.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.8.2.tar.gz>`_ (:download:`local-sig 
</../signatues/txtorcon-0.8.2.tar.gz.asc>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.8.2.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.8.2.tar.gz>`_)
+ * `txtorcon-0.8.2.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.8.2.tar.gz>`_
 (:download:`local-sig </../signatues/txtorcon-0.8.2.tar.gz.asc>` or 
`github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.8.2.tar.gz.asc?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.8.2.tar.gz>`_)
  * ensure hidden service server-side endpoints listen only on 127.0.0.1
 
 
@@ -600,7 +610,7 @@
 
 *May 13, 2013*
 
- * `txtorcon-0.8.1.tar.gz 
<http://timaq4ygg2iegci7.onion/txtorcon-0.8.1.tar.gz>`_ (:download:`local-sign 
</../signatues/txtorcon-0.8.1.tar.gz.sig>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.8.1.tar.gz.sig?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.8.1.tar.gz>`_)
+ * `txtorcon-0.8.1.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.8.1.tar.gz>`_
 (:download:`local-sign </../signatues/txtorcon-0.8.1.tar.gz.sig>` or 
`github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.8.1.tar.gz.sig?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/archive/v0.8.1.tar.gz>`_)
  * fixed improper import in setup.py preventing 0.8.0 from installing
  * signatures with proper subkey this time
  * Proper file-flushing in tests and PyPy fixes from Lukas Lueg
@@ -631,7 +641,7 @@
 
 *November 21, 2012*
 
- * `txtorcon-0.7.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.7.tar.gz>`_ 
(:download:`local-sig <../signatues/txtorcon-0.7.tar.gz.sig>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.7.tar.gz.sig?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/tarball/v0.7>`_)
+ * `txtorcon-0.7.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.7.tar.gz>`_
 (:download:`local-sig <../signatues/txtorcon-0.7.tar.gz.sig>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.7.tar.gz.sig?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/tarball/v0.7>`_)
  * `issue #20 <https://github.com/meejah/txtorcon/issues/20>`_ config object 
now hooked up correctly after launch_tor();
  * `patch <https://github.com/meejah/txtorcon/pull/22>`_ from hellais for 
properly handling data_dir given to TCPHiddenServiceEndpoint;
  * `.tac example <https://github.com/meejah/txtorcon/pull/19>`_ from mmaker;
@@ -642,7 +652,7 @@
 
 *October 10, 2012*
 
- * `txtorcon-0.6.tar.gz <http://timaq4ygg2iegci7.onion/txtorcon-0.6.tar.gz>`_ 
(:download:`local-sig <../signatues/txtorcon-0.6.tar.gz.sig>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.6.tar.gz.sig?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/tarball/v0.6>`_)
+ * `txtorcon-0.6.tar.gz 
<http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/txtorcon-0.6.tar.gz>`_
 (:download:`local-sig <../signatues/txtorcon-0.6.tar.gz.sig>` or `github-sig 
<https://github.com/meejah/txtorcon/blob/main/signatues/txtorcon-0.6.tar.gz.sig?raw=true>`_)
 (`source <https://github.com/meejah/txtorcon/tarball/v0.6>`_)
  * debian packaging (mmaker);
  * psutil fully gone;
  * *changed API* for launch_tor() to use TorConfig instead of args;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/examples/launch_onion.py 
new/txtorcon-23.11.0/examples/launch_onion.py
--- old/txtorcon-23.5.0/examples/launch_onion.py        1970-01-01 
01:00:00.000000000 +0100
+++ new/txtorcon-23.11.0/examples/launch_onion.py       2023-08-10 
21:30:17.000000000 +0200
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+
+from twisted.internet import defer, task, endpoints, error
+from twisted.web import server, resource
+
+import txtorcon
+import sys
+
+class Simple(resource.Resource):
+    """
+    A really simple Web site.
+    """
+    isLeaf = True
+
+    def render_GET(self, request):
+        return b"<html>Hello, world! I'm a hidden service!</html>"
+
+
+async def main(reactor):
+    print("main", reactor)
+    tor = await txtorcon.launch(
+        reactor,
+        stdout=sys.stdout,
+        stderr=sys.stderr,
+        progress_updates=print,
+        control_port="unix:/tmp/testing/torcontrolfoo",
+        data_directory="/tmp/tordatatmp",
+    )
+    print(tor)
+
+    # create ephemeral service listening on "80" publically, and a
+    # random local port.
+    for _ in range(2):
+        onion_service = await tor.create_onion_service([80], progress=print) # 
, await_all_uploads=True,
+        print(f"service: http://{onion_service.hostname}";)
+        for port in onion_service.ports:
+            print("  ", port)
+            ep = endpoints.serverFromString(reactor, 
"tcp:{}".format(port.split()[1].split(":")[1]))
+            port = await ep.listen(server.Site(Simple()))
+            print(port)
+
+    await defer.Deferred()  # wait forever
+
+
+if __name__ == "__main__":
+    def run(reactor):
+        return defer.ensureDeferred(main(reactor))
+    task.react(run)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/examples/web_client.py 
new/txtorcon-23.11.0/examples/web_client.py
--- old/txtorcon-23.5.0/examples/web_client.py  2018-05-31 20:59:02.000000000 
+0200
+++ new/txtorcon-23.11.0/examples/web_client.py 2023-08-11 09:41:38.000000000 
+0200
@@ -32,7 +32,7 @@
     agent = tor.web_agent()
     uri = b'http://surely-this-has-not-been-registered-and-is-invalid.com'
     uri = b'https://www.torproject.org'
-    uri = b'http://timaq4ygg2iegci7.onion/'  # txtorcon documentation
+    uri = 
b'http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/'  # 
txtorcon documentation
     print("Downloading {}".format(uri))
     resp = yield agent.request(b'GET', uri)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/requirements.txt 
new/txtorcon-23.11.0/requirements.txt
--- old/txtorcon-23.5.0/requirements.txt        2023-05-19 03:11:14.000000000 
+0200
+++ new/txtorcon-23.11.0/requirements.txt       2023-08-29 17:13:24.000000000 
+0200
@@ -3,6 +3,5 @@
 ##GeoIP>=1.2.9
 Twisted[tls]>=15.5.0
 zope.interface>=3.6.1
-incremental
 automat
 cryptography
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/py3_test_controller.py 
new/txtorcon-23.11.0/test/py3_test_controller.py
--- old/txtorcon-23.5.0/test/py3_test_controller.py     2018-05-31 
20:59:02.000000000 +0200
+++ new/txtorcon-23.11.0/test/py3_test_controller.py    2023-11-20 
07:11:22.000000000 +0100
@@ -1,4 +1,4 @@
-from mock import Mock
+from unittest.mock import Mock
 
 from twisted.trial import unittest
 from twisted.internet.defer import ensureDeferred
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_attacher.py 
new/txtorcon-23.11.0/test/test_attacher.py
--- old/txtorcon-23.5.0/test/test_attacher.py   2018-05-31 20:59:02.000000000 
+0200
+++ new/txtorcon-23.11.0/test/test_attacher.py  2023-11-20 07:11:22.000000000 
+0100
@@ -1,4 +1,4 @@
-from mock import Mock
+from unittest.mock import Mock
 from zope.interface import directlyProvides
 
 from twisted.trial import unittest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_circuit.py 
new/txtorcon-23.11.0/test/test_circuit.py
--- old/txtorcon-23.5.0/test/test_circuit.py    2018-05-31 20:59:02.000000000 
+0200
+++ new/txtorcon-23.11.0/test/test_circuit.py   2023-11-20 07:11:22.000000000 
+0100
@@ -1,6 +1,6 @@
 import datetime
 import ipaddress
-from mock import patch
+from unittest.mock import patch
 
 from twisted.trial import unittest
 from twisted.internet import defer
@@ -21,7 +21,7 @@
 from txtorcon.interface import CircuitListenerMixin
 from txtorcon.interface import ITorControlProtocol
 
-from mock import Mock
+from unittest.mock import Mock
 
 
 @implementer(IRouterContainer)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_controller.py 
new/txtorcon-23.11.0/test/test_controller.py
--- old/txtorcon-23.5.0/test/test_controller.py 2020-04-20 04:58:02.000000000 
+0200
+++ new/txtorcon-23.11.0/test/test_controller.py        2023-11-20 
07:11:22.000000000 +0100
@@ -2,7 +2,7 @@
 import six
 import functools
 from os.path import join
-from mock import Mock, patch
+from unittest.mock import Mock, patch
 from io import BytesIO
 
 from twisted.internet.interfaces import IReactorCore
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_endpoints.py 
new/txtorcon-23.11.0/test/test_endpoints.py
--- old/txtorcon-23.5.0/test/test_endpoints.py  2023-02-16 06:25:43.000000000 
+0100
+++ new/txtorcon-23.11.0/test/test_endpoints.py 2023-11-20 07:11:22.000000000 
+0100
@@ -2,8 +2,8 @@
 
 import os
 import sys
-from mock import patch
-from mock import Mock, MagicMock
+from unittest.mock import patch
+from unittest.mock import Mock, MagicMock
 from unittest import skipIf
 from binascii import b2a_base64
 
@@ -1593,9 +1593,9 @@
         )
 
     def test_parser_basic(self):
-        ep = clientFromString(None, 
'tor:host=timaq4ygg2iegci7.onion:port=80:socksPort=9050')
+        ep = clientFromString(None, 
'tor:host=fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion:port=80:socksPort=9050')
 
-        self.assertEqual(ep.host, 'timaq4ygg2iegci7.onion')
+        self.assertEqual(ep.host, 
'fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion')
         self.assertEqual(ep.port, 80)
         # XXX what's "the Twisted way" to get the port out here?
         self.assertEqual(ep._socks_endpoint._port, 9050)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_onion.py 
new/txtorcon-23.11.0/test/test_onion.py
--- old/txtorcon-23.5.0/test/test_onion.py      2019-05-19 14:35:02.000000000 
+0200
+++ new/txtorcon-23.11.0/test/test_onion.py     2023-11-20 07:11:22.000000000 
+0100
@@ -2,7 +2,7 @@
 
 import os
 import sys
-from mock import Mock
+from unittest.mock import Mock
 from os.path import join
 from unittest import skipIf
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_router.py 
new/txtorcon-23.11.0/test/test_router.py
--- old/txtorcon-23.5.0/test/test_router.py     2018-05-31 20:59:02.000000000 
+0200
+++ new/txtorcon-23.11.0/test/test_router.py    2023-11-20 07:11:22.000000000 
+0100
@@ -1,6 +1,6 @@
 import json
 from datetime import datetime
-from mock import Mock
+from unittest.mock import Mock
 
 from twisted.trial import unittest
 from twisted.internet import defer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_socks.py 
new/txtorcon-23.11.0/test/test_socks.py
--- old/txtorcon-23.5.0/test/test_socks.py      2018-05-31 20:59:02.000000000 
+0200
+++ new/txtorcon-23.11.0/test/test_socks.py     2023-11-20 07:11:22.000000000 
+0100
@@ -1,5 +1,5 @@
 from six import BytesIO, text_type
-from mock import Mock, patch
+from unittest.mock import Mock, patch
 
 from twisted.trial import unittest
 from twisted.internet import defer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_stream.py 
new/txtorcon-23.11.0/test/test_stream.py
--- old/txtorcon-23.5.0/test/test_stream.py     2018-05-31 20:59:02.000000000 
+0200
+++ new/txtorcon-23.11.0/test/test_stream.py    2023-08-11 09:41:38.000000000 
+0200
@@ -365,7 +365,7 @@
         for address in [
                 '1.2.3.4:80',
                 '1.2.3.4.315D5684D5343580D409F16119F78D776A58AEFB.exit:80',
-                'timaq4ygg2iegci7.onion:80']:
+                
'fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion:80']:
 
             line = "316 %s 1 %s REASON=FOO"
             for state in ['NEW', 'SUCCEEDED', 'REMAP',
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_torconfig.py 
new/txtorcon-23.11.0/test/test_torconfig.py
--- old/txtorcon-23.5.0/test/test_torconfig.py  2019-05-19 14:35:02.000000000 
+0200
+++ new/txtorcon-23.11.0/test/test_torconfig.py 2023-11-20 07:11:22.000000000 
+0100
@@ -6,7 +6,7 @@
 import functools
 import warnings
 from six import StringIO
-from mock import Mock, patch
+from unittest.mock import Mock, patch
 from os.path import join
 
 from zope.interface import implementer, directlyProvides
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_torcontrolprotocol.py 
new/txtorcon-23.11.0/test/test_torcontrolprotocol.py
--- old/txtorcon-23.5.0/test/test_torcontrolprotocol.py 2019-05-19 
14:35:02.000000000 +0200
+++ new/txtorcon-23.11.0/test/test_torcontrolprotocol.py        2023-10-04 
21:25:18.000000000 +0200
@@ -74,7 +74,7 @@
         self.transport = proto_helpers.StringTransport()
 
     def send(self, line):
-        assert type(line) == bytes
+        assert isinstance(line, bytes)
         self.protocol.dataReceived(line.strip() + b"\r\n")
 
     def test_authenticate_cookie(self):
@@ -226,7 +226,7 @@
         it_was_called.yes = False
 
         d = self.protocol.when_disconnected()
-        d.addCallback(it_was_called)
+        d.addBoth(it_was_called)
         f = failure.Failure(error.ConnectionDone("It's all over"))
         self.protocol.connectionLost(f)
         self.assertTrue(it_was_called.yes)
@@ -284,6 +284,31 @@
         self.protocol.connectionLost(f)
         self.assertEqual(it_was_called.count, 2)
 
+    def test_disconnect_subsequent_commands(self):
+        """
+        commands issued after disconnect should errback
+        """
+
+        def it_was_called(f):
+            str(f)
+            it_was_called.count += 1
+            return None
+        it_was_called.count = 0
+
+        # one outstanding command
+        d0 = self.protocol.queue_command("some command0")
+        d0.addErrback(it_was_called)
+        self.protocol.on_disconnect.addErrback(lambda _: None)
+
+        f = failure.Failure(RuntimeError("The thing didn't do the stuff."))
+        self.protocol.connectionLost(f)
+
+        # one command issued _after_ we've disconnected
+        d1 = self.protocol.queue_command("some command1")
+        d1.addErrback(it_was_called)
+
+        self.assertEqual(it_was_called.count, 2)
+
 
 class ProtocolTests(unittest.TestCase):
 
@@ -297,7 +322,7 @@
         self.protocol = None
 
     def send(self, line):
-        assert type(line) == bytes
+        assert isinstance(line, bytes)
         self.protocol.dataReceived(line.strip() + b"\r\n")
 
     def test_statemachine_broadcast_no_code(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_torstate.py 
new/txtorcon-23.11.0/test/test_torstate.py
--- old/txtorcon-23.5.0/test/test_torstate.py   2023-02-16 06:25:43.000000000 
+0100
+++ new/txtorcon-23.11.0/test/test_torstate.py  2023-11-20 07:11:22.000000000 
+0100
@@ -12,7 +12,7 @@
 
 from ipaddress import IPv4Address
 
-from mock import patch, Mock
+from unittest.mock import patch, Mock
 
 from txtorcon import TorControlProtocol
 from txtorcon import TorProtocolError
@@ -1293,7 +1293,14 @@
         self.assertEqual(self.transport.value(), b'EXTENDCIRCUIT 0 
0000000000000000000000000000000000000000,0000000000000000000000000000000000000001,0000000000000000000000000000000000000002\r\n')
         # should have gotten a warning about this not being an entry
         # guard
-        self.assertEqual(len(self.flushWarnings()), 1)
+        self.assertEqual(
+            1,
+            len([
+                warn
+                for warn in self.flushWarnings()
+                if "Circuit doesn't start with a guard" in warn["message"]
+            ])
+        )
 
     def test_build_circuit_no_routers(self):
         self.state.build_circuit()
@@ -1329,7 +1336,14 @@
         self.send(b"250 EXTENDED 1234")
         # should have gotten a warning about this not being an entry
         # guard
-        self.assertEqual(len(self.flushWarnings()), 1)
+        self.assertEqual(
+            1,
+            len([
+                warn
+                for warn in self.flushWarnings()
+                if "Circuit doesn't start with a guard" in warn["message"]
+            ])
+        )
         return d
 
     def test_build_circuit_error(self):
@@ -1477,7 +1491,14 @@
         self.state.circuits[1234].update(['1234', 'BUILT'])
         # should have gotten a warning about this not being an entry
         # guard
-        self.assertEqual(len(self.flushWarnings()), 1)
+        self.assertEqual(
+            1,
+            len([
+                warn
+                for warn in self.flushWarnings()
+                if "Circuit doesn't start with a guard" in warn["message"]
+            ])
+        )
         return d
 
     def test_build_circuit_failure(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_util.py 
new/txtorcon-23.11.0/test/test_util.py
--- old/txtorcon-23.5.0/test/test_util.py       2021-08-16 22:24:40.000000000 
+0200
+++ new/txtorcon-23.11.0/test/test_util.py      2023-11-20 07:11:22.000000000 
+0100
@@ -1,7 +1,7 @@
 import os
 import tempfile
 import ipaddress
-from mock import patch
+from unittest.mock import patch
 from unittest import skip as _skip
 from os.path import exists
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/test/test_web.py 
new/txtorcon-23.11.0/test/test_web.py
--- old/txtorcon-23.5.0/test/test_web.py        2023-05-19 03:11:14.000000000 
+0200
+++ new/txtorcon-23.11.0/test/test_web.py       2023-11-20 07:11:22.000000000 
+0100
@@ -1,5 +1,5 @@
 
-from mock import Mock
+from unittest.mock import Mock
 
 from twisted.web.client import BrowserLikePolicyForHTTPS
 from twisted.trial import unittest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/txtorcon/_metadata.py 
new/txtorcon-23.11.0/txtorcon/_metadata.py
--- old/txtorcon-23.5.0/txtorcon/_metadata.py   2023-05-19 03:13:53.000000000 
+0200
+++ new/txtorcon-23.11.0/txtorcon/_metadata.py  2023-11-20 07:12:18.000000000 
+0100
@@ -1,4 +1,4 @@
-__version__ = '23.5.0'
+__version__ = '23.11.0'
 __author__ = 'meejah'
 __contact__ = 'mee...@meejah.ca'
 __url__ = 'https://github.com/meejah/txtorcon'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/txtorcon/controller.py 
new/txtorcon-23.11.0/txtorcon/controller.py
--- old/txtorcon-23.5.0/txtorcon/controller.py  2023-05-19 03:11:14.000000000 
+0200
+++ new/txtorcon-23.11.0/txtorcon/controller.py 2023-08-30 01:34:05.000000000 
+0200
@@ -692,9 +692,9 @@
         add and remove onion authentication. For example, inside an
         `async def` method that's had `ensureDeferred` called on it::
 
-            async with tor.onion_authentication("timaq4ygg2iegci7.onion", 
"seekrit token"):
+            async with 
tor.onion_authentication("fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion",
 "seekrit token"):
                 agent = tor.web_agent()
-                resp = await agent.request(b'GET', 
"http://timaq4ygg2iegci7.onion/";)
+                resp = await agent.request(b'GET', 
"http://fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion/";)
                 body = await readBody(resp)
             # after the "async with" the token will be removed from Tor's 
configuration
 
@@ -1032,6 +1032,8 @@
             control-connection goes away (this means the service will
             appear in `GETINFO onions/detached` to all other
             controllers)
+
+        :returns EphemeralOnionService:
         """
         if version not in (2, 3):
             raise ValueError(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/txtorcon/endpoints.py 
new/txtorcon-23.11.0/txtorcon/endpoints.py
--- old/txtorcon-23.5.0/txtorcon/endpoints.py   2021-08-16 22:24:37.000000000 
+0200
+++ new/txtorcon-23.11.0/txtorcon/endpoints.py  2023-08-11 09:41:38.000000000 
+0200
@@ -203,7 +203,7 @@
     :class:`txtorcon.IAuthenticatedOnionClients` instance (and from
     which you can recover private keys, the hostname, etc)
 
-    :ivar onion_uri: the public key, like ``timaq4ygg2iegci7.onion``
+    :ivar onion_uri: the public key, like 
``fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion``
         which came from the hidden_service_dir's ``hostname`` file
 
     :ivar onion_private_key: the contents of ``hidden_service_dir/private_key``
@@ -1193,11 +1193,11 @@
     :api:`twisted.internet.endpoints.clientFromString
     <clientFromString>` with a string argument like:
 
-    ``tor:host=timaq4ygg2iegci7.onion:port=80:socksPort=9050``
+    
``tor:host=fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion:port=80:socksPort=9050``
 
     ...or simply:
 
-    ``tor:host=timaq4ygg2iegci7.onion:port=80``
+    
``tor:host=fjblvrw2jrxnhtg67qpbzi45r7ofojaoo3orzykesly2j3c2m3htapid.onion:port=80``
 
     You may also include a username + password. By default, Tor will
     not put two streams that provided different authentication on the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/txtorcon/torcontrolprotocol.py 
new/txtorcon-23.11.0/txtorcon/torcontrolprotocol.py
--- old/txtorcon-23.5.0/txtorcon/torcontrolprotocol.py  2019-05-19 
14:35:02.000000000 +0200
+++ new/txtorcon-23.11.0/txtorcon/torcontrolprotocol.py 2023-10-04 
21:25:18.000000000 +0200
@@ -232,6 +232,12 @@
     :class:`txtorcon.TorState`, which is also the place to go if you
     wish to add your own stream or circuit listeners.
     """
+    # override Twisted's LineOnlyReceiver maximum line-length. At
+    # least "GETINFO md/id/X" for some Xse exceeds 16384 (2**14, the
+    # default) and thus causes the control connection to
+    # fail. control.c defines MAX_COMMAND_LINE_LENGTH as 1024*1024 so
+    # we use that
+    MAX_LENGTH = 2 ** 20
 
     def __init__(self, password_function=None):
         """
@@ -276,11 +282,6 @@
 
         self._when_disconnected = SingleObserver()
         """
-        Internal use. A :class:`SingleObserver` for when_disconnected()
-        """
-
-        self._when_disconnected = SingleObserver()
-        """
         Private. See :func:`.when_disconnected`
         """
 
@@ -356,7 +357,7 @@
         self.stop_debug()
 
     def start_debug(self):
-        self.debuglog = open('txtorcon-debug.log', 'w')
+        self.debuglog = open('txtorcon-debug.log', 'wb')
 
     def stop_debug(self):
         def noop(*args, **kw):
@@ -692,10 +693,14 @@
     def connectionLost(self, reason):
         "Protocol API"
         txtorlog.msg('connection terminated: ' + str(reason))
-        if reason.check(ConnectionDone):
-            self._when_disconnected.fire(self)
-        else:
-            self._when_disconnected.fire(reason)
+        self._when_disconnected.fire(
+            Failure(
+                TorDisconnectError(
+                    text="Tor connection terminated",
+                    error=reason,
+                )
+            )
+        )
 
         # ...and this is why we don't do on_disconnect = Deferred() :(
         # and instead should have had on_disconnect() method that
@@ -712,8 +717,10 @@
             else:
                 self.on_disconnect.errback(reason)
         self.on_disconnect = None
-        self._when_disconnected.fire(self)
+
         outstanding = [self.command] + self.commands if self.command else 
self.commands
+        self.command = None
+        self.defer = None
         for d, cmd, cmd_arg in outstanding:
             if not d.called:
                 d.errback(
@@ -754,6 +761,10 @@
         if len(self.commands):
             self.command = self.commands.pop(0)
             (d, cmd, cmd_arg) = self.command
+
+            if self._when_disconnected.already_fired(d):
+                return
+
             self.defer = d
 
             self.debuglog.write(cmd + b'\n')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/txtorcon/torstate.py 
new/txtorcon-23.11.0/txtorcon/torstate.py
--- old/txtorcon-23.5.0/txtorcon/torstate.py    2020-04-20 04:58:02.000000000 
+0200
+++ new/txtorcon-23.11.0/txtorcon/torstate.py   2023-08-11 09:41:38.000000000 
+0200
@@ -477,7 +477,7 @@
         (e.g. "SomeFlag=True"). Currently there are none that Tor accepts.
         """
 
-        if type(stream) != int:
+        if not isinstance(stream, int):
             # assume it's a Stream instance
             stream = stream.id
         try:
@@ -513,7 +513,7 @@
             :meth:`Circuit.close <txtorcon.circuit.Circuit.close>`
         """
 
-        if type(circid) != int:
+        if not isinstance(circid, int):
             # assume it's a Circuit instance
             circid = circid.id
         flags = flags_from_dict(kwargs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/txtorcon/util.py 
new/txtorcon-23.11.0/txtorcon/util.py
--- old/txtorcon-23.5.0/txtorcon/util.py        2019-05-19 14:35:02.000000000 
+0200
+++ new/txtorcon-23.11.0/txtorcon/util.py       2023-10-04 21:25:18.000000000 
+0200
@@ -473,6 +473,19 @@
         self._observers = []
         self._fired = self._NotFired
 
+    def has_fired(self):
+        return self._fired is not self._NotFired
+
+    def already_fired(self, d):
+        """
+        If we have already fired, callback `d` with our result.
+        :returns bool: True if we already fired, False otherwise
+        """
+        if self.has_fired():
+            d.callback(self._fired)
+            return True
+        return False
+
     def when_fired(self):
         d = defer.Deferred()
         if self._fired is not self._NotFired:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/txtorcon.egg-info/PKG-INFO 
new/txtorcon-23.11.0/txtorcon.egg-info/PKG-INFO
--- old/txtorcon-23.5.0/txtorcon.egg-info/PKG-INFO      2023-05-19 
03:21:31.000000000 +0200
+++ new/txtorcon-23.11.0/txtorcon.egg-info/PKG-INFO     2023-11-20 
08:48:41.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: txtorcon
-Version: 23.5.0
+Version: 23.11.0
 Summary:      Twisted-based Tor controller client, with state-tracking and     
configuration abstractions.     https://txtorcon.readthedocs.org     
https://github.com/meejah/txtorcon 
 Home-page: https://github.com/meejah/txtorcon
 Author: meejah
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/txtorcon.egg-info/SOURCES.txt 
new/txtorcon-23.11.0/txtorcon.egg-info/SOURCES.txt
--- old/txtorcon-23.5.0/txtorcon.egg-info/SOURCES.txt   2023-05-19 
03:21:31.000000000 +0200
+++ new/txtorcon-23.11.0/txtorcon.egg-info/SOURCES.txt  2023-11-20 
08:48:41.000000000 +0100
@@ -50,6 +50,7 @@
 examples/disallow_streams_by_port.py
 examples/dns_lookups.py
 examples/hidden_echo.py
+examples/launch_onion.py
 examples/launch_tor.py
 examples/launch_tor2web.py
 examples/launch_tor_endpoint.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/txtorcon-23.5.0/txtorcon.egg-info/requires.txt 
new/txtorcon-23.11.0/txtorcon.egg-info/requires.txt
--- old/txtorcon-23.5.0/txtorcon.egg-info/requires.txt  2023-05-19 
03:21:31.000000000 +0200
+++ new/txtorcon-23.11.0/txtorcon.egg-info/requires.txt 2023-11-20 
08:48:41.000000000 +0100
@@ -1,6 +1,5 @@
 Twisted[tls]>=15.5.0
 zope.interface>=3.6.1
-incremental
 automat
 cryptography
 
@@ -17,7 +16,6 @@
 twine
 pyflakes
 pycodestyle
-mock
 ipaddress>=1.0.16
 geoip
 readme_renderer

Reply via email to