Hello community,
here is the log from the commit of package python-txtorcon for
openSUSE:Leap:15.2 checked in at 2020-04-12 15:39:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/python-txtorcon (Old)
and /work/SRC/openSUSE:Leap:15.2/.python-txtorcon.new.3248 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-txtorcon"
Sun Apr 12 15:39:32 2020 rev:5 rq:793359 version:20.0.0
Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/python-txtorcon/python-txtorcon.changes
2020-03-02 13:24:22.142519052 +0100
+++
/work/SRC/openSUSE:Leap:15.2/.python-txtorcon.new.3248/python-txtorcon.changes
2020-04-12 15:39:35.106066351 +0200
@@ -1,0 +2,10 @@
+Mon Apr 6 08:18:04 UTC 2020 - Marketa Calabkova <[email protected]>
+
+- Update to 20.0.0
+ * Use real GeoIP database or nothing
(https://github.com/meejah/txtorcon/issues/250)
+ * Change abstract base classes import in preperation for Python 3.8 (thanks
@glowatsk)
+ * Python 3.4 is no longer supported
+ * Python 2 is deprecated; all new code should be Python 3. Support
+ for Python 2 will be removed in a future release.
+
+-------------------------------------------------------------------
Old:
----
txtorcon-19.1.0.tar.gz
New:
----
txtorcon-20.0.0.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-txtorcon.spec ++++++
--- /var/tmp/diff_new_pack.8r4Jxo/_old 2020-04-12 15:39:35.538066678 +0200
+++ /var/tmp/diff_new_pack.8r4Jxo/_new 2020-04-12 15:39:35.542066681 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-txtorcon
#
-# Copyright (c) 2019 SUSE LLC
+# Copyright (c) 2020 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -18,7 +18,7 @@
%{?!python_module:%define python_module() python-%{**}
%{!?skip_python3:python3-%{**}}}
Name: python-txtorcon
-Version: 19.1.0
+Version: 20.0.0
Release: 0
Summary: Twisted-based asynchronous Tor control protocol implementation
License: MIT
@@ -66,7 +66,7 @@
%check
# looks more like integration tests
-%pytest -k 'not (test_real_addr or test_return_geoip_object)'
+%pytest -k 'not test_real_addr'
%files %{python_files}
%license LICENSE docs/*.rst
++++++ txtorcon-19.1.0.tar.gz -> txtorcon-20.0.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/Makefile new/txtorcon-20.0.0/Makefile
--- old/txtorcon-19.1.0/Makefile 2019-09-10 08:50:29.000000000 +0200
+++ new/txtorcon-20.0.0/Makefile 2020-03-31 04:43:49.000000000 +0200
@@ -1,6 +1,6 @@
-.PHONY: test html counts coverage sdist clean install doc integration diagrams
dist-hs
+.PHONY: test html counts coverage sdist clean install doc integration diagrams
default: test
-VERSION = 19.1.0
+VERSION = 20.0.0
test:
PYTHONPATH=. trial --reporter=text test
@@ -103,20 +103,6 @@
dist-sigs: dist/txtorcon-${VERSION}-py2.py3-none-any.whl.asc
dist/txtorcon-${VERSION}.tar.gz.asc
-dist-hs:
- cp dist/txtorcon-${VERSION}-py2.py3-none-any.whl
~/tools/dist/txtorcon3/git/docs/_build/html/
- cp dist/txtorcon-${VERSION}-py2.py3-none-any.whl.asc
~/tools/dist/txtorcon3/git/docs/_build/html/
- cp dist/txtorcon-${VERSION}-py2.py3-none-any.whl
~/tools/dist/txtorcon/git/docs/_build/html/
- cp dist/txtorcon-${VERSION}-py2.py3-none-any.whl.asc
~/tools/dist/txtorcon/git/docs/_build/html/
- cp dist/txtorcon-${VERSION}.tar.gz
~/tools/dist/txtorcon3/git/docs/_build/html/
- cp dist/txtorcon-${VERSION}.tar.gz.asc
~/tools/dist/txtorcon3/git/docs/_build/html/
- cp dist/txtorcon-${VERSION}.tar.gz
~/tools/dist/txtorcon/git/docs/_build/html/
- cp dist/txtorcon-${VERSION}.tar.gz.asc
~/tools/dist/txtorcon/git/docs/_build/html/
-
-check-sigs:
- gpg --verify dist/txtorcon-${VERSION}-py2.py3-none-any.whl.asc
- gpg --verify dist/txtorcon-${VERSION}.tar.gz.asc
-
sdist: setup.py
python setup.py check
python setup.py sdist
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/PKG-INFO new/txtorcon-20.0.0/PKG-INFO
--- old/txtorcon-19.1.0/PKG-INFO 2019-09-10 08:50:32.000000000 +0200
+++ new/txtorcon-20.0.0/PKG-INFO 2020-04-01 04:56:34.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: txtorcon
-Version: 19.1.0
+Version: 20.0.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
@@ -51,7 +51,7 @@
- **code**: https://github.com/meejah/txtorcon
- ``torsocks git clone git://timaq4ygg2iegci7.onion/txtorcon.git``
- MIT-licensed;
- - Python 2.7, PyPy 5.0.0+, Python 3.4+;
+ - Python 2.7, PyPy 5.0.0+, Python 3.5+;
- depends on
`Twisted`_,
`Automat <https://github.com/glyph/automat>`_,
@@ -79,53 +79,59 @@
---------------------------------------
`download <examples/readme.py>`_
- (also `python3 style <examples/readme3.py>`_)
+ (also `python2 style <examples/readme2.py>`_)
.. code:: python
from twisted.internet.task import react
- from twisted.internet.defer import inlineCallbacks
+ from twisted.internet.defer import inlineCallbacks, ensureDeferred
from twisted.internet.endpoints import UNIXClientEndpoint
+
import treq
import txtorcon
- @react
- @inlineCallbacks
- def main(reactor):
- tor = yield txtorcon.connect(
+
+ async def main(reactor):
+ tor = await txtorcon.connect(
reactor,
UNIXClientEndpoint(reactor, "/var/run/tor/control")
)
print("Connected to Tor version {}".format(tor.version))
- url = 'https://www.torproject.org:443'
- print("Downloading {}".format(url))
- resp = yield treq.get(url, agent=tor.web_agent())
-
- print(" {} bytes".format(resp.length))
- data = yield resp.text()
- print("Got {} bytes:\n{}\n[...]{}".format(
+ url = u'https://www.torproject.org:443'
+ print(u"Downloading {}".format(repr(url)))
+ resp = await treq.get(url, agent=tor.web_agent())
+
+ print(u" {} bytes".format(resp.length))
+ data = await resp.text()
+ print(u"Got {} bytes:\n{}\n[...]{}".format(
len(data),
data[:120],
data[-120:],
))
- print("Creating a circuit")
- state = yield tor.create_state()
- circ = yield state.build_circuit()
- yield circ.when_built()
- print(" path: {}".format(" -> ".join([r.ip for r in
circ.path])))
-
- print("Downloading meejah's public key via above circuit...")
- resp = yield treq.get(
- 'https://meejah.ca/meejah.asc',
- agent=circ.web_agent(reactor,
tor.config.socks_endpoint(reactor)),
+ print(u"Creating a circuit")
+ state = await tor.create_state()
+ circ = await state.build_circuit()
+ await circ.when_built()
+ print(u" path: {}".format(" -> ".join([r.ip for r in
circ.path])))
+
+ print(u"Downloading meejah's public key via above circuit...")
+ config = await tor.get_config()
+ resp = await treq.get(
+ u'https://meejah.ca/meejah.asc',
+ agent=circ.web_agent(reactor,
config.socks_endpoint(reactor)),
)
- data = yield resp.text()
+ data = await resp.text()
print(data)
+ @react
+ def _main(reactor):
+ return ensureDeferred(main(reactor))
+
+
Try It Now On Debian/Ubuntu
---------------------------
@@ -135,7 +141,7 @@
.. code-block:: shell-session
- $ sudo apt-get install --install-suggests python-txtorcon
+ $ sudo apt-get install --install-suggests python3-txtorcon
$ twistd -n web --port "onion:80" --path ~/public_html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/README.rst
new/txtorcon-20.0.0/README.rst
--- old/txtorcon-19.1.0/README.rst 2019-09-10 08:49:17.000000000 +0200
+++ new/txtorcon-20.0.0/README.rst 2020-03-31 04:32:26.000000000 +0200
@@ -43,7 +43,7 @@
- **code**: https://github.com/meejah/txtorcon
- ``torsocks git clone git://timaq4ygg2iegci7.onion/txtorcon.git``
- MIT-licensed;
-- Python 2.7, PyPy 5.0.0+, Python 3.4+;
+- Python 2.7, PyPy 5.0.0+, Python 3.5+;
- depends on
`Twisted`_,
`Automat <https://github.com/glyph/automat>`_,
@@ -71,53 +71,59 @@
---------------------------------------
`download <examples/readme.py>`_
-(also `python3 style <examples/readme3.py>`_)
+(also `python2 style <examples/readme2.py>`_)
.. code:: python
from twisted.internet.task import react
- from twisted.internet.defer import inlineCallbacks
+ from twisted.internet.defer import inlineCallbacks, ensureDeferred
from twisted.internet.endpoints import UNIXClientEndpoint
+
import treq
import txtorcon
- @react
- @inlineCallbacks
- def main(reactor):
- tor = yield txtorcon.connect(
+
+ async def main(reactor):
+ tor = await txtorcon.connect(
reactor,
UNIXClientEndpoint(reactor, "/var/run/tor/control")
)
print("Connected to Tor version {}".format(tor.version))
- url = 'https://www.torproject.org:443'
- print("Downloading {}".format(url))
- resp = yield treq.get(url, agent=tor.web_agent())
-
- print(" {} bytes".format(resp.length))
- data = yield resp.text()
- print("Got {} bytes:\n{}\n[...]{}".format(
+ url = u'https://www.torproject.org:443'
+ print(u"Downloading {}".format(repr(url)))
+ resp = await treq.get(url, agent=tor.web_agent())
+
+ print(u" {} bytes".format(resp.length))
+ data = await resp.text()
+ print(u"Got {} bytes:\n{}\n[...]{}".format(
len(data),
data[:120],
data[-120:],
))
- print("Creating a circuit")
- state = yield tor.create_state()
- circ = yield state.build_circuit()
- yield circ.when_built()
- print(" path: {}".format(" -> ".join([r.ip for r in circ.path])))
-
- print("Downloading meejah's public key via above circuit...")
- resp = yield treq.get(
- 'https://meejah.ca/meejah.asc',
- agent=circ.web_agent(reactor, tor.config.socks_endpoint(reactor)),
+ print(u"Creating a circuit")
+ state = await tor.create_state()
+ circ = await state.build_circuit()
+ await circ.when_built()
+ print(u" path: {}".format(" -> ".join([r.ip for r in circ.path])))
+
+ print(u"Downloading meejah's public key via above circuit...")
+ config = await tor.get_config()
+ resp = await treq.get(
+ u'https://meejah.ca/meejah.asc',
+ agent=circ.web_agent(reactor, config.socks_endpoint(reactor)),
)
- data = yield resp.text()
+ data = await resp.text()
print(data)
+ @react
+ def _main(reactor):
+ return ensureDeferred(main(reactor))
+
+
Try It Now On Debian/Ubuntu
---------------------------
@@ -127,7 +133,7 @@
.. code-block:: shell-session
- $ sudo apt-get install --install-suggests python-txtorcon
+ $ sudo apt-get install --install-suggests python3-txtorcon
$ twistd -n web --port "onion:80" --path ~/public_html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/dev-requirements.txt
new/txtorcon-20.0.0/dev-requirements.txt
--- old/txtorcon-19.1.0/dev-requirements.txt 2019-03-27 05:29:35.000000000
+0100
+++ new/txtorcon-20.0.0/dev-requirements.txt 2020-03-31 04:52:10.000000000
+0200
@@ -1,5 +1,5 @@
tox
-coverage
+coverage<5.0
cuvner
setuptools>=0.8.0
Sphinx
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/docs/index.rst
new/txtorcon-20.0.0/docs/index.rst
--- old/txtorcon-19.1.0/docs/index.rst 2018-12-11 17:15:06.000000000 +0100
+++ new/txtorcon-20.0.0/docs/index.rst 2020-03-31 04:10:02.000000000 +0200
@@ -48,7 +48,7 @@
| PyPy 5.0.0+ | ✓ | ✓ |
+---------------+---------+---------+
-Supported and tested platforms: Python 2.7+, Python 3.5+, PyPy 5.0.0+
+Supported and tested platforms: Python 3.5+, PyPy 5.0.0+, Python 2.7+
(deprecated)
using Twisted 15.5.0+, 16.3.0+, or 17.1.0+ (see `travis
<https://travis-ci.org/meejah/txtorcon>`_).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/docs/release-checklist.rst
new/txtorcon-20.0.0/docs/release-checklist.rst
--- old/txtorcon-19.1.0/docs/release-checklist.rst 2019-09-10
08:50:29.000000000 +0200
+++ new/txtorcon-20.0.0/docs/release-checklist.rst 2020-04-01
04:55:53.000000000 +0200
@@ -23,7 +23,7 @@
* update heading, date
* on both signing-machine and build-machine shells:
- * export VERSION=19.1.0
+ * export VERSION=20.0.0
* (if on signing machine) "make dist" and "make dist-sigs"
* creates:
@@ -103,9 +103,6 @@
* copy dist/* files + signatures to hidden-service machine
* copy them to the HTML build directory! (docs/_build/html/)
- * make dist-hs
- * make check-sigs
-
* git pull and build docs there
* FIXME: why aren't all the dist files copied as part of doc build (only
.tar.gz)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/docs/releases.rst
new/txtorcon-20.0.0/docs/releases.rst
--- old/txtorcon-19.1.0/docs/releases.rst 2019-09-10 08:50:22.000000000
+0200
+++ new/txtorcon-20.0.0/docs/releases.rst 2020-04-01 04:53:52.000000000
+0200
@@ -15,10 +15,19 @@
See also :ref:`api_stability`.
-unreleased
-----------
+`git master <https://github.com/meejah/txtorcon>`_ *will likely become v20.1.0*
-`git master <https://github.com/meejah/txtorcon>`_ *will likely become v19.2.0*
+
+v20.0.0
+-------
+
+April 1, 2020
+
+ * Use real GeoIP database or nothing (`#250
<https://github.com/meejah/txtorcon/issues/250>`_)
+ * Change abstract base classes import in preperation for Python 3.8 (thanks
`@glowatsk <https://github.com/glowatsk>`_
+ * Python 3.4 is no longer supported
+ * Python 2 is deprecated; all new code should be Python 3. Support
+ for Python 2 will be removed in a future release.
v19.1.0
@@ -634,4 +643,3 @@
march, 2012
* `txtorcon-0.1.tar.gz <txtorcon-0.1.tar.gz>`_ (`txtorcon-0.1.tar.gz.sig
<txtorcon-0.1.tar.gz.sig>`_)
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/examples/config.py
new/txtorcon-20.0.0/examples/config.py
--- old/txtorcon-19.1.0/examples/config.py 2017-10-03 07:45:45.000000000
+0200
+++ new/txtorcon-20.0.0/examples/config.py 1970-01-01 01:00:00.000000000
+0100
@@ -1,38 +0,0 @@
-from __future__ import print_function
-
-import sys
-import txtorcon
-from twisted.web.client import readBody
-from twisted.internet.task import react
-from twisted.internet.defer import inlineCallbacks
-from twisted.internet.endpoints import clientFromString
-
-
-@react
-@inlineCallbacks
-def main(reactor):
- control_ep = clientFromString(reactor, "tcp:localhost:9251")
- tor = yield txtorcon.connect(reactor, control_ep)
- print("Connected to Tor version '{}'".format(tor.protocol.version))
-
- config = yield tor.get_config()
-
- print("SocksPort={}".format(config.SocksPort[0]))
-
- print("Directory authorities:")
- for a in config.DirAuthority:
- print(" {}".format(a[1:-1].split()[0]))
- return
-
- stuff = yield tor.protocol.get_info('config/defaults')
- stuff = stuff['config/defaults']
- for line in stuff.strip().split('\n'):
- k, v = line.split(' ', 1)
- if k not in ['FallbackDir']:
- v = yield tor.protocol.get_conf(k)
- print('{} = {}'.format(k, v))
- continue
- try:
- print('{} = {}'.format(k, getattr(config, k)))
- except KeyError:
- print('error on {}'.format(k))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/examples/monitor_compose.py
new/txtorcon-20.0.0/examples/monitor_compose.py
--- old/txtorcon-19.1.0/examples/monitor_compose.py 2019-04-23
06:53:35.000000000 +0200
+++ new/txtorcon-20.0.0/examples/monitor_compose.py 1970-01-01
01:00:00.000000000 +0100
@@ -1,30 +0,0 @@
-#!/usr/bin/env python
-
-# Just listens for a few EVENTs from Tor (INFO NOTICE WARN ERR) and
-# prints out the contents, so functions like a log monitor.
-
-from __future__ import print_function
-
-from twisted.internet import task, defer
-from twisted.internet.endpoints import UNIXClientEndpoint
-import txtorcon
-
-
[email protected]
[email protected]
-def main(reactor):
- ep = UNIXClientEndpoint(reactor, '/var/run/tor/control')
- tor = yield txtorcon.connect(reactor, ep)
-
- def log(msg):
- print(msg)
- print("Connected to a Tor version", tor.protocol.version)
-
- state = yield tor.create_state()
-
- print(dir(state))
- @state.on_stream_new
- def _(circ):
- print("new stream: {}".format(circ))
-
- yield defer.Deferred()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/examples/readme.py
new/txtorcon-20.0.0/examples/readme.py
--- old/txtorcon-19.1.0/examples/readme.py 2017-05-16 20:55:59.000000000
+0200
+++ new/txtorcon-20.0.0/examples/readme.py 2020-03-31 04:35:21.000000000
+0200
@@ -1,45 +1,47 @@
-from __future__ import print_function
-
from twisted.internet.task import react
-from twisted.internet.defer import inlineCallbacks
+from twisted.internet.defer import inlineCallbacks, ensureDeferred
from twisted.internet.endpoints import UNIXClientEndpoint
+
import treq
import txtorcon
-@react
-@inlineCallbacks
-def main(reactor):
- tor = yield txtorcon.connect(
+async def main(reactor):
+ tor = await txtorcon.connect(
reactor,
UNIXClientEndpoint(reactor, "/var/run/tor/control")
)
print("Connected to Tor version {}".format(tor.version))
- url = 'https://www.torproject.org:443'
- print("Downloading {}".format(url))
- resp = yield treq.get(url, agent=tor.web_agent())
-
- print(" {} bytes".format(resp.length))
- data = yield resp.text()
- print("Got {} bytes:\n{}\n[...]{}".format(
+ url = u'https://www.torproject.org:443'
+ print(u"Downloading {}".format(repr(url)))
+ resp = await treq.get(url, agent=tor.web_agent())
+
+ print(u" {} bytes".format(resp.length))
+ data = await resp.text()
+ print(u"Got {} bytes:\n{}\n[...]{}".format(
len(data),
data[:120],
data[-120:],
))
- print("Creating a circuit")
- state = yield tor.create_state()
- circ = yield state.build_circuit()
- yield circ.when_built()
- print(" path: {}".format(" -> ".join([r.ip for r in circ.path])))
-
- print("Downloading meejah's public key via above circuit...")
- config = yield tor.get_config()
- resp = yield treq.get(
- 'https://meejah.ca/meejah.asc',
+ print(u"Creating a circuit")
+ state = await tor.create_state()
+ circ = await state.build_circuit()
+ await circ.when_built()
+ print(u" path: {}".format(" -> ".join([r.ip for r in circ.path])))
+
+ print(u"Downloading meejah's public key via above circuit...")
+ config = await tor.get_config()
+ resp = await treq.get(
+ u'https://meejah.ca/meejah.asc',
agent=circ.web_agent(reactor, config.socks_endpoint(reactor)),
)
- data = yield resp.text()
+ data = await resp.text()
print(data)
+
+
+@react
+def _main(reactor):
+ return ensureDeferred(main(reactor))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/examples/readme2.py
new/txtorcon-20.0.0/examples/readme2.py
--- old/txtorcon-19.1.0/examples/readme2.py 1970-01-01 01:00:00.000000000
+0100
+++ new/txtorcon-20.0.0/examples/readme2.py 2020-03-31 04:30:54.000000000
+0200
@@ -0,0 +1,42 @@
+# this is a Python2 version of the code in readme.py
+from twisted.internet.task import react
+from twisted.internet.defer import inlineCallbacks
+from twisted.internet.endpoints import UNIXClientEndpoint
+import treq
+import txtorcon
+
+@react
+@inlineCallbacks
+def main(reactor):
+ tor = yield txtorcon.connect(
+ reactor,
+ UNIXClientEndpoint(reactor, "/var/run/tor/control")
+ )
+
+ print("Connected to Tor version {}".format(tor.version))
+
+ url = 'https://www.torproject.org:443'
+ print("Downloading {}".format(url))
+ resp = yield treq.get(url, agent=tor.web_agent())
+
+ print(" {} bytes".format(resp.length))
+ data = yield resp.text()
+ print("Got {} bytes:\n{}\n[...]{}".format(
+ len(data),
+ data[:120],
+ data[-120:],
+ ))
+
+ print("Creating a circuit")
+ state = yield tor.create_state()
+ circ = yield state.build_circuit()
+ yield circ.when_built()
+ print(" path: {}".format(" -> ".join([r.ip for r in circ.path])))
+
+ print("Downloading meejah's public key via above circuit...")
+ resp = yield treq.get(
+ 'https://meejah.ca/meejah.asc',
+ agent=circ.web_agent(reactor, tor.config.socks_endpoint(reactor)),
+ )
+ data = yield resp.text()
+ print(data)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/examples/readme3.py
new/txtorcon-20.0.0/examples/readme3.py
--- old/txtorcon-19.1.0/examples/readme3.py 2017-05-16 20:55:59.000000000
+0200
+++ new/txtorcon-20.0.0/examples/readme3.py 1970-01-01 01:00:00.000000000
+0100
@@ -1,49 +0,0 @@
-# this is a Python3 version of the code in readme.py
-
-from twisted.internet.task import react
-from twisted.internet.defer import inlineCallbacks, ensureDeferred
-from twisted.internet.endpoints import UNIXClientEndpoint
-
-import treq
-import txtorcon
-
-
-async def main(reactor):
- tor = await txtorcon.connect(
- reactor,
- UNIXClientEndpoint(reactor, "/var/run/tor/control")
- )
-
- print("Connected to Tor version {}".format(tor.version))
-
- url = u'https://www.torproject.org:443'
- print(u"Downloading {}".format(repr(url)))
- resp = await treq.get(url, agent=tor.web_agent())
-
- print(u" {} bytes".format(resp.length))
- data = await resp.text()
- print(u"Got {} bytes:\n{}\n[...]{}".format(
- len(data),
- data[:120],
- data[-120:],
- ))
-
- print(u"Creating a circuit")
- state = await tor.create_state()
- circ = await state.build_circuit()
- await circ.when_built()
- print(u" path: {}".format(" -> ".join([r.ip for r in circ.path])))
-
- print(u"Downloading meejah's public key via above circuit...")
- config = await tor.get_config()
- resp = await treq.get(
- u'https://meejah.ca/meejah.asc',
- agent=circ.web_agent(reactor, config.socks_endpoint(reactor)),
- )
- data = await resp.text()
- print(data)
-
-
-@react
-def _main(reactor):
- return ensureDeferred(main(reactor))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/examples/wait_newconsensus.py
new/txtorcon-20.0.0/examples/wait_newconsensus.py
--- old/txtorcon-19.1.0/examples/wait_newconsensus.py 2018-01-24
23:30:15.000000000 +0100
+++ new/txtorcon-20.0.0/examples/wait_newconsensus.py 1970-01-01
01:00:00.000000000 +0100
@@ -1,29 +0,0 @@
-#!/usr/bin/env python
-
-from __future__ import print_function
-
-from twisted.internet import task, defer
-from twisted.internet.endpoints import UNIXClientEndpoint
-import txtorcon
-
-
-def await_single_event(tor_protocol, event_name):
- d0 = defer.Deferred()
-
- def _got(consensus):
- d1 = tor_protocol.remove_event_listener('NEWCONSENSUS', _got)
- d1.addCallback(lambda _: d0.callback(consensus))
- return d1
- tor_protocol.add_event_listener('NEWCONSENSUS', _got)
- return d0
-
-
[email protected]
[email protected]
-def main(reactor):
- ep = UNIXClientEndpoint(reactor, '/var/run/tor/control')
- tor = yield txtorcon.connect(reactor, ep)
-
- print("waiting for next NEWCONSENSUS")
- consensus = yield await_single_event(tor.protocol, 'NEWCONSENSUS')
- print("Got NEWCONSENSUS; {} bytes".format(len(consensus)))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/txtorcon-19.1.0/examples/web_client_authenticated_py3.py
new/txtorcon-20.0.0/examples/web_client_authenticated_py3.py
--- old/txtorcon-19.1.0/examples/web_client_authenticated_py3.py
2017-12-11 07:20:13.000000000 +0100
+++ new/txtorcon-20.0.0/examples/web_client_authenticated_py3.py
1970-01-01 01:00:00.000000000 +0100
@@ -1,51 +0,0 @@
-# this example shows how to use Twisted's web client with Tor via
-# txtorcon
-
-from __future__ import print_function
-
-from twisted.internet.defer import inlineCallbacks, ensureDeferred
-from twisted.internet.task import react
-from twisted.internet.endpoints import TCP4ClientEndpoint
-from twisted.web.client import readBody
-
-import txtorcon
-from txtorcon.util import default_control_port
-
-
-async def main(reactor):
- # use port 9051 for system tor instances, or:
- # ep = UNIXClientEndpoint(reactor, '/var/run/tor/control')
- # ep = UNIXClientEndpoint(reactor, '/var/run/tor/control')
- ep = TCP4ClientEndpoint(reactor, '127.0.0.1', default_control_port())
- tor = await txtorcon.connect(reactor, ep)
- print("Connected to {tor} via localhost:{port}".format(
- tor=tor,
- port=default_control_port(),
- ))
-
- # add our client-side authentication tokens for the service.
- # You can create these by running the
- # web_onion_service_ephemeral_auth.py in a separate shell and
- # using either the "alice" or "bob" token in this client.
- token = u"0GaFhnbunp0TxZuBhejhxg" # alice's token
- onion_uri = u"FIXME.onion"
-
- if u"FIXME" in onion_uri:
- print("Please edit to the correct .onion URI")
- return
-
- async with tor.onion_authentication(onion_uri, token):
- # do the Web request as with any other
- agent = tor.web_agent()
- uri = u'http://{}/'.format(onion_uri)
- print("Downloading {}".format(uri))
- resp = await agent.request(b'GET', uri.encode('ascii'))
-
- print("Response has {} bytes".format(resp.length))
- body = await readBody(resp)
- print(body)
-
-if __name__ == '__main__':
- def _main(reactor):
- return ensureDeferred(main(reactor))
- react(_main)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/txtorcon-19.1.0/examples/web_onion_service_ephemeral.py
new/txtorcon-20.0.0/examples/web_onion_service_ephemeral.py
--- old/txtorcon-19.1.0/examples/web_onion_service_ephemeral.py 2018-02-15
07:58:40.000000000 +0100
+++ new/txtorcon-20.0.0/examples/web_onion_service_ephemeral.py 1970-01-01
01:00:00.000000000 +0100
@@ -1,57 +0,0 @@
-#!/usr/bin/env python
-
-# This shows how to leverage the endpoints API to get a new hidden
-# service up and running quickly. You can pass along this API to your
-# users by accepting endpoint strings as per Twisted recommendations.
-#
-#
http://twistedmatrix.com/documents/current/core/howto/endpoints.html#maximizing-the-return-on-your-endpoint-investment
-#
-# note that only the progress-updates needs the "import txtorcon" --
-# you do still need it installed so that Twisted finds the endpoint
-# parser plugin but code without knowledge of txtorcon can still
-# launch a Tor instance using it. cool!
-
-from __future__ import print_function
-from twisted.internet import defer, task, endpoints
-from twisted.web import server, resource
-
-import txtorcon
-from txtorcon.util import default_control_port
-from txtorcon.onion import AuthBasic
-
-
-class Simple(resource.Resource):
- """
- A really simple Web site.
- """
- isLeaf = True
-
- def render_GET(self, request):
- return b"<html>Hello, world! I'm an authenticated hidden
service!</html>"
-
-
[email protected]
-def main(reactor):
- tor = yield txtorcon.connect(
- reactor,
- endpoints.TCP4ClientEndpoint(reactor, "localhost", 9251),
- )
- ep = tor.create_onion_endpoint(
- 80,
- version=3,
- )
-
- def on_progress(percent, tag, msg):
- print('%03d: %s' % (percent, msg))
- txtorcon.IProgressProvider(ep).add_progress_listener(on_progress)
- print("Note: descriptor upload can take several minutes")
-
- port = yield ep.listen(server.Site(Simple()))
- print("Private key:\n{}".format(port.getHost().onion_key))
- hs = port.onion_service
- print("hs {}".format(hs))
- print("{}".format(hs.hostname))
- yield defer.Deferred() # wait forever
-
-
-task.react(main)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/txtorcon-19.1.0/examples/web_onion_service_ephemeral_keyfile.py
new/txtorcon-20.0.0/examples/web_onion_service_ephemeral_keyfile.py
--- old/txtorcon-19.1.0/examples/web_onion_service_ephemeral_keyfile.py
2018-10-02 23:19:23.000000000 +0200
+++ new/txtorcon-20.0.0/examples/web_onion_service_ephemeral_keyfile.py
1970-01-01 01:00:00.000000000 +0100
@@ -1,57 +0,0 @@
-#!/usr/bin/env python
-
-# This shows how to leverage the endpoints API to get a new hidden
-# service up and running quickly. You can pass along this API to your
-# users by accepting endpoint strings as per Twisted recommendations.
-#
-#
http://twistedmatrix.com/documents/current/core/howto/endpoints.html#maximizing-the-return-on-your-endpoint-investment
-#
-# note that only the progress-updates needs the "import txtorcon" --
-# you do still need it installed so that Twisted finds the endpoint
-# parser plugin but code without knowledge of txtorcon can still
-# launch a Tor instance using it. cool!
-
-from __future__ import print_function
-from twisted.internet import defer, task, endpoints
-from twisted.web import server, resource
-
-import txtorcon
-from txtorcon.util import default_control_port
-from txtorcon.onion import AuthBasic
-
-
-class Simple(resource.Resource):
- """
- A really simple Web site.
- """
- isLeaf = True
-
- def render_GET(self, request):
- return b"<html>Hello, world! I'm a single-hop hidden service!</html>"
-
-
[email protected]
-def main(reactor):
- tor = yield txtorcon.connect(
- reactor,
- endpoints.TCP4ClientEndpoint(reactor, "localhost", 9251),
- )
- ep = endpoints.serverFromString(
- reactor,
-
"onion:80:version=3:privateKeyFile=/home/mike/src/txtorcon/foodir/hs_ed25519_secret_key"
- )
-
- def on_progress(percent, tag, msg):
- print('%03d: %s' % (percent, msg))
- txtorcon.IProgressProvider(ep).add_progress_listener(on_progress)
- print("Note: descriptor upload can take several minutes")
-
- port = yield ep.listen(server.Site(Simple()))
- print("Private key:\n{}".format(port.getHost().onion_key))
- hs = port.onion_service
- print("hs {}".format(hs))
- print("{}".format(hs.hostname))
- yield defer.Deferred() # wait forever
-
-
-task.react(main)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/txtorcon-19.1.0/examples/web_onion_service_nonanonymous.py
new/txtorcon-20.0.0/examples/web_onion_service_nonanonymous.py
--- old/txtorcon-19.1.0/examples/web_onion_service_nonanonymous.py
2019-03-04 03:57:43.000000000 +0100
+++ new/txtorcon-20.0.0/examples/web_onion_service_nonanonymous.py
1970-01-01 01:00:00.000000000 +0100
@@ -1,56 +0,0 @@
-#!/usr/bin/env python
-
-# This shows how to leverage the endpoints API to get a new hidden
-# service up and running quickly. You can pass along this API to your
-# users by accepting endpoint strings as per Twisted recommendations.
-#
-#
http://twistedmatrix.com/documents/current/core/howto/endpoints.html#maximizing-the-return-on-your-endpoint-investment
-#
-# note that only the progress-updates needs the "import txtorcon" --
-# you do still need it installed so that Twisted finds the endpoint
-# parser plugin but code without knowledge of txtorcon can still
-# launch a Tor instance using it. cool!
-
-from __future__ import print_function
-from twisted.internet import defer, task, endpoints
-from twisted.web import server, resource
-
-import txtorcon
-from txtorcon.util import default_control_port
-
-
-class Simple(resource.Resource):
- """
- A really simple Web site.
- """
- isLeaf = True
-
- def render_GET(self, request):
- print("serving request")
- return b"<html>Hello, world! I'm a single-hop Onion Service!</html>"
-
-
[email protected]
-def main(reactor):
- tor = yield txtorcon.launch(
- reactor,
- progress_updates=print,
- non_anonymous_mode=True,
- data_directory="./tor_data",
- )
- print("{}".format(tor))
- hs = yield tor.create_filesystem_onion_service(
- [(80, 8787)],
- "./prop224_hs",
- version=3,
- )
- print("{}".format(hs))
-
- ep = endpoints.TCP4ServerEndpoint(reactor, 8787, interface="localhost")
- port = yield ep.listen(server.Site(Simple()))
- print("Site listening: {}".format(hs.hostname))
- print("Private key:\n{}".format(hs.private_key))
- yield defer.Deferred() # wait forever
-
-
-task.react(main)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/txtorcon-19.1.0/examples/web_onion_service_prop224_endpoints.py
new/txtorcon-20.0.0/examples/web_onion_service_prop224_endpoints.py
--- old/txtorcon-19.1.0/examples/web_onion_service_prop224_endpoints.py
2017-12-13 06:51:57.000000000 +0100
+++ new/txtorcon-20.0.0/examples/web_onion_service_prop224_endpoints.py
1970-01-01 01:00:00.000000000 +0100
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-
-# This shows how to leverage the endpoints API to get a new hidden
-# service up and running quickly. You can pass along this API to your
-# users by accepting endpoint strings as per Twisted recommendations.
-#
-#
http://twistedmatrix.com/documents/current/core/howto/endpoints.html#maximizing-the-return-on-your-endpoint-investment
-#
-# note that only the progress-updates needs the "import txtorcon" --
-# you do still need it installed so that Twisted finds the endpoint
-# parser plugin but code without knowledge of txtorcon can still
-# launch a Tor instance using it. cool!
-
-from __future__ import print_function
-from twisted.internet import defer, task, endpoints
-from twisted.web import server, resource
-
-import txtorcon
-from txtorcon.util import default_control_port
-
-
-class Simple(resource.Resource):
- """
- A really simple Web site.
- """
- isLeaf = True
-
- def render_GET(self, request):
- return b"<html>Hello, world! I'm a prop224 Onion Service!</html>"
-
-
[email protected]
-def main(reactor):
- tor = yield txtorcon.connect(
- reactor,
- endpoints.TCP4ClientEndpoint(reactor, "localhost", 9251),
- )
- print(default_control_port())
- ep = endpoints.serverFromString(reactor,
"onion:80:controlPort={port}:version=3".format(port=default_control_port()))
-
- def on_progress(percent, tag, msg):
- print('%03d: %s' % (percent, msg))
- txtorcon.IProgressProvider(ep).add_progress_listener(on_progress)
- print("Note: descriptor upload can take several minutes")
-
- port = yield ep.listen(server.Site(Simple()))
- print("Site listening: {}".format(port.getHost()))
- print("Private key:\n{}".format(port.getHost().onion_key))
- yield defer.Deferred() # wait forever
-
-
-task.react(main)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/txtorcon-19.1.0/examples/web_onion_service_prop224_endpoints_ephemeral.py
new/txtorcon-20.0.0/examples/web_onion_service_prop224_endpoints_ephemeral.py
---
old/txtorcon-19.1.0/examples/web_onion_service_prop224_endpoints_ephemeral.py
2018-06-19 04:34:31.000000000 +0200
+++
new/txtorcon-20.0.0/examples/web_onion_service_prop224_endpoints_ephemeral.py
1970-01-01 01:00:00.000000000 +0100
@@ -1,52 +0,0 @@
-#!/usr/bin/env python
-
-# This shows how to leverage the endpoints API to get a new hidden
-# service up and running quickly. You can pass along this API to your
-# users by accepting endpoint strings as per Twisted recommendations.
-#
-#
http://twistedmatrix.com/documents/current/core/howto/endpoints.html#maximizing-the-return-on-your-endpoint-investment
-#
-# note that only the progress-updates needs the "import txtorcon" --
-# you do still need it installed so that Twisted finds the endpoint
-# parser plugin but code without knowledge of txtorcon can still
-# launch a Tor instance using it. cool!
-
-from __future__ import print_function
-from twisted.internet import defer, task, endpoints
-from twisted.web import server, resource
-
-import txtorcon
-from txtorcon.util import default_control_port
-
-
-class Simple(resource.Resource):
- """
- A really simple Web site.
- """
- isLeaf = True
-
- def render_GET(self, request):
- return b"<html>Hello, world! I'm an ephemeral prop224 Onion
Service!</html>"
-
-
[email protected]
-def main(reactor):
- tor = yield txtorcon.connect(
- reactor,
- endpoints.TCP4ClientEndpoint(reactor, "localhost", 9251),
- )
-
- ep = tor.create_onion_endpoint(80, version=3)
-
- def on_progress(percent, tag, msg):
- print('%03d: %s' % (percent, msg))
- txtorcon.IProgressProvider(ep).add_progress_listener(on_progress)
- print("Note: descriptor upload can take several minutes")
-
- port = yield ep.listen(server.Site(Simple()))
- print("Site listening: {}".format(port.getHost()))
- print("Private key:\n{}".format(port.getHost().onion_key))
- yield defer.Deferred() # wait forever
-
-
-task.react(main)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/scripts/asciinema-demo0.py
new/txtorcon-20.0.0/scripts/asciinema-demo0.py
--- old/txtorcon-19.1.0/scripts/asciinema-demo0.py 2014-12-19
04:32:59.000000000 +0100
+++ new/txtorcon-20.0.0/scripts/asciinema-demo0.py 1970-01-01
01:00:00.000000000 +0100
@@ -1,84 +0,0 @@
-#!/usr/bin/env python
-
-# this is a hack-tacular script to pass to asciinema like:
-# asciinema -c ./asciinema-demo0.py rec
-# to script the show. as it were.
-
-import os
-import sys
-import time
-import random
-import colors
-import subprocess
-
-prompt = 'user@machine:~/src/txtorcon$ '
-
-def interkey_interval():
- "in milliseconds"
-# return 0
- return (random.lognormvariate(0.0, 0.5) * 30.0) / 1000.0
- return (float(random.randrange(10,50)) / 1000.0)
-
-def type_it_out(line):
- for c in line:
- sys.stdout.write(c)
- sys.stdout.flush()
- time.sleep(interkey_interval())
-
-def do_commands(lines):
- for line in lines:
- sys.stdout.write(colors.blue(prompt))
- type_it_out(line)
- time.sleep(0.5)
- print
- os.system(colors.strip_color(line))
-
-commands = []
-commands.append(colors.bold('export TMPDIR=/dev/shm'))
-commands.append(colors.red('# txtorcon + endpoints demo'))
-commands.append(colors.red('# we already checked out the code here'))
-commands.append(colors.red('# first, prepare a virtualenv'))
-commands.append(colors.bold('virtualenv txtorcon_demo'))
-commands.append('txtorcon_demo/bin/' + colors.bold(colors.white('pip install
-r requirements.txt')))
-
-commands.append(colors.red('# pick up txtorcon from our local Git checkout'))
-commands.append('export PYTHONPATH=`pwd`')
-
-commands.append(colors.red('# prepare example web content'))
-commands.append('mkdir -p example_website')
-commands.append('echo "hello, hidden-service world" >
example_website/index.html')
-commands.append('rm -f twistd.log')
-commands.append('txtorcon_demo/bin/' + colors.bold('twistd web ') +
colors.white('--port onion:80') + colors.bold(' --path example_website/'))
-
-commands.append(colors.red('# wait until Tor launches etc'))
-commands.append('tail twistd.log')
-commands.append(colors.red('# wait for a particular log message to appear'))
-commands.append('while ! grep "Started hidden service" twistd.log ; do sleep
1; done;')
-
-commands.append(colors.red('# save our new hidden service\'s keys'))
-commands.append('tail twistd.log')
-commands.append('mkdir hidserv_keys')
-commands.append(r'cp `grep "Keys are in " twistd.log | cut -d \" -f 2`/*
hidserv_keys')
-commands.append('ls hidserv_keys')
-commands.append('cat hidserv_keys/hostname')
-commands.append(colors.red("# now we've got a copy of the private key"))
-commands.append('tail twistd.log')
-
-commands.append(colors.red('# there we go, a new hidden-serivce.'))
-commands.append(colors.red('# now, what if we kill it and want to re-launch
with the same key/hostname?'))
-commands.append('kill `cat twistd.pid`')
-commands.append('rm twistd.log')
-commands.append('txtorcon_demo/bin/' + colors.bold('twistd web ') +
colors.white('--port onion:80' + colors.bold(':hiddenServiceDir=hidserv_keys'))
+ colors.bold(' --path example_website/'))
-commands.append('#
^^^^^^^^^^^^^^^^')
-commands.append('sleep 5')
-
-commands.append(colors.red('# remember, if anyone gets hold of private_key ' +
colors.bold(colors.green(colors.underline('they can BECOME your
hidden-service')))))
-commands.append(colors.red('# just as if you\'d completely lost control of
your DNS entries on "normal" internet'))
-commands.append('while ! grep "Started hidden service" twistd.log ; do sleep
1; done;')
-commands.append('tail twistd.log')
-commands.append(colors.bold('cat hidserv_keys/hostname'))
-commands.append(colors.green('# thanks for watching!'))
-commands.append(colors.bold(colors.white('#
https://github.com/meejah/txtorcon')))
-
-if __name__ == '__main__':
- do_commands(commands)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/scripts/asciinema-demo1.py
new/txtorcon-20.0.0/scripts/asciinema-demo1.py
--- old/txtorcon-19.1.0/scripts/asciinema-demo1.py 2016-04-06
06:25:47.000000000 +0200
+++ new/txtorcon-20.0.0/scripts/asciinema-demo1.py 1970-01-01
01:00:00.000000000 +0100
@@ -1,72 +0,0 @@
-#!/usr/bin/env python
-
-# this is a hack-tacular script to pass to asciinema like:
-# asciinema -c ./asciinema-demo1.py rec
-# to script the show. as it were.
-
-import os
-import sys
-import time
-import random
-import colors
-import subprocess
-
-prompt = 'user@machine:~/src$ '
-
-def interkey_interval():
- "in milliseconds"
-# return 0 # faster debugging
- return (random.lognormvariate(0.0, 0.5) * 30.0) / 1000.0
- return (float(random.randrange(10,50)) / 1000.0)
-
-def type_it_out(line):
- for c in line:
- sys.stdout.write(c)
- sys.stdout.flush()
- time.sleep(interkey_interval())
-
-def do_commands(lines):
- for line in lines:
- if callable(line):
- line()
- continue
- really_run = True
- if line.startswith('!'):
- really_run = False
- line = line[1:]
- sys.stdout.write(colors.blue(prompt))
- type_it_out(line)
- time.sleep(0.5)
- print
- if really_run:
- # XXX nice to have time-limit?
- os.system(colors.strip_color(line))
-
-def change_prompt(p):
- global prompt
- prompt = p
-
-commands = []
-commands.append(colors.bold('export TMPDIR=/dev/shm'))
-commands.append(colors.red('# see http://txtorcon.readthedocs.org'))
-commands.append('git clone https://github.com/meejah/txtorcon')
-commands.append(colors.bold('virtualenv venv'))
-commands.append('!' + colors.bold('source ./venv/bin/activate'))
-commands.append(lambda: change_prompt('(venv)user@machine:~/src/txtorcon$ '))
-commands.append(lambda: sys.path.insert(0, './venv/bin'))
-commands.append(colors.bold(colors.white('pip install --editable ./txtorcon')))
-commands.append('!' + colors.white('cd txtorcon'))
-commands.append(lambda: os.chdir('./txtorcon'))
-commands.append(lambda: change_prompt('user@machine:~/src/txtorcon$ '))
-commands.append('make coverage')
-#commands.append('python examples/add_hiddenservice_to_system_tor.py')
-commands.append(colors.red('# okay, lets try one of the examles'))
-commands.append('ls examples/')
-commands.append('python examples/dump_config.py | head')
-commands.append('python examples/hello_darkweb.py')
-commands.append(colors.red('# thanks for watching'))
-commands.append(colors.red('# https://github.com/meejah/txtorcon'))
-commands.append(colors.red('# https://txtorcon.readthedocs.org'))
-
-if __name__ == '__main__':
- do_commands(commands)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/test/profile_startup.py
new/txtorcon-20.0.0/test/profile_startup.py
--- old/txtorcon-19.1.0/test/profile_startup.py 2017-04-11 07:53:18.000000000
+0200
+++ new/txtorcon-20.0.0/test/profile_startup.py 1970-01-01 01:00:00.000000000
+0100
@@ -1,21 +0,0 @@
-#!/usr/bin/env python
-
-from time import time
-import cProfile
-import txtorcon
-
-proto = txtorcon.TorControlProtocol()
-state = txtorcon.TorState(proto)
-
-data = open('consensus', 'r').read()
-routers = 5494 # number of routers in above file
-iters = 5
-
-start = time()
-if False:
- cProfile.run('state._update_network_status(data)')
-else:
- for x in range(iters):
- state._update_network_status(data)
-diff = time() - start
-print("%fs: %f microdescriptors/second" % (diff, (routers * iters) / diff))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/test/test_util.py
new/txtorcon-20.0.0/test/test_util.py
--- old/txtorcon-19.1.0/test/test_util.py 2019-03-04 03:38:01.000000000
+0100
+++ new/txtorcon-20.0.0/test/test_util.py 2020-01-04 09:10:36.000000000
+0100
@@ -1,9 +1,10 @@
import os
import sys
import tempfile
+import ipaddress
from mock import patch
from unittest import skipIf
-import ipaddress
+from os.path import exists
from twisted.trial import unittest
from twisted.internet import defer
@@ -63,10 +64,14 @@
@skipIf('pypy' in sys.version.lower(), "No GeoIP in PyPy")
def test_return_geoip_object(self):
+ # requires a valid GeoIP database to work, so hopefully we're
+ # on Debian or similar...
+ fname = "/usr/share/GeoIP/GeoIP.dat"
+ if not exists(fname):
+ return
+
from txtorcon import util
- (fd, f) = tempfile.mkstemp()
- ret_val = util.create_geoip(f)
- delete_file_or_tree(f)
+ ret_val = util.create_geoip(fname)
self.assertEqual(type(ret_val).__name__, 'GeoIP')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/test/verify-release.py
new/txtorcon-20.0.0/test/verify-release.py
--- old/txtorcon-19.1.0/test/verify-release.py 2017-04-22 06:29:06.000000000
+0200
+++ new/txtorcon-20.0.0/test/verify-release.py 1970-01-01 01:00:00.000000000
+0100
@@ -1,58 +0,0 @@
-# this does the "download and verify release from web + hidden-service
-# machine" for txtorcon release-checklist.
-
-import sys
-import hashlib
-from os.path import join, split, exists
-
-import txtorcon
-
-from twisted.internet import defer, task
-from twisted.web.client import readBody
-from twisted.python.failure import Failure
-
-
[email protected]
[email protected]
-def main(reactor):
- if len(sys.argv) != 2:
- print('usage: {} <version>'.format(__file__))
- raise SystemExit(1)
- version = sys.argv[1]
- announce = join(split(__file__)[0], '..',
'release-announce-{}'.format(version))
- if not exists(announce):
- print('no announcement file: {}'.format(announce))
- raise SystemExit(2)
-
- sums = None
- with open(announce, 'r') as f:
- for line in f.readlines():
- if line.strip() == 'cat <<EOF | sha256sum --check':
- sums = []
- elif line.strip() == 'EOF':
- break
- elif sums is not None:
- checksum, fname = line.split()
- sums.append((checksum, split(fname)[1]))
-
- tor = yield txtorcon.connect(reactor)
- agent = tor.web_agent()
-
- for sha256, fname in sums:
- print("Verifying '{}'".format(fname))
- uri = b'http://timaq4ygg2iegci7.onion/' + fname.encode('ascii')
- try:
- resp = yield agent.request(b'GET', uri)
- except Exception:
- print(Failure())
- raise
- data = yield readBody(resp)
- print('data: {} {}'.format(type(data), len(data)))
- hasher = hashlib.new('sha256')
- hasher.update(data)
- alleged_sum = hasher.hexdigest()
- if alleged_sum != sha256:
- print("Checksum mismatch:")
- print("wanted: {}".format(sha256))
- print(" got: {}".format(alleged_sum))
- raise SystemExit(45)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/txtorcon/_metadata.py
new/txtorcon-20.0.0/txtorcon/_metadata.py
--- old/txtorcon-19.1.0/txtorcon/_metadata.py 2019-09-10 08:50:22.000000000
+0200
+++ new/txtorcon-20.0.0/txtorcon/_metadata.py 2020-03-31 04:43:59.000000000
+0200
@@ -1,4 +1,4 @@
-__version__ = '19.1.0'
+__version__ = '20.0.0'
__author__ = 'meejah'
__contact__ = '[email protected]'
__url__ = 'https://github.com/meejah/txtorcon'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/txtorcon/controller.py
new/txtorcon-20.0.0/txtorcon/controller.py
--- old/txtorcon-19.1.0/txtorcon/controller.py 2019-03-11 01:37:39.000000000
+0100
+++ new/txtorcon-20.0.0/txtorcon/controller.py 2020-01-04 08:13:25.000000000
+0100
@@ -11,8 +11,11 @@
import tempfile
import functools
from io import StringIO
-from collections import Sequence
from os.path import dirname, exists
+try:
+ from collections.abc import Sequence
+except ImportError:
+ from collections import Sequence
from twisted.python import log
from twisted.python.failure import Failure
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/txtorcon/torconfig.py
new/txtorcon-20.0.0/txtorcon/torconfig.py
--- old/txtorcon-19.1.0/txtorcon/torconfig.py 2019-03-04 03:38:01.000000000
+0100
+++ new/txtorcon-20.0.0/txtorcon/torconfig.py 2020-01-04 08:13:25.000000000
+0100
@@ -10,8 +10,11 @@
import functools
import warnings
from io import StringIO
-from collections import OrderedDict
from warnings import warn
+try:
+ from collections.abc import OrderedDict
+except ImportError:
+ from collections import OrderedDict
from twisted.python import log
from twisted.python.compat import nativeString
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/txtorcon/torstate.py
new/txtorcon-20.0.0/txtorcon/torstate.py
--- old/txtorcon-19.1.0/txtorcon/torstate.py 2019-06-15 08:32:36.000000000
+0200
+++ new/txtorcon-20.0.0/txtorcon/torstate.py 2020-02-06 22:56:18.000000000
+0100
@@ -4,10 +4,13 @@
from __future__ import print_function
from __future__ import with_statement
-import collections
import os
import stat
import warnings
+try:
+ from collections.abc import Callable
+except ImportError:
+ from collections import Callable
from twisted.internet import defer
from twisted.python.failure import Failure
@@ -115,11 +118,11 @@
)
if build_state:
d.addCallback(build_state
- if isinstance(build_state, collections.Callable)
+ if isinstance(build_state, Callable)
else _build_state)
elif wait_for_proto:
d.addCallback(wait_for_proto
- if isinstance(wait_for_proto, collections.Callable)
+ if isinstance(wait_for_proto, Callable)
else _wait_for_proto)
return d
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/txtorcon.egg-info/PKG-INFO
new/txtorcon-20.0.0/txtorcon.egg-info/PKG-INFO
--- old/txtorcon-19.1.0/txtorcon.egg-info/PKG-INFO 2019-09-10
08:50:32.000000000 +0200
+++ new/txtorcon-20.0.0/txtorcon.egg-info/PKG-INFO 2020-04-01
04:56:34.000000000 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: txtorcon
-Version: 19.1.0
+Version: 20.0.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
@@ -51,7 +51,7 @@
- **code**: https://github.com/meejah/txtorcon
- ``torsocks git clone git://timaq4ygg2iegci7.onion/txtorcon.git``
- MIT-licensed;
- - Python 2.7, PyPy 5.0.0+, Python 3.4+;
+ - Python 2.7, PyPy 5.0.0+, Python 3.5+;
- depends on
`Twisted`_,
`Automat <https://github.com/glyph/automat>`_,
@@ -79,53 +79,59 @@
---------------------------------------
`download <examples/readme.py>`_
- (also `python3 style <examples/readme3.py>`_)
+ (also `python2 style <examples/readme2.py>`_)
.. code:: python
from twisted.internet.task import react
- from twisted.internet.defer import inlineCallbacks
+ from twisted.internet.defer import inlineCallbacks, ensureDeferred
from twisted.internet.endpoints import UNIXClientEndpoint
+
import treq
import txtorcon
- @react
- @inlineCallbacks
- def main(reactor):
- tor = yield txtorcon.connect(
+
+ async def main(reactor):
+ tor = await txtorcon.connect(
reactor,
UNIXClientEndpoint(reactor, "/var/run/tor/control")
)
print("Connected to Tor version {}".format(tor.version))
- url = 'https://www.torproject.org:443'
- print("Downloading {}".format(url))
- resp = yield treq.get(url, agent=tor.web_agent())
-
- print(" {} bytes".format(resp.length))
- data = yield resp.text()
- print("Got {} bytes:\n{}\n[...]{}".format(
+ url = u'https://www.torproject.org:443'
+ print(u"Downloading {}".format(repr(url)))
+ resp = await treq.get(url, agent=tor.web_agent())
+
+ print(u" {} bytes".format(resp.length))
+ data = await resp.text()
+ print(u"Got {} bytes:\n{}\n[...]{}".format(
len(data),
data[:120],
data[-120:],
))
- print("Creating a circuit")
- state = yield tor.create_state()
- circ = yield state.build_circuit()
- yield circ.when_built()
- print(" path: {}".format(" -> ".join([r.ip for r in
circ.path])))
-
- print("Downloading meejah's public key via above circuit...")
- resp = yield treq.get(
- 'https://meejah.ca/meejah.asc',
- agent=circ.web_agent(reactor,
tor.config.socks_endpoint(reactor)),
+ print(u"Creating a circuit")
+ state = await tor.create_state()
+ circ = await state.build_circuit()
+ await circ.when_built()
+ print(u" path: {}".format(" -> ".join([r.ip for r in
circ.path])))
+
+ print(u"Downloading meejah's public key via above circuit...")
+ config = await tor.get_config()
+ resp = await treq.get(
+ u'https://meejah.ca/meejah.asc',
+ agent=circ.web_agent(reactor,
config.socks_endpoint(reactor)),
)
- data = yield resp.text()
+ data = await resp.text()
print(data)
+ @react
+ def _main(reactor):
+ return ensureDeferred(main(reactor))
+
+
Try It Now On Debian/Ubuntu
---------------------------
@@ -135,7 +141,7 @@
.. code-block:: shell-session
- $ sudo apt-get install --install-suggests python-txtorcon
+ $ sudo apt-get install --install-suggests python3-txtorcon
$ twistd -n web --port "onion:80" --path ~/public_html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/txtorcon.egg-info/SOURCES.txt
new/txtorcon-20.0.0/txtorcon.egg-info/SOURCES.txt
--- old/txtorcon-19.1.0/txtorcon.egg-info/SOURCES.txt 2019-09-10
08:50:32.000000000 +0200
+++ new/txtorcon-20.0.0/txtorcon.egg-info/SOURCES.txt 2020-04-01
04:56:34.000000000 +0200
@@ -46,7 +46,6 @@
docs/_themes/alabaster/static/alabaster.css_t
docs/_themes/alabaster/static/pygments.css
examples/close_all_circuits.py
-examples/config.py
examples/connect.py
examples/disallow_streams_by_port.py
examples/dns_lookups.py
@@ -59,37 +58,26 @@
examples/launch_tor_with_simplehttpd.py
examples/minimal_endpoint.py
examples/monitor.py
-examples/monitor_compose.py
examples/readme.py
-examples/readme3.py
+examples/readme2.py
examples/stem_relay_descriptor.py
examples/stream_circuit_logger.py
examples/tor_info.py
examples/txtorcon.tac
-examples/wait_newconsensus.py
examples/web_client.py
examples/web_client_authenticated.py
-examples/web_client_authenticated_py3.py
examples/web_client_custom_circuit.py
examples/web_client_treq.py
examples/web_onion_service_aiohttp.py
examples/web_onion_service_endpoints.py
-examples/web_onion_service_ephemeral.py
examples/web_onion_service_ephemeral_auth.py
-examples/web_onion_service_ephemeral_keyfile.py
examples/web_onion_service_ephemeral_nonanon.py
examples/web_onion_service_ephemeral_unix.py
examples/web_onion_service_filesystem.py
-examples/web_onion_service_nonanonymous.py
examples/web_onion_service_prop224.py
-examples/web_onion_service_prop224_endpoints.py
-examples/web_onion_service_prop224_endpoints_ephemeral.py
examples/web_onion_service_prop224_endpoints_file.py
examples/webui_server.py
-scripts/asciinema-demo0.py
-scripts/asciinema-demo1.py
test/__init__.py
-test/profile_startup.py
test/py3_test_controller.py
test/py3_torstate.py
test/test_addrmap.py
@@ -112,7 +100,6 @@
test/test_util_imports.py
test/test_web.py
test/util.py
-test/verify-release.py
twisted/plugins/txtorcon_endpoint_parser.py
txtorcon/__init__.py
txtorcon/_metadata.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/txtorcon-19.1.0/txtorcon.egg-info/requires.txt
new/txtorcon-20.0.0/txtorcon.egg-info/requires.txt
--- old/txtorcon-19.1.0/txtorcon.egg-info/requires.txt 2019-09-10
08:50:32.000000000 +0200
+++ new/txtorcon-20.0.0/txtorcon.egg-info/requires.txt 2020-04-01
04:56:34.000000000 +0200
@@ -9,7 +9,7 @@
[dev]
tox
-coverage
+coverage<5.0
cuvner
setuptools>=0.8.0
Sphinx