Compare commits
52 Commits
e3d06ff0f5
...
61051d5711
Author | SHA1 | Date |
---|---|---|
Kevin F | 61051d5711 | |
Kevin F | 59ad2731ba | |
Kevin F | 560a20e90a | |
Kevin F | ce3a548c70 | |
Kevin F | 8712a1c401 | |
Kevin F | 8511fb42b6 | |
Kevin F | 9eb2e5d413 | |
Kevin F | 39c01fdbc5 | |
Kevin F | 7bcef03592 | |
Kevin F | 2b224cae84 | |
Kevin F | 7895442b51 | |
Kevin F | 474ef21163 | |
Kevin F | 8e35a79864 | |
Kevin F | 8e730cef98 | |
Kevin F | 738fa0c361 | |
Kevin F | b3eb0caffd | |
Kevin F | 446662cc60 | |
Kevin F | 180116a55d | |
Kevin F | bc3d6571bb | |
Kevin F | 30d50ceacf | |
Kevin F | e84ad93de7 | |
Kevin F | 84e16e5b82 | |
Kevin F | cd3a7cd7b2 | |
Kevin F | 24e0157e15 | |
Kevin F | c2db671a85 | |
Kevin F | 9501d73546 | |
Kevin F | 4572f255fb | |
Kevin F | 20393a547e | |
Kevin F | 015a072b0b | |
Kevin F | 5ae5897703 | |
Kevin F | e9efffff34 | |
Kevin F | 2eea681e98 | |
Kevin F | 3852b15c89 | |
Kevin F | 3643e4f8d7 | |
Kevin F | 8676a18c87 | |
Kevin F | 97d8662f15 | |
Kevin F | a517ad3aee | |
Kevin F | d915a2aaed | |
Kevin F | 25e705c0b2 | |
Kevin F | 6f3e5aebd9 | |
Kevin F | 584bc6b73f | |
Kevin F | 171ea25f46 | |
Kevin F | 2c9836c54f | |
Kevin F | a036c1839f | |
Kevin F | 6ad36bf4e5 | |
Kevin F | cdeaa403af | |
Kevin F | fae9521d8f | |
Kevin F | 05e04ef557 | |
Kevin F | 5bb43326e7 | |
Kevin F | 9058f7bee5 | |
Kevin F | 08d8fda857 | |
Kevin F | 650e943182 |
12
AUTHORS.MD
12
AUTHORS.MD
|
@ -1,12 +0,0 @@
|
|||
# Incomplete List of Contributors
|
||||
|
||||
Onionr is created by a team of hard working volunteers.
|
||||
|
||||
In no order of importance, these people make Onionr happen:
|
||||
|
||||
* [Beardog (Kevin Froman)](https://www.chaoswebs.net/) - Project founder, owner and core developer
|
||||
* [InvisaMage](https://invisamage.com/) - Web UI Bulma design
|
||||
* [Arinerron](https://arinerron.com/) - Logger and config modules, testing and other contributions
|
||||
* [Anhar Ismail](https://github.com/anharismail) - Created Onionr's logo
|
||||
|
||||
+ Other contributors and testers
|
|
@ -1,4 +1,4 @@
|
|||
FROM python:3.7
|
||||
FROM python:3.10
|
||||
EXPOSE 8080
|
||||
|
||||
USER root
|
||||
|
@ -15,7 +15,7 @@ RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
|
|||
locale-gen
|
||||
ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8
|
||||
|
||||
ADD ./requirements.txt /app/requirements.txt
|
||||
ADD ./requirements-x86-all-plugins.txt /app/requirements.txt
|
||||
RUN pip3 install --require-hashes -r requirements.txt
|
||||
|
||||
#Add Onionr source
|
||||
|
@ -28,4 +28,4 @@ RUN chmod g=u -R /app
|
|||
USER 1000
|
||||
ENV HOME=/app
|
||||
|
||||
CMD ["bash", "./run-onionr-node.sh"]
|
||||
CMD ["bash", "./onionr.sh", "start"]
|
||||
|
|
|
@ -88,9 +88,9 @@ Master may be unstable, you should use the latest release tag. (checkout via git
|
|||
* You may need build-essentials or the equivalent of your platform
|
||||
* Clone the git repo: `$ git clone https://gitlab.com/beardog/onionr --tags`
|
||||
* cd into install direction: `$ cd onionr/`
|
||||
* Install the Python dependencies ([virtualenv strongly recommended](https://virtualenv.pypa.io/en/stable/userguide/)): `$ pip3 install --require-hashes -r requirements.txt`
|
||||
* Install the Python dependencies ([virtualenv strongly recommended](https://virtualenv.pypa.io/en/stable/userguide/)): `$ pip3 install --require-hashes -r requirements-x86-all-plugins.txt`
|
||||
|
||||
Require-hashes is suggested for security but is optional. The hashes are not correct for ARM machines.
|
||||
Require-hashes is suggested for supply-chain security but is optional. The hashes are not correct for ARM machines. If you are just running a node or want a bare-bones install you can use requirements-base-x86.txt and selectively install the requirements.txt files in static-data/official-plugins/ subdirectories
|
||||
|
||||
## Run Onionr
|
||||
|
||||
|
|
|
@ -1,13 +1,8 @@
|
|||
PyNaCl==1.5.0
|
||||
PySocks==1.7.1
|
||||
stem==1.8.0
|
||||
unpaddedbase32==0.2.0
|
||||
niceware==0.2.1
|
||||
psutil==5.9.1
|
||||
filenuke==0.0.0
|
||||
ujson==5.4.0
|
||||
cffi==1.15.1
|
||||
onionrblocks==7.0.0
|
||||
ordered-set==4.1.0
|
||||
cherrypy==18.8.0
|
||||
json-rpc==1.13.0
|
|
@ -1,124 +0,0 @@
|
|||
# Onionr HTTP API
|
||||
|
||||
All HTTP interfaces in the Onionr reference client use the [Flask](http://flask.pocoo.org/) web framework with the [gevent](http://www.gevent.org/) WSGI server.
|
||||
|
||||
## Client & Public difference
|
||||
|
||||
The client API server is a locked down interface intended for authenticated local communication.
|
||||
|
||||
The public API server is available only remotely from Tor & I2P. It is the interface in which peers use to communicate with one another.
|
||||
|
||||
# Client API
|
||||
|
||||
Please note: endpoints that simply provide static web app files are not documented here.
|
||||
|
||||
* /serviceactive/pubkey
|
||||
- Methods: GET
|
||||
- Returns true or false based on if a given public key has an active direct connection service.
|
||||
* /queueResponseAdd/key (DEPRECATED)
|
||||
- Methods: POST
|
||||
- Accepts form key 'data' to set queue response information from a plugin
|
||||
- Returns success if no error occurs
|
||||
* /queueResponse/key (DEPRECATED)
|
||||
- Methods: GET
|
||||
- Returns the queue response for a key. Returns failure with a 404 code if a code is not set.
|
||||
* /ping
|
||||
- Methods: GET
|
||||
- Returns "pong!"
|
||||
* /getblocksbytype/type
|
||||
- Methods: GET
|
||||
- Returns a list of stored blocks by a given type
|
||||
* /getblockbody/hash
|
||||
- Methods: GET
|
||||
- Returns the main data section of a block
|
||||
* /getblockdata/hash
|
||||
- Methods: GET
|
||||
- Returns the entire data contents of a block, including metadata.
|
||||
* /getblockheader/hash
|
||||
- Methods: GET
|
||||
- Returns the header (metadata section) of a block.
|
||||
* /gethidden/
|
||||
- Methods: GET
|
||||
- Returns line separated list of hidden blocks
|
||||
* /hitcount
|
||||
- Methods: GET
|
||||
- Return the amount of requests the public api server has received this session
|
||||
* /lastconnect
|
||||
- Methods: GET
|
||||
- Returns the epoch timestamp of when the last incoming connection to the public API server was logged
|
||||
* /site/hash
|
||||
- Methods: GET
|
||||
- Returns HTML content out of a block
|
||||
* /waitforshare/hash
|
||||
- Methods: POST
|
||||
- Prevents the public API server from listing or sharing a block until it has been uploaded to at least 1 peer.
|
||||
* /shutdown
|
||||
- Methods: GET
|
||||
- Shutdown Onionr. You should probably use /shutdownclean instead.
|
||||
* /shutdownclean
|
||||
- Methods: GET
|
||||
- Tells the communicator daemon to shutdown Onionr. Slower but cleaner.
|
||||
* /getstats
|
||||
- Methods: GET
|
||||
- Returns some JSON serialized statistics
|
||||
* /getuptime
|
||||
- Methods: GET
|
||||
- Returns uptime in seconds
|
||||
* /getActivePubkey
|
||||
- Methods: GET
|
||||
- Returns the current active public key in base32 format
|
||||
* /getHumanReadable/pubkey
|
||||
- Methods: GET
|
||||
- Echos the specified public key in mnemonic format
|
||||
* /insertblock
|
||||
- Methods: POST
|
||||
- Accepts JSON data for creating a new block. 'message' contains the block data, 'to' specifies the peer's public key to encrypt the data to, 'sign' is a boolean for signing the message.
|
||||
* /torready
|
||||
- Methods: POST
|
||||
- Returns boolean if Tor is started or not
|
||||
|
||||
# Public API
|
||||
|
||||
v0
|
||||
|
||||
* /
|
||||
- Methods: GET
|
||||
- Returns a basic HTML informational banner describing Onionr.
|
||||
* /getblocklist
|
||||
- Methods: GET
|
||||
- URI Parameters:
|
||||
- date: unix epoch timestamp for offset
|
||||
- Returns a list of block hashes stored on the node since an offset (all blocks if no timestamp is specified)
|
||||
* /getdata/block-hash
|
||||
- Methods: GET
|
||||
- Returns data for a block based on a provided hash
|
||||
* /www/file-path
|
||||
- Methods: GET
|
||||
- Returns file data. Intended for manually sharing file data directly from an Onionr node.
|
||||
* /ping
|
||||
- Methods: GET
|
||||
- Returns 'pong!'
|
||||
* /pex
|
||||
- Methods: GET
|
||||
- Returns a list of peer addresses reached within recent time
|
||||
* /announce
|
||||
- Methods: POST
|
||||
- Accepts form data for 'node' (valid node address) and 'random' which is a nonce when hashed (blake2b_256) in the format `hash(peerAddress+serverAddress+nonce)`, begins with at least 5 zeros.
|
||||
- Returns 200 with 'Success' if no error occurs. If the post is invalid, 'failure' with code 406 is returned.
|
||||
* /upload
|
||||
- Methods: POST
|
||||
- Accepts form data for 'block' as a 'file' upload.
|
||||
- Returns 200 with 'success' if no error occurs. If the block cannot be accepted, 'failure' with 400 is returned.
|
||||
|
||||
# Direct Connection API
|
||||
|
||||
These are constant endpoints available on direct connection servers. Plugin endpoints for direct connections are not documented here.
|
||||
|
||||
* /ping
|
||||
- Methods: GET
|
||||
- Returns 200 with 'pong!'
|
||||
|
||||
* /close
|
||||
- Methods: GET
|
||||
- Kills the direct connection server, destroying the onion address.
|
||||
- Returns 200 with 'goodbye'
|
|
@ -2,6 +2,8 @@
|
|||
ORIG_ONIONR_RUN_DIR=`pwd`
|
||||
export ORIG_ONIONR_RUN_DIR
|
||||
export PYTHONDONTWRITEBYTECODE=1
|
||||
export PYTHONUNBUFFERED=1
|
||||
export PYTHONOPTIMIZE="true"
|
||||
cd "$(dirname "$0")"
|
||||
cd src
|
||||
./__init__.py "$@"
|
|
@ -0,0 +1,270 @@
|
|||
#
|
||||
# This file is autogenerated by pip-compile with python 3.10
|
||||
# To update, run:
|
||||
#
|
||||
# pip-compile --generate-hashes --output-file=requirements-base-x86.txt requirements-base.in
|
||||
#
|
||||
cffi==1.15.1 \
|
||||
--hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \
|
||||
--hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \
|
||||
--hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \
|
||||
--hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \
|
||||
--hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \
|
||||
--hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \
|
||||
--hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \
|
||||
--hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \
|
||||
--hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \
|
||||
--hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \
|
||||
--hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \
|
||||
--hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \
|
||||
--hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \
|
||||
--hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \
|
||||
--hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \
|
||||
--hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \
|
||||
--hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \
|
||||
--hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \
|
||||
--hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \
|
||||
--hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \
|
||||
--hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \
|
||||
--hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \
|
||||
--hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \
|
||||
--hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \
|
||||
--hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \
|
||||
--hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \
|
||||
--hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \
|
||||
--hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \
|
||||
--hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \
|
||||
--hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \
|
||||
--hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \
|
||||
--hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \
|
||||
--hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \
|
||||
--hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \
|
||||
--hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \
|
||||
--hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \
|
||||
--hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \
|
||||
--hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \
|
||||
--hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \
|
||||
--hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \
|
||||
--hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \
|
||||
--hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \
|
||||
--hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \
|
||||
--hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \
|
||||
--hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \
|
||||
--hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \
|
||||
--hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \
|
||||
--hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \
|
||||
--hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \
|
||||
--hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \
|
||||
--hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \
|
||||
--hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \
|
||||
--hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \
|
||||
--hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \
|
||||
--hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \
|
||||
--hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \
|
||||
--hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \
|
||||
--hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \
|
||||
--hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \
|
||||
--hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \
|
||||
--hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \
|
||||
--hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \
|
||||
--hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \
|
||||
--hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0
|
||||
# via pynacl
|
||||
filenuke==0.0.0 \
|
||||
--hash=sha256:147011c0125121469cae0a8a7f4df399f470e54aa29a08f2d2c099bf0118dcee \
|
||||
--hash=sha256:c55535dcecfdb27c5f4ce664d46e115950b5429763b5db75c198053646177f8f
|
||||
# via -r requirements-base.in
|
||||
kasten==3.0.0 \
|
||||
--hash=sha256:52894af46d6e1339f0d5fa8961892b292f99176848bce11877fe4a435b6782e5 \
|
||||
--hash=sha256:b22ebdc5f475c2ef9ab74abc36552add0b37732a7ce2be6bd7977ee41b2163b4
|
||||
# via onionrblocks
|
||||
mimcvdf==1.2.1 \
|
||||
--hash=sha256:7c837c46cfb9dce4ba895bc706a69646d4d5185c66aeaa333b5cfaa9a7d06dc4
|
||||
# via kasten
|
||||
msgpack==1.0.4 \
|
||||
--hash=sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467 \
|
||||
--hash=sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae \
|
||||
--hash=sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92 \
|
||||
--hash=sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef \
|
||||
--hash=sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624 \
|
||||
--hash=sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227 \
|
||||
--hash=sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88 \
|
||||
--hash=sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9 \
|
||||
--hash=sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8 \
|
||||
--hash=sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd \
|
||||
--hash=sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6 \
|
||||
--hash=sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55 \
|
||||
--hash=sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e \
|
||||
--hash=sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2 \
|
||||
--hash=sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44 \
|
||||
--hash=sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6 \
|
||||
--hash=sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9 \
|
||||
--hash=sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab \
|
||||
--hash=sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae \
|
||||
--hash=sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa \
|
||||
--hash=sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9 \
|
||||
--hash=sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e \
|
||||
--hash=sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250 \
|
||||
--hash=sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce \
|
||||
--hash=sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075 \
|
||||
--hash=sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236 \
|
||||
--hash=sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae \
|
||||
--hash=sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e \
|
||||
--hash=sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f \
|
||||
--hash=sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08 \
|
||||
--hash=sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6 \
|
||||
--hash=sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d \
|
||||
--hash=sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43 \
|
||||
--hash=sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1 \
|
||||
--hash=sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6 \
|
||||
--hash=sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0 \
|
||||
--hash=sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c \
|
||||
--hash=sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff \
|
||||
--hash=sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db \
|
||||
--hash=sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243 \
|
||||
--hash=sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661 \
|
||||
--hash=sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba \
|
||||
--hash=sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e \
|
||||
--hash=sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb \
|
||||
--hash=sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52 \
|
||||
--hash=sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6 \
|
||||
--hash=sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1 \
|
||||
--hash=sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f \
|
||||
--hash=sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da \
|
||||
--hash=sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f \
|
||||
--hash=sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c \
|
||||
--hash=sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8
|
||||
# via kasten
|
||||
onionrblocks==7.0.0 \
|
||||
--hash=sha256:53e90964371076d9daf2ed0790b21f174ef3321f4f1808209cc6dd9b7ff6d8ff \
|
||||
--hash=sha256:54af28d0be856209525646c4ef9f977f95f0ae1329b2cc023b351317c9d0eef7
|
||||
# via -r requirements-base.in
|
||||
ordered-set==4.1.0 \
|
||||
--hash=sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562 \
|
||||
--hash=sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8
|
||||
# via -r requirements-base.in
|
||||
psutil==5.9.3 \
|
||||
--hash=sha256:07d880053c6461c9b89cd5d4808f3b8336665fa3acdefd6777662c5ed73a851a \
|
||||
--hash=sha256:12500d761ac091f2426567f19f95fd3f15a197d96befb44a5c1e3cbe6db5752c \
|
||||
--hash=sha256:1b540599481c73408f6b392cdffef5b01e8ff7a2ac8caae0a91b8222e88e8f1e \
|
||||
--hash=sha256:35feafe232d1aaf35d51bd42790cbccb882456f9f18cdc411532902370d660df \
|
||||
--hash=sha256:3a7826e68b0cf4ce2c1ee385d64eab7d70e3133171376cac53d7c1790357ec8f \
|
||||
--hash=sha256:46907fa62acaac364fff0b8a9da7b360265d217e4fdeaca0a2397a6883dffba2 \
|
||||
--hash=sha256:4bd4854f0c83aa84a5a40d3b5d0eb1f3c128f4146371e03baed4589fe4f3c931 \
|
||||
--hash=sha256:538fcf6ae856b5e12d13d7da25ad67f02113c96f5989e6ad44422cb5994ca7fc \
|
||||
--hash=sha256:547ebb02031fdada635452250ff39942db8310b5c4a8102dfe9384ee5791e650 \
|
||||
--hash=sha256:5e8b50241dd3c2ed498507f87a6602825073c07f3b7e9560c58411c14fe1e1c9 \
|
||||
--hash=sha256:5fa88e3d5d0b480602553d362c4b33a63e0c40bfea7312a7bf78799e01e0810b \
|
||||
--hash=sha256:68fa227c32240c52982cb931801c5707a7f96dd8927f9102d6c7771ea1ff5698 \
|
||||
--hash=sha256:6ced1ad823ecfa7d3ce26fe8aa4996e2e53fb49b7fed8ad81c80958501ec0619 \
|
||||
--hash=sha256:71b1206e7909792d16933a0d2c1c7f04ae196186c51ba8567abae1d041f06dcb \
|
||||
--hash=sha256:767ef4fa33acda16703725c0473a91e1832d296c37c63896c7153ba81698f1ab \
|
||||
--hash=sha256:7ccfcdfea4fc4b0a02ca2c31de7fcd186beb9cff8207800e14ab66f79c773af6 \
|
||||
--hash=sha256:7e4939ff75149b67aef77980409f156f0082fa36accc475d45c705bb00c6c16a \
|
||||
--hash=sha256:828c9dc9478b34ab96be75c81942d8df0c2bb49edbb481f597314d92b6441d89 \
|
||||
--hash=sha256:8a4e07611997acf178ad13b842377e3d8e9d0a5bac43ece9bfc22a96735d9a4f \
|
||||
--hash=sha256:941a6c2c591da455d760121b44097781bc970be40e0e43081b9139da485ad5b7 \
|
||||
--hash=sha256:9a4af6ed1094f867834f5f07acd1250605a0874169a5fcadbcec864aec2496a6 \
|
||||
--hash=sha256:9ec296f565191f89c48f33d9544d8d82b0d2af7dd7d2d4e6319f27a818f8d1cc \
|
||||
--hash=sha256:9ec95df684583b5596c82bb380c53a603bb051cf019d5c849c47e117c5064395 \
|
||||
--hash=sha256:a04a1836894c8279e5e0a0127c0db8e198ca133d28be8a2a72b4db16f6cf99c1 \
|
||||
--hash=sha256:a3d81165b8474087bb90ec4f333a638ccfd1d69d34a9b4a1a7eaac06648f9fbe \
|
||||
--hash=sha256:b4a247cd3feaae39bb6085fcebf35b3b8ecd9b022db796d89c8f05067ca28e71 \
|
||||
--hash=sha256:ba38cf9984d5462b506e239cf4bc24e84ead4b1d71a3be35e66dad0d13ded7c1 \
|
||||
--hash=sha256:beb57d8a1ca0ae0eb3d08ccaceb77e1a6d93606f0e1754f0d60a6ebd5c288837 \
|
||||
--hash=sha256:d266cd05bd4a95ca1c2b9b5aac50d249cf7c94a542f47e0b22928ddf8b80d1ef \
|
||||
--hash=sha256:d8c3cc6bb76492133474e130a12351a325336c01c96a24aae731abf5a47fe088 \
|
||||
--hash=sha256:db8e62016add2235cc87fb7ea000ede9e4ca0aa1f221b40cef049d02d5d2593d \
|
||||
--hash=sha256:e7507f6c7b0262d3e7b0eeda15045bf5881f4ada70473b87bc7b7c93b992a7d7 \
|
||||
--hash=sha256:ed15edb14f52925869250b1375f0ff58ca5c4fa8adefe4883cfb0737d32f5c02 \
|
||||
--hash=sha256:f57d63a2b5beaf797b87024d018772439f9d3103a395627b77d17a8d72009543 \
|
||||
--hash=sha256:fa5e32c7d9b60b2528108ade2929b115167fe98d59f89555574715054f50fa31 \
|
||||
--hash=sha256:fe79b4ad4836e3da6c4650cb85a663b3a51aef22e1a829c384e18fae87e5e727
|
||||
# via -r requirements-base.in
|
||||
pycparser==2.21 \
|
||||
--hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \
|
||||
--hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206
|
||||
# via cffi
|
||||
pynacl==1.5.0 \
|
||||
--hash=sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858 \
|
||||
--hash=sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d \
|
||||
--hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 \
|
||||
--hash=sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1 \
|
||||
--hash=sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 \
|
||||
--hash=sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff \
|
||||
--hash=sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba \
|
||||
--hash=sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394 \
|
||||
--hash=sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b \
|
||||
--hash=sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543
|
||||
# via onionrblocks
|
||||
result==0.8.0 \
|
||||
--hash=sha256:c48c909e92181a075ba358228a3fe161e26d205dad416ad81f27f23515a5626d \
|
||||
--hash=sha256:d6a6258f32c057a4e0478999c6ce43dcadaf8ea435f58ac601ae2768f93ef243
|
||||
# via -r requirements-base.in
|
||||
ujson==5.5.0 \
|
||||
--hash=sha256:0762a4fdf86e01f3f8d8b6b7158d01fdd870799ff3f402b676e358fcd879e7eb \
|
||||
--hash=sha256:10095160dbe6bba8059ad6677a01da251431f4c68041bf796dcac0956b34f8f7 \
|
||||
--hash=sha256:1a485117f97312bef45f5d79d2ff97eff4da503b8a04f3691f59d31141686459 \
|
||||
--hash=sha256:1cef44ea4973344baed3d50a5da4a8843de3a6af7dea7fadf0a594e53ce5892f \
|
||||
--hash=sha256:1dc2f46c31ef22b0aaa28cd71be897bea271e700636658d573df9c43c49ebbd0 \
|
||||
--hash=sha256:21678d7e068707e4d54bdfeb8c250ebc548b51e499aed778b22112ca31a79669 \
|
||||
--hash=sha256:278aa9d7cb56435c96d19f5d702e026bcf69f824e24b41e9b52706abd3565837 \
|
||||
--hash=sha256:2ab011e3556a9a1d9461bd686870c527327765ed02fe53550531d6609a8a33ff \
|
||||
--hash=sha256:2d90414e3b4b44b39825049185959488e084ea7fcaf6124afd5c00893938b09d \
|
||||
--hash=sha256:2e506ecf89b6b9d304362ccef770831ec242a52c89dab1b4aabf1ab0eb1d5ed6 \
|
||||
--hash=sha256:33cd9084fefc74cbacf88c92fd260b61211e00bcde38d640c369e5dc34a2b4e1 \
|
||||
--hash=sha256:3b74467564814fbce322427a5664e6bcc7dae6dbc8acbef76300fe43ca4072ab \
|
||||
--hash=sha256:3f3f4240d99d55eb97cb012e9adf401f5ed9cd827af0341ac44603832202b0d2 \
|
||||
--hash=sha256:3fe1aea596f9539fc20cd9e52f098c842afc090168824fd4ca9744fe13151a03 \
|
||||
--hash=sha256:4a8cb3c8637006c5bd8237ebb5992a76ba06e39988ad5cff2096227443e8fd6a \
|
||||
--hash=sha256:4ef4ab8352861b99bd7fedb1fc6df3ea7f7d5216c789ba6d859e4ea06f1a4c45 \
|
||||
--hash=sha256:5035bb997d163f346c22abcec75190e7e756a5349e7c708bd3d5fd7066a9a854 \
|
||||
--hash=sha256:593a0f6fb0e186c5ba65465ed6f6215a30d1efa898c25e74de1c8577a1bff6d0 \
|
||||
--hash=sha256:59cdcd934385f36e8bd76aedc234371cc75c848d95bdce804ac8aa8744cfeffa \
|
||||
--hash=sha256:5a9b1320d8363a42d857fae8065a2174d38217cdd58cd8dc4f48d54e0591271e \
|
||||
--hash=sha256:5f9681ec4c60d0da590552427d770636d9079038c30b265f507ccde23caa7823 \
|
||||
--hash=sha256:5fd797a4837ba10671954e7c09010cec7aca67e09d193f4920a16beea5f66f65 \
|
||||
--hash=sha256:6019e3480d933d3698f2ecb4b46d64bfadd64e718f04fac36e681f3254b49a93 \
|
||||
--hash=sha256:603607f56a0ee84d9cd2c7e9b1d29b18a70684b94ee34f07b9ffe8dc9c8a9f81 \
|
||||
--hash=sha256:60a4b481978ea2aad8fe8af1ecc271624d01b3cf4b09e9b643dd2fe19c07634c \
|
||||
--hash=sha256:6b9812638d7aa8ecda2e8e1513fb4da999249603bffab7439a5f8f0bb362b0db \
|
||||
--hash=sha256:6c7ae6e0778ab9610f5e80e0595957d101ab8de18c32a8c053a19943ef4831d0 \
|
||||
--hash=sha256:6f83be8257b2f2dd6dea5ee62cd28db90584da7a7af1fba77a2102fc7943638a \
|
||||
--hash=sha256:701e81e047f5c0cffd4ac828efca68b0bd270c616654966a051e9a5f836b385e \
|
||||
--hash=sha256:703fd69d9cb21d6ec2086789df9be2cf8140a76ff127050c24007ea8940dcd3b \
|
||||
--hash=sha256:7471d4486f23518cff343f1eec6c68d1b977ed74c3e6cc3e1ac896b9b7d68645 \
|
||||
--hash=sha256:765d46f3d5e7a1d48075035e2d1a9164f683e3fccde834ca04602e6c588835bc \
|
||||
--hash=sha256:7a09d203983104918c62f2eef9406f24c355511f9217967df23e70fa7f5b54ff \
|
||||
--hash=sha256:7c20cc83b0df47129ec6ed8a47fa7dcfc309c5bad029464004162738502568bb \
|
||||
--hash=sha256:7d7cfac2547c93389fa303fc0c0eb6698825564e8389c41c9b60009c746207b6 \
|
||||
--hash=sha256:7d87c817b292efb748f1974f37e8bb8a8772ef92f05f84e507159360814bcc3f \
|
||||
--hash=sha256:8141f654432cf75144d6103bfac2286b8adf23467201590b173a74535d6be22d \
|
||||
--hash=sha256:849f2ff40264152f25589cb48ddb4a43d14db811f841ec73989bfc0c8c4853fa \
|
||||
--hash=sha256:880c84ce59f49776cf120f77e7ca04877c97c6887917078dbc369eb47004d7cf \
|
||||
--hash=sha256:94874584b733a18b310b0e954d53168e62cd4a0fd9db85b1903f0902a7eb33e8 \
|
||||
--hash=sha256:95603eff711b8f3b9596e1c961dbeb745a792ba1904141612f194e07edd71e5f \
|
||||
--hash=sha256:9585892091ae86045135d6a6129a644142d6a51b23e1428bb5de6d10bc0ce0c7 \
|
||||
--hash=sha256:977bf5be704a88d46bf5b228df8b44521b1f3119d741062191608b3a6a38f224 \
|
||||
--hash=sha256:9cdc46859024501c20ab74ad542cdf2f08b94b5ce384f2f569483fa3ed926d04 \
|
||||
--hash=sha256:a34a5f034b339f69ef7f6a134c22d04b92e07b6ddc1dd65382e7e4ec65d6437d \
|
||||
--hash=sha256:a655f7b755cfc5c07f2116b6dcf0ba148c89adef9a6d40c1b0f1fada878c4345 \
|
||||
--hash=sha256:a7d12f2d2df195c8c4e49d2cdbad640353a856c62ca2c624d8b47aa33b65a2a2 \
|
||||
--hash=sha256:abfe83e082c9208891e2158c1b5044a650ecec408b823bf6bf16cd7f8085cafa \
|
||||
--hash=sha256:b25077a971c7da47bd6846a912a747f6963776d90720c88603b1b55d81790780 \
|
||||
--hash=sha256:bf416a93e1331820c77e3429df26946dbd4fe105e9b487cd2d1b7298b75784a8 \
|
||||
--hash=sha256:c04ae27e076d81a3839047d8eed57c1e17e361640616fd520d752375e3ba8f0c \
|
||||
--hash=sha256:d5bea13c73f36c4346808df3fa806596163a7962b6d28001ca2a391cab856089 \
|
||||
--hash=sha256:d75bef34e69e7effb7b4849e3f830e3174d2cc6ec7273503fdde111c222dc9b3 \
|
||||
--hash=sha256:d93940664a5ccfd79f72dcb939b0c31a3479889f14f0eb95ec52976f8c0cae7d \
|
||||
--hash=sha256:d9c89c521dc90c7564358e525f849b93ad1d710553c1491f66b8cce8113bc901 \
|
||||
--hash=sha256:e0b36257dc90194784531c3b922d8d31fb2b4d8e5adfd27aff4eee7174176365 \
|
||||
--hash=sha256:e1135264bcd40965cd35b0869e36952f54825024befdc7a923df9a7d83cfd800 \
|
||||
--hash=sha256:e510d288e613d6927796dfb728e13e4530fc83b9ccac5888a21f7860486eab21 \
|
||||
--hash=sha256:ee9a2c9a4b2421e77f8fe33ed0621dea03c66c710707553020b1e32f3afb6240 \
|
||||
--hash=sha256:f19f11055ba2961eb39bdb1ff15763a53fca4fa0b5b624da3c7a528e83cdd09c \
|
||||
--hash=sha256:f26544bc10c83a2ff9aa2e093500c1b473f327faae31fb468d591e5823333376 \
|
||||
--hash=sha256:f4875cafc9a6482c04c7df52a725d1c41beb74913c0ff4ec8f189f1954a2afe9 \
|
||||
--hash=sha256:f5179088ef6487c475604b7898731a6ddeeada7702cfb2162155b016703a8475 \
|
||||
--hash=sha256:f63d1ae1ca17bb2c847e298c7bcf084a73d56d434b4c50509fb93a4b4300b0b2 \
|
||||
--hash=sha256:ff4928dc1e9704b567171c16787238201fdbf023665573c12c02146fe1e02eec
|
||||
# via -r requirements-base.in
|
|
@ -0,0 +1,7 @@
|
|||
psutil==5.9.3
|
||||
ujson==5.5.0
|
||||
ordered-set==4.1.0
|
||||
result==0.8.0
|
||||
# These two are also by Kevin
|
||||
filenuke==0.0.0
|
||||
onionrblocks==7.0.0
|
|
@ -0,0 +1,445 @@
|
|||
#
|
||||
# This file is autogenerated by pip-compile with python 3.10
|
||||
# To update, run:
|
||||
#
|
||||
# pip-compile --generate-hashes --output-file=requirements-x86-all-plugins.txt requirements-base.in static-data/official-plugins/rpc/requirements.in static-data/official-plugins/tor/requirements.in static-data/official-plugins/wot/requirements.in
|
||||
#
|
||||
autocommand==2.2.1 \
|
||||
--hash=sha256:85d03044c2a1fc1c7844ac41545045927aecde0cbaf8ea28b88e0cd8588ce5d3 \
|
||||
--hash=sha256:fed420e9d02745821a782971b583c6970259ee0b229be2a0a401e1467a4f170f
|
||||
# via jaraco-text
|
||||
cffi==1.15.1 \
|
||||
--hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \
|
||||
--hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \
|
||||
--hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \
|
||||
--hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \
|
||||
--hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \
|
||||
--hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \
|
||||
--hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \
|
||||
--hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \
|
||||
--hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \
|
||||
--hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \
|
||||
--hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \
|
||||
--hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \
|
||||
--hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \
|
||||
--hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \
|
||||
--hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \
|
||||
--hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \
|
||||
--hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \
|
||||
--hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \
|
||||
--hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \
|
||||
--hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \
|
||||
--hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \
|
||||
--hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \
|
||||
--hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \
|
||||
--hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \
|
||||
--hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \
|
||||
--hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \
|
||||
--hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \
|
||||
--hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \
|
||||
--hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \
|
||||
--hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \
|
||||
--hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \
|
||||
--hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \
|
||||
--hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \
|
||||
--hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \
|
||||
--hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \
|
||||
--hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \
|
||||
--hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \
|
||||
--hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \
|
||||
--hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \
|
||||
--hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \
|
||||
--hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \
|
||||
--hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \
|
||||
--hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \
|
||||
--hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \
|
||||
--hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \
|
||||
--hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \
|
||||
--hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \
|
||||
--hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \
|
||||
--hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \
|
||||
--hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \
|
||||
--hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \
|
||||
--hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \
|
||||
--hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \
|
||||
--hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \
|
||||
--hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \
|
||||
--hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \
|
||||
--hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \
|
||||
--hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \
|
||||
--hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \
|
||||
--hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \
|
||||
--hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \
|
||||
--hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \
|
||||
--hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \
|
||||
--hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0
|
||||
# via
|
||||
# -r static-data/official-plugins/wot/requirements.in
|
||||
# cryptography
|
||||
# pynacl
|
||||
cheroot==8.6.0 \
|
||||
--hash=sha256:366adf6e7cac9555486c2d1be6297993022eff6f8c4655c1443268cca3f08e25 \
|
||||
--hash=sha256:62cbced16f07e8aaf512673987cd6b1fc5ad00073345e9ed6c4e2a5cc2a3a22d
|
||||
# via cherrypy
|
||||
cherrypy==18.8.0 \
|
||||
--hash=sha256:9b48cfba8a2f16d5b6419cc657e6d51db005ba35c5e3824e4728bb03bbc7ef9b \
|
||||
--hash=sha256:b56097025dc78a76a59db551b3a82871c6b3a0107b80b12ff759e4c0b3b947ce
|
||||
# via -r static-data/official-plugins/rpc/requirements.in
|
||||
cryptography==38.0.1 \
|
||||
--hash=sha256:0297ffc478bdd237f5ca3a7dc96fc0d315670bfa099c04dc3a4a2172008a405a \
|
||||
--hash=sha256:10d1f29d6292fc95acb597bacefd5b9e812099d75a6469004fd38ba5471a977f \
|
||||
--hash=sha256:16fa61e7481f4b77ef53991075de29fc5bacb582a1244046d2e8b4bb72ef66d0 \
|
||||
--hash=sha256:194044c6b89a2f9f169df475cc167f6157eb9151cc69af8a2a163481d45cc407 \
|
||||
--hash=sha256:1db3d807a14931fa317f96435695d9ec386be7b84b618cc61cfa5d08b0ae33d7 \
|
||||
--hash=sha256:3261725c0ef84e7592597606f6583385fed2a5ec3909f43bc475ade9729a41d6 \
|
||||
--hash=sha256:3b72c360427889b40f36dc214630e688c2fe03e16c162ef0aa41da7ab1455153 \
|
||||
--hash=sha256:3e3a2599e640927089f932295a9a247fc40a5bdf69b0484532f530471a382750 \
|
||||
--hash=sha256:3fc26e22840b77326a764ceb5f02ca2d342305fba08f002a8c1f139540cdfaad \
|
||||
--hash=sha256:5067ee7f2bce36b11d0e334abcd1ccf8c541fc0bbdaf57cdd511fdee53e879b6 \
|
||||
--hash=sha256:52e7bee800ec869b4031093875279f1ff2ed12c1e2f74923e8f49c916afd1d3b \
|
||||
--hash=sha256:64760ba5331e3f1794d0bcaabc0d0c39e8c60bf67d09c93dc0e54189dfd7cfe5 \
|
||||
--hash=sha256:765fa194a0f3372d83005ab83ab35d7c5526c4e22951e46059b8ac678b44fa5a \
|
||||
--hash=sha256:79473cf8a5cbc471979bd9378c9f425384980fcf2ab6534b18ed7d0d9843987d \
|
||||
--hash=sha256:896dd3a66959d3a5ddcfc140a53391f69ff1e8f25d93f0e2e7830c6de90ceb9d \
|
||||
--hash=sha256:89ed49784ba88c221756ff4d4755dbc03b3c8d2c5103f6d6b4f83a0fb1e85294 \
|
||||
--hash=sha256:ac7e48f7e7261207d750fa7e55eac2d45f720027d5703cd9007e9b37bbb59ac0 \
|
||||
--hash=sha256:ad7353f6ddf285aeadfaf79e5a6829110106ff8189391704c1d8801aa0bae45a \
|
||||
--hash=sha256:b0163a849b6f315bf52815e238bc2b2346604413fa7c1601eea84bcddb5fb9ac \
|
||||
--hash=sha256:b6c9b706316d7b5a137c35e14f4103e2115b088c412140fdbd5f87c73284df61 \
|
||||
--hash=sha256:c2e5856248a416767322c8668ef1845ad46ee62629266f84a8f007a317141013 \
|
||||
--hash=sha256:ca9f6784ea96b55ff41708b92c3f6aeaebde4c560308e5fbbd3173fbc466e94e \
|
||||
--hash=sha256:d1a5bd52d684e49a36582193e0b89ff267704cd4025abefb9e26803adeb3e5fb \
|
||||
--hash=sha256:d3971e2749a723e9084dd507584e2a2761f78ad2c638aa31e80bc7a15c9db4f9 \
|
||||
--hash=sha256:d4ef6cc305394ed669d4d9eebf10d3a101059bdcf2669c366ec1d14e4fb227bd \
|
||||
--hash=sha256:d9e69ae01f99abe6ad646947bba8941e896cb3aa805be2597a0400e0764b5818
|
||||
# via secretstorage
|
||||
filenuke==0.0.0 \
|
||||
--hash=sha256:147011c0125121469cae0a8a7f4df399f470e54aa29a08f2d2c099bf0118dcee \
|
||||
--hash=sha256:c55535dcecfdb27c5f4ce664d46e115950b5429763b5db75c198053646177f8f
|
||||
# via -r requirements-base.in
|
||||
inflect==6.0.0 \
|
||||
--hash=sha256:0bc1516ec2725e2d8221707a612245093cb6f1cea209cfd8cbd4fc5e96fa6365 \
|
||||
--hash=sha256:e3b85d65a296843268f35f4136283ad7c012a129375db1529d49b4b01ecb400b
|
||||
# via jaraco-text
|
||||
jaraco-classes==3.2.2 \
|
||||
--hash=sha256:6745f113b0b588239ceb49532aa09c3ebb947433ce311ef2f8e3ad64ebb74594 \
|
||||
--hash=sha256:e6ef6fd3fcf4579a7a019d87d1e56a883f4e4c35cfe925f86731abc58804e647
|
||||
# via
|
||||
# jaraco-collections
|
||||
# keyring
|
||||
jaraco-collections==3.5.2 \
|
||||
--hash=sha256:072b93eb35f9e48508485755534e66a34ef1cc84af291fd27f39b44d4c0dd2c3 \
|
||||
--hash=sha256:1ca12fa4b7067dfc8d7f791c1a8660d970a2bf2f80536ba0aa5cbb71fe1261f1
|
||||
# via cherrypy
|
||||
jaraco-context==4.1.2 \
|
||||
--hash=sha256:9327d3e6901923e5a7097aa2df4b9c2bc13f845c7672692e3827ebd1b3d67606 \
|
||||
--hash=sha256:a58e94dd67871639abc091b57d32842449b230777570ef2bcec3dc16b912613e
|
||||
# via jaraco-text
|
||||
jaraco-functools==3.5.1 \
|
||||
--hash=sha256:c8774f73323de42250a659934215da1d899b02c66a6133f1cb79f02a5aff4f38 \
|
||||
--hash=sha256:d0adcf91710a0853efe9f23a78fad586bf67df572f0d6d8e0fa36d289ae1c1d9
|
||||
# via
|
||||
# cheroot
|
||||
# jaraco-text
|
||||
# tempora
|
||||
jaraco-text==3.9.1 \
|
||||
--hash=sha256:3ca615c4135e151d21206075ec4aface8a2fbc3e68437fe709a6541428a635f9 \
|
||||
--hash=sha256:d57cd4448a588020318425e04194e897f96fc23b92b82ff9308a24d5cbf2b3fb
|
||||
# via jaraco-collections
|
||||
jeepney==0.8.0 \
|
||||
--hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \
|
||||
--hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755
|
||||
# via
|
||||
# keyring
|
||||
# secretstorage
|
||||
json-rpc==1.13.0 \
|
||||
--hash=sha256:84b45058e5ba95f49c7b6afcf7e03ab86bee89bf2c01f3ad8dd41fe114fc1f84 \
|
||||
--hash=sha256:def0dbcf5b7084fc31d677f2f5990d988d06497f2f47f13024274cfb2d5d7589
|
||||
# via -r static-data/official-plugins/rpc/requirements.in
|
||||
kasten==3.0.0 \
|
||||
--hash=sha256:52894af46d6e1339f0d5fa8961892b292f99176848bce11877fe4a435b6782e5 \
|
||||
--hash=sha256:b22ebdc5f475c2ef9ab74abc36552add0b37732a7ce2be6bd7977ee41b2163b4
|
||||
# via onionrblocks
|
||||
keyring==23.9.3 \
|
||||
--hash=sha256:69732a15cb1433bdfbc3b980a8a36a04878a6cfd7cb99f497b573f31618001c0 \
|
||||
--hash=sha256:69b01dd83c42f590250fe7a1f503fc229b14de83857314b1933a3ddbf595c4a5
|
||||
# via -r static-data/official-plugins/wot/requirements.in
|
||||
mimcvdf==1.2.1 \
|
||||
--hash=sha256:7c837c46cfb9dce4ba895bc706a69646d4d5185c66aeaa333b5cfaa9a7d06dc4
|
||||
# via kasten
|
||||
more-itertools==8.14.0 \
|
||||
--hash=sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2 \
|
||||
--hash=sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750
|
||||
# via
|
||||
# cheroot
|
||||
# cherrypy
|
||||
# jaraco-classes
|
||||
# jaraco-functools
|
||||
# jaraco-text
|
||||
msgpack==1.0.4 \
|
||||
--hash=sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467 \
|
||||
--hash=sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae \
|
||||
--hash=sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92 \
|
||||
--hash=sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef \
|
||||
--hash=sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624 \
|
||||
--hash=sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227 \
|
||||
--hash=sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88 \
|
||||
--hash=sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9 \
|
||||
--hash=sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8 \
|
||||
--hash=sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd \
|
||||
--hash=sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6 \
|
||||
--hash=sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55 \
|
||||
--hash=sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e \
|
||||
--hash=sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2 \
|
||||
--hash=sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44 \
|
||||
--hash=sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6 \
|
||||
--hash=sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9 \
|
||||
--hash=sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab \
|
||||
--hash=sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae \
|
||||
--hash=sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa \
|
||||
--hash=sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9 \
|
||||
--hash=sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e \
|
||||
--hash=sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250 \
|
||||
--hash=sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce \
|
||||
--hash=sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075 \
|
||||
--hash=sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236 \
|
||||
--hash=sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae \
|
||||
--hash=sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e \
|
||||
--hash=sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f \
|
||||
--hash=sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08 \
|
||||
--hash=sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6 \
|
||||
--hash=sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d \
|
||||
--hash=sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43 \
|
||||
--hash=sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1 \
|
||||
--hash=sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6 \
|
||||
--hash=sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0 \
|
||||
--hash=sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c \
|
||||
--hash=sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff \
|
||||
--hash=sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db \
|
||||
--hash=sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243 \
|
||||
--hash=sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661 \
|
||||
--hash=sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba \
|
||||
--hash=sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e \
|
||||
--hash=sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb \
|
||||
--hash=sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52 \
|
||||
--hash=sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6 \
|
||||
--hash=sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1 \
|
||||
--hash=sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f \
|
||||
--hash=sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da \
|
||||
--hash=sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f \
|
||||
--hash=sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c \
|
||||
--hash=sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8
|
||||
# via kasten
|
||||
onionrblocks==7.0.0 \
|
||||
--hash=sha256:53e90964371076d9daf2ed0790b21f174ef3321f4f1808209cc6dd9b7ff6d8ff \
|
||||
--hash=sha256:54af28d0be856209525646c4ef9f977f95f0ae1329b2cc023b351317c9d0eef7
|
||||
# via -r requirements-base.in
|
||||
ordered-set==4.1.0 \
|
||||
--hash=sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562 \
|
||||
--hash=sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8
|
||||
# via -r requirements-base.in
|
||||
portend==3.1.0 \
|
||||
--hash=sha256:239e3116045ea823f6df87d6168107ad75ccc0590e37242af0cc1e98c5d224e4 \
|
||||
--hash=sha256:9e735cee3a5c1961f09e3f3ba6dc498198c2d70b473d98d0d1504b8d1e7a3d61
|
||||
# via cherrypy
|
||||
psutil==5.9.3 \
|
||||
--hash=sha256:07d880053c6461c9b89cd5d4808f3b8336665fa3acdefd6777662c5ed73a851a \
|
||||
--hash=sha256:12500d761ac091f2426567f19f95fd3f15a197d96befb44a5c1e3cbe6db5752c \
|
||||
--hash=sha256:1b540599481c73408f6b392cdffef5b01e8ff7a2ac8caae0a91b8222e88e8f1e \
|
||||
--hash=sha256:35feafe232d1aaf35d51bd42790cbccb882456f9f18cdc411532902370d660df \
|
||||
--hash=sha256:3a7826e68b0cf4ce2c1ee385d64eab7d70e3133171376cac53d7c1790357ec8f \
|
||||
--hash=sha256:46907fa62acaac364fff0b8a9da7b360265d217e4fdeaca0a2397a6883dffba2 \
|
||||
--hash=sha256:4bd4854f0c83aa84a5a40d3b5d0eb1f3c128f4146371e03baed4589fe4f3c931 \
|
||||
--hash=sha256:538fcf6ae856b5e12d13d7da25ad67f02113c96f5989e6ad44422cb5994ca7fc \
|
||||
--hash=sha256:547ebb02031fdada635452250ff39942db8310b5c4a8102dfe9384ee5791e650 \
|
||||
--hash=sha256:5e8b50241dd3c2ed498507f87a6602825073c07f3b7e9560c58411c14fe1e1c9 \
|
||||
--hash=sha256:5fa88e3d5d0b480602553d362c4b33a63e0c40bfea7312a7bf78799e01e0810b \
|
||||
--hash=sha256:68fa227c32240c52982cb931801c5707a7f96dd8927f9102d6c7771ea1ff5698 \
|
||||
--hash=sha256:6ced1ad823ecfa7d3ce26fe8aa4996e2e53fb49b7fed8ad81c80958501ec0619 \
|
||||
--hash=sha256:71b1206e7909792d16933a0d2c1c7f04ae196186c51ba8567abae1d041f06dcb \
|
||||
--hash=sha256:767ef4fa33acda16703725c0473a91e1832d296c37c63896c7153ba81698f1ab \
|
||||
--hash=sha256:7ccfcdfea4fc4b0a02ca2c31de7fcd186beb9cff8207800e14ab66f79c773af6 \
|
||||
--hash=sha256:7e4939ff75149b67aef77980409f156f0082fa36accc475d45c705bb00c6c16a \
|
||||
--hash=sha256:828c9dc9478b34ab96be75c81942d8df0c2bb49edbb481f597314d92b6441d89 \
|
||||
--hash=sha256:8a4e07611997acf178ad13b842377e3d8e9d0a5bac43ece9bfc22a96735d9a4f \
|
||||
--hash=sha256:941a6c2c591da455d760121b44097781bc970be40e0e43081b9139da485ad5b7 \
|
||||
--hash=sha256:9a4af6ed1094f867834f5f07acd1250605a0874169a5fcadbcec864aec2496a6 \
|
||||
--hash=sha256:9ec296f565191f89c48f33d9544d8d82b0d2af7dd7d2d4e6319f27a818f8d1cc \
|
||||
--hash=sha256:9ec95df684583b5596c82bb380c53a603bb051cf019d5c849c47e117c5064395 \
|
||||
--hash=sha256:a04a1836894c8279e5e0a0127c0db8e198ca133d28be8a2a72b4db16f6cf99c1 \
|
||||
--hash=sha256:a3d81165b8474087bb90ec4f333a638ccfd1d69d34a9b4a1a7eaac06648f9fbe \
|
||||
--hash=sha256:b4a247cd3feaae39bb6085fcebf35b3b8ecd9b022db796d89c8f05067ca28e71 \
|
||||
--hash=sha256:ba38cf9984d5462b506e239cf4bc24e84ead4b1d71a3be35e66dad0d13ded7c1 \
|
||||
--hash=sha256:beb57d8a1ca0ae0eb3d08ccaceb77e1a6d93606f0e1754f0d60a6ebd5c288837 \
|
||||
--hash=sha256:d266cd05bd4a95ca1c2b9b5aac50d249cf7c94a542f47e0b22928ddf8b80d1ef \
|
||||
--hash=sha256:d8c3cc6bb76492133474e130a12351a325336c01c96a24aae731abf5a47fe088 \
|
||||
--hash=sha256:db8e62016add2235cc87fb7ea000ede9e4ca0aa1f221b40cef049d02d5d2593d \
|
||||
--hash=sha256:e7507f6c7b0262d3e7b0eeda15045bf5881f4ada70473b87bc7b7c93b992a7d7 \
|
||||
--hash=sha256:ed15edb14f52925869250b1375f0ff58ca5c4fa8adefe4883cfb0737d32f5c02 \
|
||||
--hash=sha256:f57d63a2b5beaf797b87024d018772439f9d3103a395627b77d17a8d72009543 \
|
||||
--hash=sha256:fa5e32c7d9b60b2528108ade2929b115167fe98d59f89555574715054f50fa31 \
|
||||
--hash=sha256:fe79b4ad4836e3da6c4650cb85a663b3a51aef22e1a829c384e18fae87e5e727
|
||||
# via -r requirements-base.in
|
||||
pycparser==2.21 \
|
||||
--hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \
|
||||
--hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206
|
||||
# via cffi
|
||||
pydantic==1.10.2 \
|
||||
--hash=sha256:05e00dbebbe810b33c7a7362f231893183bcc4251f3f2ff991c31d5c08240c42 \
|
||||
--hash=sha256:06094d18dd5e6f2bbf93efa54991c3240964bb663b87729ac340eb5014310624 \
|
||||
--hash=sha256:0b959f4d8211fc964772b595ebb25f7652da3f22322c007b6fed26846a40685e \
|
||||
--hash=sha256:19b3b9ccf97af2b7519c42032441a891a5e05c68368f40865a90eb88833c2559 \
|
||||
--hash=sha256:1b6ee725bd6e83ec78b1aa32c5b1fa67a3a65badddde3976bca5fe4568f27709 \
|
||||
--hash=sha256:1ee433e274268a4b0c8fde7ad9d58ecba12b069a033ecc4645bb6303c062d2e9 \
|
||||
--hash=sha256:216f3bcbf19c726b1cc22b099dd409aa371f55c08800bcea4c44c8f74b73478d \
|
||||
--hash=sha256:2d0567e60eb01bccda3a4df01df677adf6b437958d35c12a3ac3e0f078b0ee52 \
|
||||
--hash=sha256:2e05aed07fa02231dbf03d0adb1be1d79cabb09025dd45aa094aa8b4e7b9dcda \
|
||||
--hash=sha256:352aedb1d71b8b0736c6d56ad2bd34c6982720644b0624462059ab29bd6e5912 \
|
||||
--hash=sha256:355639d9afc76bcb9b0c3000ddcd08472ae75318a6eb67a15866b87e2efa168c \
|
||||
--hash=sha256:37c90345ec7dd2f1bcef82ce49b6235b40f282b94d3eec47e801baf864d15525 \
|
||||
--hash=sha256:4b8795290deaae348c4eba0cebb196e1c6b98bdbe7f50b2d0d9a4a99716342fe \
|
||||
--hash=sha256:5760e164b807a48a8f25f8aa1a6d857e6ce62e7ec83ea5d5c5a802eac81bad41 \
|
||||
--hash=sha256:6eb843dcc411b6a2237a694f5e1d649fc66c6064d02b204a7e9d194dff81eb4b \
|
||||
--hash=sha256:7b5ba54d026c2bd2cb769d3468885f23f43710f651688e91f5fb1edcf0ee9283 \
|
||||
--hash=sha256:7c2abc4393dea97a4ccbb4ec7d8658d4e22c4765b7b9b9445588f16c71ad9965 \
|
||||
--hash=sha256:81a7b66c3f499108b448f3f004801fcd7d7165fb4200acb03f1c2402da73ce4c \
|
||||
--hash=sha256:91b8e218852ef6007c2b98cd861601c6a09f1aa32bbbb74fab5b1c33d4a1e410 \
|
||||
--hash=sha256:9300fcbebf85f6339a02c6994b2eb3ff1b9c8c14f502058b5bf349d42447dcf5 \
|
||||
--hash=sha256:9cabf4a7f05a776e7793e72793cd92cc865ea0e83a819f9ae4ecccb1b8aa6116 \
|
||||
--hash=sha256:a1f5a63a6dfe19d719b1b6e6106561869d2efaca6167f84f5ab9347887d78b98 \
|
||||
--hash=sha256:a4c805731c33a8db4b6ace45ce440c4ef5336e712508b4d9e1aafa617dc9907f \
|
||||
--hash=sha256:ae544c47bec47a86bc7d350f965d8b15540e27e5aa4f55170ac6a75e5f73b644 \
|
||||
--hash=sha256:b97890e56a694486f772d36efd2ba31612739bc6f3caeee50e9e7e3ebd2fdd13 \
|
||||
--hash=sha256:bb6ad4489af1bac6955d38ebcb95079a836af31e4c4f74aba1ca05bb9f6027bd \
|
||||
--hash=sha256:bedf309630209e78582ffacda64a21f96f3ed2e51fbf3962d4d488e503420254 \
|
||||
--hash=sha256:c1ba1afb396148bbc70e9eaa8c06c1716fdddabaf86e7027c5988bae2a829ab6 \
|
||||
--hash=sha256:c33602f93bfb67779f9c507e4d69451664524389546bacfe1bee13cae6dc7488 \
|
||||
--hash=sha256:c4aac8e7103bf598373208f6299fa9a5cfd1fc571f2d40bf1dd1955a63d6eeb5 \
|
||||
--hash=sha256:c6f981882aea41e021f72779ce2a4e87267458cc4d39ea990729e21ef18f0f8c \
|
||||
--hash=sha256:cc78cc83110d2f275ec1970e7a831f4e371ee92405332ebfe9860a715f8336e1 \
|
||||
--hash=sha256:d49f3db871575e0426b12e2f32fdb25e579dea16486a26e5a0474af87cb1ab0a \
|
||||
--hash=sha256:dd3f9a40c16daf323cf913593083698caee97df2804aa36c4b3175d5ac1b92a2 \
|
||||
--hash=sha256:e0bedafe4bc165ad0a56ac0bd7695df25c50f76961da29c050712596cf092d6d \
|
||||
--hash=sha256:e9069e1b01525a96e6ff49e25876d90d5a563bc31c658289a8772ae186552236
|
||||
# via inflect
|
||||
pynacl==1.5.0 \
|
||||
--hash=sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858 \
|
||||
--hash=sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d \
|
||||
--hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 \
|
||||
--hash=sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1 \
|
||||
--hash=sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 \
|
||||
--hash=sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff \
|
||||
--hash=sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba \
|
||||
--hash=sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394 \
|
||||
--hash=sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b \
|
||||
--hash=sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543
|
||||
# via
|
||||
# -r static-data/official-plugins/wot/requirements.in
|
||||
# onionrblocks
|
||||
pysocks==1.7.1 \
|
||||
--hash=sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299 \
|
||||
--hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 \
|
||||
--hash=sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0
|
||||
# via -r static-data/official-plugins/tor/requirements.in
|
||||
pytz==2022.2.1 \
|
||||
--hash=sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197 \
|
||||
--hash=sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5
|
||||
# via tempora
|
||||
result==0.8.0 \
|
||||
--hash=sha256:c48c909e92181a075ba358228a3fe161e26d205dad416ad81f27f23515a5626d \
|
||||
--hash=sha256:d6a6258f32c057a4e0478999c6ce43dcadaf8ea435f58ac601ae2768f93ef243
|
||||
# via -r requirements-base.in
|
||||
secretstorage==3.3.3 \
|
||||
--hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \
|
||||
--hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99
|
||||
# via keyring
|
||||
six==1.16.0 \
|
||||
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
|
||||
--hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
|
||||
# via cheroot
|
||||
stem==1.8.1 \
|
||||
--hash=sha256:81d43a7c668ba9d7bc1103b2e7a911e9d148294b373d27a59ae8da79ef7a3e2f
|
||||
# via -r static-data/official-plugins/tor/requirements.in
|
||||
tempora==5.0.2 \
|
||||
--hash=sha256:31fa5bb33b2641026211f23e808eb8bd351901988b167d45f323c8f450ecf211 \
|
||||
--hash=sha256:e65d32ae68ad772ee738d802689f689b3f883e165e8dadd39aa89ef317b12b99
|
||||
# via portend
|
||||
typing-extensions==4.3.0 \
|
||||
--hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \
|
||||
--hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6
|
||||
# via pydantic
|
||||
ujson==5.5.0 \
|
||||
--hash=sha256:0762a4fdf86e01f3f8d8b6b7158d01fdd870799ff3f402b676e358fcd879e7eb \
|
||||
--hash=sha256:10095160dbe6bba8059ad6677a01da251431f4c68041bf796dcac0956b34f8f7 \
|
||||
--hash=sha256:1a485117f97312bef45f5d79d2ff97eff4da503b8a04f3691f59d31141686459 \
|
||||
--hash=sha256:1cef44ea4973344baed3d50a5da4a8843de3a6af7dea7fadf0a594e53ce5892f \
|
||||
--hash=sha256:1dc2f46c31ef22b0aaa28cd71be897bea271e700636658d573df9c43c49ebbd0 \
|
||||
--hash=sha256:21678d7e068707e4d54bdfeb8c250ebc548b51e499aed778b22112ca31a79669 \
|
||||
--hash=sha256:278aa9d7cb56435c96d19f5d702e026bcf69f824e24b41e9b52706abd3565837 \
|
||||
--hash=sha256:2ab011e3556a9a1d9461bd686870c527327765ed02fe53550531d6609a8a33ff \
|
||||
--hash=sha256:2d90414e3b4b44b39825049185959488e084ea7fcaf6124afd5c00893938b09d \
|
||||
--hash=sha256:2e506ecf89b6b9d304362ccef770831ec242a52c89dab1b4aabf1ab0eb1d5ed6 \
|
||||
--hash=sha256:33cd9084fefc74cbacf88c92fd260b61211e00bcde38d640c369e5dc34a2b4e1 \
|
||||
--hash=sha256:3b74467564814fbce322427a5664e6bcc7dae6dbc8acbef76300fe43ca4072ab \
|
||||
--hash=sha256:3f3f4240d99d55eb97cb012e9adf401f5ed9cd827af0341ac44603832202b0d2 \
|
||||
--hash=sha256:3fe1aea596f9539fc20cd9e52f098c842afc090168824fd4ca9744fe13151a03 \
|
||||
--hash=sha256:4a8cb3c8637006c5bd8237ebb5992a76ba06e39988ad5cff2096227443e8fd6a \
|
||||
--hash=sha256:4ef4ab8352861b99bd7fedb1fc6df3ea7f7d5216c789ba6d859e4ea06f1a4c45 \
|
||||
--hash=sha256:5035bb997d163f346c22abcec75190e7e756a5349e7c708bd3d5fd7066a9a854 \
|
||||
--hash=sha256:593a0f6fb0e186c5ba65465ed6f6215a30d1efa898c25e74de1c8577a1bff6d0 \
|
||||
--hash=sha256:59cdcd934385f36e8bd76aedc234371cc75c848d95bdce804ac8aa8744cfeffa \
|
||||
--hash=sha256:5a9b1320d8363a42d857fae8065a2174d38217cdd58cd8dc4f48d54e0591271e \
|
||||
--hash=sha256:5f9681ec4c60d0da590552427d770636d9079038c30b265f507ccde23caa7823 \
|
||||
--hash=sha256:5fd797a4837ba10671954e7c09010cec7aca67e09d193f4920a16beea5f66f65 \
|
||||
--hash=sha256:6019e3480d933d3698f2ecb4b46d64bfadd64e718f04fac36e681f3254b49a93 \
|
||||
--hash=sha256:603607f56a0ee84d9cd2c7e9b1d29b18a70684b94ee34f07b9ffe8dc9c8a9f81 \
|
||||
--hash=sha256:60a4b481978ea2aad8fe8af1ecc271624d01b3cf4b09e9b643dd2fe19c07634c \
|
||||
--hash=sha256:6b9812638d7aa8ecda2e8e1513fb4da999249603bffab7439a5f8f0bb362b0db \
|
||||
--hash=sha256:6c7ae6e0778ab9610f5e80e0595957d101ab8de18c32a8c053a19943ef4831d0 \
|
||||
--hash=sha256:6f83be8257b2f2dd6dea5ee62cd28db90584da7a7af1fba77a2102fc7943638a \
|
||||
--hash=sha256:701e81e047f5c0cffd4ac828efca68b0bd270c616654966a051e9a5f836b385e \
|
||||
--hash=sha256:703fd69d9cb21d6ec2086789df9be2cf8140a76ff127050c24007ea8940dcd3b \
|
||||
--hash=sha256:7471d4486f23518cff343f1eec6c68d1b977ed74c3e6cc3e1ac896b9b7d68645 \
|
||||
--hash=sha256:765d46f3d5e7a1d48075035e2d1a9164f683e3fccde834ca04602e6c588835bc \
|
||||
--hash=sha256:7a09d203983104918c62f2eef9406f24c355511f9217967df23e70fa7f5b54ff \
|
||||
--hash=sha256:7c20cc83b0df47129ec6ed8a47fa7dcfc309c5bad029464004162738502568bb \
|
||||
--hash=sha256:7d7cfac2547c93389fa303fc0c0eb6698825564e8389c41c9b60009c746207b6 \
|
||||
--hash=sha256:7d87c817b292efb748f1974f37e8bb8a8772ef92f05f84e507159360814bcc3f \
|
||||
--hash=sha256:8141f654432cf75144d6103bfac2286b8adf23467201590b173a74535d6be22d \
|
||||
--hash=sha256:849f2ff40264152f25589cb48ddb4a43d14db811f841ec73989bfc0c8c4853fa \
|
||||
--hash=sha256:880c84ce59f49776cf120f77e7ca04877c97c6887917078dbc369eb47004d7cf \
|
||||
--hash=sha256:94874584b733a18b310b0e954d53168e62cd4a0fd9db85b1903f0902a7eb33e8 \
|
||||
--hash=sha256:95603eff711b8f3b9596e1c961dbeb745a792ba1904141612f194e07edd71e5f \
|
||||
--hash=sha256:9585892091ae86045135d6a6129a644142d6a51b23e1428bb5de6d10bc0ce0c7 \
|
||||
--hash=sha256:977bf5be704a88d46bf5b228df8b44521b1f3119d741062191608b3a6a38f224 \
|
||||
--hash=sha256:9cdc46859024501c20ab74ad542cdf2f08b94b5ce384f2f569483fa3ed926d04 \
|
||||
--hash=sha256:a34a5f034b339f69ef7f6a134c22d04b92e07b6ddc1dd65382e7e4ec65d6437d \
|
||||
--hash=sha256:a655f7b755cfc5c07f2116b6dcf0ba148c89adef9a6d40c1b0f1fada878c4345 \
|
||||
--hash=sha256:a7d12f2d2df195c8c4e49d2cdbad640353a856c62ca2c624d8b47aa33b65a2a2 \
|
||||
--hash=sha256:abfe83e082c9208891e2158c1b5044a650ecec408b823bf6bf16cd7f8085cafa \
|
||||
--hash=sha256:b25077a971c7da47bd6846a912a747f6963776d90720c88603b1b55d81790780 \
|
||||
--hash=sha256:bf416a93e1331820c77e3429df26946dbd4fe105e9b487cd2d1b7298b75784a8 \
|
||||
--hash=sha256:c04ae27e076d81a3839047d8eed57c1e17e361640616fd520d752375e3ba8f0c \
|
||||
--hash=sha256:d5bea13c73f36c4346808df3fa806596163a7962b6d28001ca2a391cab856089 \
|
||||
--hash=sha256:d75bef34e69e7effb7b4849e3f830e3174d2cc6ec7273503fdde111c222dc9b3 \
|
||||
--hash=sha256:d93940664a5ccfd79f72dcb939b0c31a3479889f14f0eb95ec52976f8c0cae7d \
|
||||
--hash=sha256:d9c89c521dc90c7564358e525f849b93ad1d710553c1491f66b8cce8113bc901 \
|
||||
--hash=sha256:e0b36257dc90194784531c3b922d8d31fb2b4d8e5adfd27aff4eee7174176365 \
|
||||
--hash=sha256:e1135264bcd40965cd35b0869e36952f54825024befdc7a923df9a7d83cfd800 \
|
||||
--hash=sha256:e510d288e613d6927796dfb728e13e4530fc83b9ccac5888a21f7860486eab21 \
|
||||
--hash=sha256:ee9a2c9a4b2421e77f8fe33ed0621dea03c66c710707553020b1e32f3afb6240 \
|
||||
--hash=sha256:f19f11055ba2961eb39bdb1ff15763a53fca4fa0b5b624da3c7a528e83cdd09c \
|
||||
--hash=sha256:f26544bc10c83a2ff9aa2e093500c1b473f327faae31fb468d591e5823333376 \
|
||||
--hash=sha256:f4875cafc9a6482c04c7df52a725d1c41beb74913c0ff4ec8f189f1954a2afe9 \
|
||||
--hash=sha256:f5179088ef6487c475604b7898731a6ddeeada7702cfb2162155b016703a8475 \
|
||||
--hash=sha256:f63d1ae1ca17bb2c847e298c7bcf084a73d56d434b4c50509fb93a4b4300b0b2 \
|
||||
--hash=sha256:ff4928dc1e9704b567171c16787238201fdbf023665573c12c02146fe1e02eec
|
||||
# via -r requirements-base.in
|
||||
zc-lockfile==2.0 \
|
||||
--hash=sha256:307ad78227e48be260e64896ec8886edc7eae22d8ec53e4d528ab5537a83203b \
|
||||
--hash=sha256:cc33599b549f0c8a248cb72f3bf32d77712de1ff7ee8814312eb6456b42c015f
|
||||
# via cherrypy
|
||||
|
||||
# WARNING: The following packages were not pinned, but pip requires them to be
|
||||
# pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag.
|
||||
# setuptools
|
365
requirements.txt
365
requirements.txt
|
@ -1,365 +0,0 @@
|
|||
#
|
||||
# This file is autogenerated by pip-compile with python 3.10
|
||||
# To update, run:
|
||||
#
|
||||
# pip-compile --generate-hashes requirements.in
|
||||
#
|
||||
autocommand==2.2.1 \
|
||||
--hash=sha256:85d03044c2a1fc1c7844ac41545045927aecde0cbaf8ea28b88e0cd8588ce5d3 \
|
||||
--hash=sha256:fed420e9d02745821a782971b583c6970259ee0b229be2a0a401e1467a4f170f
|
||||
# via jaraco-text
|
||||
cffi==1.15.1 \
|
||||
--hash=sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5 \
|
||||
--hash=sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef \
|
||||
--hash=sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104 \
|
||||
--hash=sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426 \
|
||||
--hash=sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405 \
|
||||
--hash=sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375 \
|
||||
--hash=sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a \
|
||||
--hash=sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e \
|
||||
--hash=sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc \
|
||||
--hash=sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf \
|
||||
--hash=sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185 \
|
||||
--hash=sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497 \
|
||||
--hash=sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3 \
|
||||
--hash=sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35 \
|
||||
--hash=sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c \
|
||||
--hash=sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83 \
|
||||
--hash=sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21 \
|
||||
--hash=sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca \
|
||||
--hash=sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984 \
|
||||
--hash=sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac \
|
||||
--hash=sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd \
|
||||
--hash=sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee \
|
||||
--hash=sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a \
|
||||
--hash=sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2 \
|
||||
--hash=sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192 \
|
||||
--hash=sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7 \
|
||||
--hash=sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585 \
|
||||
--hash=sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f \
|
||||
--hash=sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e \
|
||||
--hash=sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27 \
|
||||
--hash=sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b \
|
||||
--hash=sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e \
|
||||
--hash=sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e \
|
||||
--hash=sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d \
|
||||
--hash=sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c \
|
||||
--hash=sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415 \
|
||||
--hash=sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82 \
|
||||
--hash=sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02 \
|
||||
--hash=sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314 \
|
||||
--hash=sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325 \
|
||||
--hash=sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c \
|
||||
--hash=sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3 \
|
||||
--hash=sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914 \
|
||||
--hash=sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045 \
|
||||
--hash=sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d \
|
||||
--hash=sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9 \
|
||||
--hash=sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5 \
|
||||
--hash=sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2 \
|
||||
--hash=sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c \
|
||||
--hash=sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3 \
|
||||
--hash=sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2 \
|
||||
--hash=sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8 \
|
||||
--hash=sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d \
|
||||
--hash=sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d \
|
||||
--hash=sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9 \
|
||||
--hash=sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162 \
|
||||
--hash=sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76 \
|
||||
--hash=sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4 \
|
||||
--hash=sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e \
|
||||
--hash=sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9 \
|
||||
--hash=sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6 \
|
||||
--hash=sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b \
|
||||
--hash=sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01 \
|
||||
--hash=sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0
|
||||
# via
|
||||
# -r requirements.in
|
||||
# pynacl
|
||||
cheroot==8.6.0 \
|
||||
--hash=sha256:366adf6e7cac9555486c2d1be6297993022eff6f8c4655c1443268cca3f08e25 \
|
||||
--hash=sha256:62cbced16f07e8aaf512673987cd6b1fc5ad00073345e9ed6c4e2a5cc2a3a22d
|
||||
# via cherrypy
|
||||
cherrypy==18.8.0 \
|
||||
--hash=sha256:9b48cfba8a2f16d5b6419cc657e6d51db005ba35c5e3824e4728bb03bbc7ef9b \
|
||||
--hash=sha256:b56097025dc78a76a59db551b3a82871c6b3a0107b80b12ff759e4c0b3b947ce
|
||||
# via -r requirements.in
|
||||
filenuke==0.0.0 \
|
||||
--hash=sha256:147011c0125121469cae0a8a7f4df399f470e54aa29a08f2d2c099bf0118dcee \
|
||||
--hash=sha256:c55535dcecfdb27c5f4ce664d46e115950b5429763b5db75c198053646177f8f
|
||||
# via -r requirements.in
|
||||
inflect==6.0.0 \
|
||||
--hash=sha256:0bc1516ec2725e2d8221707a612245093cb6f1cea209cfd8cbd4fc5e96fa6365 \
|
||||
--hash=sha256:e3b85d65a296843268f35f4136283ad7c012a129375db1529d49b4b01ecb400b
|
||||
# via jaraco-text
|
||||
jaraco-classes==3.2.2 \
|
||||
--hash=sha256:6745f113b0b588239ceb49532aa09c3ebb947433ce311ef2f8e3ad64ebb74594 \
|
||||
--hash=sha256:e6ef6fd3fcf4579a7a019d87d1e56a883f4e4c35cfe925f86731abc58804e647
|
||||
# via jaraco-collections
|
||||
jaraco-collections==3.5.2 \
|
||||
--hash=sha256:072b93eb35f9e48508485755534e66a34ef1cc84af291fd27f39b44d4c0dd2c3 \
|
||||
--hash=sha256:1ca12fa4b7067dfc8d7f791c1a8660d970a2bf2f80536ba0aa5cbb71fe1261f1
|
||||
# via cherrypy
|
||||
jaraco-context==4.1.2 \
|
||||
--hash=sha256:9327d3e6901923e5a7097aa2df4b9c2bc13f845c7672692e3827ebd1b3d67606 \
|
||||
--hash=sha256:a58e94dd67871639abc091b57d32842449b230777570ef2bcec3dc16b912613e
|
||||
# via jaraco-text
|
||||
jaraco-functools==3.5.1 \
|
||||
--hash=sha256:c8774f73323de42250a659934215da1d899b02c66a6133f1cb79f02a5aff4f38 \
|
||||
--hash=sha256:d0adcf91710a0853efe9f23a78fad586bf67df572f0d6d8e0fa36d289ae1c1d9
|
||||
# via
|
||||
# cheroot
|
||||
# jaraco-text
|
||||
# tempora
|
||||
jaraco-text==3.9.0 \
|
||||
--hash=sha256:4b2dc3678994de601e3e5b6f554eeb8445651b7ab984893c5e9ac44564033077 \
|
||||
--hash=sha256:810bc4aee7329e30bec8c6c6bab1b6ef149359ca4b98928e42178345ed7d7bd8
|
||||
# via jaraco-collections
|
||||
json-rpc==1.13.0 \
|
||||
--hash=sha256:84b45058e5ba95f49c7b6afcf7e03ab86bee89bf2c01f3ad8dd41fe114fc1f84 \
|
||||
--hash=sha256:def0dbcf5b7084fc31d677f2f5990d988d06497f2f47f13024274cfb2d5d7589
|
||||
# via -r requirements.in
|
||||
kasten==3.0.0 \
|
||||
--hash=sha256:52894af46d6e1339f0d5fa8961892b292f99176848bce11877fe4a435b6782e5 \
|
||||
--hash=sha256:b22ebdc5f475c2ef9ab74abc36552add0b37732a7ce2be6bd7977ee41b2163b4
|
||||
# via onionrblocks
|
||||
mimcvdf==1.2.1 \
|
||||
--hash=sha256:7c837c46cfb9dce4ba895bc706a69646d4d5185c66aeaa333b5cfaa9a7d06dc4
|
||||
# via kasten
|
||||
more-itertools==8.14.0 \
|
||||
--hash=sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2 \
|
||||
--hash=sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750
|
||||
# via
|
||||
# cheroot
|
||||
# cherrypy
|
||||
# jaraco-classes
|
||||
# jaraco-functools
|
||||
# jaraco-text
|
||||
msgpack==1.0.3 \
|
||||
--hash=sha256:0d8c332f53ffff01953ad25131272506500b14750c1d0ce8614b17d098252fbc \
|
||||
--hash=sha256:1c58cdec1cb5fcea8c2f1771d7b5fec79307d056874f746690bd2bdd609ab147 \
|
||||
--hash=sha256:2c3ca57c96c8e69c1a0d2926a6acf2d9a522b41dc4253a8945c4c6cd4981a4e3 \
|
||||
--hash=sha256:2f30dd0dc4dfe6231ad253b6f9f7128ac3202ae49edd3f10d311adc358772dba \
|
||||
--hash=sha256:2f97c0f35b3b096a330bb4a1a9247d0bd7e1f3a2eba7ab69795501504b1c2c39 \
|
||||
--hash=sha256:36a64a10b16c2ab31dcd5f32d9787ed41fe68ab23dd66957ca2826c7f10d0b85 \
|
||||
--hash=sha256:3d875631ecab42f65f9dce6f55ce6d736696ced240f2634633188de2f5f21af9 \
|
||||
--hash=sha256:40fb89b4625d12d6027a19f4df18a4de5c64f6f3314325049f219683e07e678a \
|
||||
--hash=sha256:47d733a15ade190540c703de209ffbc42a3367600421b62ac0c09fde594da6ec \
|
||||
--hash=sha256:494471d65b25a8751d19c83f1a482fd411d7ca7a3b9e17d25980a74075ba0e88 \
|
||||
--hash=sha256:51fdc7fb93615286428ee7758cecc2f374d5ff363bdd884c7ea622a7a327a81e \
|
||||
--hash=sha256:6eef0cf8db3857b2b556213d97dd82de76e28a6524853a9beb3264983391dc1a \
|
||||
--hash=sha256:6f4c22717c74d44bcd7af353024ce71c6b55346dad5e2cc1ddc17ce8c4507c6b \
|
||||
--hash=sha256:73a80bd6eb6bcb338c1ec0da273f87420829c266379c8c82fa14c23fb586cfa1 \
|
||||
--hash=sha256:89908aea5f46ee1474cc37fbc146677f8529ac99201bc2faf4ef8edc023c2bf3 \
|
||||
--hash=sha256:8a3a5c4b16e9d0edb823fe54b59b5660cc8d4782d7bf2c214cb4b91a1940a8ef \
|
||||
--hash=sha256:96acc674bb9c9be63fa8b6dabc3248fdc575c4adc005c440ad02f87ca7edd079 \
|
||||
--hash=sha256:973ad69fd7e31159eae8f580f3f707b718b61141838321c6fa4d891c4a2cca52 \
|
||||
--hash=sha256:9b6f2d714c506e79cbead331de9aae6837c8dd36190d02da74cb409b36162e8a \
|
||||
--hash=sha256:9c0903bd93cbd34653dd63bbfcb99d7539c372795201f39d16fdfde4418de43a \
|
||||
--hash=sha256:9fce00156e79af37bb6db4e7587b30d11e7ac6a02cb5bac387f023808cd7d7f4 \
|
||||
--hash=sha256:a598d0685e4ae07a0672b59792d2cc767d09d7a7f39fd9bd37ff84e060b1a996 \
|
||||
--hash=sha256:b0a792c091bac433dfe0a70ac17fc2087d4595ab835b47b89defc8bbabcf5c73 \
|
||||
--hash=sha256:bb87f23ae7d14b7b3c21009c4b1705ec107cb21ee71975992f6aca571fb4a42a \
|
||||
--hash=sha256:bf1e6bfed4860d72106f4e0a1ab519546982b45689937b40257cfd820650b920 \
|
||||
--hash=sha256:c1ba333b4024c17c7591f0f372e2daa3c31db495a9b2af3cf664aef3c14354f7 \
|
||||
--hash=sha256:c2140cf7a3ec475ef0938edb6eb363fa704159e0bf71dde15d953bacc1cf9d7d \
|
||||
--hash=sha256:c7e03b06f2982aa98d4ddd082a210c3db200471da523f9ac197f2828e80e7770 \
|
||||
--hash=sha256:d02cea2252abc3756b2ac31f781f7a98e89ff9759b2e7450a1c7a0d13302ff50 \
|
||||
--hash=sha256:da24375ab4c50e5b7486c115a3198d207954fe10aaa5708f7b65105df09109b2 \
|
||||
--hash=sha256:e4c309a68cb5d6bbd0c50d5c71a25ae81f268c2dc675c6f4ea8ab2feec2ac4e2 \
|
||||
--hash=sha256:f01b26c2290cbd74316990ba84a14ac3d599af9cebefc543d241a66e785cf17d \
|
||||
--hash=sha256:f201d34dc89342fabb2a10ed7c9a9aaaed9b7af0f16a5923f1ae562b31258dea \
|
||||
--hash=sha256:f74da1e5fcf20ade12c6bf1baa17a2dc3604958922de8dc83cbe3eff22e8b611
|
||||
# via kasten
|
||||
niceware==0.2.1 \
|
||||
--hash=sha256:0f8b192f2a1e800e068474f6e208be9c7e2857664b33a96f4045340de4e5c69c \
|
||||
--hash=sha256:cf2dc0e1567d36d067c61b32fed0f1b9c4534ed511f9eeead4ba548d03b5c9eb
|
||||
# via -r requirements.in
|
||||
onionrblocks==7.0.0 \
|
||||
--hash=sha256:53e90964371076d9daf2ed0790b21f174ef3321f4f1808209cc6dd9b7ff6d8ff \
|
||||
--hash=sha256:54af28d0be856209525646c4ef9f977f95f0ae1329b2cc023b351317c9d0eef7
|
||||
# via -r requirements.in
|
||||
ordered-set==4.1.0 \
|
||||
--hash=sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562 \
|
||||
--hash=sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8
|
||||
# via -r requirements.in
|
||||
portend==3.1.0 \
|
||||
--hash=sha256:239e3116045ea823f6df87d6168107ad75ccc0590e37242af0cc1e98c5d224e4 \
|
||||
--hash=sha256:9e735cee3a5c1961f09e3f3ba6dc498198c2d70b473d98d0d1504b8d1e7a3d61
|
||||
# via cherrypy
|
||||
psutil==5.9.1 \
|
||||
--hash=sha256:068935df39055bf27a29824b95c801c7a5130f118b806eee663cad28dca97685 \
|
||||
--hash=sha256:0904727e0b0a038830b019551cf3204dd48ef5c6868adc776e06e93d615fc5fc \
|
||||
--hash=sha256:0f15a19a05f39a09327345bc279c1ba4a8cfb0172cc0d3c7f7d16c813b2e7d36 \
|
||||
--hash=sha256:19f36c16012ba9cfc742604df189f2f28d2720e23ff7d1e81602dbe066be9fd1 \
|
||||
--hash=sha256:20b27771b077dcaa0de1de3ad52d22538fe101f9946d6dc7869e6f694f079329 \
|
||||
--hash=sha256:28976df6c64ddd6320d281128817f32c29b539a52bdae5e192537bc338a9ec81 \
|
||||
--hash=sha256:29a442e25fab1f4d05e2655bb1b8ab6887981838d22effa2396d584b740194de \
|
||||
--hash=sha256:3054e923204b8e9c23a55b23b6df73a8089ae1d075cb0bf711d3e9da1724ded4 \
|
||||
--hash=sha256:32c52611756096ae91f5d1499fe6c53b86f4a9ada147ee42db4991ba1520e574 \
|
||||
--hash=sha256:3a76ad658641172d9c6e593de6fe248ddde825b5866464c3b2ee26c35da9d237 \
|
||||
--hash=sha256:44d1826150d49ffd62035785a9e2c56afcea66e55b43b8b630d7706276e87f22 \
|
||||
--hash=sha256:4b6750a73a9c4a4e689490ccb862d53c7b976a2a35c4e1846d049dcc3f17d83b \
|
||||
--hash=sha256:56960b9e8edcca1456f8c86a196f0c3d8e3e361320071c93378d41445ffd28b0 \
|
||||
--hash=sha256:57f1819b5d9e95cdfb0c881a8a5b7d542ed0b7c522d575706a80bedc848c8954 \
|
||||
--hash=sha256:58678bbadae12e0db55186dc58f2888839228ac9f41cc7848853539b70490021 \
|
||||
--hash=sha256:645bd4f7bb5b8633803e0b6746ff1628724668681a434482546887d22c7a9537 \
|
||||
--hash=sha256:799759d809c31aab5fe4579e50addf84565e71c1dc9f1c31258f159ff70d3f87 \
|
||||
--hash=sha256:79c9108d9aa7fa6fba6e668b61b82facc067a6b81517cab34d07a84aa89f3df0 \
|
||||
--hash=sha256:91c7ff2a40c373d0cc9121d54bc5f31c4fa09c346528e6a08d1845bce5771ffc \
|
||||
--hash=sha256:9272167b5f5fbfe16945be3db475b3ce8d792386907e673a209da686176552af \
|
||||
--hash=sha256:944c4b4b82dc4a1b805329c980f270f170fdc9945464223f2ec8e57563139cf4 \
|
||||
--hash=sha256:a6a11e48cb93a5fa606306493f439b4aa7c56cb03fc9ace7f6bfa21aaf07c453 \
|
||||
--hash=sha256:a8746bfe4e8f659528c5c7e9af5090c5a7d252f32b2e859c584ef7d8efb1e689 \
|
||||
--hash=sha256:abd9246e4cdd5b554a2ddd97c157e292ac11ef3e7af25ac56b08b455c829dca8 \
|
||||
--hash=sha256:b14ee12da9338f5e5b3a3ef7ca58b3cba30f5b66f7662159762932e6d0b8f680 \
|
||||
--hash=sha256:b88f75005586131276634027f4219d06e0561292be8bd6bc7f2f00bdabd63c4e \
|
||||
--hash=sha256:c7be9d7f5b0d206f0bbc3794b8e16fb7dbc53ec9e40bbe8787c6f2d38efcf6c9 \
|
||||
--hash=sha256:d2d006286fbcb60f0b391741f520862e9b69f4019b4d738a2a45728c7e952f1b \
|
||||
--hash=sha256:db417f0865f90bdc07fa30e1aadc69b6f4cad7f86324b02aa842034efe8d8c4d \
|
||||
--hash=sha256:e7e10454cb1ab62cc6ce776e1c135a64045a11ec4c6d254d3f7689c16eb3efd2 \
|
||||
--hash=sha256:f65f9a46d984b8cd9b3750c2bdb419b2996895b005aefa6cbaba9a143b1ce2c5 \
|
||||
--hash=sha256:fea896b54f3a4ae6f790ac1d017101252c93f6fe075d0e7571543510f11d2676
|
||||
# via -r requirements.in
|
||||
pycparser==2.19 \
|
||||
--hash=sha256:a988718abfad80b6b157acce7bf130a30876d27603738ac39f140993246b25b3
|
||||
# via cffi
|
||||
pydantic==1.9.2 \
|
||||
--hash=sha256:1061c6ee6204f4f5a27133126854948e3b3d51fcc16ead2e5d04378c199b2f44 \
|
||||
--hash=sha256:19b5686387ea0d1ea52ecc4cffb71abb21702c5e5b2ac626fd4dbaa0834aa49d \
|
||||
--hash=sha256:2bd446bdb7755c3a94e56d7bdfd3ee92396070efa8ef3a34fab9579fe6aa1d84 \
|
||||
--hash=sha256:328558c9f2eed77bd8fffad3cef39dbbe3edc7044517f4625a769d45d4cf7555 \
|
||||
--hash=sha256:32e0b4fb13ad4db4058a7c3c80e2569adbd810c25e6ca3bbd8b2a9cc2cc871d7 \
|
||||
--hash=sha256:3ee0d69b2a5b341fc7927e92cae7ddcfd95e624dfc4870b32a85568bd65e6131 \
|
||||
--hash=sha256:4aafd4e55e8ad5bd1b19572ea2df546ccace7945853832bb99422a79c70ce9b8 \
|
||||
--hash=sha256:4b3946f87e5cef3ba2e7bd3a4eb5a20385fe36521d6cc1ebf3c08a6697c6cfb3 \
|
||||
--hash=sha256:4de71c718c9756d679420c69f216776c2e977459f77e8f679a4a961dc7304a56 \
|
||||
--hash=sha256:5565a49effe38d51882cb7bac18bda013cdb34d80ac336428e8908f0b72499b0 \
|
||||
--hash=sha256:5803ad846cdd1ed0d97eb00292b870c29c1f03732a010e66908ff48a762f20e4 \
|
||||
--hash=sha256:5da164119602212a3fe7e3bc08911a89db4710ae51444b4224c2382fd09ad453 \
|
||||
--hash=sha256:615661bfc37e82ac677543704437ff737418e4ea04bef9cf11c6d27346606044 \
|
||||
--hash=sha256:78a4d6bdfd116a559aeec9a4cfe77dda62acc6233f8b56a716edad2651023e5e \
|
||||
--hash=sha256:7d0f183b305629765910eaad707800d2f47c6ac5bcfb8c6397abdc30b69eeb15 \
|
||||
--hash=sha256:7ead3cd020d526f75b4188e0a8d71c0dbbe1b4b6b5dc0ea775a93aca16256aeb \
|
||||
--hash=sha256:84d76ecc908d917f4684b354a39fd885d69dd0491be175f3465fe4b59811c001 \
|
||||
--hash=sha256:8cb0bc509bfb71305d7a59d00163d5f9fc4530f0881ea32c74ff4f74c85f3d3d \
|
||||
--hash=sha256:91089b2e281713f3893cd01d8e576771cd5bfdfbff5d0ed95969f47ef6d676c3 \
|
||||
--hash=sha256:9c9e04a6cdb7a363d7cb3ccf0efea51e0abb48e180c0d31dca8d247967d85c6e \
|
||||
--hash=sha256:a8c5360a0297a713b4123608a7909e6869e1b56d0e96eb0d792c27585d40757f \
|
||||
--hash=sha256:afacf6d2a41ed91fc631bade88b1d319c51ab5418870802cedb590b709c5ae3c \
|
||||
--hash=sha256:b34ba24f3e2d0b39b43f0ca62008f7ba962cff51efa56e64ee25c4af6eed987b \
|
||||
--hash=sha256:bd67cb2c2d9602ad159389c29e4ca964b86fa2f35c2faef54c3eb28b4efd36c8 \
|
||||
--hash=sha256:c0f5e142ef8217019e3eef6ae1b6b55f09a7a15972958d44fbd228214cede567 \
|
||||
--hash=sha256:cdb4272678db803ddf94caa4f94f8672e9a46bae4a44f167095e4d06fec12979 \
|
||||
--hash=sha256:d70916235d478404a3fa8c997b003b5f33aeac4686ac1baa767234a0f8ac2326 \
|
||||
--hash=sha256:d8ce3fb0841763a89322ea0432f1f59a2d3feae07a63ea2c958b2315e1ae8adb \
|
||||
--hash=sha256:e0b214e57623a535936005797567231a12d0da0c29711eb3514bc2b3cd008d0f \
|
||||
--hash=sha256:e631c70c9280e3129f071635b81207cad85e6c08e253539467e4ead0e5b219aa \
|
||||
--hash=sha256:e78578f0c7481c850d1c969aca9a65405887003484d24f6110458fb02cca7747 \
|
||||
--hash=sha256:f0ca86b525264daa5f6b192f216a0d1e860b7383e3da1c65a1908f9c02f42801 \
|
||||
--hash=sha256:f1a68f4f65a9ee64b6ccccb5bf7e17db07caebd2730109cb8a95863cfa9c4e55 \
|
||||
--hash=sha256:fafe841be1103f340a24977f61dee76172e4ae5f647ab9e7fd1e1fca51524f08 \
|
||||
--hash=sha256:ff68fc85355532ea77559ede81f35fff79a6a5543477e168ab3a381887caea76
|
||||
# via inflect
|
||||
pynacl==1.5.0 \
|
||||
--hash=sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858 \
|
||||
--hash=sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d \
|
||||
--hash=sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93 \
|
||||
--hash=sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1 \
|
||||
--hash=sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92 \
|
||||
--hash=sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff \
|
||||
--hash=sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba \
|
||||
--hash=sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394 \
|
||||
--hash=sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b \
|
||||
--hash=sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543
|
||||
# via
|
||||
# -r requirements.in
|
||||
# onionrblocks
|
||||
pysocks==1.7.1 \
|
||||
--hash=sha256:08e69f092cc6dbe92a0fdd16eeb9b9ffbc13cadfe5ca4c7bd92ffb078b293299 \
|
||||
--hash=sha256:2725bd0a9925919b9b51739eea5f9e2bae91e83288108a9ad338b2e3a4435ee5 \
|
||||
--hash=sha256:3f8804571ebe159c380ac6de37643bb4685970655d3bba243530d6558b799aa0
|
||||
# via -r requirements.in
|
||||
pytz==2022.2.1 \
|
||||
--hash=sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197 \
|
||||
--hash=sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5
|
||||
# via tempora
|
||||
six==1.16.0 \
|
||||
--hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \
|
||||
--hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254
|
||||
# via cheroot
|
||||
stem==1.8.0 \
|
||||
--hash=sha256:a0b48ea6224e95f22aa34c0bc3415f0eb4667ddeae3dfb5e32a6920c185568c2
|
||||
# via -r requirements.in
|
||||
tempora==5.0.2 \
|
||||
--hash=sha256:31fa5bb33b2641026211f23e808eb8bd351901988b167d45f323c8f450ecf211 \
|
||||
--hash=sha256:e65d32ae68ad772ee738d802689f689b3f883e165e8dadd39aa89ef317b12b99
|
||||
# via portend
|
||||
typing-extensions==4.3.0 \
|
||||
--hash=sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02 \
|
||||
--hash=sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6
|
||||
# via pydantic
|
||||
ujson==5.4.0 \
|
||||
--hash=sha256:025758cf6561af6986d77cd4af9367ab56dde5c7c50f13f59e6964b4b25df73e \
|
||||
--hash=sha256:0551c1ba0bc9e05b69d9c18266dbc93252b5fa3cd9940051bc88a0dd33607b19 \
|
||||
--hash=sha256:05e411627e5d6ee773232960ca7307e66017f78e3fa74f7e95c3a8cc5cb05415 \
|
||||
--hash=sha256:0b46aee21e5d75426c4058dfdb42f7e7b1d130c664ee5027a8dbbc50872dc32b \
|
||||
--hash=sha256:0bcde3135265ecdd5714a7de4fdc167925390d7b17ca325e59980f4114c962b8 \
|
||||
--hash=sha256:1120c8263f7d85e89533a2b46d80cc6def15114772010ede4d197739e111dba6 \
|
||||
--hash=sha256:13297a7d501f9c8c53e409d4fa57cc574e4fbfbe8807ef2c4c7ce2e3ec933a85 \
|
||||
--hash=sha256:191f88d5865740497b9827ef9b7c12f37a79872ac984e09f0901a10024019380 \
|
||||
--hash=sha256:1a2e645325f844f9c890c9d956fc2d35ca91f38c857278238ef6516c2f99cf7c \
|
||||
--hash=sha256:2974b17bc522ef86d98b498959d82f03c02e07d9eb08746026415298f4a4bca3 \
|
||||
--hash=sha256:2d98248f1df1e1aab67e0374ab98945dd36bc1764753d71fd8aea5f296360b76 \
|
||||
--hash=sha256:31bdb6d771d5ef6d37134b42211500bfe176c55d399f3317e569783dc42ed38e \
|
||||
--hash=sha256:3212847d3885bfd4f5fd56cdc37645a8f8e8a80d6cb569505da22fd9eb0e1a02 \
|
||||
--hash=sha256:326a96324ed9215b0bc9f1a5af324fb33900b6b0901516bcc421475d6596de0d \
|
||||
--hash=sha256:381c97d326d1ec569d318cc0ae83940ea2df125ede1000871680fefd5b7fdea9 \
|
||||
--hash=sha256:39bb702ca1612253b5e4b6004e0f20208c98a446606aa351f9a7ba5ceaff0eb8 \
|
||||
--hash=sha256:3a0707f381f97e1287c0dbf94d95bd6c0bbf6e4eeeaa656f0076b7883010c818 \
|
||||
--hash=sha256:400e4ca8a59f71398e8fa56c4d2d6f535e2a121ddb57284ec15752ffce2dd63a \
|
||||
--hash=sha256:422653083c6df6cec17fdb5d6106c209aad9b0c94131c53b073980403db22167 \
|
||||
--hash=sha256:511aa641a5b91d19280183b134fb6c473039d4dd82e987ac810cffba783521ac \
|
||||
--hash=sha256:5df8b6369ee5ee2685fcc917f6c46b34e599c6e9a512fada6dfd752b909fa06a \
|
||||
--hash=sha256:67f4e2fa81e1d99c01e7b1978ab0cbf3c9a8b663f683a709f87baad110d5b940 \
|
||||
--hash=sha256:68c7f753aec490c6566fd3cd301887c413ac3a588316e446f30a4134ac665668 \
|
||||
--hash=sha256:6a20f2f6e8818c1ab89dd4be6bbad3fc2ddb15287f89e7ea35f3eb849afebbd9 \
|
||||
--hash=sha256:6b953e09441e307504130755e5bd6b15850178d591f66292bba4608c4f7f9b00 \
|
||||
--hash=sha256:754f422aba8db8201a1073f25e2f732effc6471f8755708b16e6ebf19dd23634 \
|
||||
--hash=sha256:784dbd12925845a3f0757a956447e2fd31418abb5aeaebf3aca1203195f16fd1 \
|
||||
--hash=sha256:7d4c9ccd30e621e714ec24ca911ad8873567dc1ac1e5e914405ea9dd16b9d40c \
|
||||
--hash=sha256:7e12272361e9722777c83b3f5b0bb91d402531f36e80c6e5fafb6acb89e897e3 \
|
||||
--hash=sha256:8cce79ce47c37132373fbdf55b683883c262a3a60763130e080b8394c1201d32 \
|
||||
--hash=sha256:8cd6117e33233f2de6bc896eea6a5a59b58a37db08f371157264e0ec5e51c76a \
|
||||
--hash=sha256:8d472efa9c92e1b2933a22d2f1dbd5237087997136b24ac2b913bf4e8be03135 \
|
||||
--hash=sha256:91edcf9978ee401119e9c8589376ae37fd3e6e75ee365c49385cb005eaff1535 \
|
||||
--hash=sha256:9ae1d0094ce730e39e09656bc14074d9573cdd80adec1a55b06d8bf1f9613a01 \
|
||||
--hash=sha256:aa00b746138835271653b0c3da171d2a8b510c579381f71e8b8e03484d50d825 \
|
||||
--hash=sha256:aaa77af91df3f71858a1f792c74d3f2d3abf3875f93ab1a2b9a24b3797743b02 \
|
||||
--hash=sha256:b045ca5497a950cc3492840adb3bcb3b9e305ed6599ed14c6aeaa08011aa463f \
|
||||
--hash=sha256:b40a3757a563ef77c3f2f9ea1732c2924e8b3b2bda3fa89513f949472ad40b6e \
|
||||
--hash=sha256:baa76a6f707a6d22437fe9c7ec9719672fb04d4d9435a3e80ee9b1aaeb2089d9 \
|
||||
--hash=sha256:cec010d318a0238b1333ea9f40d5603d374cc026c29c4471e2661712c6682da1 \
|
||||
--hash=sha256:dd0d4ec694cab8a0a4d85f45f81ae0065465c4670f0db72ba48d6c4e7ae42834 \
|
||||
--hash=sha256:e2a9ddb5c6d1427056b8d62a1a172a18ae522b14d9ba5996b8281b09cba87edd \
|
||||
--hash=sha256:e844be0831042aa91e847e5ab03bddd1089ab1a8dd0a1bf90411abf864f058b2 \
|
||||
--hash=sha256:e91947fda8354ea7faf698b084ebcdbabd239e7b15d8436fb74394f59a207ac9 \
|
||||
--hash=sha256:ea7fbc540bc04d5b05e5cd54e60ee8745ac665eedf2bad2ba9d12d5c7a7b7d2e \
|
||||
--hash=sha256:ee29cf5cfc1e841708297633e1ce749aa851fb96830bbe51f2e5940741ff2441 \
|
||||
--hash=sha256:ef985eb2770900a485431910bd3f333b56d1a34b65f8c26a6ed8e8adf55f98d9 \
|
||||
--hash=sha256:f5c547d49a7e9d3f231e9323171bbbbcef63173fb007a2787cd4f05ac6269315 \
|
||||
--hash=sha256:fbea46c0fbc1c3bc8f957afd8dbb25b4ea3a356e18ee6dd79ace6cf32bd4cff7 \
|
||||
--hash=sha256:fd82932aaa224abd7d01e823b77aef9970f5ac1695027331d99e7f5fda9d37f5
|
||||
# via -r requirements.in
|
||||
unpaddedbase32==0.2.0 \
|
||||
--hash=sha256:4aacee75f8fd6c8cf129842ecba45ca59c11bfb13dae19d86f32b48fa3715403 \
|
||||
--hash=sha256:b7b780c31d27d55e66abf6c221216a35690ee8892c2daacff7f2528e229bd9c3
|
||||
# via -r requirements.in
|
||||
zc-lockfile==2.0 \
|
||||
--hash=sha256:307ad78227e48be260e64896ec8886edc7eae22d8ec53e4d528ab5537a83203b \
|
||||
--hash=sha256:cc33599b549f0c8a248cb72f3bf32d77712de1ff7ee8814312eb6456b42c015f
|
||||
# via cherrypy
|
||||
|
||||
# WARNING: The following packages were not pinned, but pip requires them to be
|
||||
# pinned when the requirements file includes hashes. Consider using the --allow-unsafe flag.
|
||||
# setuptools
|
|
@ -1,150 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import os
|
||||
from threading import Thread
|
||||
from time import sleep
|
||||
from subprocess import DEVNULL
|
||||
|
||||
import ujson
|
||||
from psutil import Popen
|
||||
from psutil import Process
|
||||
|
||||
import sys
|
||||
|
||||
script_dir = os.path.dirname(os.path.realpath(__file__))
|
||||
sys.path.append(script_dir + '/src/')
|
||||
|
||||
import onionrvalues
|
||||
|
||||
|
||||
sub_script = script_dir + '/' + onionrvalues.SCRIPT_NAME
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
|
||||
parser.add_argument(
|
||||
"--bind-address", help="Address to bind to. Be very careful with non-loopback",
|
||||
type=str, default="")
|
||||
parser.add_argument(
|
||||
"--port", help="Port to bind to, must be available and possible",
|
||||
type=int, default=0)
|
||||
parser.add_argument(
|
||||
"--use-bootstrap-file", help="Use bootstrap node list file",
|
||||
type=int, default=1)
|
||||
parser.add_argument(
|
||||
"--show-stats", help="Display curses output of Onionr stats",
|
||||
type=int, default=0)
|
||||
parser.add_argument(
|
||||
"--onboarding", help="Use Onionr onboarding (if first load)",
|
||||
type=int, default=1)
|
||||
parser.add_argument(
|
||||
"--security-level", help="Set Onionr security level",
|
||||
type=int, default=0)
|
||||
parser.add_argument(
|
||||
'--open-ui', help='Open onionr web ui after started',
|
||||
type=int, default=1)
|
||||
parser.add_argument(
|
||||
'--random-localhost-ip', help='bind to random localhost IP for extra security',
|
||||
type=int, default=1)
|
||||
parser.add_argument(
|
||||
'--use-tor', help='Use Tor transport',
|
||||
type=int, default=1)
|
||||
parser.add_argument(
|
||||
'--private-key', help='Use existing private key',
|
||||
type=str, default=0)
|
||||
parser.add_argument(
|
||||
'--animated-background', help='Animated background on webui index. Just for looks.',
|
||||
type=int, default=0)
|
||||
parser.add_argument(
|
||||
'--keep-log-on-exit', help='Onionr can keep or delete its log file on exit',
|
||||
type=int, default=0)
|
||||
parser.add_argument(
|
||||
'--use-upload-mixing', help='Re-upload blocks uploaded to us. Slow but more secure',
|
||||
type=int, default=0)
|
||||
parser.add_argument(
|
||||
'--dev-mode',
|
||||
help='Developer mode makes restarting and testing Onionr less tedious during development',
|
||||
type=int, default=0)
|
||||
parser.add_argument(
|
||||
'--disable-plugin-list',
|
||||
help='plugins to disable by name, separate with commas',
|
||||
type=str, default='chat'
|
||||
)
|
||||
parser.add_argument(
|
||||
'--store-plaintext',
|
||||
help='store plaintext blocks or not. note that encrypted blocks may not really be encrypted, but we cannot detect that',
|
||||
type=int, default=1
|
||||
)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
p = Popen([sub_script, 'version'])
|
||||
p.wait()
|
||||
print("Configuring Onionr before starting daemon")
|
||||
from filepaths import config_file, keys_file
|
||||
from coredb import blockmetadb
|
||||
import onionrcrypto
|
||||
|
||||
|
||||
with open(config_file, 'r') as cf:
|
||||
config = ujson.loads(cf.read())
|
||||
|
||||
|
||||
if args.private_key:
|
||||
priv = args.private_key
|
||||
pub = onionrcrypto.cryptoutils.get_pub_key_from_priv(priv)
|
||||
with open(keys_file, "a") as f:
|
||||
f.write(',' + pub.decode() + ',' + priv)
|
||||
config['general']['public_key'] = pub
|
||||
|
||||
config['plugins']['disabled'] = args.disable_plugin_list.split(',')
|
||||
config['general']['dev_mode'] = False
|
||||
|
||||
config['general']['store_plaintext_blocks'] = True
|
||||
config['general']['use_bootstrap_list'] = True
|
||||
config['transports']['tor'] = True
|
||||
config['general']['bind_port'] = 0 # client api server port
|
||||
config['general']['bind_address'] = '' # client api server address
|
||||
|
||||
if args.bind_address:
|
||||
config['general']['bind_address'] = args.bind_address
|
||||
if args.port:
|
||||
config['client']['client']['port'] = args.port
|
||||
|
||||
if not args.use_bootstrap_file:
|
||||
config['general']['use_bootstrap_list'] = False
|
||||
if not args.store_plaintext:
|
||||
config['general']['store_plaintext_blocks'] = False
|
||||
if args.dev_mode:
|
||||
config['general']['dev_mode'] = True
|
||||
if not args.onboarding:
|
||||
config['onboarding']['done'] = True
|
||||
if not args.random_localhost_ip:
|
||||
config['general']['random_bind_ip'] = False
|
||||
if not args.use_tor:
|
||||
config['transports']['tor'] = False
|
||||
if not args.animated_background:
|
||||
config['ui']['animated_background'] = False
|
||||
if args.keep_log_on_exit:
|
||||
config['log']['file']['remove_on_exit'] = True
|
||||
else:
|
||||
config['log']['file']['remove_on_exit'] = False
|
||||
|
||||
config['general']['upload_mixing'] = False
|
||||
if args.use_upload_mixing:
|
||||
config['general']['upload_mixing'] = True
|
||||
config['general']['display_header'] = False
|
||||
config['general']['security_level'] = args.security_level
|
||||
|
||||
with open(config_file, 'w') as cf:
|
||||
cf.write(ujson.dumps(config, reject_bytes=False))
|
||||
|
||||
if args.open_ui:
|
||||
p = Popen([sub_script, 'start'])
|
||||
sleep(2)
|
||||
Popen([sub_script, 'openhome'])
|
||||
else:
|
||||
p = Popen([sub_script, 'start'])
|
||||
|
||||
p.wait()
|
|
@ -1,51 +0,0 @@
|
|||
#!/bin/sh
|
||||
set -x
|
||||
ORIG_ONIONR_RUN_DIR=`pwd`
|
||||
export ORIG_ONIONR_RUN_DIR
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
if [[ -n "$ONIONR_DOCKER" ]]; then
|
||||
[[ -f "/privkey" ]] && privkey_opt="--private-key /privkey"
|
||||
[[ -n "$ONIONR_ONBOARDING" ]] || ONIONR_ONBOARDING=0
|
||||
[[ -n "$ONIONR_OPEN_UI" ]] || ONIONR_OPEN_UI=0
|
||||
[[ -n "$ONIONR_RANDOM_LOCALHOST_IP" ]] || ONIONR_RANDOM_LOCALHOST_IP=0
|
||||
[[ -n "$ONIONR_BIND_ADDRESS" ]] || ONIONR_BIND_ADDRESS=0.0.0.0
|
||||
[[ -n "$ONIONR_PORT" ]] || ONIONR_PORT=8080
|
||||
fi
|
||||
|
||||
[[ -n "$ONIONR_PRIVATE_KEY_FILE" ]] && privkey_opt="--private-key $ONIONR_PRIVATE_KEY_FILE"
|
||||
[[ -n "$ONIONR_USE_BOOTSTRAP_FILE" ]] && bootstrap_opt="--use-bootstrap-file $ONIONR_USE_BOOTSTRAP_FILE"
|
||||
[[ -n "$ONIONR_SHOW_STATS" ]] && show_stats_opt="--show-stats $ONIONR_SHOW_STATS"
|
||||
[[ -n "$ONIONR_ONBOARDING" ]] && onboarding_opt="--onboarding $ONIONR_ONBOARDING"
|
||||
[[ -n "$ONIONR_SECURITY_LEVEL" ]] && security_level_opt="--security-level $ONIONR_SECURITY_LEVEL"
|
||||
[[ -n "$ONIONR_OPEN_UI" ]] && open_ui_opt="--open-ui $ONIONR_OPEN_UI"
|
||||
[[ -n "$ONIONR_RANDOM_LOCALHOST_IP" ]] && random_localhost_ip_opt="--random-localhost-ip $ONIONR_RANDOM_LOCALHOST_IP"
|
||||
[[ -n "$ONIONR_USE_TOR" ]] && use_tor_opt="--use-tor $ONIONR_USE_TOR"
|
||||
[[ -n "$ONIONR_ANIMATED_BACKGROUND" ]] && animated_background_opt="--animated-background $ONIONR_ANIMATED_BACKGROUND"
|
||||
[[ -n "$ONIONR_KEEP_LOG" ]] && keep_log_opt="--keep-log-on-exit $ONIONR_KEEP_LOG"
|
||||
[[ -n "$ONIONR_USE_UPLOAD_MIXING" ]] && use_upload_mixing_opt="--use-upload-mixing $ONIONR_USE_UPLOAD_MIXING"
|
||||
[[ -n "$ONIONR_DEV_MODE" ]] && dev_mode_opt="--dev-mode $ONIONR_DEV_MODE"
|
||||
[[ -n "$ONIONR_DISABLE_PLUGIN_LIST" ]] && disable_plugin_list_opt=" --disable-plugin-list $ONIONR_DISABLE_PLUGIN_LIST"
|
||||
[[ -n "$ONIONR_STORE_PLAINTEXT" ]] && store_plaintext_opt="--store-plaintext $ONIONR_STORE_PLAINTEXT"
|
||||
[[ -n "$ONIONR_BIND_ADDRESS" ]] && bind_address_opt="--bind-address $ONIONR_BIND_ADDRESS"
|
||||
[[ -n "$ONIONR_PORT" ]] && port_opt="--port $ONIONR_PORT"
|
||||
|
||||
|
||||
python3 run-onionr-node.py \
|
||||
$privkey_opt \
|
||||
$bootstrap_opt \
|
||||
$show_stats_opt \
|
||||
$onboarding_opt \
|
||||
$security_level_opt \
|
||||
$open_ui_opt \
|
||||
$random_localhost_ip_opt \
|
||||
$use_tor_opt \
|
||||
$animated_background_opt \
|
||||
$keep_log_opt \
|
||||
$use_upload_mixing_opt \
|
||||
$dev_mode_opt \
|
||||
$disable_plugin_list_opt \
|
||||
$store_plaintext_opt \
|
||||
$bind_address_opt \
|
||||
$port_opt \
|
||||
"$@"
|
|
@ -1,7 +1 @@
|
|||
This directory contains useful scripts and utilities that don't make sense to include as official Onionr features.
|
||||
|
||||
passphrase-generator.py: very simple utility to generate and print a strong passphrase to stdout. 256 bits of entropy by default.
|
||||
enable-dev-config.py/disable-dev-config.py: enable/disable dev default config setup
|
||||
block-spammer.py: attack tool for spamming blocks
|
||||
announce-attack.py: flood a node with false nodes
|
||||
run-unit-test-by-name: runs a unit test (no browser, runtime or intgegration test) by name
|
|
@ -1,51 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
"""Craft and send requests to the local client API"""
|
||||
|
||||
|
||||
import sys
|
||||
import os
|
||||
if not os.path.exists('onionr.sh'):
|
||||
os.chdir('../')
|
||||
sys.path.append("src/")
|
||||
|
||||
import atexit
|
||||
import readline
|
||||
|
||||
histfile = os.path.join(os.path.expanduser("~"), ".onionr_history")
|
||||
try:
|
||||
readline.read_history_file(histfile)
|
||||
# default history len is -1 (infinite), which may grow unruly
|
||||
readline.set_history_length(1000)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
atexit.register(readline.write_history_file, histfile)
|
||||
from onionrutils.localcommand import local_command
|
||||
from onionrutils.localcommand import get_hostname
|
||||
|
||||
try:
|
||||
print('API file found, probably running on ' + get_hostname())
|
||||
except TypeError:
|
||||
print('Onionr not running')
|
||||
sys.exit(1)
|
||||
print('1. get request (default)')
|
||||
print('2. post request')
|
||||
choice = input(">").lower().strip()
|
||||
post = False
|
||||
post_data = {}
|
||||
json = False
|
||||
endpoint = input("URL Endpoint: ")
|
||||
data = input("Data url param: ")
|
||||
if choice in ("2", "post", "post request"):
|
||||
post = True
|
||||
print("Enter post data")
|
||||
post_data = input()
|
||||
if post_data:
|
||||
print("Is this JSON?")
|
||||
json = input("y/n").lower().strip()
|
||||
if json == "y":
|
||||
json = True
|
||||
|
||||
ret = local_command(endpoint, data=data, post=post, post_data=post_data, is_json=json)
|
||||
print("Response: \n", ret)
|
|
@ -11,12 +11,9 @@ conf['tor']['existing_control_port'] = 0
|
|||
conf['tor']['existing_control_password'] = ""
|
||||
conf['tor']['existing_socks_port'] = 0
|
||||
|
||||
conf['general']['dev_mode'] = False
|
||||
conf['general']['insert_deniable_blocks'] = True
|
||||
conf['general']['random_bind_ip'] = True
|
||||
conf['general']['display_header'] = True
|
||||
conf['general']['security_level'] = 0
|
||||
conf['general']['use_bootstrap_list'] = True
|
||||
conf['onboarding']['done'] = False
|
||||
conf['general']['minimum_block_pow'] = 5
|
||||
conf['general']['minimum_send_pow'] = 5
|
||||
|
|
|
@ -10,7 +10,6 @@ conf = json.load(open('static-data/default_config.json', 'r'))
|
|||
|
||||
block_pow = int(input("Block POW level:"))
|
||||
|
||||
conf['general']['security_level'] = int(input("Security level:"))
|
||||
conf['transports']['tor'] = False
|
||||
if input('Use Tor? y/n').lower() == 'y':
|
||||
conf['transports']['tor'] = True
|
||||
|
@ -20,15 +19,11 @@ if input('Use Tor? y/n').lower() == 'y':
|
|||
conf['tor']['existing_control_password'] = input("Tor pass:")
|
||||
conf['tor']['existing_socks_port'] = int(input("Existing socks port:"))
|
||||
|
||||
conf['general']['dev_mode'] = True
|
||||
conf['general']['insert_deniable_blocks'] = False
|
||||
conf['general']['random_bind_ip'] = False
|
||||
conf['onboarding']['done'] = True
|
||||
conf['general']['minimum_block_pow'] = block_pow
|
||||
conf['general']['minimum_send_pow'] = block_pow
|
||||
conf['general']['use_bootstrap_list'] = False
|
||||
if input("Use bootstrap list? y/n").lower() == 'y':
|
||||
conf['general']['use_bootstrap_list'] = True
|
||||
conf['log']['file']['remove_on_exit'] = False
|
||||
conf['ui']['animated_background'] = False
|
||||
if input('Stat reporting? y/n') == 'y':
|
||||
|
|
|
@ -1,41 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
import stem
|
||||
from stem import process
|
||||
from stem.control import Controller
|
||||
if not os.path.exists('onionr.sh'):
|
||||
os.chdir('../')
|
||||
sys.path.append("src/")
|
||||
|
||||
try:
|
||||
sys.argv[1]
|
||||
except IndexError:
|
||||
sys.exit(1)
|
||||
|
||||
tor_process = process.launch_tor_with_config(
|
||||
completion_percent=0,
|
||||
config = {
|
||||
'ControlPort': '2778',
|
||||
'DisableNetwork': '1',
|
||||
'Log': [
|
||||
'NOTICE stdout',
|
||||
'ERR file /tmp/tor_error_log',
|
||||
],
|
||||
},
|
||||
)
|
||||
|
||||
with Controller.from_port('127.0.0.1', 2778) as controller:
|
||||
controller.authenticate()
|
||||
for i in range(1024, 1024 + int(sys.argv[1])):
|
||||
hs = controller.create_ephemeral_hidden_service(
|
||||
{80: i},
|
||||
key_type='NEW',
|
||||
key_content='ED25519-V3',
|
||||
await_publication=False,
|
||||
detached=True)
|
||||
print(hs.service_id + ".onion")
|
||||
controller.remove_ephemeral_hidden_service(hs.service_id)
|
||||
|
||||
tor_process.kill()
|
|
@ -1,21 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
"""Generate a 16 word passphase with 256 bits of entropy.
|
||||
|
||||
Specify true to reduce to 128 bits"""
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
import niceware
|
||||
|
||||
byte_count = 32 # 256 bits of entropy with niceware
|
||||
|
||||
arg = False
|
||||
try:
|
||||
arg = sys.argv[1].lower()
|
||||
if arg == 'true':
|
||||
byte_count = 16
|
||||
except IndexError: pass
|
||||
|
||||
print(' '.join(niceware.generate_passphrase(byte_count)))
|
|
@ -1,50 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
"""Craft and send requests to the local client API"""
|
||||
|
||||
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
from threading import Thread
|
||||
if not os.path.exists('onionr.sh'):
|
||||
os.chdir('../')
|
||||
sys.path.append("src/")
|
||||
|
||||
import filepaths
|
||||
import config
|
||||
config.reload()
|
||||
|
||||
with open(filepaths.private_API_host_file, 'r') as host:
|
||||
hostname = host.read()
|
||||
|
||||
port = config.get("client.client.port", 0)
|
||||
if not port:
|
||||
print("Could not get port for Onionr UI. Try again")
|
||||
sys.exit(1)
|
||||
torrc = f"""
|
||||
HiddenServiceDir remote-onionr-hs
|
||||
HiddenServicePort 80 {hostname}:{port}
|
||||
"""
|
||||
|
||||
with open("remote-onionr-torrc", "w") as torrc_f:
|
||||
torrc_f.write(torrc)
|
||||
|
||||
|
||||
def show_onion():
|
||||
while True:
|
||||
time.sleep(1)
|
||||
try:
|
||||
with open("remote-onionr-hs/hostname", "r") as f:
|
||||
o = f.read()
|
||||
print("UI Onion (Keep secret):", o)
|
||||
config.set("ui.public_remote_enabled", True)
|
||||
config.set("ui.public_remote_hosts", [o])
|
||||
config.save()
|
||||
break
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
Thread(target=show_onion, daemon=True).start()
|
||||
|
||||
os.system("tor -f remote-onionr-torrc")
|
|
@ -1,16 +0,0 @@
|
|||
import sys
|
||||
import os
|
||||
import stem
|
||||
|
||||
if not os.path.exists('onionr.sh'):
|
||||
os.chdir('../')
|
||||
sys.path.append("src/")
|
||||
from coredb.blockmetadb import get_block_list
|
||||
from onionrblocks.onionrblockapi import Block
|
||||
|
||||
for bl in get_block_list():
|
||||
bl_obj = Block(bl, decrypt=False)
|
||||
b_type = bl_obj.getType()
|
||||
if not b_type:
|
||||
b_type = "encrypted"
|
||||
print(bl + " - " + str(bl_obj.date) + " - " + b_type)
|
|
@ -1,40 +0,0 @@
|
|||
import sys
|
||||
import os
|
||||
import stem
|
||||
|
||||
if not os.path.exists('onionr.sh'):
|
||||
os.chdir('../')
|
||||
sys.path.append("src/")
|
||||
from onionrutils import stringvalidators
|
||||
from onionrutils import basicrequests
|
||||
|
||||
from stem.control import Controller
|
||||
|
||||
onionr_ip = input("onionr ip address: ")
|
||||
onionr_port = int(input("Enter onionr public api port: "))
|
||||
|
||||
controller = Controller.from_port('127.0.0.1', int(input("Enter tor controller port: ")))
|
||||
controller.authenticate()
|
||||
|
||||
node = input("Enter node to attack. Note that you legally must use your own, and even that might lead to technical or legal issues: ")
|
||||
assert stringvalidators.validate_transport(node)
|
||||
|
||||
socks = input("Socks:")
|
||||
|
||||
adders = set([])
|
||||
for i in range(int(input("Sybil addresses: "))):
|
||||
response = controller.create_ephemeral_hidden_service({80: f'{onionr_ip}:{onionr_port}'}, await_publication=True)
|
||||
#print(i, response.service_id)
|
||||
adders.add(response.service_id)
|
||||
|
||||
|
||||
for x in adders:
|
||||
x += '.onion'
|
||||
print(f"Introducing {x} to {node}")
|
||||
basicrequests.do_post_request(
|
||||
f'http://{node}/announce',
|
||||
data = {'node': x},
|
||||
port=socks)
|
||||
|
||||
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import sys
|
||||
import os
|
||||
if not os.path.exists('onionr.sh'):
|
||||
os.chdir('../')
|
||||
sys.path.append("src/")
|
||||
import onionrblocks
|
||||
|
||||
expire = 600
|
||||
print(onionrblocks.insert(data=os.urandom(32), expire=expire))
|
||||
|
|
@ -15,15 +15,16 @@ try:
|
|||
except ImportError:
|
||||
pass
|
||||
|
||||
|
||||
import os
|
||||
import cProfile
|
||||
import threading
|
||||
|
||||
onionr_profiling = os.getenv("ONIONR_PROFILING", False)
|
||||
|
||||
|
||||
import sys
|
||||
|
||||
try:
|
||||
import sqlite3
|
||||
except ModuleNotFoundError:
|
||||
sys.stderr.write(
|
||||
'Error, Onionr requires Sqlite3-enabled Python.\n' +
|
||||
'https://stackoverflow.com/a/1875095\n')
|
||||
sys.exit(1)
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -43,6 +44,29 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||
import locale # noqa
|
||||
locale.setlocale(locale.LC_ALL, '') # noqa
|
||||
|
||||
import traceback
|
||||
import signal
|
||||
|
||||
def sigusr_stacktrace(signum, frame):
|
||||
"""Print stacktrace on SIGUSR1"""
|
||||
stack_trace_file = os.getenv('ONIONR_STACK_TRACE_FILE', False)
|
||||
for th in threading.enumerate():
|
||||
if stack_trace_file:
|
||||
with open(stack_trace_file, 'a') as f:
|
||||
f.write(f'Thread: {th.name}')
|
||||
f.write('-' * 44 + '')
|
||||
traceback.print_stack(sys._current_frames()[th.ident], file=f)
|
||||
else:
|
||||
print(f'Thread: {th.name}')
|
||||
print('-' * 44)
|
||||
traceback.print_stack(sys._current_frames()[th.ident])
|
||||
#print(traceback.format_stack(frame))
|
||||
|
||||
signal.signal(signal.SIGUSR1, sigusr_stacktrace)
|
||||
|
||||
# Importing initailzes logging
|
||||
from logger import log as logging
|
||||
|
||||
ran_as_script = False
|
||||
if __name__ == "__main__": ran_as_script = True
|
||||
|
||||
|
@ -73,7 +97,6 @@ if sys.version_info[0] == 2 or sys.version_info[1] < min_ver:
|
|||
from utils import createdirs
|
||||
createdirs.create_dirs()
|
||||
|
||||
import bigbrother # noqa
|
||||
from onionrcommands import parser # noqa
|
||||
from onionrplugins import onionrevents as events # noqa
|
||||
|
||||
|
@ -83,23 +106,21 @@ import config # noqa
|
|||
from utils import identifyhome # noqa
|
||||
import filepaths # noqa
|
||||
|
||||
if config.get('advanced.security_auditing', True):
|
||||
try:
|
||||
bigbrother.enable_ministries()
|
||||
except onionrexceptions.PythonVersion:
|
||||
pass
|
||||
|
||||
|
||||
def onionr_main():
|
||||
"""Onionr entrypoint, start command processor
|
||||
|
||||
Entrypoint for daemon is commands/daemonlaunch/__init__.py
|
||||
"""
|
||||
events.event('beforecmdparsing', threaded=False)
|
||||
parser.register()
|
||||
|
||||
|
||||
if ran_as_script:
|
||||
onionr_main()
|
||||
if onionr_profiling:
|
||||
cProfile.run('onionr_main()')
|
||||
else:
|
||||
onionr_main()
|
||||
|
||||
config.reload()
|
||||
|
||||
|
|
|
@ -1,87 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
Prevent eval/exec/os.system and log it
|
||||
"""
|
||||
import base64
|
||||
import platform
|
||||
|
||||
import logger
|
||||
from utils import identifyhome
|
||||
from onionrexceptions import ArbitraryCodeExec
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
untrusted_exec = True
|
||||
|
||||
def block_system(cmd):
|
||||
"""Prevent os.system except for whitelisted commands+contexts."""
|
||||
logger.warn('POSSIBLE EXPLOIT DETECTED, SEE LOGS', terminal=True)
|
||||
logger.warn(f'POSSIBLE EXPLOIT: shell command not in whitelist: {cmd}')
|
||||
raise ArbitraryCodeExec('os.system command not in whitelist')
|
||||
|
||||
|
||||
def block_exec(event, info):
|
||||
"""Prevent arbitrary code execution in eval/exec and log it."""
|
||||
# because libraries have stupid amounts of compile/exec/eval,
|
||||
# We have to use a whitelist where it can be tolerated
|
||||
# Generally better than nothing, not a silver bullet
|
||||
if untrusted_exec:
|
||||
return
|
||||
whitelisted_code = [
|
||||
'netrc.py',
|
||||
'shlex.py',
|
||||
'gzip.py',
|
||||
'<werkzeug routing>',
|
||||
'werkzeug/test.py',
|
||||
'multiprocessing/popen_fork.py',
|
||||
'multiprocessing/util.py',
|
||||
'multiprocessing/connection.py',
|
||||
'multiprocessing/queues.py',
|
||||
'multiprocessing/synchronize.py',
|
||||
'onionrutils/escapeansi.py',
|
||||
'stem/connection.py',
|
||||
'stem/response/add_onion.py',
|
||||
'stem/response/authchallenge.py',
|
||||
'stem/response/getinfo.py',
|
||||
'stem/response/getconf.py',
|
||||
'stem/response/mapaddress.py',
|
||||
'stem/response/protocolinfo.py',
|
||||
'apport/__init__.py',
|
||||
'apport/report.py'
|
||||
]
|
||||
whitelisted_source = [
|
||||
'ZABaAGQBZAJsAW0CWgIBAHoGZAFkA2wDWgRXAG4LBABlBXkZAQABAAEAZARaBlkAbgN3AGQFWgZkAWQGbAdtCFoIAQBkAWQDbAlaCWQBZAdsCm0LWgwBAAkAZQmgDWQIZAWhAnM1ZARaBmUIgwBkCRcAWg5kEmQMZQ9kDWUPZgRkDmQPhAVaEGQTZBBkEYQBWhFkA1MA',
|
||||
'RwBkAGQBhABkAYMCWgBkAlMA',
|
||||
'ZABaAGQBZAJsAVoBZAFkAmwCWgJkAWQCbANaA2QBZAJsBFoEZAFkAmwFWgVkAWQCbAZaBmQBZAJsB1oIZAFkAmwJWghkAWQCbApaCGQBZAJsC1oIZANaDGQEWg1kBWQCZAJkBmQCZQ1kB2QIZAJmCWQJZAqEAVoOZAVkBmQCZQ1kB2QIZgZkC2QMhAFaD2QCUwA=',
|
||||
'ZABaAGQBZAJsAVoBZAFkAmwCWgJkAWQCbANaA2QBZAJsBFoEZAFkAmwFWgVkAWQCbAZaBmQBZAJsB1oIZAFkAmwJWghkAWQCbApaCGQBZANsC20MWgxtDVoNbQ5aDm0PWg9tEFoQbRFaEQEAZARaEmQFWhNkBmQCZAJkB2QCZRNkCGQJZAJmCWQKZRRkC2UPZRBlFBkAGQBkDGUPZRQZAGQNZRVkDmUPZQ1lFGcBZAJmAhkAGQBkD2UVZBBlFmQRZRZkEmUPZRQZAGQTZQRqF2YUZBRkFYQFWhhkBmQHZAJlE2QIZAlmBmQWZQ5lFGURZRRlEGUUGQBmAhkAZgIZAGQKZRRkDWUVZA5lD2UNZRRnAWQCZgIZABkAZA9lFWQQZRZkEWUWZBNlBGoXZhBkF2QYhAVaGWQCUwA='
|
||||
]
|
||||
home = identifyhome.identify_home()
|
||||
|
||||
code_b64 = base64.b64encode(info[0].co_code).decode()
|
||||
if code_b64 in whitelisted_source:
|
||||
return
|
||||
|
||||
for source in whitelisted_code:
|
||||
if info[0].co_filename.endswith(source):
|
||||
return
|
||||
|
||||
if 'plugins/' in info[0].co_filename:
|
||||
return
|
||||
|
||||
logger.warn('POSSIBLE EXPLOIT DETECTED, SEE LOGS', terminal=True)
|
||||
logger.warn('POSSIBLE EXPLOIT DETECTED: ' + info[0].co_filename)
|
||||
logger.warn('Prevented exec/eval. Report this with the sample below')
|
||||
logger.warn(f'{event} code in base64 format: {code_b64}')
|
||||
raise ArbitraryCodeExec("Arbitrary code (eval/exec) detected.")
|
|
@ -1,6 +1,7 @@
|
|||
from typing import Callable, Generator, List
|
||||
|
||||
from onionrblocks import Block
|
||||
from onionrplugins import onionrevents
|
||||
|
||||
import db
|
||||
|
||||
|
@ -15,8 +16,9 @@ block_storage_observers: List[Callable] = []
|
|||
|
||||
|
||||
def add_block_to_db(block: Block):
|
||||
# Raises db.DuplicateKey if dupe
|
||||
db.set_if_new(block_db_path, block.id, block.raw)
|
||||
onionrevents.event('before_block_db_add', block, threaded=False)
|
||||
db.set_if_new(block_db_path, block.id, block.raw) # Raises db.DuplicateKey if dupe
|
||||
onionrevents.event('after_block_db_add', block, threaded=False)
|
||||
|
||||
|
||||
def has_block(block_hash):
|
||||
|
|
|
@ -2,7 +2,7 @@ from typing import Set
|
|||
|
||||
from onionrblocks import Block
|
||||
|
||||
import logger
|
||||
from logger import log as logging
|
||||
|
||||
from .deleteblock import delete_block
|
||||
from .getblocks import get_blocks_after_timestamp
|
||||
|
@ -18,7 +18,7 @@ def clean_block_database():
|
|||
Block(block.id, block.raw, auto_verify=True)
|
||||
except ValueError: # block expired
|
||||
remove_set.add(block)
|
||||
|
||||
|
||||
if len(remove_set):
|
||||
logger.info(f"Cleaning {len(remove_set)} blocks", terminal=True)
|
||||
logging.info(f"Cleaning {len(remove_set)} blocks")
|
||||
[i for i in map(delete_block, remove_set)]
|
||||
|
|
|
@ -6,10 +6,9 @@ import os
|
|||
from json import JSONDecodeError
|
||||
|
||||
import ujson as json
|
||||
import logger
|
||||
from logger import log as logging
|
||||
import filepaths
|
||||
|
||||
from . import onboarding
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -107,7 +106,7 @@ def save():
|
|||
with open(get_config_file(), 'w', encoding="utf8") as configfile:
|
||||
json.dump(get_config(), configfile, indent=2)
|
||||
except JSONDecodeError:
|
||||
logger.warn('Failed to write to configuration file.')
|
||||
logging.warn('Failed to write to configuration file.')
|
||||
|
||||
|
||||
def reload():
|
||||
|
@ -118,7 +117,7 @@ def reload():
|
|||
set_config(json.loads(configfile.read()))
|
||||
except (FileNotFoundError, JSONDecodeError) as e:
|
||||
pass
|
||||
#logger.debug('Failed to parse configuration file.')
|
||||
#logging.debug('Failed to parse configuration file.')
|
||||
|
||||
|
||||
def get_config():
|
||||
|
|
|
@ -1,79 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
Setup config from onboarding choices
|
||||
"""
|
||||
from pathlib import Path
|
||||
from typing import Union
|
||||
|
||||
from filepaths import onboarding_mark_file
|
||||
from onionrtypes import JSONSerializable
|
||||
from onionrtypes import OnboardingConfig
|
||||
import config
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def _get_val_or_none(json: dict, key: str) -> Union[None, JSONSerializable]:
|
||||
try:
|
||||
return json['configInfo'][key]
|
||||
except KeyError:
|
||||
return None
|
||||
|
||||
|
||||
def set_config_from_onboarding(config_settings: OnboardingConfig):
|
||||
get = _get_val_or_none
|
||||
|
||||
config.reload()
|
||||
|
||||
if get(config_settings, 'optimize'):
|
||||
config.set('ui.animated_background', False)
|
||||
config.set('general.insert_deniable_blocks', False)
|
||||
|
||||
if get(config_settings, 'stateTarget') or not get(config_settings,
|
||||
'networkContrib'):
|
||||
config.set('general.security_level', 1)
|
||||
|
||||
if get(config_settings, 'localThreat'):
|
||||
config.set('general.security_level', 3)
|
||||
config.set('transports.lan', False)
|
||||
|
||||
config.set('ui.theme', 'light')
|
||||
if get(config_settings, 'useDark'):
|
||||
config.set('ui.theme', 'dark')
|
||||
|
||||
disabled = config.get('plugins.disabled', [])
|
||||
|
||||
if not get(config_settings, 'circles') or \
|
||||
config.get('general.security_level') > 0:
|
||||
disabled.append('flow')
|
||||
|
||||
if not get(config_settings, 'mail'):
|
||||
disabled.append('pms')
|
||||
|
||||
config.set('plugins.disabled', disabled)
|
||||
|
||||
config.set('general.store_plaintext_blocks',
|
||||
get(config_settings, 'plainContrib'))
|
||||
|
||||
config.set('onboarding.done', True, savefile=True)
|
||||
|
||||
|
||||
def set_onboarding_finished():
|
||||
"""Create the onboarding completed setting file"""
|
||||
Path(onboarding_mark_file).touch()
|
||||
|
||||
|
||||
def is_onboarding_finished() -> bool:
|
||||
return True
|
|
@ -1 +0,0 @@
|
|||
from . import keydb
|
|
@ -1,9 +0,0 @@
|
|||
from utils import identifyhome
|
||||
import filepaths
|
||||
home = identifyhome.identify_home()
|
||||
if not home.endswith('/'): home += '/'
|
||||
|
||||
address_info_db = '%saddress.db' % (home,)
|
||||
user_id_info_db = '%susers.db' % (home,)
|
||||
forward_keys_db = '%sforward-keys.db' % (home,)
|
||||
blacklist_db = '%sblacklist.db' % (home,)
|
|
@ -1 +0,0 @@
|
|||
from . import addkeys, listkeys, removekeys, userinfo
|
|
@ -1,55 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
add user keys or transport addresses
|
||||
"""
|
||||
import sqlite3
|
||||
from onionrutils import stringvalidators
|
||||
from . import listkeys
|
||||
from .. import dbfiles
|
||||
import onionrcrypto
|
||||
import onionrvalues
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def add_pub_key(peerID, name=''):
|
||||
"""Add a public key to the key database (misleading function name)."""
|
||||
if peerID in listkeys.list_pub_keys() or peerID == onionrcrypto.pub_key:
|
||||
raise ValueError("specified id is already known")
|
||||
|
||||
# This function simply adds a peer to the DB
|
||||
if not stringvalidators.validate_pub_key(peerID):
|
||||
return False
|
||||
|
||||
conn = sqlite3.connect(dbfiles.user_id_info_db, timeout=onionrvalues.DATABASE_LOCK_TIMEOUT)
|
||||
hashID = ""
|
||||
c = conn.cursor()
|
||||
t = (peerID, name, 'unknown', hashID, 0)
|
||||
|
||||
for i in c.execute("SELECT * FROM peers WHERE id = ?;", (peerID,)):
|
||||
try:
|
||||
if i[0] == peerID:
|
||||
conn.close()
|
||||
return False
|
||||
except ValueError:
|
||||
pass
|
||||
except IndexError:
|
||||
pass
|
||||
c.execute('INSERT INTO peers (id, name, dateSeen, hashID, trust) VALUES(?, ?, ?, ?, ?);', t)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
return True
|
||||
|
|
@ -1,63 +0,0 @@
|
|||
"""
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
get lists for user keys
|
||||
"""
|
||||
import sqlite3
|
||||
import logger
|
||||
from onionrutils import epoch
|
||||
import onionrvalues
|
||||
from .. import dbfiles
|
||||
from . import userinfo
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def list_pub_keys(randomOrder=True, getPow=False, trust=0):
|
||||
"""
|
||||
Return a list of public keys (misleading function name)
|
||||
|
||||
randomOrder determines if the list should be in a random order
|
||||
trust sets the minimum trust to list
|
||||
"""
|
||||
conn = sqlite3.connect(dbfiles.user_id_info_db, timeout=onionrvalues.DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
|
||||
payload = ''
|
||||
|
||||
if trust not in (0, 1, 2):
|
||||
logger.error('Tried to select invalid trust.')
|
||||
return
|
||||
|
||||
if randomOrder:
|
||||
payload = 'SELECT * FROM peers WHERE trust >= ? ORDER BY RANDOM();'
|
||||
else:
|
||||
payload = 'SELECT * FROM peers WHERE trust >= ?;'
|
||||
|
||||
peer_list = []
|
||||
|
||||
for i in c.execute(payload, (trust,)):
|
||||
try:
|
||||
if len(i[0]) != 0:
|
||||
if getPow:
|
||||
peer_list.append(i[0] + '-' + i[1])
|
||||
else:
|
||||
peer_list.append(i[0])
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
conn.close()
|
||||
|
||||
return peer_list
|
|
@ -1,43 +0,0 @@
|
|||
"""
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
Remove a transport address but don't ban them
|
||||
"""
|
||||
import sqlite3
|
||||
from onionrplugins import onionrevents as events
|
||||
from onionrutils import stringvalidators
|
||||
from onionrutils import mnemonickeys
|
||||
from .. import dbfiles
|
||||
import onionrvalues
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def remove_user(pubkey: str)->bool:
|
||||
"""Remove a user from the user database"""
|
||||
pubkey = mnemonickeys.get_base32(pubkey)
|
||||
if stringvalidators.validate_pub_key(pubkey):
|
||||
conn = sqlite3.connect(
|
||||
dbfiles.user_id_info_db,
|
||||
timeout=onionrvalues.DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
t = (pubkey,)
|
||||
c.execute('Delete from peers where id=?;', t)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
return True
|
||||
else:
|
||||
return False
|
|
@ -1,74 +0,0 @@
|
|||
"""
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
get or set information about a user id
|
||||
"""
|
||||
import sqlite3
|
||||
from .. import dbfiles
|
||||
import onionrvalues
|
||||
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
def get_user_info(peer, info):
|
||||
"""
|
||||
Get info about a peer from their database entry
|
||||
|
||||
id text 0
|
||||
name text, 1
|
||||
adders text, 2
|
||||
dateSeen not null, 3
|
||||
trust int 4
|
||||
hashID text 5
|
||||
"""
|
||||
conn = sqlite3.connect(dbfiles.user_id_info_db, timeout=onionrvalues.DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
|
||||
command = (peer,)
|
||||
infoNumbers = {'id': 0, 'name': 1, 'adders': 2, 'dateSeen': 3, 'trust': 4, 'hashID': 5}
|
||||
info = infoNumbers[info]
|
||||
iterCount = 0
|
||||
retVal = ''
|
||||
|
||||
for row in c.execute('SELECT * FROM peers WHERE id=?;', command):
|
||||
for i in row:
|
||||
if iterCount == info:
|
||||
retVal = i
|
||||
break
|
||||
else:
|
||||
iterCount += 1
|
||||
|
||||
conn.close()
|
||||
|
||||
return retVal
|
||||
|
||||
def set_peer_info(peer, key, data):
|
||||
"""
|
||||
Update a peer for a key
|
||||
"""
|
||||
|
||||
conn = sqlite3.connect(dbfiles.user_id_info_db, timeout=onionrvalues.DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
|
||||
command = (data, peer)
|
||||
|
||||
if key not in ('id', 'name', 'pubkey', 'forwardKey', 'dateSeen', 'trust'):
|
||||
raise ValueError("Got invalid database key when setting peer info")
|
||||
|
||||
c.execute('UPDATE peers SET ' + key + ' = ? WHERE id=?', command)
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
set_user_info = set_peer_info
|
|
@ -7,27 +7,8 @@ app_root = os.path.dirname(os.path.realpath(__file__)) + '/../../'
|
|||
|
||||
gossip_server_socket_file = home + 'gossip-server.sock'
|
||||
|
||||
usage_file = home + 'disk-usage.txt'
|
||||
contacts_location = home + 'contacts/'
|
||||
cached_storage = home + 'cachedstorage.dat'
|
||||
export_location = home + 'block-export/'
|
||||
upload_list = home + 'upload-list.json'
|
||||
config_file = home + 'config.json'
|
||||
daemon_mark_file = home + '/daemon-true.txt'
|
||||
lock_file = home + 'onionr.lock'
|
||||
pid_file = home + 'onionr.pid'
|
||||
|
||||
site_cache = home + 'onionr-sites.txt'
|
||||
|
||||
tor_hs_loc = home + 'hs/'
|
||||
tor_hs_address_file = home + 'hs/hostname'
|
||||
|
||||
keys_file = home + 'keys.txt'
|
||||
|
||||
onboarding_mark_file = home + 'onboarding-completed'
|
||||
|
||||
log_file = home + 'onionr.log'
|
||||
|
||||
ephemeral_services_file = home + 'ephemeral-services.list'
|
||||
|
||||
restarting_indicator = home + "is-restarting"
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import threading
|
||||
from time import sleep
|
||||
from typing import TYPE_CHECKING, Set, Tuple
|
||||
from logger import log as logging
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from ordered_set import OrderedSet
|
||||
|
@ -11,7 +12,6 @@ if TYPE_CHECKING:
|
|||
|
||||
from onionrthreads import add_onionr_thread
|
||||
import onionrplugins
|
||||
import logger
|
||||
|
||||
from .connectpeer import connect_peer
|
||||
from .client import start_gossip_client
|
||||
|
@ -56,4 +56,4 @@ def start_gossip_threads():
|
|||
sleep(60)
|
||||
if len(gossip_peer_set):
|
||||
return
|
||||
logger.error("Could not connect to any peers :(", terminal=True)
|
||||
logging.error("Could not connect to any peers :(")
|
||||
|
|
|
@ -21,7 +21,7 @@ if TYPE_CHECKING:
|
|||
from ..peer import Peer
|
||||
from ordered_set import OrderedSet
|
||||
|
||||
import logger
|
||||
from logger import log as logging
|
||||
import config
|
||||
import onionrplugins
|
||||
from ..commands import GossipCommands
|
||||
|
@ -61,20 +61,20 @@ def block_queue_processing():
|
|||
while not len(gossip_peer_set):
|
||||
sleep(1)
|
||||
if dandelion_phase.remaining_time() <= 15:
|
||||
#logger.debug("Sleeping", terminal=True)
|
||||
#logging.debug("Sleeping")
|
||||
sleep(dandelion_phase.remaining_time())
|
||||
if dandelion_phase.is_stem_phase() and config.get('security.dandelion.enabled', True):
|
||||
logger.debug("Entering stem phase", terminal=True)
|
||||
logging.debug("Entering stem phase")
|
||||
try:
|
||||
# Stem out blocks for (roughly) remaining epoch time
|
||||
asyncio.run(stem_out(dandelion_phase))
|
||||
except TimeoutError:
|
||||
pass
|
||||
except Exception:
|
||||
logger.error(traceback.format_exc(), terminal=True)
|
||||
logging.error(traceback.format_exc())
|
||||
pass
|
||||
else:
|
||||
#logger.debug("Entering fluff phase", terminal=True)
|
||||
#logging.debug("Entering fluff phase")
|
||||
# Add block to primary block db, where the diffuser can read it
|
||||
sleep(0.1)
|
||||
store_blocks(dandelion_phase)
|
||||
|
|
|
@ -5,7 +5,7 @@ from typing import TYPE_CHECKING
|
|||
if TYPE_CHECKING:
|
||||
from .. import Peer
|
||||
|
||||
import logger
|
||||
from logger import log as logging
|
||||
import onionrplugins
|
||||
|
||||
from ..commands import GossipCommands, command_to_byte
|
||||
|
@ -28,7 +28,7 @@ def do_announce():
|
|||
sock.sendall(command_to_byte(GossipCommands.ANNOUNCE))
|
||||
sock.sendall(our_transport_address)
|
||||
if int.from_bytes(sock.recv(1), 'big') != 1:
|
||||
logger.warn(
|
||||
logging.warn(
|
||||
f"Could not announce with {announce_peer.transport_address}")
|
||||
sock.close()
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ from ordered_set import OrderedSet
|
|||
import config
|
||||
from onionrthreads import add_delayed_thread
|
||||
from blockdb import add_block_to_db
|
||||
import logger
|
||||
from logger import log as logging
|
||||
|
||||
from ...constants import BLACKHOLE_EVADE_TIMER_SECS, OUTBOUND_DANDELION_EDGES
|
||||
from ...commands import GossipCommands, command_to_byte
|
||||
|
@ -45,9 +45,9 @@ async def _setup_edge(
|
|||
try:
|
||||
s = peer.get_socket(12)
|
||||
except TimeoutError:
|
||||
logger.debug(f"{peer.transport_address} timed out when trying stemout")
|
||||
logging.debug(f"{peer.transport_address} timed out when trying stemout")
|
||||
except Exception:
|
||||
logger.debug(traceback.format_exc())
|
||||
logging.debug(traceback.format_exc())
|
||||
return
|
||||
|
||||
try:
|
||||
|
@ -56,18 +56,18 @@ async def _setup_edge(
|
|||
if s.recv(1) == dandelion.StemAcceptResult.DENY:
|
||||
raise StemConnectionDenied
|
||||
except TimeoutError:
|
||||
logger.debug(
|
||||
"Peer timed out when establishing stem connection", terminal=True)
|
||||
logger.debug(traceback.format_exc())
|
||||
logging.debug(
|
||||
"Peer timed out when establishing stem connection")
|
||||
logging.debug(traceback.format_exc())
|
||||
except StemConnectionDenied:
|
||||
logger.debug(
|
||||
logging.debug(
|
||||
"Stem connection denied (peer has too many) " +
|
||||
f"{peer.transport_address}")
|
||||
logger.debug(traceback.format_exc())
|
||||
logging.debug(traceback.format_exc())
|
||||
except Exception:
|
||||
logger.warn(
|
||||
logging.warn(
|
||||
"Error asking peer to establish stem connection" +
|
||||
traceback.format_exc(), terminal=True)
|
||||
traceback.format_exc())
|
||||
else:
|
||||
# Return peer socket if it is in stem reception mode successfully
|
||||
return s
|
||||
|
@ -113,10 +113,10 @@ async def stem_out(d_phase: 'DandelionPhase'):
|
|||
await _setup_edge(gossip_peer_set, tried_edges))
|
||||
except NotEnoughEdges:
|
||||
# No possible edges at this point (edges < OUTBOUND_DANDELION_EDGE)
|
||||
#logger.debug(
|
||||
#logging.debug(
|
||||
# "Making too few edges for stemout " +
|
||||
# "this is bad for anonymity if frequent.",
|
||||
# terminal=True)
|
||||
# )
|
||||
if strict_dandelion:
|
||||
not_enough_edges = True
|
||||
else:
|
||||
|
@ -133,10 +133,10 @@ async def stem_out(d_phase: 'DandelionPhase'):
|
|||
else:
|
||||
# Ran out of time for stem phase
|
||||
if not d_phase.is_stem_phase() or d_phase.remaining_time() < 5:
|
||||
logger.error(
|
||||
logging.error(
|
||||
"Did not stem out any blocks in time, " +
|
||||
"if this happens regularly you may be under attack",
|
||||
terminal=False)
|
||||
)
|
||||
for s in peer_sockets:
|
||||
if s:
|
||||
s.close()
|
||||
|
@ -155,7 +155,7 @@ async def stem_out(d_phase: 'DandelionPhase'):
|
|||
except Empty:
|
||||
pass
|
||||
except Exception:
|
||||
logger.warn(traceback.format_exc())
|
||||
logging.warn(traceback.format_exc())
|
||||
else:
|
||||
# stream routine exited early
|
||||
pass
|
||||
|
|
|
@ -4,7 +4,7 @@ from queue import Empty
|
|||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
import logger
|
||||
from logger import log as logging
|
||||
from ...constants import BLOCK_ID_SIZE, BLOCK_MAX_SIZE, BLOCK_SIZE_LEN
|
||||
|
||||
if TYPE_CHECKING:
|
||||
|
@ -22,7 +22,7 @@ async def do_stem_stream(
|
|||
remaining_time = d_phase.remaining_time()
|
||||
my_phase_id = d_phase.phase_id
|
||||
|
||||
|
||||
|
||||
while remaining_time > 1 and my_phase_id == d_phase.phase_id:
|
||||
# Primary client component that communicate's with gossip.server.acceptstem
|
||||
remaining_time = d_phase.remaining_time()
|
||||
|
@ -35,7 +35,7 @@ async def do_stem_stream(
|
|||
await sleep(1)
|
||||
else:
|
||||
break
|
||||
logger.info("Sending block over dandelion++", terminal=True)
|
||||
logging.info("Sending block over dandelion++")
|
||||
|
||||
block_size = str(len(bl.raw)).zfill(BLOCK_SIZE_LEN)
|
||||
def _send_it():
|
||||
|
|
|
@ -6,9 +6,7 @@ if TYPE_CHECKING:
|
|||
from socket import socket
|
||||
|
||||
from onionrplugins import onionrevents
|
||||
import logger
|
||||
|
||||
from socks import GeneralProxyError
|
||||
from logger import log as logging
|
||||
|
||||
from ..peer import Peer
|
||||
from ..commands import GossipCommands, command_to_byte
|
||||
|
@ -23,9 +21,9 @@ def _do_ask_peer(peer):
|
|||
try:
|
||||
_ask_peer(peer)
|
||||
except TimeoutError:
|
||||
logger.debug("Timed out when asking for new peers")
|
||||
logging.debug("Timed out when asking for new peers")
|
||||
except Exception:
|
||||
logger.error(format_exc(), terminal=True)
|
||||
logging.error(format_exc())
|
||||
|
||||
def _ask_peer(peer):
|
||||
s: 'socket' = peer.get_socket(12)
|
||||
|
@ -46,14 +44,14 @@ def _ask_peer(peer):
|
|||
'address': peer,
|
||||
'callback': connectpeer.connect_peer
|
||||
}
|
||||
#logger.info("Got new peer from exchange " + peer.decode('utf-8'), terminal=True)
|
||||
#logging.info("Got new peer from exchange " + peer.decode('utf-8'))
|
||||
onionrevents.event('announce_rec', data=connect_data, threaded=True)
|
||||
s.close()
|
||||
|
||||
|
||||
def get_new_peers():
|
||||
if not len(gossip_peer_set):
|
||||
logger.debug("Peer set empty, cannot get new peers")
|
||||
logging.debug("Peer set empty, cannot get new peers")
|
||||
return
|
||||
|
||||
# Deep copy the peer list
|
||||
|
|
|
@ -22,7 +22,7 @@ if TYPE_CHECKING:
|
|||
|
||||
from ordered_set import OrderedSet
|
||||
|
||||
import logger
|
||||
from logger import log as logging
|
||||
|
||||
import onionrblocks
|
||||
from ...peerset import gossip_peer_set
|
||||
|
@ -71,7 +71,7 @@ def stream_from_peers():
|
|||
need_socket_lock.release()
|
||||
return
|
||||
except Exception:
|
||||
logger.warn(traceback.format_exc(), terminal=True)
|
||||
logging.warn(traceback.format_exc())
|
||||
need_socket_lock.release()
|
||||
return
|
||||
try:
|
||||
|
@ -83,7 +83,7 @@ def stream_from_peers():
|
|||
|
||||
while stream_times >= stream_counter:
|
||||
stream_counter += 1
|
||||
#logger.debug("Reading block of id in stream with " + peer.transport_address, terminal=True)
|
||||
#logging.debug("Reading block of id in stream with " + peer.transport_address)
|
||||
sock.settimeout(5)
|
||||
block_id = sock.recv(BLOCK_ID_SIZE)
|
||||
if blockdb.has_block(block_id):
|
||||
|
@ -91,12 +91,12 @@ def stream_from_peers():
|
|||
continue
|
||||
sock.sendall(int(1).to_bytes(1, 'big'))
|
||||
|
||||
#logger.debug("Reading block size in stream", terminal=True)
|
||||
#logging.debug("Reading block size in stream")
|
||||
|
||||
sock.settimeout(5)
|
||||
block_size = int(sock.recv(BLOCK_SIZE_LEN))
|
||||
if block_size > BLOCK_MAX_SIZE or block_size <= 0:
|
||||
logger.warn(
|
||||
logging.warn(
|
||||
f"Peer {peer.transport_address} " +
|
||||
"reported block size out of range")
|
||||
break
|
||||
|
@ -104,9 +104,9 @@ def stream_from_peers():
|
|||
sock.settimeout(5)
|
||||
block_data = sock.recv(block_size)
|
||||
|
||||
#logger.debug(
|
||||
#logging.debug(
|
||||
# "We got a block from stream, assuming it is valid",
|
||||
# terminal=True)
|
||||
# )
|
||||
try:
|
||||
blockdb.add_block_to_db(
|
||||
onionrblocks.Block(
|
||||
|
@ -120,10 +120,10 @@ def stream_from_peers():
|
|||
sock.sendall(int(1).to_bytes(1, 'big'))
|
||||
except (BrokenPipeError, TimeoutError, ConnectionError) as e:
|
||||
pass
|
||||
#logger.debug(f"{e} when streaming from peers", terminal=True)
|
||||
#logger.debug(traceback.format_exc())
|
||||
#logging.debug(f"{e} when streaming from peers")
|
||||
#logging.debug(traceback.format_exc())
|
||||
except Exception:
|
||||
logger.warn(traceback.format_exc(), terminal=True)
|
||||
logging.warn(traceback.format_exc())
|
||||
finally:
|
||||
sock.close()
|
||||
need_socket_lock.release()
|
||||
|
|
|
@ -2,7 +2,7 @@ import traceback
|
|||
from gossip.commands import GossipCommands, command_to_byte
|
||||
from .peerset import gossip_peer_set
|
||||
|
||||
import logger
|
||||
from logger import log as logging
|
||||
|
||||
|
||||
def connect_peer(peer):
|
||||
|
@ -11,12 +11,12 @@ def connect_peer(peer):
|
|||
try:
|
||||
s = peer.get_socket(120)
|
||||
except Exception:
|
||||
logger.warn(f"Could not connect to {peer.transport_address}")
|
||||
logger.warn(traceback.format_exc())
|
||||
logging.warn(f"Could not connect to {peer.transport_address}")
|
||||
logging.warn(traceback.format_exc())
|
||||
else:
|
||||
with s:
|
||||
s.sendall(command_to_byte(GossipCommands.PING))
|
||||
|
||||
if s.recv(4).decode('utf-8') == 'PONG':
|
||||
gossip_peer_set.add(peer)
|
||||
logger.info(f"connected to {peer.transport_address}", terminal=True)
|
||||
logging.info(f"connected to {peer.transport_address}")
|
||||
|
|
|
@ -12,7 +12,7 @@ from gossip import constants
|
|||
from ..connectpeer import connect_peer
|
||||
|
||||
from onionrplugins import onionrevents
|
||||
import logger
|
||||
from logger import log as logging
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from onionrblocks import Block
|
||||
|
@ -88,9 +88,9 @@ def gossip_server():
|
|||
try:
|
||||
await diffuse_blocks(reader, writer)
|
||||
except Exception:
|
||||
logger.warn(
|
||||
logging.warn(
|
||||
f"Err streaming blocks\n{traceback.format_exc()}",
|
||||
terminal=True)
|
||||
)
|
||||
case GossipCommands.PUT_BLOCKS:
|
||||
# Pick block queue & append stemmed blocks to it
|
||||
try:
|
||||
|
@ -99,18 +99,18 @@ def gossip_server():
|
|||
inbound_dandelion_edge_count)
|
||||
except asyncio.exceptions.TimeoutError:
|
||||
pass
|
||||
logger.debug(
|
||||
logging.debug(
|
||||
"Inbound edge timed out when steming blocks to us",
|
||||
terminal=True)
|
||||
)
|
||||
except asyncio.exceptions.IncompleteReadError:
|
||||
pass
|
||||
logger.debug(
|
||||
logging.debug(
|
||||
"Inbound edge timed out (Incomplete Read) when steming blocks to us",
|
||||
terminal=True)
|
||||
)
|
||||
except Exception:
|
||||
logger.warn(
|
||||
logging.warn(
|
||||
f"Err accepting stem blocks\n{traceback.format_exc()}",
|
||||
terminal=True)
|
||||
)
|
||||
# Subtract dandelion edge, make sure >=0
|
||||
inbound_dandelion_edge_count[0] = \
|
||||
max(inbound_dandelion_edge_count[0] - 1, 0)
|
||||
|
@ -120,14 +120,13 @@ def gossip_server():
|
|||
if blockdb.has_block(block_id):
|
||||
writer.write(int(0).to_bytes(1, 'big'))
|
||||
else:
|
||||
|
||||
writer.write(int(1).to_bytes(1, 'big'))
|
||||
await writer.drain()
|
||||
block_size = int(await asyncio.wait_for(reader.readexactly(constants.BLOCK_SIZE_LEN), 30))
|
||||
block_data = await reader.readexactly(block_size)
|
||||
|
||||
Thread(
|
||||
target=add_block_to_db,
|
||||
target=add_block_to_db,
|
||||
args=[
|
||||
Block(block_id, block_data, auto_verify=True)]
|
||||
).start()
|
||||
|
@ -137,6 +136,7 @@ def gossip_server():
|
|||
await writer.drain()
|
||||
except BrokenPipeError:
|
||||
pass
|
||||
writer.close()
|
||||
|
||||
async def main():
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import traceback
|
||||
from typing import TYPE_CHECKING
|
||||
from typing import List
|
||||
import secrets
|
||||
|
@ -5,7 +6,7 @@ from asyncio import wait_for
|
|||
|
||||
from onionrblocks import Block
|
||||
|
||||
import logger
|
||||
from logger import log as logging
|
||||
from ..dandelion import StemAcceptResult
|
||||
from ..constants import BLOCK_ID_SIZE, BLOCK_SIZE_LEN, BLOCK_MAX_SIZE
|
||||
from ..constants import MAX_INBOUND_DANDELION_EDGE, MAX_STEM_BLOCKS_PER_STREAM
|
||||
|
@ -35,13 +36,13 @@ async def accept_stem_blocks(
|
|||
|
||||
for _ in range(MAX_STEM_BLOCKS_PER_STREAM):
|
||||
read_routine = reader.readexactly(BLOCK_ID_SIZE)
|
||||
#logger.debug(f"Reading block id in stem server", terminal=True)
|
||||
#logging.debug(f"Reading block id in stem server")
|
||||
block_id = await wait_for(read_routine, base_wait_timeout)
|
||||
block_id = block_id.decode('utf-8')
|
||||
if not block_id:
|
||||
break
|
||||
|
||||
#logger.debug(f"Reading block size in stem server", terminal=True)
|
||||
#logging.debug(f"Reading block size in stem server")
|
||||
block_size = (await wait_for(
|
||||
reader.readexactly(BLOCK_SIZE_LEN),
|
||||
base_wait_timeout)).decode('utf-8')
|
||||
|
@ -54,17 +55,25 @@ async def accept_stem_blocks(
|
|||
if block_size > BLOCK_MAX_SIZE:
|
||||
raise ValueError("Max block size")
|
||||
|
||||
#logger.debug(f"Reading block of size {block_size} in stem server", terminal=True)
|
||||
#logging.debug(f"Reading block of size {block_size} in stem server")
|
||||
|
||||
raw_block: bytes = await wait_for(
|
||||
reader.readexactly(block_size), base_wait_timeout * 6)
|
||||
if not raw_block:
|
||||
break
|
||||
|
||||
logger.debug("Got a stem block, put into queue", terminal=True)
|
||||
block_queue_to_use.put(
|
||||
Block(block_id, raw_block, auto_verify=True)
|
||||
)
|
||||
try:
|
||||
bl = Block(block_id, raw_block, auto_verify=True)
|
||||
except Exception as e:
|
||||
logging.warn(
|
||||
f"Error in received stem block {block_id} {str(e)}")
|
||||
logging.debug(traceback.format_exc())
|
||||
break
|
||||
|
||||
|
||||
logging.debug("Got a stem block, put into queue")
|
||||
|
||||
block_queue_to_use.put(bl)
|
||||
|
||||
# Regardless of stem phase, we add to queue
|
||||
# Client will decide if they are to be stemmed
|
||||
|
|
|
@ -19,7 +19,7 @@ if TYPE_CHECKING:
|
|||
from ..constants import BLOCK_MAX_SIZE, BLOCK_SIZE_LEN
|
||||
from ..constants import BLOCK_STREAM_OFFSET_DIGITS
|
||||
|
||||
import logger
|
||||
from logger import log as logging
|
||||
import blockdb
|
||||
from blockdb import get_blocks_after_timestamp, block_storage_observers
|
||||
"""
|
||||
|
@ -103,5 +103,5 @@ async def diffuse_blocks(reader: 'StreamReader', writer: 'StreamWriter'):
|
|||
except ConnectionResetError:
|
||||
pass
|
||||
except Exception:
|
||||
logger.warn(traceback.format_exc(), terminal=True)
|
||||
logging.warn(traceback.format_exc())
|
||||
|
||||
|
|
|
@ -1,71 +1,92 @@
|
|||
'''
|
||||
Onionr - Private P2P Communication
|
||||
"""
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
This file handles all operations involving logging
|
||||
'''
|
||||
'''
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
We use built in logging but with a custom formatter for colors and such
|
||||
"""
|
||||
import logging
|
||||
import sys
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
from filepaths import log_file
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
import sys, traceback
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
from . import colors, readline, log, raw, confirm, colors, settings
|
||||
colors = colors.Colors
|
||||
readline = readline.readline
|
||||
log = log.log
|
||||
raw = raw.raw
|
||||
confirm = confirm.confirm
|
||||
# credit: https://stackoverflow.com/a/384076
|
||||
# license: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
class ConsoleFormatter(logging.Formatter):
|
||||
|
||||
# debug: when there is info that could be useful for debugging purposes only
|
||||
def debug(data: str, error = None, timestamp = True, prompt = True, terminal = False, level = settings.LEVEL_DEBUG):
|
||||
if settings.get_level() <= level:
|
||||
log('/', data, timestamp = timestamp, prompt = prompt, terminal = terminal)
|
||||
if not error is None:
|
||||
debug('Error: ' + str(error) + parse_error())
|
||||
grey = "\x1b[38;20m"
|
||||
green = "\x1b[38;5;82m"
|
||||
yellow = "\x1b[33;20m"
|
||||
red = "\x1b[31;20m"
|
||||
bold_red = "\x1b[31;1m"
|
||||
reset = "\x1b[0m"
|
||||
format_default = "%(levelname)s - %(message)s (%(filename)s:%(lineno)d)"
|
||||
format_info = "%(message)s - (%(filename)s:%(lineno)d)"
|
||||
|
||||
# info: when there is something to notify the user of, such as the success of a process
|
||||
def info(data: str, timestamp = False, prompt = True, terminal = False, level = settings.LEVEL_INFO):
|
||||
if settings.get_level() <= level:
|
||||
log('+', data, colors.fg.green, timestamp = timestamp, prompt = prompt, terminal = terminal)
|
||||
FORMATS = {
|
||||
logging.DEBUG: grey + format_default + reset,
|
||||
logging.INFO: green + format_info + reset,
|
||||
logging.WARNING: yellow + format_default + reset,
|
||||
logging.ERROR: red + format_default + reset,
|
||||
logging.CRITICAL: bold_red + format_default + reset
|
||||
}
|
||||
|
||||
# warn: when there is a potential for something bad to happen
|
||||
def warn(data: str, error = None, timestamp = True, prompt = True, terminal = False, level = settings.LEVEL_WARN):
|
||||
if not error is None:
|
||||
debug('Error: ' + str(error) + parse_error())
|
||||
if settings.get_level() <= level:
|
||||
log('!', data, colors.fg.orange, timestamp = timestamp, prompt = prompt, terminal = terminal)
|
||||
def format(self, record):
|
||||
log_fmt = self.FORMATS.get(record.levelno)
|
||||
formatter = logging.Formatter(log_fmt)
|
||||
return formatter.format(record)
|
||||
|
||||
# error: when only one function, module, or process of the program encountered a problem and must stop
|
||||
def error(data: str, error = None, timestamp = True, prompt = True, terminal = False, level = settings.LEVEL_ERROR):
|
||||
if settings.get_level() <= level:
|
||||
log('-', data, colors.fg.red, timestamp = timestamp, fd = sys.stderr, prompt = prompt, terminal = terminal)
|
||||
if not error is None:
|
||||
debug('Error: ' + str(error) + parse_error())
|
||||
class FileFormatter(logging.Formatter):
|
||||
|
||||
# fatal: when the something so bad has happened that the program must stop
|
||||
def fatal(data: str, error = None, timestamp=True, prompt = True, terminal = False, level = settings.LEVEL_FATAL):
|
||||
if not error is None:
|
||||
debug('Error: ' + str(error) + parse_error(), terminal = terminal)
|
||||
if settings.get_level() <= level:
|
||||
log('#', data, colors.bg.red + colors.fg.green + colors.bold, timestamp = timestamp, fd = sys.stderr, prompt = prompt, terminal = terminal)
|
||||
|
||||
# returns a formatted error message
|
||||
def parse_error():
|
||||
details = traceback.extract_tb(sys.exc_info()[2])
|
||||
output = ''
|
||||
format_default = "%(levelname)s - %(message)s (%(filename)s:%(lineno)d)"
|
||||
format_info = "%(message)s - (%(filename)s:%(lineno)d)"
|
||||
|
||||
for line in details:
|
||||
output += '\n ... module %s in %s:%i' % (line[2], line[0], line[1])
|
||||
FORMATS = {
|
||||
logging.DEBUG: format_default,
|
||||
logging.INFO: format_info,
|
||||
logging.WARNING: format_default,
|
||||
logging.ERROR: format_default,
|
||||
logging.CRITICAL: format_default
|
||||
}
|
||||
|
||||
return output
|
||||
def format(self, record):
|
||||
log_fmt = self.FORMATS.get(record.levelno)
|
||||
formatter = logging.Formatter(log_fmt)
|
||||
return formatter.format(record)
|
||||
|
||||
|
||||
#logging.basicConfig(level=logging.ERROR, format='%(message)s ')
|
||||
log = logging.getLogger('onionr')
|
||||
log.setLevel(logging.INFO)
|
||||
|
||||
ch = logging.StreamHandler(sys.stdout)
|
||||
ch.setLevel(logging.INFO)
|
||||
|
||||
ch.setFormatter(ConsoleFormatter())
|
||||
|
||||
|
||||
def enable_file_logging():
|
||||
fh = logging.FileHandler(log_file)
|
||||
fh.setLevel(logging.INFO)
|
||||
fh.setFormatter(FileFormatter())
|
||||
log.addHandler(fh)
|
||||
|
||||
def disable_console_logging():
|
||||
log.removeHandler(ch)
|
||||
|
||||
def enable_console_logging():
|
||||
log.addHandler(ch)
|
||||
enable_console_logging()
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
'''
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
class to access ANSI control codes
|
||||
'''
|
||||
'''
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
import re
|
||||
class Colors:
|
||||
'''
|
||||
This class allows you to set the color if ANSI codes are supported
|
||||
'''
|
||||
reset='\033[0m'
|
||||
bold='\033[01m'
|
||||
disable='\033[02m'
|
||||
underline='\033[04m'
|
||||
reverse='\033[07m'
|
||||
strikethrough='\033[09m'
|
||||
invisible='\033[08m'
|
||||
italics='\033[3m'
|
||||
class fg:
|
||||
black='\033[30m'
|
||||
red='\033[31m'
|
||||
green='\033[32m'
|
||||
orange='\033[33m'
|
||||
blue='\033[34m'
|
||||
purple='\033[35m'
|
||||
cyan='\033[36m'
|
||||
lightgrey='\033[37m'
|
||||
darkgrey='\033[90m'
|
||||
lightred='\033[91m'
|
||||
lightgreen='\033[92m'
|
||||
yellow='\033[93m'
|
||||
lightblue='\033[94m'
|
||||
pink='\033[95m'
|
||||
lightcyan='\033[96m'
|
||||
class bg:
|
||||
black='\033[40m'
|
||||
red='\033[41m'
|
||||
green='\033[42m'
|
||||
orange='\033[43m'
|
||||
blue='\033[44m'
|
||||
purple='\033[45m'
|
||||
cyan='\033[46m'
|
||||
lightgrey='\033[47m'
|
||||
@staticmethod
|
||||
def filter(data):
|
||||
return re.compile(r'\x1B\[[0-?]*[ -/]*[@-~]').sub('', str(data))
|
|
@ -1,54 +0,0 @@
|
|||
'''
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
confirm y/n cli prompt
|
||||
'''
|
||||
'''
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
import sys
|
||||
from . import colors, settings
|
||||
colors = colors.Colors
|
||||
def confirm(default = 'y', message = 'Are you sure %s? '):
|
||||
'''
|
||||
Displays an "Are you sure" message, returns True for Y and False for N
|
||||
message: The confirmation message, use %s for (y/n)
|
||||
default: which to prefer-- y or n
|
||||
'''
|
||||
|
||||
color = colors.fg.green + colors.bold
|
||||
|
||||
default = default.lower()
|
||||
confirm = colors.bold
|
||||
if default.startswith('y'):
|
||||
confirm += '(Y/n)'
|
||||
else:
|
||||
confirm += '(y/N)'
|
||||
confirm += colors.reset + color
|
||||
|
||||
output = colors.reset + str(color) + '... ' + colors.reset + str(message) + colors.reset
|
||||
|
||||
if not get_settings() & settings.USE_ANSI:
|
||||
output = colors.filter(output)
|
||||
|
||||
sys.stdout.write(output.replace('%s', confirm))
|
||||
|
||||
inp = input().lower()
|
||||
|
||||
if 'y' in inp:
|
||||
return True
|
||||
if 'n' in inp:
|
||||
return False
|
||||
else:
|
||||
return default == 'y'
|
|
@ -1,38 +0,0 @@
|
|||
'''
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
god log function
|
||||
'''
|
||||
'''
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
import sys, time
|
||||
from . import colors, raw, settings
|
||||
colors = colors.Colors
|
||||
def log(prefix, data, color = '', timestamp=True, fd = sys.stdout, prompt = True, terminal = False):
|
||||
'''
|
||||
Logs the data
|
||||
prefix : The prefix to the output
|
||||
data : The actual data to output
|
||||
color : The color to output before the data
|
||||
'''
|
||||
curTime = ''
|
||||
if timestamp:
|
||||
curTime = time.strftime("%m-%d %H:%M:%S") + ' '
|
||||
|
||||
output = colors.reset + str(color) + ('[' + colors.bold + str(prefix) + colors.reset + str(color) + '] ' if prompt is True else '') + curTime + str(data) + colors.reset
|
||||
if not settings.get_settings() & settings.USE_ANSI:
|
||||
output = colors.filter(output)
|
||||
|
||||
raw.raw(output, fd = fd, terminal = terminal)
|
|
@ -1,54 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
Output raw data to file or terminal
|
||||
"""
|
||||
import sys
|
||||
import os
|
||||
from . import settings, colors
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
colors = colors.Colors
|
||||
|
||||
|
||||
def raw(data, fd = sys.stdout, terminal = False):
|
||||
"""
|
||||
Outputs raw data to console without formatting
|
||||
"""
|
||||
|
||||
if terminal and (settings.get_settings() & settings.OUTPUT_TO_CONSOLE):
|
||||
try:
|
||||
ts = fd.write('%s\n' % data)
|
||||
except OSError:
|
||||
pass
|
||||
if settings.get_settings() & settings.OUTPUT_TO_FILE:
|
||||
fdata = ''
|
||||
try:
|
||||
for _ in range(5):
|
||||
try:
|
||||
with open(settings._outputfile, 'r') as file:
|
||||
fdata = file.read()
|
||||
except UnicodeDecodeError:
|
||||
pass
|
||||
else:
|
||||
break
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
fdata = fdata + '\n' + data
|
||||
fdata = fdata.split('\n')
|
||||
if len(fdata) >= settings.MAX_LOG_FILE_LINES:
|
||||
fdata.pop(0)
|
||||
fdata = '\n'.join(fdata)
|
||||
with open(settings._outputfile, 'w') as file:
|
||||
file.write(fdata)
|
|
@ -1,37 +0,0 @@
|
|||
'''
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
get a line of input from stdin
|
||||
'''
|
||||
'''
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
import sys
|
||||
from . import colors, settings
|
||||
colors = colors.Colors
|
||||
def readline(message = ''):
|
||||
'''
|
||||
Takes in input from the console, not stored in logs
|
||||
message: The message to display before taking input
|
||||
'''
|
||||
|
||||
color = colors.fg.green + colors.bold
|
||||
output = colors.reset + str(color) + '... ' + colors.reset + str(message) + colors.reset
|
||||
|
||||
if not settings.get_settings() & settings.USE_ANSI:
|
||||
output = colors.filter(output)
|
||||
|
||||
sys.stdout.write(output)
|
||||
|
||||
return input()
|
|
@ -1,89 +0,0 @@
|
|||
'''
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
logger settings
|
||||
'''
|
||||
'''
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
import os
|
||||
from utils import identifyhome
|
||||
import filepaths
|
||||
|
||||
data_home = os.environ.get('ONIONR_LOG_DIR', identifyhome.identify_home())
|
||||
# Use the bitwise operators to merge these settings
|
||||
USE_ANSI = 0b100
|
||||
if os.name == 'nt':
|
||||
USE_ANSI = 0b000
|
||||
OUTPUT_TO_CONSOLE = 0b010
|
||||
OUTPUT_TO_FILE = 0b001
|
||||
|
||||
LEVEL_DEBUG = 1
|
||||
LEVEL_INFO = 2
|
||||
LEVEL_WARN = 3
|
||||
LEVEL_ERROR = 4
|
||||
LEVEL_FATAL = 5
|
||||
LEVEL_IMPORTANT = 6
|
||||
|
||||
MAX_LOG_FILE_LINES = 10000
|
||||
|
||||
_type = OUTPUT_TO_CONSOLE | USE_ANSI # the default settings for logging
|
||||
_level = LEVEL_DEBUG # the lowest level to log
|
||||
# the file to log to
|
||||
_outputfile = filepaths.log_file
|
||||
|
||||
def set_settings(type):
|
||||
'''
|
||||
Set the settings for the logger using bitwise operators
|
||||
'''
|
||||
|
||||
global _type
|
||||
_type = type
|
||||
|
||||
def get_settings():
|
||||
'''
|
||||
Get settings from the logger
|
||||
'''
|
||||
|
||||
return _type
|
||||
|
||||
def set_level(level):
|
||||
'''
|
||||
Set the lowest log level to output
|
||||
'''
|
||||
|
||||
global _level
|
||||
_level = level
|
||||
|
||||
def get_level()->int:
|
||||
'''
|
||||
Get the lowest log level currently being outputted
|
||||
'''
|
||||
|
||||
return _level
|
||||
|
||||
def set_file(outputfile):
|
||||
'''
|
||||
Set the file to output to, if enabled
|
||||
'''
|
||||
|
||||
global _outputfile
|
||||
_outputfile = outputfile
|
||||
|
||||
def get_file():
|
||||
'''
|
||||
Get the file to output to
|
||||
'''
|
||||
|
||||
return _outputfile
|
|
@ -8,20 +8,19 @@ import sys
|
|||
import platform
|
||||
import signal
|
||||
from threading import Thread
|
||||
from logger import log as logging
|
||||
from logger import enable_file_logging
|
||||
|
||||
import filenuke
|
||||
import psutil
|
||||
|
||||
import config
|
||||
|
||||
import logger
|
||||
from onionrplugins import onionrevents as events
|
||||
|
||||
from utils import identifyhome
|
||||
import filepaths
|
||||
import onionrvalues
|
||||
from onionrutils import cleanup
|
||||
from onionrcrypto import getourkeypair
|
||||
from onionrthreads import add_onionr_thread
|
||||
from blockdb.blockcleaner import clean_block_database
|
||||
from .. import version
|
||||
|
@ -44,22 +43,36 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
def _safe_remove(path):
|
||||
try:
|
||||
os.remove(path)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
|
||||
def delete_run_files():
|
||||
"""Delete run files, do not error if not found.
|
||||
|
||||
Test: test_cleanup.py
|
||||
"""
|
||||
_safe_remove(filepaths.lock_file)
|
||||
_safe_remove(filepaths.gossip_server_socket_file)
|
||||
_safe_remove(filepaths.pid_file)
|
||||
|
||||
def _show_info_messages():
|
||||
version.version(verbosity=5, function=logger.info)
|
||||
logger.debug('Python version %s' % platform.python_version())
|
||||
version.version(verbosity=5, function=logging.info)
|
||||
logging.debug('Python version %s' % platform.python_version())
|
||||
|
||||
if onionrvalues.DEVELOPMENT_MODE:
|
||||
logger.warn('Development mode enabled', timestamp=False, terminal=True)
|
||||
|
||||
logger.info('Using public key: %s' %
|
||||
(logger.colors.underline +
|
||||
getourkeypair.get_keypair()[0][:52]))
|
||||
logging.warn('Development mode enabled')
|
||||
|
||||
|
||||
def daemon():
|
||||
"""Start Onionr's primary threads for communicator, API server, node, and LAN."""
|
||||
|
||||
if config.get('log.file.output', False):
|
||||
enable_file_logging()
|
||||
|
||||
def _handle_sig_term(signum, frame):
|
||||
sys.exit(0)
|
||||
|
||||
|
@ -74,8 +87,8 @@ def daemon():
|
|||
security_level = config.get('general.security_level', 1)
|
||||
|
||||
_show_info_messages()
|
||||
logger.info(
|
||||
f"Onionr daemon is running under pid {os.getpid()}", terminal=True)
|
||||
logging.info(
|
||||
f"Onionr daemon is running under pid {os.getpid()}")
|
||||
events.event('init', threaded=False)
|
||||
events.event('afterinit', threaded=False)
|
||||
events.event('daemon_start')
|
||||
|
@ -90,11 +103,14 @@ def daemon():
|
|||
|
||||
try:
|
||||
while True:
|
||||
# Mainly for things like repls
|
||||
events.event('primary_loop', threaded=False)
|
||||
sleep(60)
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
|
||||
cleanup.delete_run_files()
|
||||
|
||||
delete_run_files()
|
||||
if security_level >= 2:
|
||||
filenuke.nuke.clean_tree(identifyhome.identify_home())
|
||||
|
||||
|
@ -105,33 +121,25 @@ def start(override: bool = False):
|
|||
Error exit if there is and its not overridden
|
||||
"""
|
||||
if os.path.exists(filepaths.lock_file) and not override:
|
||||
if os.path.exists(filepaths.restarting_indicator):
|
||||
try:
|
||||
os.remove(filepaths.restarting_indicator)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
else:
|
||||
return
|
||||
with open(filepaths.lock_file, 'r') as lock_file:
|
||||
try:
|
||||
proc = psutil.Process(int(lock_file.read())).name()
|
||||
except psutil.NoSuchProcess:
|
||||
proc = ""
|
||||
if not proc.startswith("python"):
|
||||
logger.warn(
|
||||
f"Detected stale run file, deleting {filepaths.lock_file}",
|
||||
terminal=True)
|
||||
logging.warn(
|
||||
f"Detected stale run file, deleting {filepaths.lock_file}")
|
||||
try:
|
||||
os.remove(filepaths.lock_file)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
start(override=True)
|
||||
return
|
||||
logger.fatal('Cannot start. Daemon is already running,'
|
||||
logging.error('Cannot start. Daemon is already running,'
|
||||
+ ' or it did not exit cleanly.\n'
|
||||
+ ' (if you are sure that there is not a daemon running,'
|
||||
+ f' delete {filepaths.lock_file} & try again).',
|
||||
terminal=True)
|
||||
)
|
||||
else:
|
||||
if not onionrvalues.DEVELOPMENT_MODE:
|
||||
lock_file = open(filepaths.lock_file, 'w')
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
Open the web interface properly into a web browser, and return it
|
||||
"""
|
||||
import logger
|
||||
from onionrutils import getclientapiserver
|
||||
|
||||
|
||||
def get_url(config) -> str:
|
||||
"""Build UI URL string and return it."""
|
||||
onboarding = ""
|
||||
if not config.get('onboarding.done', False):
|
||||
onboarding = "onboarding/"
|
||||
try:
|
||||
url = getclientapiserver.get_client_API_server()
|
||||
except FileNotFoundError:
|
||||
url = ""
|
||||
logger.error(
|
||||
'Onionr seems to not be running (could not get api host)',
|
||||
terminal=True)
|
||||
else:
|
||||
url = 'http://%s/%s#%s' % (url, onboarding, config.get('client.webpassword'))
|
||||
logger.info('Onionr web interface URL: ' + url, terminal=True)
|
||||
return url
|
|
@ -6,7 +6,7 @@ import os
|
|||
from signal import SIGTERM
|
||||
|
||||
from filepaths import pid_file
|
||||
import logger
|
||||
from logger import log as logging
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -29,9 +29,8 @@ def kill_daemon():
|
|||
with open(pid_file, 'r') as pid:
|
||||
os.kill(int(pid.read()), SIGTERM)
|
||||
except FileNotFoundError:
|
||||
logger.error("Daemon not running/pid file missing")
|
||||
logger.warn('Stopping the running daemon, if one exists...', timestamp=False,
|
||||
terminal=True)
|
||||
logging.error("Daemon not running/pid file missing")
|
||||
logging.warn('Stopping the running daemon, if one exists...')
|
||||
|
||||
|
||||
kill_daemon.onionr_help = "Gracefully stops the " # type: ignore
|
||||
|
|
|
@ -5,11 +5,12 @@ Show nice logo
|
|||
import os
|
||||
|
||||
import config
|
||||
import logger
|
||||
|
||||
from .quotes import QUOTE
|
||||
from utils.boxprint import bordered
|
||||
from utils import logoheader
|
||||
|
||||
from utils import readstatic
|
||||
import onionrvalues
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -25,28 +26,34 @@ You should have received a copy of the GNU General Public License
|
|||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
def header():
|
||||
if onionrvalues.DEVELOPMENT_MODE:
|
||||
return
|
||||
|
||||
pink_ansi = '\033[95m'
|
||||
green_ansi = '\033[92m'
|
||||
reset_ansi = '\x1b[0m'
|
||||
|
||||
logo = readstatic.read_static('header.txt', ret_bin=False)
|
||||
logo = logo.replace('P', pink_ansi).replace('G', green_ansi).replace('W', reset_ansi)
|
||||
print(reset_ansi + logo)
|
||||
|
||||
def show_logo():
|
||||
logger.raw('', terminal=True)
|
||||
try:
|
||||
terminal_size = os.get_terminal_size().columns
|
||||
except OSError: # Generally thrown if not in terminal
|
||||
terminal_size = 120
|
||||
# print nice header thing :)
|
||||
if config.get('general.display_header', True):
|
||||
logoheader.header("")
|
||||
header()
|
||||
if terminal_size >= 120:
|
||||
if QUOTE[1]: # If there is an author to show for the quote
|
||||
logger.info(
|
||||
"\u001b[33m\033[F" + bordered(QUOTE[0] + '\n -' + QUOTE[1]),
|
||||
terminal=True)
|
||||
print("\u001b[33m\033[F" + bordered(QUOTE[0] + '\n -' + QUOTE[1]))
|
||||
else:
|
||||
logger.info(
|
||||
"\u001b[33m\033[F" + bordered(QUOTE[0]), terminal=True)
|
||||
print("\u001b[33m\033[F" + bordered(QUOTE[0]))
|
||||
else:
|
||||
if QUOTE[1]:
|
||||
logger.info("\u001b[33m\033[F" + QUOTE[0] + '\n -' + QUOTE[1],
|
||||
terminal=True)
|
||||
print("\u001b[33m\033[F" + QUOTE[0] + '\n -' + QUOTE[1])
|
||||
else:
|
||||
logger.info("\u001b[33m\033[F" + QUOTE[0], terminal=True)
|
||||
print("\u001b[33m\033[F" + QUOTE[0])
|
||||
|
||||
|
|
|
@ -1,146 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
This module defines commands to show stats/details about the local node
|
||||
"""
|
||||
import os
|
||||
import logger
|
||||
from onionrutils import mnemonickeys
|
||||
from utils import sizeutils, getconsolewidth, identifyhome
|
||||
from coredb import keydb
|
||||
import onionrcrypto
|
||||
import config
|
||||
import onionrvalues
|
||||
from filepaths import lock_file
|
||||
|
||||
import psutil
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def _is_running():
|
||||
script = onionrvalues.SCRIPT_NAME
|
||||
if os.path.isfile(lock_file):
|
||||
for process in psutil.process_iter():
|
||||
if process.name() == script:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def show_stats():
|
||||
"""Print/log statistic info about our Onionr install."""
|
||||
try:
|
||||
# define stats messages here
|
||||
home = identifyhome.identify_home()
|
||||
|
||||
|
||||
messages = {
|
||||
# info about local client
|
||||
|
||||
# This line is inaccurate if dev mode is enabled
|
||||
'Onionr Daemon Status':
|
||||
((logger.colors.fg.green + 'Online') \
|
||||
if _is_running() \
|
||||
else logger.colors.fg.red + 'Offline'),
|
||||
|
||||
# file and folder size stats
|
||||
'div1': True, # this creates a solid line across the screen, a div
|
||||
'Total Block Size':
|
||||
sizeutils.human_size(sizeutils.size(home + 'blocks.db')),
|
||||
'Total Plugin Size':
|
||||
sizeutils.human_size(sizeutils.size(home + 'plugins/')),
|
||||
'Log File Size':
|
||||
sizeutils.human_size(sizeutils.size(home + 'output.log')),
|
||||
|
||||
# count stats
|
||||
'div2': True,
|
||||
'Enabled Plugins':
|
||||
str(len(config.get('plugins.enabled', list()))) + ' / ' +
|
||||
str(len(os.listdir(home + 'plugins/')))
|
||||
}
|
||||
|
||||
# color configuration
|
||||
colors = {
|
||||
'title': logger.colors.bold,
|
||||
'key': logger.colors.fg.lightgreen,
|
||||
'val': logger.colors.fg.green,
|
||||
'border': logger.colors.fg.lightblue,
|
||||
|
||||
'reset': logger.colors.reset
|
||||
}
|
||||
|
||||
# pre-processing
|
||||
maxlength = 0
|
||||
width = getconsolewidth.get_console_width()
|
||||
for key, val in messages.items():
|
||||
if not (type(val) is bool and val is True):
|
||||
maxlength = max(len(key), maxlength)
|
||||
prewidth = maxlength + len(' | ')
|
||||
groupsize = width - prewidth - len('[+] ')
|
||||
|
||||
# generate stats table
|
||||
logger.info(colors['title'] + 'Onionr v%s Statistics' %
|
||||
onionrvalues.ONIONR_VERSION + colors['reset'],
|
||||
terminal=True)
|
||||
logger.info(colors['border'] + '-' * (maxlength + 1) +
|
||||
'+' + colors['reset'], terminal=True)
|
||||
for key, val in messages.items():
|
||||
if not (type(val) is bool and val is True):
|
||||
val = [str(val)[i:i + groupsize]
|
||||
for i in range(0, len(str(val)), groupsize)]
|
||||
|
||||
logger.info(colors['key'] + str(key).rjust(maxlength) +
|
||||
colors['reset'] + colors['border'] +
|
||||
' | ' + colors['reset'] + colors['val'] +
|
||||
str(val.pop(0)) + colors['reset'], terminal=True)
|
||||
|
||||
for value in val:
|
||||
logger.info(' ' * maxlength + colors['border'] + ' | ' +
|
||||
colors['reset'] + colors['val'] + str(
|
||||
value) + colors['reset'], terminal=True)
|
||||
else:
|
||||
logger.info(colors['border'] + '-' * (maxlength +
|
||||
1) + '+' +
|
||||
colors['reset'], terminal=True)
|
||||
logger.info(colors['border'] + '-' * (maxlength + 1) +
|
||||
'+' + colors['reset'], terminal=True)
|
||||
except Exception as e: # pylint: disable=W0703
|
||||
logger.error('Failed to generate statistics table. ' +
|
||||
str(e), error=e, timestamp=False, terminal=True)
|
||||
|
||||
|
||||
def show_details():
|
||||
"""Print out details.
|
||||
|
||||
node transport address(es)
|
||||
active user ID
|
||||
active user ID in mnemonic form
|
||||
"""
|
||||
details = {
|
||||
'Data directory': identifyhome.identify_home(),
|
||||
'Public Key': onionrcrypto.pub_key.replace('=', ''),
|
||||
'Human-readable Public Key': mnemonickeys.get_human_readable_ID()
|
||||
}
|
||||
|
||||
for detail in details:
|
||||
logger.info('%s%s: \n%s%s\n' % (logger.colors.fg.lightgreen,
|
||||
detail, logger.colors.fg.green,
|
||||
details[detail]), terminal=True)
|
||||
|
||||
|
||||
show_details.onionr_help = "Shows relevant information " # type: ignore
|
||||
show_details.onionr_help += "for your Onionr install:"
|
||||
|
||||
show_stats.onionr_help = "Shows statistics for your Onionr " # type: ignore
|
||||
show_stats.onionr_help += "node. Slow if Onionr is not running" # type: ignore
|
|
@ -11,7 +11,7 @@ try:
|
|||
except (KeyError, IndexError) as _:
|
||||
pass
|
||||
|
||||
import logger
|
||||
from logger import log as logging
|
||||
import onionrexceptions
|
||||
import onionrplugins
|
||||
from onionrplugins import onionrpluginapi
|
||||
|
@ -48,10 +48,6 @@ def register_plugin_commands(cmd) -> bool:
|
|||
return False
|
||||
|
||||
|
||||
def _show_term(msg: str):
|
||||
logger.info(msg, terminal=True)
|
||||
|
||||
|
||||
def register():
|
||||
"""Register commands and handles help command processing."""
|
||||
def get_help_message(cmd: str,
|
||||
|
@ -80,7 +76,7 @@ def register():
|
|||
try:
|
||||
cmd = sys.argv[1]
|
||||
except IndexError:
|
||||
logger.info('Run with --help to see available commands', terminal=True)
|
||||
logging.info('Run with --help to see available commands')
|
||||
sys.exit(10)
|
||||
|
||||
is_help_cmd = False
|
||||
|
@ -102,29 +98,28 @@ def register():
|
|||
sys.argv[2]
|
||||
except IndexError:
|
||||
for i in arguments.get_arguments():
|
||||
_show_term('%s <%s>: %s' % (PROGRAM_NAME, '/'.join(i),
|
||||
logging.info('%s <%s>: %s' % (PROGRAM_NAME, '/'.join(i),
|
||||
get_help_message(i[0])))
|
||||
for pl in onionrplugins.get_enabled_plugins():
|
||||
pl = onionrplugins.get_plugin(pl)
|
||||
if hasattr(pl, 'ONIONR_COMMANDS'):
|
||||
print('')
|
||||
try:
|
||||
_show_term('%s commands:' % (pl.plugin_name,))
|
||||
logging.info('%s commands:' % (pl.plugin_name,))
|
||||
except AttributeError:
|
||||
_show_term('%s commands:' % (pl.__name__,))
|
||||
logging.info('%s commands:' % (pl.__name__,))
|
||||
for plugin_cmd in pl.ONIONR_COMMANDS:
|
||||
_show_term('%s %s: %s' %
|
||||
logging.info('%s %s: %s' %
|
||||
(PROGRAM_NAME,
|
||||
plugin_cmd,
|
||||
get_help_message(plugin_cmd)),)
|
||||
print('')
|
||||
else:
|
||||
try:
|
||||
_show_term('%s %s: %s' % (PROGRAM_NAME,
|
||||
logging.info('%s %s: %s' % (PROGRAM_NAME,
|
||||
sys.argv[2],
|
||||
get_help_message(sys.argv[2])))
|
||||
except KeyError:
|
||||
logger.error('%s: command does not exist.' % [sys.argv[2]],
|
||||
terminal=True)
|
||||
logging.error('%s: command does not exist.' % [sys.argv[2]])
|
||||
sys.exit(3)
|
||||
return
|
||||
|
|
|
@ -4,8 +4,7 @@ Sets CLI arguments for Onionr
|
|||
"""
|
||||
from typing import Callable
|
||||
|
||||
from .. import onionrstatistics, version, daemonlaunch
|
||||
from .. import pubkeymanager # commands to add or change id
|
||||
from .. import version, daemonlaunch
|
||||
from .. import resetplugins # command to reinstall default plugins
|
||||
|
||||
|
||||
|
@ -33,12 +32,10 @@ def get_arguments() -> dict:
|
|||
dynamically modify them with plugins
|
||||
"""
|
||||
args = {
|
||||
('details', 'info'): onionrstatistics.show_details,
|
||||
('stats', 'statistics'): onionrstatistics.show_stats,
|
||||
('version',): version.version,
|
||||
('start', 'daemon'): daemonlaunch.start,
|
||||
('stop', 'kill'): daemonlaunch.kill_daemon,
|
||||
('resetplugins', 'reset-plugins'): resetplugins.reset
|
||||
('resetplugins', 'reset-plugins', 'updateplugins', 'update-plugins'): resetplugins.reset
|
||||
}
|
||||
return args
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ Try to provide recommendations for invalid Onionr commands
|
|||
"""
|
||||
import sys
|
||||
from difflib import SequenceMatcher
|
||||
import logger
|
||||
from logger import log as logging
|
||||
from . import arguments
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
|
@ -30,9 +30,9 @@ def recommend(print_default: bool = True):
|
|||
for key in args.keys():
|
||||
for word in key:
|
||||
if SequenceMatcher(None, tried, word).ratio() >= 0.75:
|
||||
logger.warn(f'{print_message} "{tried}", '
|
||||
logging.warn(f'{print_message} "{tried}", '
|
||||
+ f'did you mean "{word}"?',
|
||||
terminal=True)
|
||||
)
|
||||
return
|
||||
if print_default:
|
||||
logger.error('%s "%s"' % (print_message, tried), terminal=True)
|
||||
logging.error('%s "%s"' % (print_message, tried))
|
||||
|
|
|
@ -1,95 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
This module defines user ID-related CLI commands
|
||||
"""
|
||||
import sys
|
||||
import getpass
|
||||
|
||||
import unpaddedbase32
|
||||
import niceware
|
||||
|
||||
import logger
|
||||
import onionrexceptions
|
||||
from onionrutils import stringvalidators, bytesconverter
|
||||
import config
|
||||
import keymanager
|
||||
import onionrcrypto
|
||||
import onionrvalues
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
DETERMINISTIC_REQUIREMENT = onionrvalues.PASSWORD_LENGTH
|
||||
|
||||
|
||||
def add_ID():
|
||||
"""Command to create a new user ID key pair."""
|
||||
key_manager = keymanager.KeyManager()
|
||||
pw = ""
|
||||
try:
|
||||
sys.argv[2] # pylint: disable=W0104
|
||||
if not sys.argv[2].lower() == 'true':
|
||||
raise ValueError
|
||||
except (IndexError, ValueError):
|
||||
newID = key_manager.addKey()[0]
|
||||
else:
|
||||
pw = "-".join(niceware.generate_passphrase(32))
|
||||
newID, privKey = onionrcrypto.generate_deterministic(pw)
|
||||
try:
|
||||
key_manager.addKey(pubKey=newID,
|
||||
privKey=privKey)
|
||||
except ValueError:
|
||||
logger.error(
|
||||
'That ID is already available, you can change to it ' +
|
||||
'with the change-id command.', terminal=True)
|
||||
return
|
||||
if pw:
|
||||
print("Phrase to restore ID:", pw)
|
||||
logger.info('Added ID: %s' %
|
||||
(bytesconverter.bytes_to_str(newID.replace('=', '')),), terminal=True)
|
||||
|
||||
|
||||
add_ID.onionr_help = "If the first argument is true, " # type: ignore
|
||||
add_ID.onionr_help += "Onionr will show a deterministic " # type: ignore
|
||||
add_ID.onionr_help += "generation prompt. Otherwise it will " # type: ignore
|
||||
add_ID.onionr_help += "generate & save a new random key pair." # type: ignore
|
||||
|
||||
|
||||
def change_ID():
|
||||
"""Command to change active ID from argv or stdin."""
|
||||
key_manager = keymanager.KeyManager()
|
||||
try:
|
||||
key = sys.argv[2]
|
||||
key = unpaddedbase32.repad(key.encode()).decode()
|
||||
except IndexError:
|
||||
logger.warn('Specify pubkey to use', terminal=True)
|
||||
else:
|
||||
if stringvalidators.validate_pub_key(key):
|
||||
key_list = key_manager.getPubkeyList()
|
||||
if key in key_list or key.replace('=', '') in key_list:
|
||||
config.set('general.public_key', key)
|
||||
config.save()
|
||||
logger.info('Set active key to: %s' % (key,), terminal=True)
|
||||
logger.info('Restart Onionr if it is running.', terminal=True)
|
||||
else:
|
||||
logger.warn('That key does not exist', terminal=True)
|
||||
else:
|
||||
logger.warn('Invalid key %s' % (key,), terminal=True)
|
||||
|
||||
|
||||
change_ID.onionr_help = "<pubkey>: Switches Onionr to " # type: ignore
|
||||
change_ID.onionr_help += "use a different user ID key. " # type: ignore
|
||||
change_ID.onionr_help += "You should immediately restart " # type: ignore
|
||||
change_ID.onionr_help += "Onionr if it is running." # type: ignore
|
|
@ -6,7 +6,7 @@ import os
|
|||
import shutil
|
||||
|
||||
from utils import identifyhome
|
||||
import logger
|
||||
from logger import log as logging
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -32,7 +32,7 @@ def reset():
|
|||
if os.path.exists(plugin_dir):
|
||||
shutil.rmtree(plugin_dir)
|
||||
|
||||
logger.info('Default plugins have been reset.', terminal=True)
|
||||
logging.info('Default plugins have been reset.')
|
||||
|
||||
|
||||
reset.onionr_help = "reinstalls default Onionr plugins" # type: ignore
|
||||
|
|
|
@ -5,7 +5,7 @@ Command to show version info
|
|||
import platform
|
||||
from utils import identifyhome
|
||||
import onionrvalues
|
||||
import logger
|
||||
from logger import log as logging
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -22,24 +22,21 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||
"""
|
||||
|
||||
|
||||
def version(verbosity=5, function=logger.info):
|
||||
def version(verbosity=5, function=logging.info):
|
||||
"""Display the Onionr version."""
|
||||
function('Onionr v%s (%s) (API v%s)' % (onionrvalues.ONIONR_VERSION,
|
||||
platform.machine(),
|
||||
onionrvalues.API_VERSION),
|
||||
terminal=True)
|
||||
function('Onionr v%s (%s)' % (onionrvalues.ONIONR_VERSION,
|
||||
platform.machine()))
|
||||
if verbosity >= 1:
|
||||
function(onionrvalues.ONIONR_TAGLINE, terminal=True)
|
||||
function(onionrvalues.ONIONR_TAGLINE)
|
||||
if verbosity >= 2:
|
||||
pf = platform.platform()
|
||||
release = platform.release()
|
||||
python_imp = platform.python_implementation()
|
||||
python_version = platform.python_version()
|
||||
function(
|
||||
f'{python_imp} {python_version} on {pf} {release}',
|
||||
terminal=True)
|
||||
f'{python_imp} {python_version} on {pf} {release}')
|
||||
function('Onionr data dir: %s' %
|
||||
identifyhome.identify_home(), terminal=True)
|
||||
identifyhome.identify_home())
|
||||
|
||||
|
||||
version.onionr_help = 'Shows environment details including ' # type: ignore
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
'''
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
This file handles Onionr's cryptography.
|
||||
'''
|
||||
'''
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
|
||||
from . import generate, getourkeypair, signing, encryption, cryptoutils
|
||||
generate_deterministic = generate.generate_deterministic
|
||||
generate = generate.generate_pub_key
|
||||
|
||||
keypair = getourkeypair.get_keypair()
|
||||
pub_key = keypair[0]
|
||||
priv_key = keypair[1]
|
|
@ -1,5 +0,0 @@
|
|||
from . import safecompare
|
||||
from . import getpubfrompriv
|
||||
|
||||
safe_compare = safecompare.safe_compare
|
||||
get_pub_key_from_priv = getpubfrompriv.get_pub_key_from_priv
|
|
@ -1,28 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
generate a public ed25519 key from a private one
|
||||
"""
|
||||
from nacl import signing, encoding
|
||||
|
||||
from onionrtypes import UserID, UserIDSecretKey
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def get_pub_key_from_priv(priv_key: UserIDSecretKey,
|
||||
raw_encoding: bool = False) -> UserID:
|
||||
return signing.SigningKey(
|
||||
priv_key, encoder=encoding.Base32Encoder).verify_key.encode(
|
||||
encoding.Base32Encoder)
|
|
@ -1,15 +0,0 @@
|
|||
import hmac
|
||||
|
||||
|
||||
def safe_compare(one, two):
|
||||
# Do encode here to avoid spawning core
|
||||
try:
|
||||
one = one.encode()
|
||||
except AttributeError:
|
||||
pass
|
||||
try:
|
||||
two = two.encode()
|
||||
except AttributeError:
|
||||
pass
|
||||
return hmac.compare_digest(one, two)
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
import nacl.encoding, nacl.public, nacl.signing
|
||||
from .. import getourkeypair
|
||||
import unpaddedbase32
|
||||
from onionrutils import bytesconverter, stringvalidators
|
||||
pair = getourkeypair.get_keypair()
|
||||
our_pub_key = unpaddedbase32.repad(pair[0].encode())
|
||||
our_priv_key = unpaddedbase32.repad(pair[1].encode())
|
||||
|
||||
def pub_key_encrypt(data, pubkey, encodedData=False):
|
||||
'''Encrypt to a public key (Curve25519, taken from base32 Ed25519 pubkey)'''
|
||||
pubkey = unpaddedbase32.repad(bytesconverter.str_to_bytes(pubkey))
|
||||
retVal = ''
|
||||
box = None
|
||||
data = bytesconverter.str_to_bytes(data)
|
||||
|
||||
pubkey = nacl.signing.VerifyKey(pubkey, encoder=nacl.encoding.Base32Encoder()).to_curve25519_public_key()
|
||||
|
||||
if encodedData:
|
||||
encoding = nacl.encoding.Base64Encoder
|
||||
else:
|
||||
encoding = nacl.encoding.RawEncoder
|
||||
|
||||
box = nacl.public.SealedBox(pubkey)
|
||||
retVal = box.encrypt(data, encoder=encoding)
|
||||
|
||||
return retVal
|
||||
|
||||
def pub_key_decrypt(data, pubkey='', privkey='', encodedData=False):
|
||||
'''pubkey decrypt (Curve25519, taken from Ed25519 pubkey)'''
|
||||
if pubkey != '':
|
||||
pubkey = unpaddedbase32.repad(bytesconverter.str_to_bytes(pubkey))
|
||||
decrypted = False
|
||||
if encodedData:
|
||||
encoding = nacl.encoding.Base64Encoder
|
||||
else:
|
||||
encoding = nacl.encoding.RawEncoder
|
||||
if privkey == '':
|
||||
privkey = our_priv_key
|
||||
ownKey = nacl.signing.SigningKey(seed=privkey, encoder=nacl.encoding.Base32Encoder()).to_curve25519_private_key()
|
||||
|
||||
if stringvalidators.validate_pub_key(privkey):
|
||||
privkey = nacl.signing.SigningKey(seed=privkey, encoder=nacl.encoding.Base32Encoder()).to_curve25519_private_key()
|
||||
anonBox = nacl.public.SealedBox(privkey)
|
||||
else:
|
||||
anonBox = nacl.public.SealedBox(ownKey)
|
||||
decrypted = anonBox.decrypt(data, encoder=encoding)
|
||||
return decrypted
|
|
@ -1,63 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
functions to generate ed25519 key pairs
|
||||
"""
|
||||
import nacl.signing
|
||||
import nacl.encoding
|
||||
import nacl.pwhash
|
||||
|
||||
import onionrexceptions
|
||||
from onionrutils import bytesconverter
|
||||
import onionrvalues
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def generate_pub_key():
|
||||
"""Generate a Ed25519 public key pair.
|
||||
|
||||
return tuple of base32encoded pubkey, privkey
|
||||
"""
|
||||
private_key = nacl.signing.SigningKey.generate()
|
||||
public_key = private_key.verify_key
|
||||
return (public_key, private_key)
|
||||
|
||||
|
||||
def generate_deterministic(passphrase, bypassCheck=False):
|
||||
"""Generate a Ed25519 public key pair from a phase.
|
||||
|
||||
not intended for human-generated key
|
||||
"""
|
||||
passStrength = onionrvalues.PASSWORD_LENGTH
|
||||
# Convert to bytes if not already
|
||||
passphrase = bytesconverter.str_to_bytes(passphrase)
|
||||
# Validate passphrase length
|
||||
if not bypassCheck:
|
||||
if len(passphrase) < passStrength:
|
||||
raise onionrexceptions.PasswordStrengthError(
|
||||
"Passphase must be at least %s characters" % (passStrength,))
|
||||
# KDF values
|
||||
kdf = nacl.pwhash.argon2id.kdf
|
||||
# Does not need to be secret, but must be 16 bytes
|
||||
salt = b"U81Q7llrQcdTP0Ux"
|
||||
ops = nacl.pwhash.argon2id.OPSLIMIT_SENSITIVE
|
||||
mem = nacl.pwhash.argon2id.MEMLIMIT_SENSITIVE
|
||||
|
||||
# Generate seed for ed25519 key
|
||||
key = kdf(32, passphrase, salt, opslimit=ops, memlimit=mem)
|
||||
key = nacl.signing.SigningKey(key)
|
||||
return (
|
||||
key.verify_key.encode(nacl.encoding.Base32Encoder).decode(),
|
||||
key.encode(nacl.encoding.Base32Encoder).decode())
|
|
@ -1,36 +0,0 @@
|
|||
"""
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
returns our current active keypair
|
||||
"""
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
import os
|
||||
import keymanager, config, filepaths
|
||||
from . import generate
|
||||
def get_keypair():
|
||||
key_m = keymanager.KeyManager()
|
||||
if os.path.exists(filepaths.keys_file):
|
||||
if len(config.get('general.public_key', '')) > 0:
|
||||
pubKey = config.get('general.public_key')
|
||||
else:
|
||||
pubKey = key_m.getPubkeyList()[0]
|
||||
privKey = key_m.getPrivkey(pubKey)
|
||||
else:
|
||||
keys = generate.generate_pub_key()
|
||||
pubKey = keys[0]
|
||||
privKey = keys[1]
|
||||
key_m.addKey(pubKey, privKey)
|
||||
return (pubKey, privKey)
|
|
@ -1,45 +0,0 @@
|
|||
import base64, binascii
|
||||
|
||||
import unpaddedbase32
|
||||
import nacl.encoding, nacl.signing, nacl.exceptions
|
||||
|
||||
from onionrutils import bytesconverter
|
||||
from onionrutils import mnemonickeys
|
||||
import logger
|
||||
|
||||
def ed_sign(data, key, encodeResult=False):
|
||||
'''Ed25519 sign data'''
|
||||
key = unpaddedbase32.repad(bytesconverter.str_to_bytes(key))
|
||||
try:
|
||||
data = data.encode()
|
||||
except AttributeError:
|
||||
pass
|
||||
key = nacl.signing.SigningKey(seed=key, encoder=nacl.encoding.Base32Encoder)
|
||||
retData = ''
|
||||
if encodeResult:
|
||||
retData = key.sign(data, encoder=nacl.encoding.Base64Encoder).signature.decode() # .encode() is not the same as nacl.encoding
|
||||
else:
|
||||
retData = key.sign(data).signature
|
||||
return retData
|
||||
|
||||
def ed_verify(data, key, sig, encodedData=True):
|
||||
'''Verify signed data (combined in nacl) to an ed25519 key'''
|
||||
key = unpaddedbase32.repad(bytesconverter.str_to_bytes(key))
|
||||
try:
|
||||
key = nacl.signing.VerifyKey(key=key, encoder=nacl.encoding.Base32Encoder)
|
||||
except nacl.exceptions.ValueError:
|
||||
return False
|
||||
except binascii.Error:
|
||||
logger.warn('Could not load key for verification, invalid padding')
|
||||
return False
|
||||
retData = False
|
||||
sig = base64.b64decode(sig)
|
||||
try:
|
||||
data = data.encode()
|
||||
except AttributeError:
|
||||
pass
|
||||
try:
|
||||
retData = key.verify(data, sig) # .encode() is not the same as nacl.encoding
|
||||
except nacl.exceptions.BadSignatureError:
|
||||
pass
|
||||
return retData
|
|
@ -17,12 +17,13 @@ GNU General Public License for more details.
|
|||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
import os, re, importlib
|
||||
import os, re
|
||||
import importlib.util
|
||||
import traceback
|
||||
|
||||
from . import onionrevents as events
|
||||
from .pluginapis import plugin_apis
|
||||
import config, logger
|
||||
import config, logging
|
||||
from utils import identifyhome
|
||||
|
||||
# set data dir
|
||||
|
@ -43,9 +44,9 @@ def reload(stop_event = True):
|
|||
enabled_plugins = get_enabled_plugins()
|
||||
|
||||
if stop_event is True:
|
||||
logger.debug('Reloading all plugins...')
|
||||
logging.debug('Reloading all plugins...')
|
||||
else:
|
||||
logger.debug('Loading all plugins...')
|
||||
logging.debug('Loading all plugins...')
|
||||
|
||||
if stop_event is True:
|
||||
for plugin in enabled_plugins:
|
||||
|
@ -56,7 +57,7 @@ def reload(stop_event = True):
|
|||
|
||||
return True
|
||||
except:
|
||||
logger.error('Failed to reload plugins.')
|
||||
logging.error('Failed to reload plugins.')
|
||||
|
||||
return False
|
||||
|
||||
|
@ -73,8 +74,8 @@ def enable(name, start_event = True):
|
|||
except ImportError as e: # Was getting import error on Gitlab CI test "data"
|
||||
# NOTE: If you are experiencing issues with plugins not being enabled, it might be this resulting from an error in the module
|
||||
# can happen inconsistently (especially between versions)
|
||||
logger.error('Failed to enable module:', terminal=True)
|
||||
logger.error(traceback.format_exc(), terminal=True)
|
||||
logging.error('Failed to enable module:')
|
||||
logging.error(traceback.format_exc())
|
||||
return False
|
||||
else:
|
||||
enabled_plugins.append(name)
|
||||
|
@ -86,8 +87,8 @@ def enable(name, start_event = True):
|
|||
else:
|
||||
return False
|
||||
else:
|
||||
logger.error('Failed to enable plugin \"%s\", disabling plugin.' % name, terminal=True)
|
||||
logger.debug('Plugins folder not found: %s' % get_plugins_folder(str(name).lower()), terminal=True)
|
||||
logging.error('Failed to enable plugin \"%s\", disabling plugin.' % name)
|
||||
logging.debug('Plugins folder not found: %s' % get_plugins_folder(str(name).lower()))
|
||||
disable(name)
|
||||
|
||||
return False
|
||||
|
@ -129,9 +130,9 @@ def start(name):
|
|||
|
||||
return plugin
|
||||
except:
|
||||
logger.error('Failed to start module \"%s\".' % name)
|
||||
logging.error('Failed to start module \"%s\".' % name)
|
||||
else:
|
||||
logger.error('Failed to start nonexistant module \"%s\".' % name)
|
||||
logging.error('Failed to start nonexistant module \"%s\".' % name)
|
||||
|
||||
return None
|
||||
|
||||
|
@ -153,9 +154,9 @@ def stop(name):
|
|||
|
||||
return plugin
|
||||
except:
|
||||
logger.error('Failed to stop module \"%s\".' % name)
|
||||
logging.error('Failed to stop module \"%s\".' % name)
|
||||
else:
|
||||
logger.error('Failed to stop nonexistant module \"%s\".' % name)
|
||||
logging.error('Failed to stop nonexistant module \"%s\".' % name)
|
||||
|
||||
return None
|
||||
|
||||
|
@ -258,11 +259,11 @@ def check():
|
|||
"""
|
||||
|
||||
if not config.is_set('plugins'):
|
||||
logger.debug('Generating plugin configuration data...')
|
||||
logging.debug('Generating plugin configuration data...')
|
||||
config.set('plugins', {'enabled': []}, True)
|
||||
|
||||
if not os.path.exists(os.path.dirname(get_plugins_folder())):
|
||||
logger.debug('Generating plugin data folder...')
|
||||
logging.debug('Generating plugin data folder...')
|
||||
try:
|
||||
os.makedirs(os.path.dirname(get_plugins_folder()))
|
||||
except FileExistsError:
|
||||
|
|
|
@ -7,7 +7,7 @@ from threading import Thread
|
|||
|
||||
import traceback
|
||||
|
||||
import config, logger
|
||||
import config, logging
|
||||
import onionrplugins as plugins
|
||||
from . import onionrpluginapi as pluginapi
|
||||
"""
|
||||
|
@ -41,11 +41,11 @@ def __event_caller(event_name, data = {}):
|
|||
try:
|
||||
call(plugins.get_plugin(plugin), event_name, data, get_pluginapi(data))
|
||||
except ModuleNotFoundError as _:
|
||||
logger.warn('Disabling nonexistant plugin "%s"...' % plugin, terminal=True)
|
||||
logging.warn('Disabling nonexistant plugin "%s"...' % plugin)
|
||||
plugins.disable(plugin, stop_event = False)
|
||||
except Exception as _:
|
||||
logger.error('Event "%s" failed for plugin "%s".' % (event_name, plugin), terminal=True)
|
||||
logger.error('\n' + traceback.format_exc(), terminal=True)
|
||||
logging.error('Event "%s" failed for plugin "%s".' % (event_name, plugin))
|
||||
logging.error('\n' + traceback.format_exc())
|
||||
|
||||
def event(event_name, data = {}, threaded = True):
|
||||
"""Call an event on all plugins (if defined)"""
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
'''
|
||||
|
||||
import onionrplugins, logger
|
||||
import onionrplugins, logging
|
||||
|
||||
|
||||
class PluginAPI:
|
||||
|
|
|
@ -1,120 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
DBCreator, creates sqlite3 databases used by Onionr
|
||||
"""
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
import sqlite3, os
|
||||
from coredb import dbfiles
|
||||
import filepaths
|
||||
|
||||
def createAddressDB():
|
||||
'''
|
||||
Generate the address database
|
||||
|
||||
types:
|
||||
1: I2P b32 address
|
||||
2: Tor v2 (like facebookcorewwwi.onion)
|
||||
3: Tor v3
|
||||
'''
|
||||
if os.path.exists(dbfiles.address_info_db):
|
||||
raise FileExistsError("Address database already exists")
|
||||
conn = sqlite3.connect(dbfiles.address_info_db)
|
||||
c = conn.cursor()
|
||||
c.execute('''CREATE TABLE adders(
|
||||
address text,
|
||||
type int,
|
||||
knownPeer text,
|
||||
speed int,
|
||||
success int,
|
||||
powValue text,
|
||||
failure int,
|
||||
lastConnect int,
|
||||
lastConnectAttempt int,
|
||||
trust int,
|
||||
introduced int
|
||||
);
|
||||
''')
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
def createPeerDB():
|
||||
'''
|
||||
Generate the peer sqlite3 database and populate it with the peers table.
|
||||
'''
|
||||
if os.path.exists(dbfiles.user_id_info_db):
|
||||
raise FileExistsError("User database already exists")
|
||||
# generate the peer database
|
||||
conn = sqlite3.connect(dbfiles.user_id_info_db)
|
||||
c = conn.cursor()
|
||||
c.execute('''CREATE TABLE peers(
|
||||
ID text not null,
|
||||
name text,
|
||||
adders text,
|
||||
dateSeen not null,
|
||||
trust int,
|
||||
hashID text);
|
||||
''')
|
||||
c.execute('''CREATE TABLE forwardKeys(
|
||||
peerKey text not null,
|
||||
forwardKey text not null,
|
||||
date int not null,
|
||||
expire int not null
|
||||
);''')
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return
|
||||
|
||||
|
||||
def createForwardKeyDB():
|
||||
'''
|
||||
Create the forward secrecy key db (*for *OUR* keys*)
|
||||
'''
|
||||
if os.path.exists(dbfiles.forward_keys_db):
|
||||
raise FileExistsError("Block database already exists")
|
||||
conn = sqlite3.connect(dbfiles.forward_keys_db)
|
||||
c = conn.cursor()
|
||||
c.execute('''CREATE TABLE myForwardKeys(
|
||||
peer text not null,
|
||||
publickey text not null,
|
||||
privatekey text not null,
|
||||
date int not null,
|
||||
expire int not null
|
||||
);
|
||||
''')
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return
|
||||
|
||||
|
||||
def create_blacklist_db():
|
||||
if os.path.exists(dbfiles.blacklist_db):
|
||||
raise FileExistsError("Blacklist db already exists")
|
||||
conn = sqlite3.connect(dbfiles.blacklist_db, timeout=10)
|
||||
c = conn.cursor()
|
||||
# Create table
|
||||
c.execute('''CREATE TABLE blacklist(
|
||||
hash text primary key not null,
|
||||
dataType int,
|
||||
blacklistDate int,
|
||||
expire int
|
||||
);
|
||||
''')
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
|
||||
create_funcs = [createAddressDB, createPeerDB,
|
||||
createForwardKeyDB, create_blacklist_db]
|
|
@ -20,16 +20,16 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|||
import os, shutil
|
||||
|
||||
import onionrplugins as plugins
|
||||
import logger
|
||||
from logger import log as logging
|
||||
import filepaths
|
||||
from utils.readstatic import get_static_dir
|
||||
|
||||
def setup_default_plugins():
|
||||
# Copy default plugins into plugins folder
|
||||
if os.path.exists(get_static_dir() + '/default-plugins/'):
|
||||
names = [f for f in os.listdir(get_static_dir() + '/default-plugins/')]
|
||||
if os.path.exists(get_static_dir() + '/official-plugins/'):
|
||||
names = [f for f in os.listdir(get_static_dir() + '/official-plugins/')]
|
||||
shutil.copytree(
|
||||
get_static_dir() + '/default-plugins/',
|
||||
get_static_dir() + '/official-plugins/',
|
||||
plugins.get_plugins_folder(), dirs_exist_ok=True)
|
||||
|
||||
|
||||
|
@ -38,9 +38,9 @@ def setup_default_plugins():
|
|||
if not name in plugins.get_enabled_plugins():
|
||||
plugins.enable(name)
|
||||
else:
|
||||
logger.error(
|
||||
logging.error(
|
||||
"Plugin source directory does not exist!" +
|
||||
"Onionr needs plugins to be useful", terminal=True)
|
||||
"Onionr needs plugins to be useful")
|
||||
|
||||
|
||||
for name in plugins.get_enabled_plugins():
|
||||
|
@ -50,5 +50,5 @@ def setup_default_plugins():
|
|||
except FileExistsError:
|
||||
pass
|
||||
except Exception as e:
|
||||
#logger.warn('Error enabling plugin: ' + str(e), terminal=True)
|
||||
#logging.warn('Error enabling plugin: ' + str(e))
|
||||
plugins.disable(name, stop_event = False)
|
||||
|
|
|
@ -8,9 +8,8 @@ import base64
|
|||
import ujson as json
|
||||
|
||||
import config
|
||||
import logger
|
||||
from logger import log as logging
|
||||
import onionrvalues
|
||||
from logger.settings import *
|
||||
from utils import readstatic
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
|
@ -37,42 +36,3 @@ def setup_config():
|
|||
config.save()
|
||||
|
||||
config.reload()
|
||||
|
||||
settings = 0b000
|
||||
if config.get('log.console.color', True):
|
||||
settings = settings | USE_ANSI
|
||||
if config.get('log.console.output', True):
|
||||
settings = settings | OUTPUT_TO_CONSOLE
|
||||
if config.get('log.file.output', True):
|
||||
settings = settings | OUTPUT_TO_FILE
|
||||
set_settings(settings)
|
||||
|
||||
verbosity = str(config.get('log.verbosity', 'default')).lower().strip()
|
||||
if not verbosity in ['default', 'null', 'none', 'nil']:
|
||||
map = {
|
||||
str(LEVEL_DEBUG) : LEVEL_DEBUG,
|
||||
'verbose' : LEVEL_DEBUG,
|
||||
'debug' : LEVEL_DEBUG,
|
||||
str(LEVEL_INFO) : LEVEL_INFO,
|
||||
'info' : LEVEL_INFO,
|
||||
'information' : LEVEL_INFO,
|
||||
str(LEVEL_WARN) : LEVEL_WARN,
|
||||
'warn' : LEVEL_WARN,
|
||||
'warning' : LEVEL_WARN,
|
||||
'warnings' : LEVEL_WARN,
|
||||
str(LEVEL_ERROR) : LEVEL_ERROR,
|
||||
'err' : LEVEL_ERROR,
|
||||
'error' : LEVEL_ERROR,
|
||||
'errors' : LEVEL_ERROR,
|
||||
str(LEVEL_FATAL) : LEVEL_FATAL,
|
||||
'fatal' : LEVEL_FATAL,
|
||||
str(LEVEL_IMPORTANT) : LEVEL_IMPORTANT,
|
||||
'silent' : LEVEL_IMPORTANT,
|
||||
'quiet' : LEVEL_IMPORTANT,
|
||||
'important' : LEVEL_IMPORTANT
|
||||
}
|
||||
|
||||
if verbosity in map:
|
||||
set_level(map[verbosity])
|
||||
else:
|
||||
logger.warn('Verbosity level %s is not valid, using default verbosity.' % verbosity)
|
||||
|
|
|
@ -6,7 +6,7 @@ from threading import Thread
|
|||
from uuid import uuid4
|
||||
from time import sleep
|
||||
|
||||
import logger
|
||||
from logger import log as logging
|
||||
|
||||
|
||||
def _onionr_thread(func: Callable,
|
||||
|
@ -18,10 +18,10 @@ def _onionr_thread(func: Callable,
|
|||
try:
|
||||
func(*args, **kwargs)
|
||||
except Exception as _: # noqa
|
||||
logger.warn(
|
||||
logging.warn(
|
||||
f"Onionr thread exception in {thread_id} \n" +
|
||||
traceback.format_exc(),
|
||||
terminal=True)
|
||||
)
|
||||
sleep(sleep_secs)
|
||||
|
||||
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
from typing import NewType
|
||||
|
||||
UserID = NewType('UserID', str)
|
||||
UserIDSecretKey = NewType('UserIDSecretKey', str)
|
||||
|
||||
LoopBackIP = NewType('LoopBackIP', str)
|
||||
|
||||
DeterministicKeyPassphrase = NewType('DeterministicKeyPassphrase', str)
|
||||
|
||||
Ed25519PublicKeyBytes = NewType('Ed25519PublicKeyBytes', bytes)
|
||||
|
||||
BlockHash = NewType('BlockHash', str)
|
||||
|
||||
OnboardingConfig = NewType('OnboardingConfig', str)
|
||||
|
||||
# JSON serializable string. e.g. no raw bytes
|
||||
JSONSerializable = NewType('JSONSerializable', str)
|
||||
|
||||
# Return value of some functions or methods, denoting operation success
|
||||
# Do not use for new code
|
||||
BooleanSuccessState = NewType('BooleanSuccessState', bool)
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
# onionrusers
|
||||
|
||||
onionrusers is a small collection of classes for interacting with onionr public keys, such as encrypting messages to them with forward secrecy, interacting with their settings, or else.
|
||||
|
||||
## Files
|
||||
|
||||
onionrusers.py: OnionrUsers class can be used to encrypt/decrypt messages to a particular Onionr user (incl. forward secrecy), view information about them, and get our friend list.
|
||||
|
||||
contactmanager.py: Inheriting from OnionrUsers, ContactManager allows arbitrary information to be associated with an Onionr user.
|
|
@ -1,89 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
Set more abstract information related to a peer.
|
||||
Can be thought of as traditional 'contact' system
|
||||
"""
|
||||
import os
|
||||
|
||||
import ujson as json
|
||||
import unpaddedbase32
|
||||
|
||||
import onionrexceptions
|
||||
from onionrusers import onionrusers
|
||||
from onionrutils import bytesconverter, epoch
|
||||
from utils import identifyhome
|
||||
from onionrutils import mnemonickeys
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
class ContactManager(onionrusers.OnionrUser):
|
||||
def __init__(self, publicKey, saveUser=False, recordExpireSeconds=5):
|
||||
try:
|
||||
if mnemonickeys.DELIMITER in publicKey:
|
||||
publicKey = mnemonickeys.get_base32(publicKey)
|
||||
#publicKey = unpaddedbase32.b32encode(bytesconverter.str_to_bytes(publicKey))
|
||||
except ValueError:
|
||||
pass
|
||||
publicKey = bytesconverter.bytes_to_str(unpaddedbase32.repad(bytesconverter.str_to_bytes(publicKey)))
|
||||
super(ContactManager, self).__init__(publicKey, saveUser=saveUser)
|
||||
home = identifyhome.identify_home()
|
||||
self.dataDir = home + '/contacts/'
|
||||
self.dataFile = '%s/contacts/%s.json' % (home, publicKey)
|
||||
self.lastRead = 0
|
||||
self.recordExpire = recordExpireSeconds
|
||||
self.data = self._loadData()
|
||||
self.deleted = False
|
||||
|
||||
if not os.path.exists(self.dataDir):
|
||||
os.mkdir(self.dataDir)
|
||||
|
||||
def _writeData(self):
|
||||
data = json.dumps(self.data)
|
||||
with open(self.dataFile, 'w') as dataFile:
|
||||
dataFile.write(data)
|
||||
|
||||
def _loadData(self):
|
||||
self.lastRead = epoch.get_epoch()
|
||||
retData = {}
|
||||
if os.path.exists(self.dataFile):
|
||||
with open(self.dataFile, 'r') as dataFile:
|
||||
retData = json.loads(dataFile.read())
|
||||
return retData
|
||||
|
||||
def set_info(self, key, value, autoWrite=True):
|
||||
if self.deleted:
|
||||
raise onionrexceptions.ContactDeleted
|
||||
|
||||
self.data[key] = value
|
||||
if autoWrite:
|
||||
self._writeData()
|
||||
return
|
||||
|
||||
def get_info(self, key, forceReload=False):
|
||||
if self.deleted:
|
||||
raise onionrexceptions.ContactDeleted
|
||||
|
||||
if (epoch.get_epoch() - self.lastRead >= self.recordExpire) or forceReload:
|
||||
self.data = self._loadData()
|
||||
try:
|
||||
return self.data[key]
|
||||
except KeyError:
|
||||
return None
|
||||
|
||||
def delete_contact(self):
|
||||
self.deleted = True
|
||||
if os.path.exists(self.dataFile):
|
||||
os.remove(self.dataFile)
|
|
@ -1,259 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
Contains abstractions for interacting with users of Onionr
|
||||
"""
|
||||
import sqlite3
|
||||
import time
|
||||
|
||||
import onionrexceptions
|
||||
from onionrutils import stringvalidators, bytesconverter, epoch
|
||||
|
||||
import unpaddedbase32
|
||||
import nacl.exceptions
|
||||
|
||||
from coredb import keydb, dbfiles
|
||||
import onionrcrypto
|
||||
from onionrcrypto import getourkeypair
|
||||
from onionrvalues import DATABASE_LOCK_TIMEOUT
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def deleteExpiredKeys():
|
||||
# Fetch the keys we generated for the peer, that are still around
|
||||
conn = sqlite3.connect(
|
||||
dbfiles.forward_keys_db, timeout=DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
|
||||
curTime = epoch.get_epoch()
|
||||
c.execute("DELETE from myForwardKeys where expire <= ?", (curTime,))
|
||||
conn.commit()
|
||||
conn.execute("VACUUM")
|
||||
conn.close()
|
||||
return
|
||||
|
||||
|
||||
def deleteTheirExpiredKeys(pubkey):
|
||||
conn = sqlite3.connect(
|
||||
dbfiles.user_id_info_db, timeout=DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
|
||||
# Prepare the insert
|
||||
command = (pubkey, epoch.get_epoch())
|
||||
|
||||
c.execute("DELETE from forwardKeys where peerKey = ? and expire <= ?", command)
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
|
||||
DEFAULT_KEY_EXPIRE = 604800
|
||||
|
||||
|
||||
class OnionrUser:
|
||||
|
||||
def __init__(self, publicKey, saveUser=False):
|
||||
"""
|
||||
OnionrUser is an abstraction for "users" of the network.
|
||||
|
||||
Takes a base32 encoded ed25519 public key, and a bool saveUser
|
||||
saveUser determines if we should add a user to our peer database or not.
|
||||
"""
|
||||
publicKey = unpaddedbase32.repad(
|
||||
bytesconverter.str_to_bytes(publicKey)).decode()
|
||||
|
||||
self.trust = 0
|
||||
self.publicKey = publicKey
|
||||
|
||||
if saveUser and not publicKey == getourkeypair.get_keypair():
|
||||
try:
|
||||
keydb.addkeys.add_pub_key(publicKey)
|
||||
except (AssertionError, ValueError) as _:
|
||||
pass
|
||||
|
||||
self.trust = keydb.userinfo.get_user_info(self.publicKey, 'trust')
|
||||
return
|
||||
|
||||
def setTrust(self, newTrust):
|
||||
"""Set the peers trust. 0 = not trusted, 1 = friend, 2 = ultimate"""
|
||||
keydb.userinfo.set_user_info(self.publicKey, 'trust', newTrust)
|
||||
|
||||
def isFriend(self):
|
||||
if keydb.userinfo.get_user_info(self.publicKey, 'trust') == 1:
|
||||
return True
|
||||
return False
|
||||
|
||||
def getName(self):
|
||||
retData = 'anonymous'
|
||||
name = keydb.userinfo.get_user_info(self.publicKey, 'name')
|
||||
try:
|
||||
if len(name) > 0:
|
||||
retData = name
|
||||
except ValueError:
|
||||
pass
|
||||
return retData
|
||||
|
||||
def encrypt(self, data):
|
||||
encrypted = onionrcrypto.encryption.pub_key_encrypt(
|
||||
data, self.publicKey, encodedData=True)
|
||||
return encrypted
|
||||
|
||||
def decrypt(self, data):
|
||||
decrypted = onionrcrypto.encryption.pub_key_decrypt(
|
||||
data, self.publicKey, encodedData=True)
|
||||
return decrypted
|
||||
|
||||
def forwardEncrypt(self, data):
|
||||
deleteTheirExpiredKeys(self.publicKey)
|
||||
deleteExpiredKeys()
|
||||
retData = ''
|
||||
forwardKey = self._getLatestForwardKey()
|
||||
if stringvalidators.validate_pub_key(forwardKey[0]):
|
||||
retData = onionrcrypto.encryption.pub_key_encrypt(
|
||||
data, forwardKey[0], encodedData=True)
|
||||
else:
|
||||
raise onionrexceptions.InvalidPubkey(
|
||||
"No valid forward secrecy key available for this user")
|
||||
return (retData, forwardKey[0], forwardKey[1])
|
||||
|
||||
def forwardDecrypt(self, encrypted):
|
||||
retData = ""
|
||||
for key in self.getGeneratedForwardKeys(False):
|
||||
try:
|
||||
retData = onionrcrypto.encryption.pub_key_decrypt(
|
||||
encrypted, privkey=key[1], encodedData=True)
|
||||
except nacl.exceptions.CryptoError:
|
||||
retData = False
|
||||
else:
|
||||
break
|
||||
else:
|
||||
raise onionrexceptions.DecryptionError(
|
||||
"Could not decrypt forward secrecy content")
|
||||
return retData
|
||||
|
||||
def _getLatestForwardKey(self):
|
||||
# Get the latest forward secrecy key for a peer
|
||||
key = ""
|
||||
conn = sqlite3.connect(
|
||||
dbfiles.user_id_info_db, timeout=DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
|
||||
# TODO: account for keys created at the same time (same epoch)
|
||||
for row in c.execute(
|
||||
"SELECT forwardKey, max(EXPIRE) FROM forwardKeys WHERE peerKey = ? ORDER BY expire DESC", # noqa
|
||||
(self.publicKey,)):
|
||||
key = (row[0], row[1])
|
||||
break
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
return key
|
||||
|
||||
def _getForwardKeys(self):
|
||||
conn = sqlite3.connect(
|
||||
dbfiles.user_id_info_db, timeout=DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
keyList = []
|
||||
|
||||
for row in c.execute(
|
||||
"SELECT forwardKey, date FROM forwardKeys WHERE peerKey = ? ORDER BY expire DESC", # noqa
|
||||
(self.publicKey,)):
|
||||
keyList.append((row[0], row[1]))
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
return list(keyList)
|
||||
|
||||
def generateForwardKey(self, expire=DEFAULT_KEY_EXPIRE):
|
||||
|
||||
# Generate a forward secrecy key for the peer
|
||||
conn = sqlite3.connect(
|
||||
dbfiles.forward_keys_db, timeout=DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
# Prepare the insert
|
||||
time = epoch.get_epoch()
|
||||
newKeys = onionrcrypto.generate()
|
||||
newPub = bytesconverter.bytes_to_str(newKeys[0])
|
||||
newPriv = bytesconverter.bytes_to_str(newKeys[1])
|
||||
|
||||
command = (self.publicKey, newPub, newPriv, time, expire + time)
|
||||
|
||||
c.execute("INSERT INTO myForwardKeys VALUES(?, ?, ?, ?, ?);", command)
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return newPub
|
||||
|
||||
def getGeneratedForwardKeys(self, genNew=True):
|
||||
# Fetch the keys we generated for the peer, that are still around
|
||||
conn = sqlite3.connect(
|
||||
dbfiles.forward_keys_db, timeout=DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
pubkey = self.publicKey
|
||||
pubkey = bytesconverter.bytes_to_str(pubkey)
|
||||
command = (pubkey,)
|
||||
keyList = [] # list of tuples containing pub, private for peer
|
||||
|
||||
for result in c.execute(
|
||||
"SELECT * FROM myForwardKeys WHERE peer = ?", command):
|
||||
keyList.append((result[1], result[2]))
|
||||
|
||||
if len(keyList) == 0:
|
||||
if genNew:
|
||||
self.generateForwardKey()
|
||||
keyList = self.getGeneratedForwardKeys()
|
||||
return list(keyList)
|
||||
|
||||
def addForwardKey(self, newKey, expire=DEFAULT_KEY_EXPIRE):
|
||||
newKey = bytesconverter.bytes_to_str(
|
||||
unpaddedbase32.repad(bytesconverter.str_to_bytes(newKey)))
|
||||
if not stringvalidators.validate_pub_key(newKey):
|
||||
# Do not add if something went wrong with the key
|
||||
raise onionrexceptions.InvalidPubkey(newKey)
|
||||
|
||||
conn = sqlite3.connect(
|
||||
dbfiles.user_id_info_db, timeout=DATABASE_LOCK_TIMEOUT)
|
||||
c = conn.cursor()
|
||||
|
||||
# Get the time we're inserting the key at
|
||||
timeInsert = epoch.get_epoch()
|
||||
|
||||
# Look at our current keys for duplicate key data or time
|
||||
for entry in self._getForwardKeys():
|
||||
if entry[0] == newKey:
|
||||
return False
|
||||
if entry[1] == timeInsert:
|
||||
timeInsert += 1
|
||||
# Sleep if our time is the same to prevent dupe time records
|
||||
time.sleep(1)
|
||||
|
||||
# Add a forward secrecy key for the peer
|
||||
# Prepare the insert
|
||||
command = (self.publicKey, newKey, timeInsert, timeInsert + expire)
|
||||
|
||||
c.execute("INSERT INTO forwardKeys VALUES(?, ?, ?, ?);", command)
|
||||
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return True
|
||||
|
||||
@classmethod
|
||||
def list_friends(cls):
|
||||
friendList = []
|
||||
for x in keydb.listkeys.list_pub_keys(trust=1):
|
||||
friendList.append(cls(x))
|
||||
return list(friendList)
|
|
@ -1,16 +0,0 @@
|
|||
def str_to_bytes(data: str) -> bytes:
|
||||
'''Convert a string to bytes with .encode(), utf8'''
|
||||
try:
|
||||
data = data.encode('UTF-8')
|
||||
except AttributeError:
|
||||
pass
|
||||
return data
|
||||
|
||||
|
||||
def bytes_to_str(data: bytes) -> str:
|
||||
"""Convert bytes to strings with .decode(), utf8"""
|
||||
try:
|
||||
data = data.decode('UTF-8')
|
||||
except AttributeError:
|
||||
pass
|
||||
return data
|
|
@ -1,41 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
cleanup run files
|
||||
"""
|
||||
import os
|
||||
|
||||
import filepaths
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def _safe_remove(path):
|
||||
try:
|
||||
os.remove(path)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
|
||||
def delete_run_files():
|
||||
"""Delete run files, do not error if not found.
|
||||
|
||||
Test: test_cleanup.py
|
||||
"""
|
||||
_safe_remove(filepaths.public_API_host_file)
|
||||
_safe_remove(filepaths.private_API_host_file)
|
||||
_safe_remove(filepaths.daemon_mark_file)
|
||||
_safe_remove(filepaths.lock_file)
|
||||
_safe_remove(filepaths.gossip_server_socket_file)
|
||||
_safe_remove(filepaths.pid_file)
|
|
@ -1,31 +0,0 @@
|
|||
"""Onionr - Private P2P Communication.
|
||||
|
||||
Get floored epoch, or rounded epoch
|
||||
"""
|
||||
import time
|
||||
import math
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def get_rounded_epoch(roundS=60) -> int:
|
||||
"""Return the epoch, rounded down to given seconds (Default 60)."""
|
||||
epoch = get_epoch()
|
||||
return epoch - (epoch % roundS)
|
||||
|
||||
|
||||
def get_epoch() -> int:
|
||||
"""return epoch"""
|
||||
return math.floor(time.time())
|
|
@ -1,12 +0,0 @@
|
|||
import re
|
||||
|
||||
|
||||
def escape_ANSI(line):
|
||||
'''
|
||||
Remove ANSI escape codes from a string with regex
|
||||
|
||||
adapted from: https://stackoverflow.com/a/38662876 by user https://stackoverflow.com/users/802365/%c3%89douard-lopez
|
||||
cc-by-sa-3 license https://creativecommons.org/licenses/by-sa/3.0/
|
||||
'''
|
||||
ansi_escape = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]')
|
||||
return ansi_escape.sub('', line)
|
|
@ -1,50 +0,0 @@
|
|||
"""
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
convert a base32 string (intended for ed25519 user ids) to pgp word list
|
||||
"""
|
||||
import base64
|
||||
|
||||
import niceware
|
||||
import unpaddedbase32
|
||||
|
||||
import onionrcrypto
|
||||
import onionrvalues
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
DELIMITER = '-'
|
||||
|
||||
def get_human_readable_ID(pub=''):
|
||||
"""gets a human readable ID from a public key"""
|
||||
if pub == '':
|
||||
pub = onionrcrypto.pub_key
|
||||
|
||||
if not len(pub) == onionrvalues.MAIN_PUBLIC_KEY_SIZE:
|
||||
pub = base64.b32decode(pub)
|
||||
|
||||
return DELIMITER.join(niceware.bytes_to_passphrase(pub))
|
||||
#return niceware.bytes_to_passphrase(pub).replace(' ', DELIMITER)
|
||||
|
||||
def get_base32(words):
|
||||
"""converts mnemonic to base32"""
|
||||
if DELIMITER not in words and not type(words) in (type(list), type(tuple)): return words
|
||||
|
||||
try:
|
||||
return unpaddedbase32.b32encode(niceware.passphrase_to_bytes(words.split(DELIMITER)))
|
||||
except AttributeError:
|
||||
ret = unpaddedbase32.b32encode(niceware.passphrase_to_bytes(words))
|
||||
return ret
|
|
@ -1,42 +0,0 @@
|
|||
"""
|
||||
Onionr - Private P2P Communication
|
||||
|
||||
validate various string data types
|
||||
"""
|
||||
import base64
|
||||
import string
|
||||
import unpaddedbase32, nacl.signing, nacl.encoding
|
||||
from onionrutils import bytesconverter
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
def validate_pub_key(key):
|
||||
"""Validate if a string is a valid base32 encoded Ed25519 key"""
|
||||
if type(key) is type(None):
|
||||
return False
|
||||
# Accept keys that have no = padding
|
||||
key = unpaddedbase32.repad(bytesconverter.str_to_bytes(key))
|
||||
|
||||
retVal = False
|
||||
try:
|
||||
nacl.signing.SigningKey(seed=key, encoder=nacl.encoding.Base32Encoder)
|
||||
except nacl.exceptions.ValueError:
|
||||
pass
|
||||
except base64.binascii.Error as _:
|
||||
pass
|
||||
else:
|
||||
retVal = True
|
||||
return retVal
|
|
@ -1,8 +0,0 @@
|
|||
from __future__ import annotations
|
||||
from typing import Union, Generic
|
||||
from gevent import sleep
|
||||
def wait_for_set_var(obj, attribute, sleep_seconds: Union[int, float]=0):
|
||||
"""Wait for an object to get an attribute with an optional sleep time"""
|
||||
while not hasattr(obj, attribute):
|
||||
if hasattr(obj, attribute): break
|
||||
if sleep_seconds > 0: sleep(sleep_seconds)
|
|
@ -2,10 +2,6 @@
|
|||
|
||||
This file defines values and requirements used by Onionr
|
||||
"""
|
||||
import platform
|
||||
import os
|
||||
|
||||
import filepaths
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -20,27 +16,11 @@ GNU General Public License for more details.
|
|||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
DENIABLE_PEER_ADDRESS = "OVPCZLOXD6DC5JHX4EQ3PSOGAZ3T24F75HQLIUZSDSMYPEOXCPFA"
|
||||
PASSWORD_LENGTH = 25
|
||||
ONIONR_TAGLINE = 'Private P2P Communication - GPLv3 - https://Onionr.net'
|
||||
ONIONR_VERSION = '9.0.0'
|
||||
ONIONR_VERSION_CODENAME = 'Taraxacum'
|
||||
ONIONR_VERSION_TUPLE = tuple(ONIONR_VERSION.split('.')) # (MAJOR, MINOR, VERSION)
|
||||
API_VERSION = '2' # increments of 1; only change when something fundamental about how the API works changes. This way other nodes know how to communicate without learning too much information about you.
|
||||
MIN_PY_VERSION = 7 # min version of 7 so we can take advantage of non-cyclic type hints
|
||||
MIN_PY_VERSION = 10
|
||||
DEVELOPMENT_MODE = False
|
||||
|
||||
"""Onionr user IDs are ed25519 keys, which are always 32 bytes in length"""
|
||||
MAIN_PUBLIC_KEY_SIZE = 32
|
||||
ORIG_RUN_DIR_ENV_VAR = 'ORIG_ONIONR_RUN_DIR'
|
||||
|
||||
DATABASE_LOCK_TIMEOUT = 60
|
||||
|
||||
BLOCK_EXPORT_FILE_EXT = '.onionr'
|
||||
|
||||
# Begin OnionrValues migrated values
|
||||
|
||||
if os.path.exists(filepaths.daemon_mark_file):
|
||||
SCRIPT_NAME = 'start-daemon.sh'
|
||||
else:
|
||||
SCRIPT_NAME = 'onionr.sh'
|
||||
|
|
|
@ -5,10 +5,7 @@ Create required Onionr directories
|
|||
import os
|
||||
import stat
|
||||
|
||||
from onionrplugins import get_plugins_folder
|
||||
|
||||
from . import identifyhome
|
||||
import filepaths
|
||||
import onionrexceptions
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
|
@ -31,9 +28,7 @@ def create_dirs():
|
|||
"""Create onionr data-related directories in
|
||||
order of the hardcoded list below,
|
||||
then trigger creation of DBs"""
|
||||
gen_dirs = [home,
|
||||
filepaths.contacts_location,
|
||||
filepaths.export_location]
|
||||
gen_dirs = [home]
|
||||
for path in gen_dirs:
|
||||
if not os.path.exists(path):
|
||||
os.makedirs(path)
|
||||
|
@ -44,11 +39,3 @@ def create_dirs():
|
|||
" already exists and is not owned by the same user")
|
||||
|
||||
os.chmod(home, stat.S_IRWXU)
|
||||
|
||||
from onionrsetup import dbcreator
|
||||
|
||||
for db in dbcreator.create_funcs:
|
||||
try:
|
||||
db()
|
||||
except FileExistsError:
|
||||
pass
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
import re
|
||||
|
||||
|
||||
def escape_ANSI(line):
|
||||
'''Remove ANSI escape codes from a string with regex
|
||||
|
||||
adapted from: https://stackoverflow.com/a/38662876 by user https://stackoverflow.com/users/802365/%c3%89douard-lopez
|
||||
cc-by-sa-3 license https://creativecommons.org/licenses/by-sa/3.0/
|
||||
'''
|
||||
ansi_escape = re.compile(r'(\x9B|\x1B\[)[0-?]*[ -/]*[@-~]')
|
||||
return ansi_escape.sub('', line)
|
|
@ -1,15 +0,0 @@
|
|||
import sys, os
|
||||
from . import readstatic
|
||||
import logger
|
||||
import onionrvalues
|
||||
def header(message = logger.colors.fg.pink + logger.colors.bold + 'Onionr' + logger.colors.reset + logger.colors.fg.pink + ' has started.'):
|
||||
if onionrvalues.DEVELOPMENT_MODE:
|
||||
return
|
||||
header_path = readstatic.get_static_dir() + 'header.txt'
|
||||
if os.path.exists(header_path) and logger.settings.get_level() <= logger.settings.LEVEL_INFO:
|
||||
with open(header_path, 'rb') as file:
|
||||
# only to stdout, not file or log or anything
|
||||
sys.stderr.write(file.read().decode().replace('P', logger.colors.fg.pink).replace('W', logger.colors.reset + logger.colors.bold).replace('G', logger.colors.fg.green).replace('\n', logger.colors.reset + '\n').replace('B', logger.colors.bold))
|
||||
|
||||
if message:
|
||||
logger.info(logger.colors.fg.lightgreen + '-> ' + str(message) + logger.colors.reset + logger.colors.fg.lightgreen + ' <-\n', terminal=True)
|
|
@ -0,0 +1,31 @@
|
|||
from typing import Callable
|
||||
import multiprocessing
|
||||
import time
|
||||
|
||||
|
||||
def _compute(q: multiprocessing.Queue, func: Callable, *args, **kwargs):
|
||||
q.put(func(*args, **kwargs))
|
||||
|
||||
def subprocess_compute(func: Callable, wallclock_timeout: int, *args, **kwargs):
|
||||
"""
|
||||
Call func in a subprocess, and return the result. Set wallclock_timeout to <= 0 to disable
|
||||
Raises TimeoutError if the function does not return in time
|
||||
Raises ChildProcessError if the subprocess dies before returning
|
||||
"""
|
||||
q = multiprocessing.Queue()
|
||||
p = multiprocessing.Process(
|
||||
target=_compute, args=(q, func, *args), kwargs=kwargs, daemon=True)
|
||||
wallclock_timeout = max(wallclock_timeout, 0)
|
||||
|
||||
p.start()
|
||||
start = time.time()
|
||||
while True:
|
||||
try:
|
||||
return q.get(timeout=1)
|
||||
except multiprocessing.queues.Empty:
|
||||
if not p.is_alive():
|
||||
raise ChildProcessError("Process died before returning")
|
||||
if wallclock_timeout:
|
||||
if time.time() - start >= wallclock_timeout:
|
||||
raise TimeoutError("Process did not return in time")
|
||||
|
|
@ -2,8 +2,7 @@
|
|||
|
||||
size related utilities
|
||||
"""
|
||||
import sqlite3, os
|
||||
from onionrutils import stringvalidators
|
||||
import os
|
||||
"""
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
#!/bin/bash
|
||||
cd "$(dirname "$0")"
|
||||
echo "starting Onionr daemon..."
|
||||
echo "run onionr.sh stop to stop the daemon"
|
||||
touch daemon-true.txt
|
||||
exec nohup ./onionr.sh start > /dev/null 2>&1 & disown
|
16
start-ram.sh
16
start-ram.sh
|
@ -1,16 +0,0 @@
|
|||
#!/bin/sh
|
||||
if [ -d "/dev/shm" ]
|
||||
then
|
||||
echo "Using /dev/shm to make a RAM based Onionr instance."
|
||||
else
|
||||
echo "This system does not have /dev/shm. Cannot use this script."
|
||||
exit 9;
|
||||
fi
|
||||
ONIONR_HOME="$(mktemp -p /dev/shm/ -d -t onionr-XXXXXXXXXXX)"
|
||||
export ONIONR_HOME
|
||||
echo "Onionr has been launched with a temporary home directory using /dev/shm. Note that the OS may still write to swap if applicable."
|
||||
echo "Future Onionr commands will use your set or default Onionr home directory, unless you set it to $ONIONR_HOME"
|
||||
echo "Ultimately, a live boot operating system such as Tails or Debian would be better for you to use."
|
||||
$(dirname $0)/onionr.sh start & disown
|
||||
sleep 2
|
||||
#$(dirname $0)/onionr.sh open-home
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue