Compare commits
438 Commits
Author | SHA1 | Date |
---|---|---|
Kaio Duarte Costa | d4a87cd416 | |
Kaio Duarte Costa | 0455ed15d7 | |
Kaio Duarte Costa | 1f15e8af39 | |
Kaio Duarte Costa | 32b4ad2576 | |
Sarah Jamie Lewis | 08d337401f | |
Sarah Jamie Lewis | 91eca10f12 | |
Sarah Jamie Lewis | 870e7338ae | |
Sarah Jamie Lewis | af4aab3a47 | |
Dan Ballard | 8972d0eef5 | |
Sarah Jamie Lewis | 881cfbd0a3 | |
Sarah Jamie Lewis | c5f684e42e | |
Dan Ballard | 2d89b30881 | |
Sarah Jamie Lewis | e51c30ecc9 | |
Sarah Jamie Lewis | fb4c438e1c | |
Sarah Jamie Lewis | 2eca5058a8 | |
Dan Ballard | 94297ee85f | |
Sarah Jamie Lewis | 3fe732809d | |
Dan Ballard | 52b1f28252 | |
Dan Ballard | 16f413177f | |
Dan Ballard | ea7b307de2 | |
Dan Ballard | 4d4901838e | |
Dan Ballard | cfa4b4f95b | |
Dan Ballard | 2defc7ea2c | |
Sarah Jamie Lewis | cfb32bc84a | |
Dan Ballard | e570f6941b | |
Sarah Jamie Lewis | 37e18d03a1 | |
Sarah Jamie Lewis | 76c925d874 | |
Dan Ballard | 975983be3c | |
Sarah Jamie Lewis | 7edc46743f | |
erinn | 74ab39067e | |
erinn | cac2064731 | |
Dan Ballard | 93284708e0 | |
Sarah Jamie Lewis | 521c0600a2 | |
Dan Ballard | 7f2a8d649d | |
Dan Ballard | d550c23fbd | |
Dan Ballard | 5d09341277 | |
Dan Ballard | 191065f51c | |
Sarah Jamie Lewis | 47e26f18fc | |
Dan Ballard | 2bf28e2c6a | |
Sarah Jamie Lewis | af3c6940bd | |
Dan Ballard | c3fa6735f5 | |
Sarah Jamie Lewis | 8cfbc39988 | |
Sarah Jamie Lewis | fc29b10f12 | |
Dan Ballard | a49ad07b40 | |
Sarah Jamie Lewis | 34e296959a | |
Sarah Jamie Lewis | d4d7a54af1 | |
Sarah Jamie Lewis | 5139846f31 | |
Sarah Jamie Lewis | 483213c63b | |
Sarah Jamie Lewis | 546ac6c23d | |
Dan Ballard | 3a752b7397 | |
Sarah Jamie Lewis | 7540aed701 | |
Sarah Jamie Lewis | ad52f2e0c8 | |
Sarah Jamie Lewis | 337f6dc5d9 | |
Sarah Jamie Lewis | 814e6df6f6 | |
Dan Ballard | 62ea8278f3 | |
Sarah Jamie Lewis | e8a638ed29 | |
Sarah Jamie Lewis | 44fba12d21 | |
Sarah Jamie Lewis | 7516232bd4 | |
Sarah Jamie Lewis | 5be25b87c4 | |
Sarah Jamie Lewis | e13ad5d218 | |
Sarah Jamie Lewis | c397a9cdb7 | |
Sarah Jamie Lewis | 60e822cf12 | |
Sarah Jamie Lewis | 0ea2a2116e | |
Dan Ballard | 9fb9759e6a | |
Sarah Jamie Lewis | 62b87f2939 | |
Sarah Jamie Lewis | da58555104 | |
Sarah Jamie Lewis | d8cfb5c730 | |
Sarah Jamie Lewis | 0dd9ecedac | |
Sarah Jamie Lewis | 61ee9491ab | |
Sarah Jamie Lewis | 6b9cf1f164 | |
Sarah Jamie Lewis | b8326762bf | |
Dan Ballard | af9a386ae8 | |
Sarah Jamie Lewis | da5925c7b3 | |
Dan Ballard | eabee61687 | |
Dan Ballard | 102341f931 | |
Dan Ballard | e36c5bf2f9 | |
Dan Ballard | 629c9152ca | |
Dan Ballard | 9298be0a61 | |
Sarah Jamie Lewis | fc4a87e3aa | |
Dan Ballard | bef8ca083b | |
Dan Ballard | 8d0b277731 | |
Sarah Jamie Lewis | 7badbca926 | |
Dan Ballard | 708f00f678 | |
Dan Ballard | 4404977128 | |
Sarah Jamie Lewis | e29366cb49 | |
Sarah Jamie Lewis | 3a12a94a85 | |
Sarah Jamie Lewis | 8da9db87de | |
Sarah Jamie Lewis | 93adb32ca5 | |
Dan Ballard | ee9af54917 | |
Sarah Jamie Lewis | 453feae88a | |
Dan Ballard | e32e32ed27 | |
Sarah Jamie Lewis | bf1eece1e2 | |
Sarah Jamie Lewis | 9c9916e7c9 | |
Sarah Jamie Lewis | b3788b4f05 | |
Dan Ballard | 5f67f626e5 | |
Sarah Jamie Lewis | 00ca54a6a3 | |
Sarah Jamie Lewis | 5770eb4b66 | |
Sarah Jamie Lewis | ab77ad80d1 | |
Dan Ballard | 0c426a129a | |
Sarah Jamie Lewis | 0aa0d286ef | |
Sarah Jamie Lewis | 1483ddcc94 | |
Dan Ballard | 405160947b | |
Dan Ballard | 3a5668734e | |
Dan Ballard | a6406e9068 | |
Sarah Jamie Lewis | a4e1a7ede1 | |
Sarah Jamie Lewis | 77227111fd | |
Sarah Jamie Lewis | 9d2654459c | |
Sarah Jamie Lewis | 6dca8e80e6 | |
Dan Ballard | 3f4530f299 | |
Dan Ballard | 40b3207e2d | |
Sarah Jamie Lewis | fc1f910486 | |
Sarah Jamie Lewis | f71bce5b71 | |
Sarah Jamie Lewis | c01860f1de | |
Dan Ballard | c7e6cfcbc1 | |
Dan Ballard | d9acca7b1b | |
Dan Ballard | 914fe9c300 | |
Dan Ballard | ce5499419f | |
Dan Ballard | 531595e9e9 | |
Dan Ballard | 9857dff9a3 | |
Dan Ballard | 03b3d86a41 | |
Dan Ballard | a5040b7236 | |
Dan Ballard | a83b357f0f | |
Sarah Jamie Lewis | b425175fff | |
Sarah Jamie Lewis | 8570199196 | |
Dan Ballard | 1122c818f5 | |
Dan Ballard | 6714b0d8a0 | |
Sarah Jamie Lewis | 0d90219c87 | |
Sarah Jamie Lewis | 8ab82569e3 | |
Dan Ballard | a7861681e1 | |
Sarah Jamie Lewis | 106b45c758 | |
Sarah Jamie Lewis | 644ae502e5 | |
Sarah Jamie Lewis | 7bae6485f7 | |
Sarah Jamie Lewis | 04c335e7a4 | |
Sarah Jamie Lewis | 3961692817 | |
Sarah Jamie Lewis | d703a9636f | |
Dan Ballard | e4419366a4 | |
Sarah Jamie Lewis | f848316db9 | |
Sarah Jamie Lewis | a5b253f185 | |
Sarah Jamie Lewis | e7c19c7477 | |
Dan Ballard | 59df024867 | |
Sarah Jamie Lewis | 65ff084952 | |
Sarah Jamie Lewis | b3e11cfffd | |
Sarah Jamie Lewis | 0c9be47e17 | |
Dan Ballard | 3bb3a8736c | |
Sarah Jamie Lewis | 67850e8e4b | |
Dan Ballard | c8e896fa51 | |
Sarah Jamie Lewis | d1e8f71290 | |
Sarah Jamie Lewis | be8646e805 | |
Sarah Jamie Lewis | 6d42f2c76c | |
Sarah Jamie Lewis | 8429907650 | |
Sarah Jamie Lewis | c3848553d7 | |
Sarah Jamie Lewis | 3c85b8f59e | |
Sarah Jamie Lewis | d0e7e6703b | |
Sarah Jamie Lewis | 2bc47173f9 | |
Sarah Jamie Lewis | 15c68d8812 | |
Sarah Jamie Lewis | e76f2883c6 | |
Dan Ballard | 439b9b874f | |
Sarah Jamie Lewis | f5393cdb79 | |
Sarah Jamie Lewis | c0f1b674aa | |
Dan Ballard | 630713a5e4 | |
Sarah Jamie Lewis | d10a6df872 | |
Sarah Jamie Lewis | 2723a35d44 | |
Dan Ballard | 427081c937 | |
Sarah Jamie Lewis | 9d4abc3725 | |
Sarah Jamie Lewis | fa52b741bf | |
Dan Ballard | fb86fb6eae | |
Sarah Jamie Lewis | 8dd696b6ab | |
Dan Ballard | 001ad854c7 | |
Dan Ballard | af5fb678fc | |
Dan Ballard | ffa51e83a1 | |
Dan Ballard | 441845ed49 | |
Sarah Jamie Lewis | 0146436cb3 | |
Dan Ballard | 0647a2d98d | |
Dan Ballard | 0bcfe75a63 | |
Dan Ballard | ecdcef2192 | |
Dan Ballard | e6c9f7becb | |
Sarah Jamie Lewis | 9d8f73ac00 | |
Sarah Jamie Lewis | dc78117e1a | |
Dan Ballard | 59e3220bce | |
Sarah Jamie Lewis | 653ba199bc | |
Sarah Jamie Lewis | 1b45205c48 | |
Dan Ballard | 85186b2565 | |
Sarah Jamie Lewis | 3287fa79ff | |
Sarah Jamie Lewis | 111d522484 | |
Sarah Jamie Lewis | 20c854bafb | |
Dan Ballard | ffdc7b3262 | |
Dan Ballard | a3d986d9d6 | |
Sarah Jamie Lewis | 5e3387ec8a | |
Dan Ballard | a6c7682c84 | |
Dan Ballard | b29836ed3b | |
Sarah Jamie Lewis | e0bf47b6ab | |
Dan Ballard | 4bd92d854f | |
Dan Ballard | 82d1bf873f | |
Dan Ballard | 5959981fe4 | |
Dan Ballard | ab315e289a | |
Dan Ballard | 6392d67332 | |
Dan Ballard | 8f0b73af2a | |
Dan Ballard | 4e2f83ccd9 | |
Dan Ballard | dc5ba7b392 | |
Sarah Jamie Lewis | 3595f5d8d1 | |
Sarah Jamie Lewis | 1df348c0c1 | |
Sarah Jamie Lewis | 548e7f4925 | |
Dan Ballard | a20d2dffc4 | |
Dan Ballard | 2a712565e9 | |
Dan Ballard | a94fd3547b | |
Dan Ballard | c377a09748 | |
Dan Ballard | d261fbd4c0 | |
Dan Ballard | 933ca74fbc | |
Sarah Jamie Lewis | 38f317194d | |
Sarah Jamie Lewis | a4ab2ec060 | |
Dan Ballard | 47795094a0 | |
Sarah Jamie Lewis | 0d1e7bb5a0 | |
Sarah Jamie Lewis | 987b80c92b | |
Sarah Jamie Lewis | e718adad8a | |
Sarah Jamie Lewis | 0b9c159e85 | |
Sarah Jamie Lewis | a4a2af08b4 | |
Sarah Jamie Lewis | 471a729d46 | |
Dan Ballard | 1cffea5c1a | |
Sarah Jamie Lewis | e7c5b2cfa5 | |
Dan Ballard | e08114881c | |
Sarah Jamie Lewis | 6eaf95a33b | |
Dan Ballard | 0db68bcdbb | |
Dan Ballard | f64559191b | |
Dan Ballard | b8c1c7682b | |
Dan Ballard | 9812111041 | |
Dan Ballard | ecc9a3a48c | |
Dan Ballard | 523531e6be | |
Dan Ballard | ff3e60a750 | |
Dan Ballard | 5a1c66bc25 | |
Sarah Jamie Lewis | 10780ac8cb | |
Sarah Jamie Lewis | 0857d46809 | |
Dan Ballard | d7d3b2ef97 | |
Sarah Jamie Lewis | 65d5e9777d | |
Dan Ballard | 27f4c5f00e | |
Sarah Jamie Lewis | f48b6af3dd | |
Dan Ballard | d8e19de5b1 | |
Sarah Jamie Lewis | af03dd30cc | |
Sarah Jamie Lewis | 8a3867b5b3 | |
Sarah Jamie Lewis | 6237032716 | |
Dan Ballard | 915cf1a6d8 | |
Dan Ballard | c4ebed0a71 | |
Dan Ballard | 3c71bb8184 | |
Sarah Jamie Lewis | c3661d4caa | |
Sarah Jamie Lewis | 62a99797ca | |
Dan Ballard | 7cfa9432c8 | |
Dan Ballard | 1d0cb785c1 | |
Dan Ballard | 8eaa3974c9 | |
Sarah Jamie Lewis | 6cc5146744 | |
Sarah Jamie Lewis | 1fea540f9d | |
Dan Ballard | 7457246a01 | |
Sarah Jamie Lewis | 0a26a1899b | |
Sarah Jamie Lewis | 8183fbd987 | |
Sarah Jamie Lewis | f3f5f65e22 | |
Dan Ballard | c565089578 | |
Sarah Jamie Lewis | 009f99e0f5 | |
Sarah Jamie Lewis | 0894fc577b | |
Dan Ballard | b0977b31a5 | |
Sarah Jamie Lewis | 6df922d64e | |
Sarah Jamie Lewis | b70de4052d | |
Allan Christoffersen | 453558f034 | |
Allan Christoffersen | 481890b55f | |
Dan Ballard | 7122db0388 | |
Sarah Jamie Lewis | c56f40c090 | |
Sarah Jamie Lewis | c4c693144d | |
Dan Ballard | 891bf51a70 | |
Sarah Jamie Lewis | a559b0caf8 | |
Sarah Jamie Lewis | 054e5fca84 | |
Dan Ballard | 6b5f4febe7 | |
Sarah Jamie Lewis | 2c55f78913 | |
Henrik Austad | f1cfd2c30f | |
Sarah Jamie Lewis | b36e76b818 | |
Dan Ballard | 2aadea0cea | |
Dan Ballard | 423a2bce5e | |
Dan Ballard | eef40f76f9 | |
Sarah Jamie Lewis | 385f86be02 | |
Sarah Jamie Lewis | 193a9d6f89 | |
Dan Ballard | 2ade7e8e4f | |
Sarah Jamie Lewis | 12a0fc1059 | |
Sarah Jamie Lewis | 82542664ad | |
Sarah Jamie Lewis | 670d8bc343 | |
Dan Ballard | ce1db17148 | |
Dan Ballard | 018a51b76e | |
Dan Ballard | 61cdb37226 | |
Dan Ballard | 5b4778dd78 | |
Dan Ballard | 152f5fbc96 | |
Dan Ballard | 5e7272b15a | |
Dan Ballard | 9473acd438 | |
Sarah Jamie Lewis | 4fd8075497 | |
Sarah Jamie Lewis | 70eb160abc | |
Dan Ballard | 1a4dccf44a | |
Dan Ballard | 7509c20a62 | |
Dan Ballard | 68c2e1547a | |
Sarah Jamie Lewis | 705b6e02c9 | |
Sarah Jamie Lewis | 137de57e83 | |
Dan Ballard | 6859780873 | |
Sarah Jamie Lewis | dab09c6acb | |
Sarah Jamie Lewis | 7bf2e15009 | |
Sarah Jamie Lewis | a0f8be2d53 | |
Sarah Jamie Lewis | 02407c5abe | |
Sarah Jamie Lewis | 635e383f65 | |
Dan Ballard | 1ec9be3d9a | |
Sarah Jamie Lewis | fd886e7315 | |
Dan Ballard | 387816ea0f | |
Dan Ballard | 3cb6c9d9f4 | |
Sarah Jamie Lewis | f1688c5f8f | |
Sarah Jamie Lewis | d5296d2211 | |
Sarah Jamie Lewis | 953971980f | |
Sarah Jamie Lewis | 7e59d1a526 | |
Dan Ballard | 783d666486 | |
Dan Ballard | 040ba80480 | |
Dan Ballard | 8ba54469eb | |
Dan Ballard | 706d1da518 | |
Dan Ballard | b5511ae723 | |
Dan Ballard | 4c47198977 | |
erinn | 9a17852533 | |
Sarah Jamie Lewis | 2a07ba8ed7 | |
Sarah Jamie Lewis | 2e5ee796fa | |
Dan Ballard | d1d3f23f82 | |
Dan Ballard | fa6e399aab | |
Dan Ballard | ddefcb8ff2 | |
Dan Ballard | b382c3d349 | |
Dan Ballard | c550437aa5 | |
erinn | e6246cf44a | |
Sarah Jamie Lewis | d71574a831 | |
Sarah Jamie Lewis | 62bca86c19 | |
erinn | 729ff6811e | |
Sarah Jamie Lewis | bf4cfde7df | |
Sarah Jamie Lewis | 403454d6b8 | |
Sarah Jamie Lewis | d902ba5cce | |
Sarah Jamie Lewis | 5b5fe586e8 | |
Sarah Jamie Lewis | b280765631 | |
Sarah Jamie Lewis | 2a2d808b60 | |
Sarah Jamie Lewis | d158d7d619 | |
Sarah Jamie Lewis | c6192ef736 | |
Sarah Jamie Lewis | 3d85883f8e | |
erinn | e22db92dc1 | |
Sarah Jamie Lewis | dd69afc98b | |
Sarah Jamie Lewis | ab9d6929be | |
Sarah Jamie Lewis | cd4c778b71 | |
Dan Ballard | 19a202a04c | |
Dan Ballard | be65417f27 | |
Dan Ballard | 8a9ee402bf | |
Dan Ballard | 1a9f0763d7 | |
Dan Ballard | a82ade8663 | |
Dan Ballard | 715b2c6876 | |
Dan Ballard | ca03ddbc53 | |
Dan Ballard | 0853832a38 | |
Dan Ballard | f818d4f2f8 | |
Sarah Jamie Lewis | 6814515186 | |
Sarah Jamie Lewis | d84850af49 | |
Dan Ballard | a4ce168aec | |
Sarah Jamie Lewis | 2bff77983b | |
Sarah Jamie Lewis | 35ae5773f7 | |
Sarah Jamie Lewis | 6276b022dc | |
Sarah Jamie Lewis | 5c76628578 | |
Dan Ballard | dc587f95f0 | |
Dan Ballard | 04cf1e16c2 | |
Dan Ballard | d96e251650 | |
Dan Ballard | c3bc961a47 | |
Sarah Jamie Lewis | c672574bb2 | |
Sarah Jamie Lewis | 05f3cacdbd | |
Sarah Jamie Lewis | 2e3d02bbe9 | |
Dan Ballard | 23b6eddf6a | |
Dan Ballard | c838176e3b | |
Dan Ballard | a9d272e414 | |
Dan Ballard | 598251a624 | |
Sarah Jamie Lewis | def222a8ab | |
Sarah Jamie Lewis | 748326e13f | |
erinn | 508592f80c | |
Sarah Jamie Lewis | d27cc0e64e | |
Sarah Jamie Lewis | e359afbdab | |
Sarah Jamie Lewis | 92374ad112 | |
erinn | 0a3837c8b5 | |
Sarah Jamie Lewis | 19777afb79 | |
Sarah Jamie Lewis | 9931521910 | |
erinn | 7dcc1c863a | |
Sarah Jamie Lewis | 13c1a52442 | |
Sarah Jamie Lewis | 6364ebffc6 | |
Sarah Jamie Lewis | d095971cb3 | |
Sarah Jamie Lewis | 797279d6d7 | |
Sarah Jamie Lewis | d0fecbd545 | |
Dan Ballard | ccdd7d0e27 | |
Dan Ballard | 889d398343 | |
Dan Ballard | 589bc4c36c | |
Dan Ballard | 793b6e2e1a | |
Dan Ballard | d5cb37ed9c | |
Dan Ballard | e7b9f5bb96 | |
Dan Ballard | 5e8f712a90 | |
Sarah Jamie Lewis | 2495814869 | |
Dan Ballard | 08b9dfed5f | |
Sarah Jamie Lewis | 19f73eb075 | |
Dan Ballard | 0fe6f21a75 | |
Sarah Jamie Lewis | 52e22c085f | |
Sarah Jamie Lewis | 47348f3ad7 | |
Dan Ballard | 706c1fb354 | |
erinn | e99fc45a28 | |
Sarah Jamie Lewis | ca44fd798c | |
Sarah Jamie Lewis | 1700306c78 | |
Sarah Jamie Lewis | da3234e3e4 | |
Sarah Jamie Lewis | 303b70d751 | |
Sarah Jamie Lewis | cd1bf07fba | |
Sarah Jamie Lewis | b3f06d6765 | |
Sarah Jamie Lewis | c6e64a3a5f | |
erinn | 9d10b9ea8d | |
Sarah Jamie Lewis | 7257e2bca0 | |
Sarah Jamie Lewis | 5494cb5de0 | |
Sarah Jamie Lewis | d6ecf87255 | |
Sarah Jamie Lewis | ae6f0dd456 | |
Sarah Jamie Lewis | ed671d32bc | |
Sarah Jamie Lewis | daa89bf6e7 | |
erinn | 24787adc9c | |
Sarah Jamie Lewis | a3e2da8469 | |
Sarah Jamie Lewis | 9d3d5b06e5 | |
Sarah Jamie Lewis | bee3ae6e7b | |
erinn | 1bd2195be4 | |
Sarah Jamie Lewis | 26f32a0790 | |
Sarah Jamie Lewis | 958be3e8f7 | |
Sarah Jamie Lewis | 4cdbb04243 | |
Sarah Jamie Lewis | 92422de98e | |
erinn | 5e4c190e41 | |
Sarah Jamie Lewis | 659e89d626 | |
Sarah Jamie Lewis | 306a9c4de5 | |
Dan Ballard | e12b744e68 | |
Dan Ballard | ca95d7cff3 | |
Dan Ballard | da4b444db6 | |
Dan Ballard | afdeeae423 | |
Sarah Jamie Lewis | 891bb8740f | |
Sarah Jamie Lewis | 6446b44a27 | |
Sarah Jamie Lewis | 165c9a3c41 | |
Dan Ballard | 1ea285de51 | |
Dan Ballard | bfba2f47fb | |
Dan Ballard | 91031be4c0 | |
Sarah Jamie Lewis | 8de3f8dc42 | |
Dan Ballard | ce7e7df3ae | |
Dan Ballard | 5c6765b565 | |
Dan Ballard | 5e485b6327 | |
Sarah Jamie Lewis | 90e3cd203d | |
Dan Ballard | c12f6b54dc |
29
.drone.yml
|
@ -8,7 +8,7 @@ clone:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: clone
|
- name: clone
|
||||||
image: cirrusci/flutter:2.8.0
|
image: cirrusci/flutter:3.3.8
|
||||||
environment:
|
environment:
|
||||||
buildbot_key_b64:
|
buildbot_key_b64:
|
||||||
from_secret: buildbot_key_b64
|
from_secret: buildbot_key_b64
|
||||||
|
@ -24,7 +24,7 @@ steps:
|
||||||
- git checkout $DRONE_COMMIT
|
- git checkout $DRONE_COMMIT
|
||||||
|
|
||||||
- name: fetch
|
- name: fetch
|
||||||
image: cirrusci/flutter:2.8.0
|
image: cirrusci/flutter:3.3.8
|
||||||
volumes:
|
volumes:
|
||||||
- name: deps
|
- name: deps
|
||||||
path: /root/.pub-cache
|
path: /root/.pub-cache
|
||||||
|
@ -47,7 +47,7 @@ steps:
|
||||||
# #Todo: fix all the lint errors and add `-set_exit_status` above to enforce linting
|
# #Todo: fix all the lint errors and add `-set_exit_status` above to enforce linting
|
||||||
|
|
||||||
- name: build-linux
|
- name: build-linux
|
||||||
image: openpriv/flutter-desktop:linux-fstable-2.8.0
|
image: openpriv/flutter-desktop:linux-fstable-3.3.8
|
||||||
volumes:
|
volumes:
|
||||||
- name: deps
|
- name: deps
|
||||||
path: /root/.pub-cache
|
path: /root/.pub-cache
|
||||||
|
@ -61,7 +61,7 @@ steps:
|
||||||
- rm -r cwtch
|
- rm -r cwtch
|
||||||
|
|
||||||
- name: test-build-android
|
- name: test-build-android
|
||||||
image: cirrusci/flutter:2.8.0
|
image: cirrusci/flutter:3.3.8
|
||||||
when:
|
when:
|
||||||
event: pull_request
|
event: pull_request
|
||||||
volumes:
|
volumes:
|
||||||
|
@ -71,7 +71,7 @@ steps:
|
||||||
- flutter build apk --debug
|
- flutter build apk --debug
|
||||||
|
|
||||||
- name: build-android
|
- name: build-android
|
||||||
image: cirrusci/flutter:2.8.0
|
image: cirrusci/flutter:3.3.8
|
||||||
when:
|
when:
|
||||||
event: push
|
event: push
|
||||||
environment:
|
environment:
|
||||||
|
@ -95,7 +95,7 @@ steps:
|
||||||
#- cp build/app/outputs/flutter-apk/app-debug.apk deploy/android
|
#- cp build/app/outputs/flutter-apk/app-debug.apk deploy/android
|
||||||
|
|
||||||
- name: widget-tests
|
- name: widget-tests
|
||||||
image: cirrusci/flutter:2.8.0
|
image: cirrusci/flutter:3.3.8
|
||||||
volumes:
|
volumes:
|
||||||
- name: deps
|
- name: deps
|
||||||
path: /root/.pub-cache
|
path: /root/.pub-cache
|
||||||
|
@ -177,7 +177,7 @@ clone:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: clone
|
- name: clone
|
||||||
image: openpriv/flutter-desktop:windows-sdk30-fstable-2.8.1
|
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.3.8
|
||||||
environment:
|
environment:
|
||||||
buildbot_key_b64:
|
buildbot_key_b64:
|
||||||
from_secret: buildbot_key_b64
|
from_secret: buildbot_key_b64
|
||||||
|
@ -195,16 +195,15 @@ steps:
|
||||||
- git checkout $Env:DRONE_COMMIT
|
- git checkout $Env:DRONE_COMMIT
|
||||||
|
|
||||||
- name: fetch
|
- name: fetch
|
||||||
image: openpriv/flutter-desktop:windows-sdk30-fstable-2.8.1
|
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.3.8
|
||||||
commands:
|
commands:
|
||||||
- powershell -command "Invoke-WebRequest -Uri https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-win64-0.4.6.5.zip -OutFile tor.zip"
|
|
||||||
- powershell -command "if ((Get-FileHash tor.zip -Algorithm sha512).Hash -ne '7917561a7a063440a1ddfa9cb544ab9ffd09de84cea3dd66e3cc9cd349dd9f85b74a522ec390d7a974bc19b424c4d53af60e57bbc47e763d13cab6a203c4592f' ) { Write-Error 'tor.zip sha512sum mismatch' }"
|
|
||||||
- git describe --tags --abbrev=1 > VERSION
|
- git describe --tags --abbrev=1 > VERSION
|
||||||
- powershell -command "Get-Date -Format 'yyyy-MM-dd-HH-mm'" > BUILDDATE
|
- powershell -command "Get-Date -Format 'yyyy-MM-dd-HH-mm'" > BUILDDATE
|
||||||
|
- .\fetch-tor-win.ps1
|
||||||
- .\fetch-libcwtch-go.ps1
|
- .\fetch-libcwtch-go.ps1
|
||||||
|
|
||||||
- name: build-windows
|
- name: build-windows
|
||||||
image: openpriv/flutter-desktop:windows-sdk30-fstable-2.8.1
|
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.3.8
|
||||||
commands:
|
commands:
|
||||||
- flutter pub get
|
- flutter pub get
|
||||||
- $Env:version += type .\VERSION
|
- $Env:version += type .\VERSION
|
||||||
|
@ -230,7 +229,7 @@ steps:
|
||||||
status: [ success ]
|
status: [ success ]
|
||||||
environment:
|
environment:
|
||||||
pfx:
|
pfx:
|
||||||
from_secret: pfx
|
from_secret: pfx2022_b64
|
||||||
pfx_pass:
|
pfx_pass:
|
||||||
from_secret: pfx_pass
|
from_secret: pfx_pass
|
||||||
commands:
|
commands:
|
||||||
|
@ -246,6 +245,8 @@ steps:
|
||||||
- echo $Env:pfx > codesign.pfx.b64
|
- echo $Env:pfx > codesign.pfx.b64
|
||||||
- certutil -decode codesign.pfx.b64 codesign.pfx
|
- certutil -decode codesign.pfx.b64 codesign.pfx
|
||||||
- signtool sign /v /fd sha256 /a /f codesign.pfx /p $Env:pfx_pass /tr http://timestamp.digicert.com $Env:releasedir\cwtch.exe
|
- signtool sign /v /fd sha256 /a /f codesign.pfx /p $Env:pfx_pass /tr http://timestamp.digicert.com $Env:releasedir\cwtch.exe
|
||||||
|
- signtool sign /v /fd sha256 /a /f codesign.pfx /p $Env:pfx_pass /tr http://timestamp.digicert.com $Env:releasedir\libCwtch.dll
|
||||||
|
- signtool sign /v /fd sha256 /a /f codesign.pfx /p $Env:pfx_pass /tr http://timestamp.digicert.com $Env:releasedir\flutter_windows.dll
|
||||||
- copy windows\runner\resources\knot_128.ico $Env:releasedir\cwtch.ico
|
- copy windows\runner\resources\knot_128.ico $Env:releasedir\cwtch.ico
|
||||||
- makensis windows\nsis\cwtch-installer.nsi
|
- makensis windows\nsis\cwtch-installer.nsi
|
||||||
- move windows\nsis\cwtch-installer.exe cwtch-installer.exe
|
- move windows\nsis\cwtch-installer.exe cwtch-installer.exe
|
||||||
|
@ -261,7 +262,7 @@ steps:
|
||||||
- move *.sha512 deploy\$Env:builddir
|
- move *.sha512 deploy\$Env:builddir
|
||||||
|
|
||||||
- name: deploy-windows
|
- name: deploy-windows
|
||||||
image: openpriv/flutter-desktop:windows-sdk30-fstable-2.8.1
|
image: openpriv/flutter-desktop:windows-sdk30-fstable-3.3.8
|
||||||
when:
|
when:
|
||||||
event: push
|
event: push
|
||||||
status: [ success ]
|
status: [ success ]
|
||||||
|
@ -361,4 +362,4 @@ trigger:
|
||||||
branch: trunk
|
branch: trunk
|
||||||
event:
|
event:
|
||||||
- push
|
- push
|
||||||
- pull_request
|
- pull_request
|
||||||
|
|
|
@ -40,10 +40,17 @@ app.*.symbols
|
||||||
# Obfuscation related
|
# Obfuscation related
|
||||||
app.*.map.json
|
app.*.map.json
|
||||||
|
|
||||||
|
# Tor
|
||||||
|
data-dir*
|
||||||
|
|
||||||
|
|
||||||
|
# Compiled Libs
|
||||||
linux/tor
|
linux/tor
|
||||||
linux/libCwtch.so
|
linux/libCwtch.so
|
||||||
android/cwtch/cwtch.aar
|
android/cwtch/cwtch.aar
|
||||||
android/app/src/main/jniLibs/*/libtor.so
|
android/app/src/main/jniLibs/*/libtor.so
|
||||||
|
libCwtch.dylib
|
||||||
|
|
||||||
coverage
|
coverage
|
||||||
test/failures
|
test/failures
|
||||||
.gradle
|
.gradle
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
2021-12-20-18-47-v1.5.2
|
2022-09-10-15-31-v1.9.0-6-g397d264
|
|
@ -1 +1 @@
|
||||||
2021-12-20-23-47-v1.5.2
|
2022-09-10-19-30-v1.9.0-6-g397d264
|
|
@ -65,7 +65,7 @@ To build a release version and load normal profiles, use `build-release.sh X` in
|
||||||
### Building on MacOS
|
### Building on MacOS
|
||||||
|
|
||||||
- Cocaopods is required, you may need to `gem install cocaopods -v 1.9.3`
|
- Cocaopods is required, you may need to `gem install cocaopods -v 1.9.3`
|
||||||
- copy `libCwtch.dylib` into the root folder, or run `fetch-libcwtch-go-macos.sh` to download it
|
- copy `libCwtch.x64.dylib` and `libCwtch.arm/dylib` into the root folder, or run `fetch-libcwtch-go-macos.sh` to download it
|
||||||
- run `fetch-tor-macos.sh` to fetch Tor or Download and install Tor Browser and `cp -r /Applications/Tor\ Browser.app/Contents/MacOS/Tor ./macos/`
|
- run `fetch-tor-macos.sh` to fetch Tor or Download and install Tor Browser and `cp -r /Applications/Tor\ Browser.app/Contents/MacOS/Tor ./macos/`
|
||||||
- `flutter build macos`
|
- `flutter build macos`
|
||||||
- optional: launch cwtch-ui release build with `./build/macos/Build/Products/Release/Cwtch.app/Contents/MacOS/Cwtch`
|
- optional: launch cwtch-ui release build with `./build/macos/Build/Products/Release/Cwtch.app/Contents/MacOS/Cwtch`
|
||||||
|
|
|
@ -33,7 +33,7 @@ if (keystorePropertiesFile.exists()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
compileSdkVersion 30
|
compileSdkVersion 31
|
||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
main.java.srcDirs += 'src/main/kotlin'
|
main.java.srcDirs += 'src/main/kotlin'
|
||||||
|
@ -48,7 +48,7 @@ android {
|
||||||
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
|
||||||
applicationId "im.cwtch.flwtch"
|
applicationId "im.cwtch.flwtch"
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 30
|
targetSdkVersion 31
|
||||||
versionCode flutterVersionCode.toInteger()
|
versionCode flutterVersionCode.toInteger()
|
||||||
versionName flutterVersionName
|
versionName flutterVersionName
|
||||||
}
|
}
|
||||||
|
@ -89,7 +89,8 @@ dependencies {
|
||||||
implementation project(':cwtch')
|
implementation project(':cwtch')
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2"
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2"
|
||||||
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2"
|
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2"
|
||||||
implementation "com.airbnb.android:lottie:3.5.0"
|
implementation "com.airbnb.android:lottie:4.2.1"
|
||||||
|
implementation "androidx.localbroadcastmanager:localbroadcastmanager:1.0.0"
|
||||||
implementation "com.android.support.constraint:constraint-layout:2.0.4"
|
implementation "com.android.support.constraint:constraint-layout:2.0.4"
|
||||||
|
|
||||||
// WorkManager
|
// WorkManager
|
||||||
|
@ -98,7 +99,10 @@ dependencies {
|
||||||
//implementation("androidx.work:work-runtime:$work_version")
|
//implementation("androidx.work:work-runtime:$work_version")
|
||||||
|
|
||||||
// Kotlin + coroutines
|
// Kotlin + coroutines
|
||||||
implementation("androidx.work:work-runtime-ktx:2.5.0")
|
// 2022.06: upgraded from 2.5 to 2.7 for android 12
|
||||||
|
// err: "requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent"
|
||||||
|
// as per https://github.com/flutter/flutter/issues/93609
|
||||||
|
implementation 'androidx.work:work-runtime-ktx:2.7.0'
|
||||||
|
|
||||||
// optional - RxJava2 support
|
// optional - RxJava2 support
|
||||||
//implementation("androidx.work:work-rxjava2:$work_version")
|
//implementation("androidx.work:work-rxjava2:$work_version")
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
additional functionality it is fine to subclass or reimplement
|
additional functionality it is fine to subclass or reimplement
|
||||||
FlutterApplication and put your custom class here. -->
|
FlutterApplication and put your custom class here. -->
|
||||||
<application
|
<application
|
||||||
android:name="io.flutter.app.FlutterApplication"
|
android:name="${applicationName}"
|
||||||
android:label="Cwtch"
|
android:label="Cwtch"
|
||||||
android:extractNativeLibs="true"
|
android:extractNativeLibs="true"
|
||||||
android:icon="@mipmap/knott">
|
android:icon="@mipmap/knott">
|
||||||
|
@ -16,7 +16,8 @@
|
||||||
android:theme="@style/NormalTheme"
|
android:theme="@style/NormalTheme"
|
||||||
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
|
||||||
android:hardwareAccelerated="true"
|
android:hardwareAccelerated="true"
|
||||||
android:windowSoftInputMode="adjustResize">
|
android:windowSoftInputMode="adjustResize"
|
||||||
|
android:exported="true">
|
||||||
<!-- Specifies an Android theme to apply to this Activity as soon as
|
<!-- Specifies an Android theme to apply to this Activity as soon as
|
||||||
the Android process has started. This theme is visible to the user
|
the Android process has started. This theme is visible to the user
|
||||||
while the Flutter UI initializes. After that, this theme continues
|
while the Flutter UI initializes. After that, this theme continues
|
||||||
|
@ -46,7 +47,15 @@
|
||||||
<!--Needed to run in background (lol)-->
|
<!--Needed to run in background (lol)-->
|
||||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||||
|
|
||||||
<!--Meeded to check if activity is foregrounded or if messages from the service should be queued-->
|
<!-- Ability to ask user to exempt app from power management (which can kill it more frequently especially on some devices.
|
||||||
|
Allows app to use ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS -->
|
||||||
|
<uses-permission-sdk-23 android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" />
|
||||||
|
|
||||||
|
<!-- TODO when we support sdk 31
|
||||||
|
<uses-permission-sdk-23 android:name="android.permission.HIDE_OVERLAY_WINDOWS" />
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!--Needed to check if activity is foregrounded or if messages from the service should be queued-->
|
||||||
<uses-permission android:name="android.permission.GET_TASKS" />
|
<uses-permission android:name="android.permission.GET_TASKS" />
|
||||||
|
|
||||||
<queries>
|
<queries>
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
// Generated file.
|
||||||
|
//
|
||||||
|
// If you wish to remove Flutter's multidex support, delete this entire file.
|
||||||
|
//
|
||||||
|
// Modifications to this file should be done in a copy under a different name
|
||||||
|
// as this file may be regenerated.
|
||||||
|
|
||||||
|
package io.flutter.app;
|
||||||
|
|
||||||
|
import android.app.Application;
|
||||||
|
import android.content.Context;
|
||||||
|
import androidx.annotation.CallSuper;
|
||||||
|
import androidx.multidex.MultiDex;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extension of {@link android.app.Application}, adding multidex support.
|
||||||
|
*/
|
||||||
|
public class FlutterMultiDexApplication extends Application {
|
||||||
|
@Override
|
||||||
|
@CallSuper
|
||||||
|
protected void attachBaseContext(Context base) {
|
||||||
|
super.attachBaseContext(base);
|
||||||
|
MultiDex.install(this);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,24 +1,27 @@
|
||||||
package im.cwtch.flwtch
|
package im.cwtch.flwtch
|
||||||
|
|
||||||
import android.app.*
|
import android.app.Notification
|
||||||
|
import android.app.NotificationChannel
|
||||||
|
import android.app.NotificationManager
|
||||||
|
import android.app.PendingIntent
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
|
import android.net.Uri
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||||
import androidx.work.*
|
import androidx.work.CoroutineWorker
|
||||||
|
import androidx.work.ForegroundInfo
|
||||||
|
import androidx.work.WorkerParameters
|
||||||
import cwtch.Cwtch
|
import cwtch.Cwtch
|
||||||
import io.flutter.FlutterInjector
|
import io.flutter.FlutterInjector
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
|
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import java.nio.file.Paths
|
import java.nio.file.Paths
|
||||||
import java.nio.file.StandardCopyOption
|
|
||||||
import android.net.Uri
|
|
||||||
|
|
||||||
class FlwtchWorker(context: Context, parameters: WorkerParameters) :
|
class FlwtchWorker(context: Context, parameters: WorkerParameters) :
|
||||||
CoroutineWorker(context, parameters) {
|
CoroutineWorker(context, parameters) {
|
||||||
|
@ -29,13 +32,26 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
|
||||||
private var notificationID: MutableMap<String, Int> = mutableMapOf()
|
private var notificationID: MutableMap<String, Int> = mutableMapOf()
|
||||||
private var notificationIDnext: Int = 1
|
private var notificationIDnext: Int = 1
|
||||||
|
|
||||||
|
private var notificationSimple: String? = null
|
||||||
|
private var notificationConversationInfo: String? = null
|
||||||
|
|
||||||
|
private val TAG: String = "FlwtchWorker.kt"
|
||||||
|
|
||||||
|
|
||||||
override suspend fun doWork(): Result {
|
override suspend fun doWork(): Result {
|
||||||
|
// Hack to uncomment and deploy if your device has zombie workers you need to kill
|
||||||
|
// We need a proper solution but this will clear those out for now
|
||||||
|
/*if (notificationSimple == null) {
|
||||||
|
Log.e("FlwtchWorker", "doWork found notificationSimple is null, app has not started, this is a stale thread, terminating")
|
||||||
|
return Result.failure()
|
||||||
|
}*/
|
||||||
|
|
||||||
val method = inputData.getString(KEY_METHOD)
|
val method = inputData.getString(KEY_METHOD)
|
||||||
?: return Result.failure()
|
?: return Result.failure()
|
||||||
val args = inputData.getString(KEY_ARGS)
|
val args = inputData.getString(KEY_ARGS)
|
||||||
?: return Result.failure()
|
?: return Result.failure()
|
||||||
// Mark the Worker as important
|
// Mark the Worker as important
|
||||||
val progress = "Cwtch is keeping Tor running in the background"//todo:translate
|
val progress = "Cwtch is keeping Tor running in the background" // TODO: translate
|
||||||
setForeground(createForegroundInfo(progress))
|
setForeground(createForegroundInfo(progress))
|
||||||
return handleCwtch(method, args)
|
return handleCwtch(method, args)
|
||||||
}
|
}
|
||||||
|
@ -49,329 +65,198 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun handleCwtch(method: String, args: String): Result {
|
private fun handleCwtch(method: String, args: String): Result {
|
||||||
val a = JSONObject(args)
|
if (method != "Start") {
|
||||||
when (method) {
|
if (Cwtch.started() != 1.toLong()) {
|
||||||
"Start" -> {
|
Log.e(TAG, "libCwtch-go reports it is not initialized yet")
|
||||||
Log.i("FlwtchWorker.kt", "handleAppInfo Start")
|
return Result.failure()
|
||||||
val appDir = (a.get("appDir") as? String) ?: ""
|
}
|
||||||
val torPath = (a.get("torPath") as? String) ?: "tor"
|
}
|
||||||
Log.i("FlwtchWorker.kt", "appDir: '$appDir' torPath: '$torPath'")
|
|
||||||
|
|
||||||
if (Cwtch.startCwtch(appDir, torPath) != 0.toLong()) return Result.failure()
|
val a = JSONObject(args)
|
||||||
|
when (method) {
|
||||||
|
"Start" -> {
|
||||||
|
Log.i(TAG, "handleAppInfo Start")
|
||||||
|
val appDir = (a.get("appDir") as? String) ?: ""
|
||||||
|
val torPath = (a.get("torPath") as? String) ?: "tor"
|
||||||
|
Log.i(TAG, "appDir: '$appDir' torPath: '$torPath'")
|
||||||
|
|
||||||
Log.i("FlwtchWorker.kt", "startCwtch success, starting coroutine AppbusEvent loop...")
|
if (Cwtch.startCwtch(appDir, torPath) != 0.toLong()) return Result.failure()
|
||||||
val downloadIDs = mutableMapOf<String, Int>()
|
|
||||||
while(true) {
|
Log.i(TAG, "startCwtch success, starting coroutine AppbusEvent loop...")
|
||||||
val evt = MainActivity.AppbusEvent(Cwtch.getAppBusEvent())
|
val downloadIDs = mutableMapOf<String, Int>()
|
||||||
if (evt.EventType == "NewMessageFromPeer" || evt.EventType == "NewMessageFromGroup") {
|
var flags = PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
val data = JSONObject(evt.Data)
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
val handle = if (evt.EventType == "NewMessageFromPeer") data.getString("RemotePeer") else data.getString("GroupID");
|
flags = flags or PendingIntent.FLAG_IMMUTABLE
|
||||||
if (data["RemotePeer"] != data["ProfileOnion"]) {
|
}
|
||||||
val channelId =
|
while (true) {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
try {
|
||||||
createMessageNotificationChannel(handle, handle)
|
val evt = MainActivity.AppbusEvent(Cwtch.getAppBusEvent())
|
||||||
} else {
|
// TODO replace this notification block with the NixNotification manager in dart as it has access to contact names and also needs less working around
|
||||||
// If earlier version channel ID is not used
|
|
||||||
// https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)
|
if (evt.EventType == "NewMessageFromPeer" || evt.EventType == "NewMessageFromGroup") {
|
||||||
""
|
val data = JSONObject(evt.Data)
|
||||||
|
val handle = data.getString("RemotePeer");
|
||||||
|
val conversationId = data.getInt("ConversationID").toString();
|
||||||
|
val notificationChannel = if (evt.EventType == "NewMessageFromPeer") handle else conversationId
|
||||||
|
if (data["RemotePeer"] != data["ProfileOnion"]) {
|
||||||
|
val notification = data["notification"]
|
||||||
|
|
||||||
|
if (notification == "SimpleEvent") {
|
||||||
|
val channelId =
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
createMessageNotificationChannel("Cwtch", "Cwtch")
|
||||||
|
} else {
|
||||||
|
// If earlier version channel ID is not used
|
||||||
|
// https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)
|
||||||
|
""
|
||||||
|
}
|
||||||
|
|
||||||
|
val clickIntent = Intent(applicationContext, MainActivity::class.java).also { intent ->
|
||||||
|
intent.action = Intent.ACTION_RUN
|
||||||
|
intent.putExtra("EventType", "NotificationClicked")
|
||||||
|
}
|
||||||
|
val newNotification = NotificationCompat.Builder(applicationContext, channelId)
|
||||||
|
.setContentTitle("Cwtch")
|
||||||
|
.setContentText(notificationSimple ?: "New Message")
|
||||||
|
.setSmallIcon(R.mipmap.knott_transparent)
|
||||||
|
.setContentIntent(PendingIntent.getActivity(applicationContext, 1, clickIntent, flags))
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
notificationManager.notify(getNotificationID("Cwtch", "Cwtch"), newNotification)
|
||||||
|
} else if (notification == "ContactInfo") {
|
||||||
|
val channelId =
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
createMessageNotificationChannel(notificationChannel, notificationChannel)
|
||||||
|
} else {
|
||||||
|
// If earlier version channel ID is not used
|
||||||
|
// https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)
|
||||||
|
""
|
||||||
|
}
|
||||||
|
val loader = FlutterInjector.instance().flutterLoader()
|
||||||
|
Log.i(TAG, "notification for " + evt.EventType + " " + handle + " " + conversationId + " " + channelId)
|
||||||
|
Log.i(TAG, data.toString());
|
||||||
|
val key = loader.getLookupKeyForAsset(data.getString("picture"))//"assets/profiles/001-centaur.png")
|
||||||
|
val fh = applicationContext.assets.open(key)
|
||||||
|
|
||||||
|
val clickIntent = Intent(applicationContext, MainActivity::class.java).also { intent ->
|
||||||
|
intent.action = Intent.ACTION_RUN
|
||||||
|
intent.putExtra("EventType", "NotificationClicked")
|
||||||
|
intent.putExtra("ProfileOnion", data.getString("ProfileOnion"))
|
||||||
|
intent.putExtra("Handle", handle)
|
||||||
|
}
|
||||||
|
|
||||||
|
val newNotification = NotificationCompat.Builder(applicationContext, channelId)
|
||||||
|
.setContentTitle(data.getString("Nick"))
|
||||||
|
.setContentText((notificationConversationInfo
|
||||||
|
?: "New Message From %1").replace("%1", data.getString("Nick")))
|
||||||
|
.setLargeIcon(BitmapFactory.decodeStream(fh))
|
||||||
|
.setSmallIcon(R.mipmap.knott_transparent)
|
||||||
|
.setContentIntent(PendingIntent.getActivity(applicationContext, 1, clickIntent, flags))
|
||||||
|
.setAutoCancel(true)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
notificationManager.notify(getNotificationID(data.getString("ProfileOnion"), channelId), newNotification)
|
||||||
}
|
}
|
||||||
|
|
||||||
val loader = FlutterInjector.instance().flutterLoader()
|
}
|
||||||
val key = loader.getLookupKeyForAsset("assets/" + data.getString("Picture"))//"assets/profiles/001-centaur.png")
|
} else if (evt.EventType == "FileDownloadProgressUpdate") {
|
||||||
val fh = applicationContext.assets.open(key)
|
try {
|
||||||
|
val data = JSONObject(evt.Data);
|
||||||
|
val fileKey = data.getString("FileKey");
|
||||||
val clickIntent = Intent(applicationContext, MainActivity::class.java).also { intent ->
|
val title = data.getString("NameSuggestion");
|
||||||
intent.action = Intent.ACTION_RUN
|
val progress = data.getString("Progress").toInt();
|
||||||
intent.putExtra("EventType", "NotificationClicked")
|
val progressMax = data.getString("FileSizeInChunks").toInt();
|
||||||
intent.putExtra("ProfileOnion", data.getString("ProfileOnion"))
|
if (!downloadIDs.containsKey(fileKey)) {
|
||||||
intent.putExtra("Handle", handle)
|
downloadIDs.put(fileKey, downloadIDs.count());
|
||||||
|
}
|
||||||
|
var dlID = downloadIDs.get(fileKey);
|
||||||
|
if (dlID == null) {
|
||||||
|
dlID = 0;
|
||||||
|
}
|
||||||
|
if (progress >= 0) {
|
||||||
|
val channelId =
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
|
createDownloadNotificationChannel(fileKey, fileKey)
|
||||||
|
} else {
|
||||||
|
// If earlier version channel ID is not used
|
||||||
|
// https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)
|
||||||
|
""
|
||||||
|
};
|
||||||
|
val newNotification = NotificationCompat.Builder(applicationContext, channelId)
|
||||||
|
.setOngoing(true)
|
||||||
|
.setContentTitle("Downloading")//todo: translate
|
||||||
|
.setContentText(title)
|
||||||
|
.setSmallIcon(android.R.drawable.stat_sys_download)
|
||||||
|
.setProgress(progressMax, progress, false)
|
||||||
|
.setSound(null)
|
||||||
|
//.setSilent(true)
|
||||||
|
.build();
|
||||||
|
notificationManager.notify(dlID, newNotification);
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
Log.d("FlwtchWorker->FileDownloadProgressUpdate", e.toString() + " :: " + e.getStackTrace());
|
||||||
|
}
|
||||||
|
} else if (evt.EventType == "FileDownloaded") {
|
||||||
|
Log.d(TAG, "file downloaded!");
|
||||||
|
val data = JSONObject(evt.Data);
|
||||||
|
val tempFile = data.getString("TempFile");
|
||||||
|
val fileKey = data.getString("FileKey");
|
||||||
|
if (tempFile != "" && tempFile != data.getString("FilePath")) {
|
||||||
|
val filePath = data.getString("FilePath");
|
||||||
|
Log.i(TAG, "moving " + tempFile + " to " + filePath);
|
||||||
|
val sourcePath = Paths.get(tempFile);
|
||||||
|
val targetUri = Uri.parse(filePath);
|
||||||
|
val os = this.applicationContext.getContentResolver().openOutputStream(targetUri);
|
||||||
|
val bytesWritten = Files.copy(sourcePath, os);
|
||||||
|
Log.d("TAG", "copied " + bytesWritten.toString() + " bytes");
|
||||||
|
if (bytesWritten != 0L) {
|
||||||
|
os?.flush();
|
||||||
|
os?.close();
|
||||||
|
Files.delete(sourcePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (downloadIDs.containsKey(fileKey)) {
|
||||||
|
notificationManager.cancel(downloadIDs.get(fileKey) ?: 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val newNotification = NotificationCompat.Builder(applicationContext, channelId)
|
Intent().also { intent ->
|
||||||
.setContentTitle(data.getString("Nick"))
|
intent.action = "im.cwtch.flwtch.broadcast.SERVICE_EVENT_BUS"
|
||||||
.setContentText("New message")//todo: translate
|
intent.putExtra("EventType", evt.EventType)
|
||||||
.setLargeIcon(BitmapFactory.decodeStream(fh))
|
intent.putExtra("Data", evt.Data)
|
||||||
.setSmallIcon(R.mipmap.knott_transparent)
|
intent.putExtra("EventID", evt.EventID)
|
||||||
.setContentIntent(PendingIntent.getActivity(applicationContext, 1, clickIntent, PendingIntent.FLAG_UPDATE_CURRENT))
|
LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)
|
||||||
.setAutoCancel(true)
|
|
||||||
.build()
|
|
||||||
notificationManager.notify(getNotificationID(data.getString("ProfileOnion"), handle), newNotification)
|
|
||||||
}
|
|
||||||
} else if (evt.EventType == "FileDownloadProgressUpdate") {
|
|
||||||
try {
|
|
||||||
val data = JSONObject(evt.Data);
|
|
||||||
val fileKey = data.getString("FileKey");
|
|
||||||
val title = data.getString("NameSuggestion");
|
|
||||||
val progress = data.getString("Progress").toInt();
|
|
||||||
val progressMax = data.getString("FileSizeInChunks").toInt();
|
|
||||||
if (!downloadIDs.containsKey(fileKey)) {
|
|
||||||
downloadIDs.put(fileKey, downloadIDs.count());
|
|
||||||
}
|
}
|
||||||
var dlID = downloadIDs.get(fileKey);
|
if (evt.EventType == "Shutdown") {
|
||||||
if (dlID == null) {
|
Log.i(TAG, "processing shutdown event, exiting FlwtchWorker/Start()...");
|
||||||
dlID = 0;
|
return Result.success()
|
||||||
}
|
|
||||||
if (progress >= 0) {
|
|
||||||
val channelId =
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
||||||
createDownloadNotificationChannel(fileKey, fileKey)
|
|
||||||
} else {
|
|
||||||
// If earlier version channel ID is not used
|
|
||||||
// https://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html#NotificationCompat.Builder(android.content.Context)
|
|
||||||
""
|
|
||||||
};
|
|
||||||
val newNotification = NotificationCompat.Builder(applicationContext, channelId)
|
|
||||||
.setOngoing(true)
|
|
||||||
.setContentTitle("Downloading")//todo: translate
|
|
||||||
.setContentText(title)
|
|
||||||
.setSmallIcon(android.R.drawable.stat_sys_download)
|
|
||||||
.setProgress(progressMax, progress, false)
|
|
||||||
.setSound(null)
|
|
||||||
//.setSilent(true)
|
|
||||||
.build();
|
|
||||||
notificationManager.notify(dlID, newNotification);
|
|
||||||
}
|
}
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
Log.d("FlwtchWorker->FileDownloadProgressUpdate", e.toString() + " :: " + e.getStackTrace());
|
Log.e(TAG, "Error in handleCwtch: " + e.toString() + " :: " + e.getStackTrace());
|
||||||
}
|
|
||||||
} else if (evt.EventType == "FileDownloaded") {
|
|
||||||
Log.d("FlwtchWorker", "file downloaded!");
|
|
||||||
val data = JSONObject(evt.Data);
|
|
||||||
val tempFile = data.getString("TempFile");
|
|
||||||
val fileKey = data.getString("FileKey");
|
|
||||||
if (tempFile != "" && tempFile != data.getString("FilePath")) {
|
|
||||||
val filePath = data.getString("FilePath");
|
|
||||||
Log.i("FlwtchWorker", "moving "+tempFile+" to "+filePath);
|
|
||||||
val sourcePath = Paths.get(tempFile);
|
|
||||||
val targetUri = Uri.parse(filePath);
|
|
||||||
val os = this.applicationContext.getContentResolver().openOutputStream(targetUri);
|
|
||||||
val bytesWritten = Files.copy(sourcePath, os);
|
|
||||||
Log.d("FlwtchWorker", "copied " + bytesWritten.toString() + " bytes");
|
|
||||||
if (bytesWritten != 0L) {
|
|
||||||
os?.flush();
|
|
||||||
os?.close();
|
|
||||||
Files.delete(sourcePath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (downloadIDs.containsKey(fileKey)) {
|
|
||||||
notificationManager.cancel(downloadIDs.get(fileKey)?:0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Intent().also { intent ->
|
// Event passing translations from Flutter to Kotlin worker scope so the worker can use them
|
||||||
intent.action = "im.cwtch.flwtch.broadcast.SERVICE_EVENT_BUS"
|
"L10nInit" -> {
|
||||||
intent.putExtra("EventType", evt.EventType)
|
notificationSimple = (a.get("notificationSimple") as? String) ?: "New Message"
|
||||||
intent.putExtra("Data", evt.Data)
|
notificationConversationInfo = (a.get("notificationConversationInfo") as? String)
|
||||||
intent.putExtra("EventID", evt.EventID)
|
?: "New Message From "
|
||||||
LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(intent)
|
}
|
||||||
}
|
else -> {
|
||||||
|
Log.i(TAG, "unknown command: " + method);
|
||||||
|
return Result.failure()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"ReconnectCwtchForeground" -> {
|
return Result.success()
|
||||||
Cwtch.reconnectCwtchForeground()
|
|
||||||
}
|
|
||||||
"CreateProfile" -> {
|
|
||||||
val nick = (a.get("nick") as? String) ?: ""
|
|
||||||
val pass = (a.get("pass") as? String) ?: ""
|
|
||||||
Cwtch.createProfile(nick, pass)
|
|
||||||
}
|
|
||||||
"LoadProfiles" -> {
|
|
||||||
val pass = (a.get("pass") as? String) ?: ""
|
|
||||||
Cwtch.loadProfiles(pass)
|
|
||||||
}
|
|
||||||
"ChangePassword" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val pass = (a.get("OldPass") as? String) ?: ""
|
|
||||||
val passNew = (a.get("NewPass") as? String) ?: ""
|
|
||||||
val passNew2 = (a.get("NewPassAgain") as? String) ?: ""
|
|
||||||
Cwtch.changePassword(profile, pass, passNew, passNew2)
|
|
||||||
}
|
|
||||||
"GetMessage" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
val indexI = a.getInt("index").toLong()
|
|
||||||
Log.d("FlwtchWorker", "Cwtch GetMessage " + profile + " " + conversation.toString() + " " + indexI.toString())
|
|
||||||
return Result.success(Data.Builder().putString("result", Cwtch.getMessage(profile, conversation, indexI)).build())
|
|
||||||
}
|
|
||||||
"GetMessageByID" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
val id = a.getInt("id").toLong()
|
|
||||||
return Result.success(Data.Builder().putString("result", Cwtch.getMessageByID(profile, conversation, id)).build())
|
|
||||||
}
|
|
||||||
"GetMessageByContentHash" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
val contentHash = (a.get("contentHash") as? String) ?: ""
|
|
||||||
return Result.success(Data.Builder().putString("result", Cwtch.getMessagesByContentHash(profile, conversation, contentHash)).build())
|
|
||||||
}
|
|
||||||
"UpdateMessageAttribute" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
val channel = a.getInt("chanenl").toLong()
|
|
||||||
val midx = a.getInt("midx").toLong()
|
|
||||||
val key = (a.get("key") as? String) ?: ""
|
|
||||||
val value = (a.get("value") as? String) ?: ""
|
|
||||||
Cwtch.setMessageAttribute(profile, conversation, channel, midx, key, value)
|
|
||||||
}
|
|
||||||
"AcceptConversation" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
Cwtch.acceptConversation(profile, conversation)
|
|
||||||
}
|
|
||||||
"BlockContact" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
Cwtch.blockContact(profile, conversation)
|
|
||||||
}
|
|
||||||
"SendMessage" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
val message = (a.get("message") as? String) ?: ""
|
|
||||||
Cwtch.sendMessage(profile, conversation, message)
|
|
||||||
}
|
|
||||||
"SendInvitation" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
val target = (a.get("target") as? Long) ?: -1
|
|
||||||
Cwtch.sendInvitation(profile, conversation, target)
|
|
||||||
}
|
|
||||||
"ShareFile" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
val filepath = (a.get("filepath") as? String) ?: ""
|
|
||||||
Cwtch.shareFile(profile, conversation, filepath)
|
|
||||||
}
|
|
||||||
"DownloadFile" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
val filepath = (a.get("filepath") as? String) ?: ""
|
|
||||||
val manifestpath = (a.get("manifestpath") as? String) ?: ""
|
|
||||||
val filekey = (a.get("filekey") as? String) ?: ""
|
|
||||||
// FIXME: Prevent spurious calls by Intent
|
|
||||||
if (profile != "") {
|
|
||||||
Cwtch.downloadFile(profile, conversation, filepath, manifestpath, filekey)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"CheckDownloadStatus" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val fileKey = (a.get("fileKey") as? String) ?: ""
|
|
||||||
Cwtch.checkDownloadStatus(profile, fileKey)
|
|
||||||
}
|
|
||||||
"VerifyOrResumeDownload" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = a.getInt("conversation").toLong()
|
|
||||||
val fileKey = (a.get("fileKey") as? String) ?: ""
|
|
||||||
Cwtch.verifyOrResumeDownload(profile, conversation, fileKey)
|
|
||||||
}
|
|
||||||
"SendProfileEvent" -> {
|
|
||||||
val onion = (a.get("onion") as? String) ?: ""
|
|
||||||
val jsonEvent = (a.get("jsonEvent") as? String) ?: ""
|
|
||||||
Cwtch.sendProfileEvent(onion, jsonEvent)
|
|
||||||
}
|
|
||||||
"SendAppEvent" -> {
|
|
||||||
val jsonEvent = (a.get("jsonEvent") as? String) ?: ""
|
|
||||||
Cwtch.sendAppEvent(jsonEvent)
|
|
||||||
}
|
|
||||||
"ResetTor" -> {
|
|
||||||
Cwtch.resetTor()
|
|
||||||
}
|
|
||||||
"ImportBundle" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val bundle = (a.get("bundle") as? String) ?: ""
|
|
||||||
Cwtch.importBundle(profile, bundle)
|
|
||||||
}
|
|
||||||
"CreateGroup" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val server = (a.get("server") as? String) ?: ""
|
|
||||||
val groupName = (a.get("groupName") as? String) ?: ""
|
|
||||||
Cwtch.createGroup(profile, server, groupName)
|
|
||||||
}
|
|
||||||
"DeleteProfile" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val pass = (a.get("pass") as? String) ?: ""
|
|
||||||
Cwtch.deleteProfile(profile, pass)
|
|
||||||
}
|
|
||||||
"ArchiveConversation" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = (a.get("conversation") as? Long) ?: -1
|
|
||||||
Cwtch.archiveConversation(profile, conversation)
|
|
||||||
}
|
|
||||||
"DeleteConversation" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = (a.get("conversation") as? Long) ?: -1
|
|
||||||
Cwtch.deleteContact(profile, conversation)
|
|
||||||
}
|
|
||||||
"SetProfileAttribute" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val key = (a.get("Key") as? String) ?: ""
|
|
||||||
val v = (a.get("Val") as? String) ?: ""
|
|
||||||
Cwtch.setProfileAttribute(profile, key, v)
|
|
||||||
}
|
|
||||||
"SetConversationAttribute" -> {
|
|
||||||
val profile = (a.get("ProfileOnion") as? String) ?: ""
|
|
||||||
val conversation = (a.get("conversation") as? Long) ?: -1
|
|
||||||
val key = (a.get("Key") as? String) ?: ""
|
|
||||||
val v = (a.get("Val") as? String) ?: ""
|
|
||||||
Cwtch.setConversationAttribute(profile, conversation, key, v)
|
|
||||||
}
|
|
||||||
"Shutdown" -> {
|
|
||||||
Cwtch.shutdownCwtch();
|
|
||||||
return Result.success()
|
|
||||||
}
|
|
||||||
"LoadServers" -> {
|
|
||||||
val password = (a.get("Password") as? String) ?: ""
|
|
||||||
Cwtch.loadServers(password)
|
|
||||||
}
|
|
||||||
"CreateServer" -> {
|
|
||||||
val password = (a.get("Password") as? String) ?: ""
|
|
||||||
val desc = (a.get("Description") as? String) ?: ""
|
|
||||||
val autostart = (a.get("Autostart") as? Boolean) ?: false
|
|
||||||
Cwtch.createServer(password, desc, autostart)
|
|
||||||
}
|
|
||||||
"DeleteServer" -> {
|
|
||||||
val serverOnion = (a.get("ServerOnion") as? String) ?: ""
|
|
||||||
val password = (a.get("Password") as? String) ?: ""
|
|
||||||
Cwtch.deleteServer(serverOnion, password)
|
|
||||||
}
|
|
||||||
"LaunchServers" -> {
|
|
||||||
Cwtch.launchServers()
|
|
||||||
}
|
|
||||||
"LaunchServer" -> {
|
|
||||||
val serverOnion = (a.get("ServerOnion") as? String) ?: ""
|
|
||||||
Cwtch.launchServer(serverOnion)
|
|
||||||
}
|
|
||||||
"StopServer" -> {
|
|
||||||
val serverOnion = (a.get("ServerOnion") as? String) ?: ""
|
|
||||||
Cwtch.stopServer(serverOnion)
|
|
||||||
}
|
|
||||||
"StopServers" -> {
|
|
||||||
Cwtch.stopServers()
|
|
||||||
}
|
|
||||||
"DestroyServers" -> {
|
|
||||||
Cwtch.destroyServers()
|
|
||||||
}
|
|
||||||
"SetServerAttribute" -> {
|
|
||||||
val serverOnion = (a.get("ServerOnion") as? String) ?: ""
|
|
||||||
val key = (a.get("Key") as? String) ?: ""
|
|
||||||
val v = (a.get("Val") as? String) ?: ""
|
|
||||||
Cwtch.setServerAttribute(serverOnion, key, v)
|
|
||||||
}
|
|
||||||
else -> {
|
|
||||||
Log.i("FlwtchWorker", "unknown command: " + method);
|
|
||||||
return Result.failure()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Result.success()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Creates an instance of ForegroundInfo which can be used to update the
|
// Creates an instance of ForegroundInfo which can be used to update the
|
||||||
// ongoing notification.
|
// ongoing notification.
|
||||||
private fun createForegroundInfo(progress: String): ForegroundInfo {
|
private fun createForegroundInfo(progress: String): ForegroundInfo {
|
||||||
val id = "flwtch"
|
val id = "flwtch"
|
||||||
val title = "Flwtch"
|
val title = "Flwtch" // TODO: change
|
||||||
val cancel = "Shut down"//todo: translate
|
val cancel = "Shut down" // TODO: translate
|
||||||
val channelId =
|
val channelId =
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||||
createForegroundNotificationChannel(id, id)
|
createForegroundNotificationChannel(id, id)
|
||||||
|
@ -385,6 +270,10 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
|
||||||
intent.action = Intent.ACTION_RUN
|
intent.action = Intent.ACTION_RUN
|
||||||
intent.putExtra("EventType", "ShutdownClicked")
|
intent.putExtra("EventType", "ShutdownClicked")
|
||||||
}
|
}
|
||||||
|
var flags = PendingIntent.FLAG_UPDATE_CURRENT
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
flags = flags or PendingIntent.FLAG_IMMUTABLE
|
||||||
|
}
|
||||||
|
|
||||||
val notification = NotificationCompat.Builder(applicationContext, channelId)
|
val notification = NotificationCompat.Builder(applicationContext, channelId)
|
||||||
.setContentTitle(title)
|
.setContentTitle(title)
|
||||||
|
@ -394,7 +283,7 @@ class FlwtchWorker(context: Context, parameters: WorkerParameters) :
|
||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
// Add the cancel action to the notification which can
|
// Add the cancel action to the notification which can
|
||||||
// be used to cancel the worker
|
// be used to cancel the worker
|
||||||
.addAction(android.R.drawable.ic_delete, cancel, PendingIntent.getActivity(applicationContext, 2, cancelIntent, PendingIntent.FLAG_UPDATE_CURRENT))
|
.addAction(android.R.drawable.ic_delete, cancel, PendingIntent.getActivity(applicationContext, 2, cancelIntent, flags))
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
return ForegroundInfo(101, notification)
|
return ForegroundInfo(101, notification)
|
||||||
|
|
|
@ -1,46 +1,48 @@
|
||||||
package im.cwtch.flwtch
|
package im.cwtch.flwtch
|
||||||
|
|
||||||
import SplashView
|
import SplashView
|
||||||
|
import android.annotation.TargetApi
|
||||||
import android.content.BroadcastReceiver
|
import android.content.BroadcastReceiver
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
import androidx.annotation.NonNull
|
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
import android.net.Uri
|
||||||
|
import android.os.PowerManager
|
||||||
|
import android.provider.Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import android.view.Window
|
import android.view.Window
|
||||||
|
import android.view.WindowManager
|
||||||
|
import androidx.annotation.NonNull
|
||||||
import androidx.lifecycle.Observer
|
import androidx.lifecycle.Observer
|
||||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||||
import androidx.work.*
|
import androidx.work.*
|
||||||
import io.flutter.embedding.android.SplashScreen
|
import cwtch.Cwtch
|
||||||
import io.flutter.embedding.android.FlutterActivity
|
import io.flutter.embedding.android.FlutterActivity
|
||||||
|
import io.flutter.embedding.android.SplashScreen
|
||||||
import io.flutter.embedding.engine.FlutterEngine
|
import io.flutter.embedding.engine.FlutterEngine
|
||||||
import io.flutter.plugin.common.MethodChannel
|
|
||||||
import io.flutter.plugin.common.MethodCall
|
|
||||||
import io.flutter.plugin.common.MethodChannel.Result
|
|
||||||
import io.flutter.plugin.common.ErrorLogResult
|
import io.flutter.plugin.common.ErrorLogResult
|
||||||
|
import io.flutter.plugin.common.MethodCall
|
||||||
|
import io.flutter.plugin.common.MethodChannel
|
||||||
|
import io.flutter.plugin.common.MethodChannel.Result
|
||||||
import org.json.JSONObject
|
import org.json.JSONObject
|
||||||
import java.util.concurrent.TimeUnit
|
|
||||||
import java.io.File
|
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import java.nio.file.Paths
|
import java.nio.file.Paths
|
||||||
import java.nio.file.StandardCopyOption
|
import java.util.concurrent.TimeUnit
|
||||||
|
|
||||||
import android.net.Uri
|
|
||||||
import android.provider.DocumentsContract
|
|
||||||
import android.content.ContentUris
|
|
||||||
import android.os.Build
|
|
||||||
import android.os.Environment
|
|
||||||
import android.database.Cursor
|
|
||||||
import android.provider.MediaStore
|
|
||||||
|
|
||||||
class MainActivity: FlutterActivity() {
|
class MainActivity: FlutterActivity() {
|
||||||
override fun provideSplashScreen(): SplashScreen? = SplashView()
|
override fun provideSplashScreen(): SplashScreen? = SplashView()
|
||||||
|
|
||||||
|
|
||||||
// Channel to get app info
|
// Channel to get app info
|
||||||
private val CHANNEL_APP_INFO = "test.flutter.dev/applicationInfo"
|
private val CHANNEL_APP_INFO = "test.flutter.dev/applicationInfo"
|
||||||
private val CALL_APP_INFO = "getNativeLibDir"
|
private val CALL_APP_INFO = "getNativeLibDir"
|
||||||
|
private val ANDROID_SETTINGS_CHANNEL_NAME = "androidSettings"
|
||||||
|
private val ANDROID_SETTINGS_CHANGE_NAME= "androidSettingsChanged"
|
||||||
|
private var andoidSettingsChangeChannel: MethodChannel? = null
|
||||||
|
private val CALL_ASK_BATTERY_EXEMPTION = "requestBatteryExemption"
|
||||||
|
private val CALL_IS_BATTERY_EXEMPT = "isBatteryExempt"
|
||||||
|
|
||||||
// Channel to get cwtch api calls on
|
// Channel to get cwtch api calls on
|
||||||
private val CHANNEL_CWTCH = "cwtch"
|
private val CHANNEL_CWTCH = "cwtch"
|
||||||
|
@ -52,6 +54,7 @@ class MainActivity: FlutterActivity() {
|
||||||
private val CHANNEL_NOTIF_CLICK = "im.cwtch.flwtch/notificationClickHandler"
|
private val CHANNEL_NOTIF_CLICK = "im.cwtch.flwtch/notificationClickHandler"
|
||||||
private val CHANNEL_SHUTDOWN_CLICK = "im.cwtch.flwtch/shutdownClickHandler"
|
private val CHANNEL_SHUTDOWN_CLICK = "im.cwtch.flwtch/shutdownClickHandler"
|
||||||
|
|
||||||
|
private val TAG: String = "MainActivity.kt"
|
||||||
// WorkManager tag applied to all Start() infinite coroutines
|
// WorkManager tag applied to all Start() infinite coroutines
|
||||||
val WORKER_TAG = "cwtchEventBusWorker"
|
val WORKER_TAG = "cwtchEventBusWorker"
|
||||||
|
|
||||||
|
@ -62,11 +65,27 @@ class MainActivity: FlutterActivity() {
|
||||||
// "Download to..." prompt extra arguments
|
// "Download to..." prompt extra arguments
|
||||||
private val FILEPICKER_REQUEST_CODE = 234
|
private val FILEPICKER_REQUEST_CODE = 234
|
||||||
private val PREVIEW_EXPORT_REQUEST_CODE = 235
|
private val PREVIEW_EXPORT_REQUEST_CODE = 235
|
||||||
|
private val PROFILE_EXPORT_REQUEST_CODE = 236
|
||||||
|
private val REQUEST_DOZE_WHITELISTING_CODE:Int = 9
|
||||||
private var dlToProfile = ""
|
private var dlToProfile = ""
|
||||||
private var dlToHandle = ""
|
private var dlToHandle = ""
|
||||||
private var dlToFileKey = ""
|
private var dlToFileKey = ""
|
||||||
private var exportFromPath = ""
|
private var exportFromPath = ""
|
||||||
|
|
||||||
|
override fun onCreate(savedInstanceState: android.os.Bundle?) {
|
||||||
|
super.onCreate(savedInstanceState)
|
||||||
|
window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
|
||||||
|
// Todo: when we support SDK 31
|
||||||
|
// hideOverlay()
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@TargetApi(31)
|
||||||
|
fun hideOverlay() {
|
||||||
|
window.setHideOverlayWindows(true);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// handles clicks received from outside the app (ie, notifications)
|
// handles clicks received from outside the app (ie, notifications)
|
||||||
override fun onNewIntent(intent: Intent) {
|
override fun onNewIntent(intent: Intent) {
|
||||||
super.onNewIntent(intent)
|
super.onNewIntent(intent)
|
||||||
|
@ -93,8 +112,16 @@ class MainActivity: FlutterActivity() {
|
||||||
override fun onActivityResult(requestCode: Int, result: Int, intent: Intent?) {
|
override fun onActivityResult(requestCode: Int, result: Int, intent: Intent?) {
|
||||||
super.onActivityResult(requestCode, result, intent);
|
super.onActivityResult(requestCode, result, intent);
|
||||||
|
|
||||||
|
// has null intent and data
|
||||||
|
if (requestCode == REQUEST_DOZE_WHITELISTING_CODE) {
|
||||||
|
// 0 == "battery optimized" (still)
|
||||||
|
// -1 == "no battery optimization" (exempt!)
|
||||||
|
andoidSettingsChangeChannel!!.invokeMethod("powerExemptionChange", result == -1)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (intent == null || intent!!.getData() == null) {
|
if (intent == null || intent!!.getData() == null) {
|
||||||
Log.i("MainActivity:onActivityResult", "user canceled activity");
|
Log.i(TAG, "user canceled activity");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,8 +137,6 @@ class MainActivity: FlutterActivity() {
|
||||||
)), ErrorLogResult(""));//placeholder; this Result is never actually invoked
|
)), ErrorLogResult(""));//placeholder; this Result is never actually invoked
|
||||||
} else if (requestCode == PREVIEW_EXPORT_REQUEST_CODE) {
|
} else if (requestCode == PREVIEW_EXPORT_REQUEST_CODE) {
|
||||||
val targetPath = intent!!.getData().toString()
|
val targetPath = intent!!.getData().toString()
|
||||||
var srcFile = File(this.exportFromPath)
|
|
||||||
Log.i("MainActivity:PREVIEW_EXPORT", "exporting previewed file")
|
|
||||||
val sourcePath = Paths.get(this.exportFromPath);
|
val sourcePath = Paths.get(this.exportFromPath);
|
||||||
val targetUri = Uri.parse(targetPath);
|
val targetUri = Uri.parse(targetPath);
|
||||||
val os = this.applicationContext.getContentResolver().openOutputStream(targetUri);
|
val os = this.applicationContext.getContentResolver().openOutputStream(targetUri);
|
||||||
|
@ -122,6 +147,20 @@ class MainActivity: FlutterActivity() {
|
||||||
os?.close();
|
os?.close();
|
||||||
//Files.delete(sourcePath);
|
//Files.delete(sourcePath);
|
||||||
}
|
}
|
||||||
|
} else if (requestCode == PROFILE_EXPORT_REQUEST_CODE ) {
|
||||||
|
val targetPath = intent!!.getData().toString()
|
||||||
|
val srcFile = StringBuilder().append(this.applicationContext.cacheDir).append("/").append(this.exportFromPath).toString();
|
||||||
|
Log.i("MainActivity:PREVIEW_EXPORT", "exporting previewed file " + srcFile);
|
||||||
|
val sourcePath = Paths.get(srcFile);
|
||||||
|
val targetUri = Uri.parse(targetPath);
|
||||||
|
val os = this.applicationContext.getContentResolver().openOutputStream(targetUri);
|
||||||
|
val bytesWritten = Files.copy(sourcePath, os);
|
||||||
|
Log.d("MainActivity:PREVIEW_EXPORT", "copied " + bytesWritten.toString() + " bytes");
|
||||||
|
if (bytesWritten != 0L) {
|
||||||
|
os?.flush();
|
||||||
|
os?.close();
|
||||||
|
//Files.delete(sourcePath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,10 +171,13 @@ class MainActivity: FlutterActivity() {
|
||||||
requestWindowFeature(Window.FEATURE_NO_TITLE)
|
requestWindowFeature(Window.FEATURE_NO_TITLE)
|
||||||
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_APP_INFO).setMethodCallHandler { call, result -> handleAppInfo(call, result) }
|
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_APP_INFO).setMethodCallHandler { call, result -> handleAppInfo(call, result) }
|
||||||
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_CWTCH).setMethodCallHandler { call, result -> handleCwtch(call, result) }
|
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_CWTCH).setMethodCallHandler { call, result -> handleCwtch(call, result) }
|
||||||
|
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, ANDROID_SETTINGS_CHANNEL_NAME).setMethodCallHandler { call, result -> handleAndroidSettings(call, result) }
|
||||||
notificationClickChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_NOTIF_CLICK)
|
notificationClickChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_NOTIF_CLICK)
|
||||||
shutdownClickChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_SHUTDOWN_CLICK)
|
shutdownClickChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL_SHUTDOWN_CLICK)
|
||||||
|
andoidSettingsChangeChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, ANDROID_SETTINGS_CHANGE_NAME)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MethodChannel CHANNEL_APP_INFO handler (Flutter Channel for requests for Android environment info)
|
||||||
private fun handleAppInfo(@NonNull call: MethodCall, @NonNull result: Result) {
|
private fun handleAppInfo(@NonNull call: MethodCall, @NonNull result: Result) {
|
||||||
when (call.method) {
|
when (call.method) {
|
||||||
CALL_APP_INFO -> result.success(getNativeLibDir())
|
CALL_APP_INFO -> result.success(getNativeLibDir())
|
||||||
|
@ -144,6 +186,30 @@ class MainActivity: FlutterActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MethodChannel ANDROID_SETTINGS_CHANNEL_NAME handler (Flutter Channel for requests for Android settings)
|
||||||
|
// Called from lib/view/globalsettingsview.dart
|
||||||
|
private fun handleAndroidSettings(@NonNull call: MethodCall, @NonNull result: Result) {
|
||||||
|
when (call.method) {
|
||||||
|
CALL_IS_BATTERY_EXEMPT -> result.success(checkIgnoreBatteryOpt() ?: false);
|
||||||
|
CALL_ASK_BATTERY_EXEMPTION -> { requestBatteryExemption(); result.success(null); }
|
||||||
|
else -> result.notImplemented()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(23)
|
||||||
|
private fun checkIgnoreBatteryOpt(): Boolean {
|
||||||
|
val powerManager = getSystemService(Context.POWER_SERVICE) as PowerManager
|
||||||
|
return powerManager.isIgnoringBatteryOptimizations(this.packageName) ?: false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@TargetApi(23)
|
||||||
|
private fun requestBatteryExemption() {
|
||||||
|
val i = Intent()
|
||||||
|
i.action = ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
|
||||||
|
i.data = Uri.parse("package:" + this.packageName)
|
||||||
|
startActivityForResult(i, REQUEST_DOZE_WHITELISTING_CODE);
|
||||||
|
}
|
||||||
|
|
||||||
private fun getNativeLibDir(): String {
|
private fun getNativeLibDir(): String {
|
||||||
val ainfo = this.applicationContext.packageManager.getApplicationInfo(
|
val ainfo = this.applicationContext.packageManager.getApplicationInfo(
|
||||||
"im.cwtch.flwtch", // Must be app name
|
"im.cwtch.flwtch", // Must be app name
|
||||||
|
@ -154,76 +220,336 @@ class MainActivity: FlutterActivity() {
|
||||||
// receives messages from the ForegroundService (which provides, ironically enough, the backend)
|
// receives messages from the ForegroundService (which provides, ironically enough, the backend)
|
||||||
private fun handleCwtch(@NonNull call: MethodCall, @NonNull result: Result) {
|
private fun handleCwtch(@NonNull call: MethodCall, @NonNull result: Result) {
|
||||||
var method = call.method
|
var method = call.method
|
||||||
|
// todo change usage patern to match that in FlwtchWorker
|
||||||
|
// Unsafe for anything using int args, causes access time attempt to cast to string which will fail
|
||||||
val argmap: Map<String, String> = call.arguments as Map<String, String>
|
val argmap: Map<String, String> = call.arguments as Map<String, String>
|
||||||
|
|
||||||
// the frontend calls Start every time it fires up, but we don't want to *actually* call Cwtch.Start()
|
// the frontend calls Start every time it fires up, but we don't want to *actually* call Cwtch.Start()
|
||||||
// in case the ForegroundService is still running. in both cases, however, we *do* want to re-register
|
// in case the ForegroundService is still running. in both cases, however, we *do* want to re-register
|
||||||
// the eventbus listener.
|
// the eventbus listener.
|
||||||
if (call.method == "Start") {
|
when (call.method) {
|
||||||
val uniqueTag = argmap["torPath"] ?: "nullEventBus"
|
"Start" -> {
|
||||||
|
val uniqueTag = argmap["torPath"] ?: "nullEventBus"
|
||||||
|
|
||||||
// note: because the ForegroundService is specified as UniquePeriodicWork, it can't actually get
|
// note: because the ForegroundService is specified as UniquePeriodicWork, it can't actually get
|
||||||
// accidentally duplicated. however, we still need to manually check if it's running or not, so
|
// accidentally duplicated. however, we still need to manually check if it's running or not, so
|
||||||
// that we can divert this method call to ReconnectCwtchForeground instead if so.
|
// that we can divert this method call to ReconnectCwtchForeground instead if so.
|
||||||
val works = WorkManager.getInstance(this).getWorkInfosByTag(WORKER_TAG).get()
|
val works = WorkManager.getInstance(this).getWorkInfosByTag(WORKER_TAG).get()
|
||||||
for (workInfo in works) {
|
for (workInfo in works) {
|
||||||
WorkManager.getInstance(this).cancelWorkById(workInfo.id)
|
WorkManager.getInstance(this).cancelWorkById(workInfo.id)
|
||||||
}
|
}
|
||||||
WorkManager.getInstance(this).pruneWork()
|
WorkManager.getInstance(this).pruneWork()
|
||||||
|
|
||||||
Log.i("MainActivity.kt", "Start() launching foregroundservice")
|
Log.i("MainActivity.kt", "Start() launching foregroundservice")
|
||||||
// this is where the eventbus ForegroundService gets launched. WorkManager should keep it alive after this
|
// this is where the eventbus ForegroundService gets launched. WorkManager should keep it alive after this
|
||||||
val data: Data = Data.Builder().putString(FlwtchWorker.KEY_METHOD, call.method).putString(FlwtchWorker.KEY_ARGS, JSONObject(argmap).toString()).build()
|
val data: Data = Data.Builder().putString(FlwtchWorker.KEY_METHOD, call.method).putString(FlwtchWorker.KEY_ARGS, JSONObject(argmap).toString()).build()
|
||||||
// 15 minutes is the shortest interval you can request
|
// 15 minutes is the shortest interval you can request
|
||||||
val workRequest = PeriodicWorkRequestBuilder<FlwtchWorker>(15, TimeUnit.MINUTES).setInputData(data).addTag(WORKER_TAG).addTag(uniqueTag).build()
|
val workRequest = PeriodicWorkRequestBuilder<FlwtchWorker>(15, TimeUnit.MINUTES).setInputData(data).addTag(WORKER_TAG).addTag(uniqueTag).build()
|
||||||
WorkManager.getInstance(this).enqueueUniquePeriodicWork("req_$uniqueTag", ExistingPeriodicWorkPolicy.REPLACE, workRequest)
|
WorkManager.getInstance(this).enqueueUniquePeriodicWork("req_$uniqueTag", ExistingPeriodicWorkPolicy.REPLACE, workRequest)
|
||||||
return
|
|
||||||
} else if (call.method == "CreateDownloadableFile") {
|
|
||||||
this.dlToProfile = argmap["ProfileOnion"] ?: ""
|
|
||||||
this.dlToHandle = argmap["handle"] ?: ""
|
|
||||||
val suggestedName = argmap["filename"] ?: "filename.ext"
|
|
||||||
this.dlToFileKey = argmap["filekey"] ?: ""
|
|
||||||
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
|
|
||||||
addCategory(Intent.CATEGORY_OPENABLE)
|
|
||||||
type = "application/octet-stream"
|
|
||||||
putExtra(Intent.EXTRA_TITLE, suggestedName)
|
|
||||||
}
|
}
|
||||||
startActivityForResult(intent, FILEPICKER_REQUEST_CODE)
|
"CreateDownloadableFile" -> {
|
||||||
return
|
this.dlToProfile = argmap["ProfileOnion"] ?: ""
|
||||||
} else if (call.method == "ExportPreviewedFile") {
|
this.dlToHandle = argmap["handle"] ?: ""
|
||||||
this.exportFromPath = argmap["Path"] ?: ""
|
val suggestedName = argmap["filename"] ?: "filename.ext"
|
||||||
val suggestion = argmap["FileName"] ?: "filename.ext"
|
this.dlToFileKey = argmap["filekey"] ?: ""
|
||||||
var imgType = "jpeg"
|
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
|
||||||
if (suggestion.endsWith("png")) {
|
addCategory(Intent.CATEGORY_OPENABLE)
|
||||||
imgType = "png"
|
type = "application/octet-stream"
|
||||||
} else if (suggestion.endsWith("webp")) {
|
putExtra(Intent.EXTRA_TITLE, suggestedName)
|
||||||
imgType = "webp"
|
}
|
||||||
} else if (suggestion.endsWith("bmp")) {
|
startActivityForResult(intent, FILEPICKER_REQUEST_CODE)
|
||||||
imgType = "bmp"
|
|
||||||
} else if (suggestion.endsWith("gif")) {
|
|
||||||
imgType = "gif"
|
|
||||||
}
|
}
|
||||||
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
|
"ExportPreviewedFile" -> {
|
||||||
addCategory(Intent.CATEGORY_OPENABLE)
|
this.exportFromPath = argmap["Path"] ?: ""
|
||||||
type = "image/" + imgType
|
val suggestion = argmap["FileName"] ?: "filename.ext"
|
||||||
putExtra(Intent.EXTRA_TITLE, suggestion)
|
var imgType = "jpeg"
|
||||||
|
if (suggestion.endsWith("png")) {
|
||||||
|
imgType = "png"
|
||||||
|
} else if (suggestion.endsWith("webp")) {
|
||||||
|
imgType = "webp"
|
||||||
|
} else if (suggestion.endsWith("bmp")) {
|
||||||
|
imgType = "bmp"
|
||||||
|
} else if (suggestion.endsWith("gif")) {
|
||||||
|
imgType = "gif"
|
||||||
|
}
|
||||||
|
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
|
||||||
|
addCategory(Intent.CATEGORY_OPENABLE)
|
||||||
|
type = "image/" + imgType
|
||||||
|
putExtra(Intent.EXTRA_TITLE, suggestion)
|
||||||
|
}
|
||||||
|
startActivityForResult(intent, PREVIEW_EXPORT_REQUEST_CODE)
|
||||||
}
|
}
|
||||||
startActivityForResult(intent, PREVIEW_EXPORT_REQUEST_CODE)
|
"ExportProfile" -> {
|
||||||
return
|
this.exportFromPath = argmap["file"] ?: ""
|
||||||
}
|
val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
|
||||||
|
addCategory(Intent.CATEGORY_OPENABLE)
|
||||||
|
type = "application/gzip"
|
||||||
|
putExtra(Intent.EXTRA_TITLE, argmap["file"])
|
||||||
|
}
|
||||||
|
startActivityForResult(intent, PROFILE_EXPORT_REQUEST_CODE)
|
||||||
|
}
|
||||||
|
"GetMessages" -> {
|
||||||
|
Log.d("MainActivity.kt", "Cwtch GetMessages")
|
||||||
|
|
||||||
// ...otherwise fallthru to a normal ffi method call (and return the result using the result callback)
|
val profile = argmap["ProfileOnion"] ?: ""
|
||||||
val data: Data = Data.Builder().putString(FlwtchWorker.KEY_METHOD, method).putString(FlwtchWorker.KEY_ARGS, JSONObject(argmap).toString()).build()
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
val workRequest = OneTimeWorkRequestBuilder<FlwtchWorker>().setInputData(data).build()
|
val indexI: Int = call.argument("index") ?: 0
|
||||||
WorkManager.getInstance(this).enqueue(workRequest)
|
val count: Int = call.argument("count") ?: 1
|
||||||
WorkManager.getInstance(applicationContext).getWorkInfoByIdLiveData(workRequest.id).observe(
|
|
||||||
this, Observer { workInfo ->
|
result.success(Cwtch.getMessages(profile, conversation.toLong(), indexI.toLong(), count.toLong()))
|
||||||
if (workInfo.state == WorkInfo.State.SUCCEEDED) {
|
return
|
||||||
val res = workInfo.outputData.keyValueMap.toString()
|
}
|
||||||
result.success(workInfo.outputData.getString("result"))
|
"SendMessage" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
val message: String = call.argument("message") ?: ""
|
||||||
|
result.success(Cwtch.sendMessage(profile, conversation.toLong(), message))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
"SendInvitation" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
val target: Int = call.argument("target") ?: 0
|
||||||
|
result.success(Cwtch.sendInvitation(profile, conversation.toLong(), target.toLong()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
"ShareFile" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
val filepath: String = call.argument("filepath") ?: ""
|
||||||
|
result.success(Cwtch.shareFile(profile, conversation.toLong(), filepath))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
"GetSharedFiles" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
result.success(Cwtch.getSharedFiles(profile, conversation.toLong()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
"RestartSharing" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val filepath: String = call.argument("filekey") ?: ""
|
||||||
|
result.success(Cwtch.restartSharing(profile, filepath))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
"StopSharing" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val filepath: String = call.argument("filekey") ?: ""
|
||||||
|
result.success(Cwtch.stopSharing(profile, filepath))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
"CreateProfile" -> {
|
||||||
|
val nick: String = call.argument("nick") ?: ""
|
||||||
|
val pass: String = call.argument("pass") ?: ""
|
||||||
|
Cwtch.createProfile(nick, pass)
|
||||||
|
}
|
||||||
|
"LoadProfiles" -> {
|
||||||
|
val pass: String = call.argument("pass") ?: ""
|
||||||
|
Cwtch.loadProfiles(pass)
|
||||||
|
}
|
||||||
|
"ChangePassword" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val pass: String = call.argument("OldPass") ?: ""
|
||||||
|
val passNew: String = call.argument("NewPass") ?: ""
|
||||||
|
val passNew2: String = call.argument("NewPassAgain") ?: ""
|
||||||
|
Cwtch.changePassword(profile, pass, passNew, passNew2)
|
||||||
|
}
|
||||||
|
"GetMessage" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
val indexI: Int = call.argument("index") ?: 0
|
||||||
|
result.success(Cwtch.getMessage(profile, conversation.toLong(), indexI.toLong()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
"GetMessageByID" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
val id: Int = call.argument("id") ?: 0
|
||||||
|
result.success(Cwtch.getMessageByID(profile, conversation.toLong(), id.toLong()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
"GetMessageByContentHash" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
val contentHash: String = call.argument("contentHash") ?: ""
|
||||||
|
result.success(Cwtch.getMessagesByContentHash(profile, conversation.toLong(), contentHash))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
"SetMessageAttribute" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
val channel: Int = call.argument("Chanenl") ?: 0
|
||||||
|
val midx: Int = call.argument("Message") ?: 0
|
||||||
|
val key: String = call.argument("key") ?: ""
|
||||||
|
val value: String = call.argument("value") ?: ""
|
||||||
|
Cwtch.setMessageAttribute(profile, conversation.toLong(), channel.toLong(), midx.toLong(), key, value)
|
||||||
|
}
|
||||||
|
"AcceptConversation" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
Cwtch.acceptConversation(profile, conversation.toLong())
|
||||||
|
}
|
||||||
|
"BlockContact" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
Cwtch.blockContact(profile, conversation.toLong())
|
||||||
|
}
|
||||||
|
"UnblockContact" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
Cwtch.unblockContact(profile, conversation.toLong())
|
||||||
|
}
|
||||||
|
|
||||||
|
"DownloadFile" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
val filepath: String = call.argument("filepath") ?: ""
|
||||||
|
val manifestpath: String = call.argument("manifestpath") ?: ""
|
||||||
|
val filekey: String = call.argument("filekey") ?: ""
|
||||||
|
// FIXME: Prevent spurious calls by Intent
|
||||||
|
if (profile != "") {
|
||||||
|
Cwtch.downloadFile(profile, conversation.toLong(), filepath, manifestpath, filekey)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
"CheckDownloadStatus" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val fileKey: String = call.argument("fileKey") ?: ""
|
||||||
|
Cwtch.checkDownloadStatus(profile, fileKey)
|
||||||
|
}
|
||||||
|
"VerifyOrResumeDownload" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
val fileKey: String = call.argument("fileKey") ?: ""
|
||||||
|
Cwtch.verifyOrResumeDownload(profile, conversation.toLong(), fileKey)
|
||||||
|
}
|
||||||
|
"SendProfileEvent" -> {
|
||||||
|
val onion: String= call.argument("onion") ?: ""
|
||||||
|
val jsonEvent: String = call.argument("jsonEvent") ?: ""
|
||||||
|
Cwtch.sendProfileEvent(onion, jsonEvent)
|
||||||
|
}
|
||||||
|
"SendAppEvent" -> {
|
||||||
|
val jsonEvent: String = call.argument("jsonEvent") ?: ""
|
||||||
|
Cwtch.sendAppEvent(jsonEvent)
|
||||||
|
}
|
||||||
|
"ResetTor" -> {
|
||||||
|
Cwtch.resetTor()
|
||||||
|
}
|
||||||
|
"ImportBundle" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val bundle: String = call.argument("bundle") ?: ""
|
||||||
|
result.success(Cwtch.importBundle(profile, bundle))
|
||||||
|
}
|
||||||
|
"CreateGroup" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val server: String = call.argument("server") ?: ""
|
||||||
|
val groupName: String = call.argument("groupName") ?: ""
|
||||||
|
Cwtch.createGroup(profile, server, groupName)
|
||||||
|
}
|
||||||
|
"DeleteProfile" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val pass: String = call.argument("pass") ?: ""
|
||||||
|
Cwtch.deleteProfile(profile, pass)
|
||||||
|
}
|
||||||
|
"ArchiveConversation" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
Cwtch.archiveConversation(profile, conversation.toLong())
|
||||||
|
}
|
||||||
|
"DeleteConversation" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
Cwtch.deleteContact(profile, conversation.toLong())
|
||||||
|
}
|
||||||
|
"SetProfileAttribute" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val key: String = call.argument("Key") ?: ""
|
||||||
|
val v: String = call.argument("Val") ?: ""
|
||||||
|
Cwtch.setProfileAttribute(profile, key, v)
|
||||||
|
}
|
||||||
|
"SetConversationAttribute" -> {
|
||||||
|
val profile: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val conversation: Int = call.argument("conversation") ?: 0
|
||||||
|
val key: String = call.argument("Key") ?: ""
|
||||||
|
val v: String = call.argument("Val") ?: ""
|
||||||
|
Cwtch.setConversationAttribute(profile, conversation.toLong(), key, v)
|
||||||
|
}
|
||||||
|
"LoadServers" -> {
|
||||||
|
val password: String = call.argument("Password") ?: ""
|
||||||
|
Cwtch.loadServers(password)
|
||||||
|
}
|
||||||
|
"CreateServer" -> {
|
||||||
|
val password: String = call.argument("Password") ?: ""
|
||||||
|
val desc: String = call.argument("Description") ?: ""
|
||||||
|
val autostart: Boolean = call.argument("Autostart") ?: false
|
||||||
|
Cwtch.createServer(password, desc, autostart)
|
||||||
|
}
|
||||||
|
"DeleteServer" -> {
|
||||||
|
val serverOnion: String = call.argument("ServerOnion") ?: ""
|
||||||
|
val password: String = call.argument("Password") ?: ""
|
||||||
|
Cwtch.deleteServer(serverOnion, password)
|
||||||
|
}
|
||||||
|
"LaunchServers" -> {
|
||||||
|
Cwtch.launchServers()
|
||||||
|
}
|
||||||
|
"LaunchServer" -> {
|
||||||
|
val serverOnion: String = call.argument("ServerOnion") ?: ""
|
||||||
|
Cwtch.launchServer(serverOnion)
|
||||||
|
}
|
||||||
|
"StopServer" -> {
|
||||||
|
val serverOnion: String = call.argument("ServerOnion") ?: ""
|
||||||
|
Cwtch.stopServer(serverOnion)
|
||||||
|
}
|
||||||
|
"StopServers" -> {
|
||||||
|
Cwtch.stopServers()
|
||||||
|
}
|
||||||
|
"DestroyServers" -> {
|
||||||
|
Cwtch.destroyServers()
|
||||||
|
}
|
||||||
|
"SetServerAttribute" -> {
|
||||||
|
val serverOnion: String = call.argument("ServerOnion") ?: ""
|
||||||
|
val key: String = call.argument("Key") ?: ""
|
||||||
|
val v: String = call.argument("Val") ?: ""
|
||||||
|
Cwtch.setServerAttribute(serverOnion, key, v)
|
||||||
|
}
|
||||||
|
"ExportProfile" -> {
|
||||||
|
val profileOnion: String = call.argument("ProfileOnion") ?: ""
|
||||||
|
val file: String = StringBuilder().append(this.applicationContext.cacheDir).append("/").append(call.argument("file") ?: "").toString()
|
||||||
|
Log.i("FlwtchWorker", "constructing exported file " + file);
|
||||||
|
Cwtch.exportProfile(profileOnion,file)
|
||||||
|
}
|
||||||
|
"ImportProfile" -> {
|
||||||
|
val file: String = call.argument("file") ?: ""
|
||||||
|
val pass: String = call.argument("pass") ?: ""
|
||||||
|
Data.Builder().putString("result", Cwtch.importProfile(file, pass)).build()
|
||||||
|
}
|
||||||
|
"ReconnectCwtchForeground" -> {
|
||||||
|
Cwtch.reconnectCwtchForeground()
|
||||||
|
}
|
||||||
|
"Shutdown" -> {
|
||||||
|
Cwtch.shutdownCwtch();
|
||||||
|
}
|
||||||
|
else -> {
|
||||||
|
// ...otherwise fallthru to a normal ffi method call (and return the result using the result callback)
|
||||||
|
val data: Data = Data.Builder().putString(FlwtchWorker.KEY_METHOD, method).putString(FlwtchWorker.KEY_ARGS, JSONObject(argmap).toString()).build()
|
||||||
|
val workRequest = OneTimeWorkRequestBuilder<FlwtchWorker>().setInputData(data).build()
|
||||||
|
WorkManager.getInstance(this).enqueue(workRequest)
|
||||||
|
WorkManager.getInstance(applicationContext).getWorkInfoByIdLiveData(workRequest.id).observe(
|
||||||
|
this, Observer { workInfo ->
|
||||||
|
if (workInfo != null && workInfo.state == WorkInfo.State.SUCCEEDED) {
|
||||||
|
val res = workInfo.outputData.keyValueMap.toString()
|
||||||
|
result.success(workInfo.outputData.getString("result"))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
result.success(null)
|
||||||
}
|
}
|
||||||
|
|
||||||
// using onresume/onstop for broadcastreceiver because of extended discussion on https://stackoverflow.com/questions/7439041/how-to-unregister-broadcastreceiver
|
// using onresume/onstop for broadcastreceiver because of extended discussion on https://stackoverflow.com/questions/7439041/how-to-unregister-broadcastreceiver
|
||||||
|
@ -232,19 +558,22 @@ class MainActivity: FlutterActivity() {
|
||||||
Log.i("MainActivity.kt", "onResume")
|
Log.i("MainActivity.kt", "onResume")
|
||||||
if (myReceiver == null) {
|
if (myReceiver == null) {
|
||||||
Log.i("MainActivity.kt", "onResume registering local broadcast receiver / event bus forwarder")
|
Log.i("MainActivity.kt", "onResume registering local broadcast receiver / event bus forwarder")
|
||||||
val mc = MethodChannel(flutterEngine?.dartExecutor?.binaryMessenger, CWTCH_EVENTBUS)
|
val bm = flutterEngine?.dartExecutor?.binaryMessenger;
|
||||||
val filter = IntentFilter("im.cwtch.flwtch.broadcast.SERVICE_EVENT_BUS")
|
if (bm != null) {
|
||||||
myReceiver = MyBroadcastReceiver(mc)
|
val mc = MethodChannel(bm, CWTCH_EVENTBUS)
|
||||||
LocalBroadcastManager.getInstance(applicationContext).registerReceiver(myReceiver!!, filter)
|
|
||||||
|
val filter = IntentFilter("im.cwtch.flwtch.broadcast.SERVICE_EVENT_BUS")
|
||||||
|
myReceiver = MyBroadcastReceiver(mc)
|
||||||
|
LocalBroadcastManager.getInstance(applicationContext)
|
||||||
|
.registerReceiver(myReceiver!!, filter)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReconnectCwtchForeground which will resync counters and settings...
|
// ReconnectCwtchForeground which will resync counters and settings...
|
||||||
// We need to do this here because after a "pause" flutter is still running
|
// We need to do this here because after a "pause" flutter is still running
|
||||||
// but we might have lost sync with the background process...
|
// but we might have lost sync with the background process...
|
||||||
Log.i("MainActivity.kt", "Call ReconnectCwtchForeground")
|
Log.i("MainActivity.kt", "Call ReconnectCwtchForeground")
|
||||||
val data: Data = Data.Builder().putString(FlwtchWorker.KEY_METHOD, "ReconnectCwtchForeground").putString(FlwtchWorker.KEY_ARGS, "{}").build()
|
Cwtch.reconnectCwtchForeground()
|
||||||
val workRequest = OneTimeWorkRequestBuilder<FlwtchWorker>().setInputData(data).build()
|
|
||||||
WorkManager.getInstance(applicationContext).enqueue(workRequest)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onStop() {
|
override fun onStop() {
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
app:lottie_autoPlay="true"
|
app:lottie_autoPlay="true"
|
||||||
app:lottie_rawRes="@raw/cwtch_animated_logo_op"
|
app:lottie_rawRes="@raw/cwtch_animated_logo_op"
|
||||||
app:lottie_loop="true"
|
app:lottie_loop="true"
|
||||||
app:lottie_speed="1.00" />
|
app:lottie_speed="1.00"
|
||||||
|
app:lottie_enableMergePathsForKitKatAndAbove="true" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
@ -1,8 +1,9 @@
|
||||||
buildscript {
|
buildscript {
|
||||||
ext.kotlin_version = '1.3.50'
|
ext.kotlin_version = '1.5.31'
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
// jCenter() no longer exists... https://blog.gradle.org/jcenter-shutdown
|
||||||
|
mavenCentral()
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
@ -15,7 +16,7 @@ buildscript {
|
||||||
allprojects {
|
allprojects {
|
||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
jcenter()
|
mavenCentral()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#Fri Jun 23 08:50:38 CEST 2017
|
#Mon Jun 20 10:33:21 PDT 2022
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
|
distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-bin.zip
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
|
||||||
zipStorePath=wrapper/dists
|
zipStorePath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
|
BIN
assets/knott.png
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 51 KiB |
|
@ -0,0 +1,8 @@
|
||||||
|
targets:
|
||||||
|
$default:
|
||||||
|
sources:
|
||||||
|
- lib/**
|
||||||
|
- pubspec.*
|
||||||
|
- $package$
|
||||||
|
# Allows the code generator to target files outside of the lib folder
|
||||||
|
- integration_test/**.dart
|
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 381 KiB |
After Width: | Height: | Size: 204 KiB |
After Width: | Height: | Size: 346 KiB |
After Width: | Height: | Size: 177 KiB |
|
@ -0,0 +1,16 @@
|
||||||
|
Cwtch (/kʊtʃ/ - a Welsh word roughly translating to “a hug that creates a safe place”) is a decentralized,
|
||||||
|
privacy-preserving, multi-party messaging protocol that can be used to build metadata resistant applications.
|
||||||
|
|
||||||
|
- Decentralized and Open: There is no “Cwtch service” or “Cwtch network”. Participants in Cwtch
|
||||||
|
can host their own safe spaces, or lend their infrastructure to others seeking a safe space.
|
||||||
|
The Cwtch protocol is open, and anyone is free to build bots, services and user interfaces and
|
||||||
|
integrate and interact with Cwtch.
|
||||||
|
|
||||||
|
- Privacy Preserving: All communication in Cwtch is end-to-end encrypted and takes place over Tor v3
|
||||||
|
onion services.
|
||||||
|
|
||||||
|
- Metadata Resistant: Cwtch has been designed such that no information is exchanged or available to
|
||||||
|
anyone without their explicit consent, including on-the-wire messages and protocol metadata.
|
||||||
|
|
||||||
|
For more information on how Cwtch works and a guide to metadata resistant communication please
|
||||||
|
checkout the Cwtch Handbook: https://docs.cwtch.im/
|
|
@ -0,0 +1 @@
|
||||||
|
Metadata resistant privacy platform designed to help you resist surveillance
|
|
@ -0,0 +1 @@
|
||||||
|
Cwtch
|
|
@ -0,0 +1 @@
|
||||||
|
https://cwtch.im/cwtch-explainer.mp4
|
|
@ -3,4 +3,6 @@
|
||||||
VERSION=`cat LIBCWTCH-GO-MACOS.version`
|
VERSION=`cat LIBCWTCH-GO-MACOS.version`
|
||||||
echo $VERSION
|
echo $VERSION
|
||||||
|
|
||||||
curl https://build.openprivacy.ca/files/libCwtch-go-macos-$VERSION/libCwtch.dylib --output libCwtch.dylib
|
curl https://build.openprivacy.ca/files/libCwtch-go-macos-$VERSION/libCwtch.x64.dylib --output libCwtch.x64.dylib
|
||||||
|
curl https://build.openprivacy.ca/files/libCwtch-go-macos-$VERSION/libCwtch.arm64.dylib --output libCwtch.arm64.dylib
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
cd macos
|
cd macos
|
||||||
curl https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-macos-0.4.6.7.tar.gz --output tor.tar.gz
|
curl https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-macos-0.4.7.8.tar.gz --output tor.tar.gz
|
||||||
tar -xzf tor.tar.gz
|
tar -xzf tor.tar.gz
|
||||||
chmod a+x Tor/tor.real
|
chmod a+x Tor/tor.real
|
||||||
cd ..
|
cd ..
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
|
||||||
Invoke-WebRequest -Uri https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-win64-0.4.6.5.zip -OutFile tor.zip
|
Invoke-WebRequest -Uri https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-win64-0.4.7.8.zip -OutFile tor.zip
|
||||||
|
|
||||||
if ((Get-FileHash tor.zip -Algorithm sha512).Hash -ne '7917561a7a063440a1ddfa9cb544ab9ffd09de84cea3dd66e3cc9cd349dd9f85b74a522ec390d7a974bc19b424c4d53af60e57bbc47e763d13cab6a203c4592f' ) { Write-Error 'tor.zip sha512sum mismatch' }
|
if ((Get-FileHash tor.zip -Algorithm sha512).Hash -ne '5b8f900a37f6e90d7a945b3903d769383c7478042cb43b2105d2374186e1a536f1a4758a2823d1d5be71d53a81dcfd8243293e04f82812d355983df322823cf4' ) { Write-Error 'tor.zip sha512sum mismatch' }
|
||||||
|
|
||||||
Expand-Archive -Path tor.zip -DestinationPath Tor
|
Expand-Archive -Path tor.zip -DestinationPath Tor
|
||||||
|
|
10
fetch-tor.sh
|
@ -1,12 +1,14 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.5.9-linux-x86_64 -O linux/tor
|
cd linux
|
||||||
chmod a+x linux/tor
|
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.7.8-linux-x86_64.tar.gz -O tor.tar.gz
|
||||||
|
tar -xzf tor.tar.gz
|
||||||
|
cd ..
|
||||||
|
|
||||||
mkdir -p android/app/src/main/jniLibs/arm64-v8a
|
mkdir -p android/app/src/main/jniLibs/arm64-v8a
|
||||||
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.4.9-arm64_pie -O android/app/src/main/jniLibs/arm64-v8a/libtor.so
|
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.7.10-arm64 -O android/app/src/main/jniLibs/arm64-v8a/libtor.so
|
||||||
chmod a+x android/app/src/main/jniLibs/arm64-v8a/libtor.so
|
chmod a+x android/app/src/main/jniLibs/arm64-v8a/libtor.so
|
||||||
|
|
||||||
mkdir -p android/app/src/main/jniLibs/armeabi-v7a
|
mkdir -p android/app/src/main/jniLibs/armeabi-v7a
|
||||||
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.4.9-arm_pie -O android/app/src/main/jniLibs/armeabi-v7a/libtor.so
|
wget https://git.openprivacy.ca/openprivacy/buildfiles/raw/branch/master/tor/tor-0.4.7.10-arm7 -O android/app/src/main/jniLibs/armeabi-v7a/libtor.so
|
||||||
chmod a+x android/app/src/main/jniLibs/armeabi-v7a/libtor.so
|
chmod a+x android/app/src/main/jniLibs/armeabi-v7a/libtor.so
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
|
||||||
|
var fs = require("fs");
|
||||||
|
var reporter = require('cucumber-html-reporter');
|
||||||
|
const reportRootDir = 'integration_test/gherkin/reports/'
|
||||||
|
const jsonReportPath = `${reportRootDir}json_report.json`;
|
||||||
|
const htmlReportPath = `${reportRootDir}cucumber_report.html`;
|
||||||
|
const reportFile = fs.readFileSync(`${reportRootDir}integration_response_data.json`);
|
||||||
|
//const jsonReport = JSON.parse(JSON.parse(reportFile).gherkin_reports)[0];
|
||||||
|
const jsonReport = JSON.parse(reportFile);
|
||||||
|
fs.writeFileSync(jsonReportPath, JSON.stringify(jsonReport));
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
theme: 'bootstrap',
|
||||||
|
jsonFile: jsonReportPath,
|
||||||
|
output: htmlReportPath,
|
||||||
|
reportSuiteAsScenarios: true,
|
||||||
|
launchReport: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
reporter.generate(options);
|
|
@ -0,0 +1,60 @@
|
||||||
|
## Environments
|
||||||
|
|
||||||
|
Located in the `integration_test/env` folder and managed by the hooks in `integration_test/hooks/env.dart`. Specify the environment you want a feature to run in by tagging it.
|
||||||
|
|
||||||
|
* `[no tag] (env/default)`: default environment to load if none is specified
|
||||||
|
* `@env:aliceandbob1 (env/aliceandbob1)`: no-password Alice, Bob, and Carol profiles. Alice and Bob have already added each other, Carol has no contacts
|
||||||
|
* `@env:persist (env/persist)`: changes made to this profile persist between features and scenarios (but NOT between runs)
|
||||||
|
* `@env:clean`: runs the feature with no profile existing yet on disk
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
[ ] 1. general
|
||||||
|
[X] splash screen + clean load
|
||||||
|
[X] setting save+load (TODO: dropdowns)
|
||||||
|
[~] tor status+reset
|
||||||
|
[~] shutdown cwtch
|
||||||
|
[ ] 2. global settings (verify functionality)
|
||||||
|
[_] language # blocked by dropdown
|
||||||
|
[_] theme+color theme # blocked by dropdown
|
||||||
|
[ ] column mode -> background? so all tests check both modes?
|
||||||
|
[X] block unknown
|
||||||
|
[X] streamer mode
|
||||||
|
[ ] 3. experiments (
|
||||||
|
[ ] group chat -> needs many
|
||||||
|
[ ] server hosting -> also many
|
||||||
|
[ ] file sharing -> a couple
|
||||||
|
[ ] image previews
|
||||||
|
[ ] clickable links (how much to test?)
|
||||||
|
[ ] 4. profile mgmt
|
||||||
|
[X] create+delete
|
||||||
|
[X] default+password load
|
||||||
|
[X] name change
|
||||||
|
[ ] password change
|
||||||
|
[ ] known server mgmt
|
||||||
|
[ ] 5. p2p chat
|
||||||
|
[ ] add, remove, block, archive
|
||||||
|
[ ] invite accept+reject
|
||||||
|
[X] send+receive
|
||||||
|
[ ] acks
|
||||||
|
[ ] try to send a long message
|
||||||
|
[ ] malformed messages, replies
|
||||||
|
[ ] overlays (invite, file/image)
|
||||||
|
[ ] send
|
||||||
|
[ ] receive
|
||||||
|
[ ] functionality
|
||||||
|
[ ] 6. p2p settings
|
||||||
|
[ ] name saving + transmission
|
||||||
|
[ ] block (ui indicators, functionality) inc in groups
|
||||||
|
[ ] history save+load
|
||||||
|
[ ] 7. groupchat
|
||||||
|
[ ] add, leave, archive
|
||||||
|
[ ] send+receive inc acks
|
||||||
|
[ ] try to send a long message
|
||||||
|
[ ] malformed messages, replies
|
||||||
|
[ ] overlays (invite, file/image) inc from non-contacts
|
||||||
|
[ ] send
|
||||||
|
[ ] receive
|
||||||
|
[ ] functionality
|
||||||
|
[ ] 8. group settings
|
||||||
|
[ ] display name
|
|
@ -0,0 +1 @@
|
||||||
|
_âeK%?Š!ţ~‡Lö9<C3B6>u×ÍlýQ’Q‚ż¦U•rMQCN5<4E>T-Ó/[<ń<ěn@KgŚă-ŕóŕČŃÓWÇ^l$řI‘C]»ÎI×7Đů@z¤m•Şb ŠNgířż?ő:†IşäD!ă±6ć°%čě…b
|
1
integration_test/env/aliceandbob1/dev/profiles/648b3aac5a139faadf74661983ab072e/SALT
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
¢‰qö3‰ ÉÌ¥êÒŽB7Å¢(Ê–vQBöÞɱ<C389>øŒœ¾F±zŠ\\UƒÈG[Ü/£Ñ?uš¼\;]y”›HþG|þÛ,Þ3xÛÞe‘E0!¬ÄSÍž<nÐÃòÐÉ®M~üw “ÀëQ@6Ǹ˒Öo£ÉüØ…ÕöÀi’ò
|
1
integration_test/env/aliceandbob1/dev/profiles/648b3aac5a139faadf74661983ab072e/VERSION
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2
|
BIN
integration_test/env/aliceandbob1/dev/profiles/648b3aac5a139faadf74661983ab072e/db
vendored
Normal file
1
integration_test/env/aliceandbob1/dev/profiles/aef99a4db367d0a06f8a351f4732e2db/SALT
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
;KĄĂ”ČÓŠť\|ç<ÂŐÉ^1iRüÁw°ôFŔQĄ'¢©©z{P4ĂP(ä"5͸Qpr7˝`ŇK^uý¸ČÖ;©1&Ĺ,vŞ
K/YößžŹ‹mĄâ}±3›]/§v"&ĽiѸ!3Wîyëjuvą¶D+w_'
|
1
integration_test/env/aliceandbob1/dev/profiles/aef99a4db367d0a06f8a351f4732e2db/VERSION
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2
|
BIN
integration_test/env/aliceandbob1/dev/profiles/aef99a4db367d0a06f8a351f4732e2db/db
vendored
Normal file
2
integration_test/env/aliceandbob1/dev/profiles/c39e0660a885b6000173ffea9d214b5c/SALT
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
¢ž»5‡Ä ô<03>m-J0újÕx ŽÙð•ÛjÙß“K×çøs³C=íà¾t¶-ÿD÷ñÇecàIXF`íI´
|
||||||
|
÷³6
Vr×gp4ËBóäÞS¿E<C2BF>tv–ìíä1iù¢‡”}ûZóÈWMóŒöIÈ´»1þ‡KB||Å,¢fEž%<<3C>D
|
1
integration_test/env/aliceandbob1/dev/profiles/c39e0660a885b6000173ffea9d214b5c/VERSION
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
2
|
BIN
integration_test/env/aliceandbob1/dev/profiles/c39e0660a885b6000173ffea9d214b5c/db
vendored
Normal file
|
@ -0,0 +1,411 @@
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4
|
||||||
|
dir-key-published 2021-09-01 00:00:00
|
||||||
|
dir-key-expires 2022-03-01 00:00:00
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2
|
||||||
|
R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD
|
||||||
|
0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW
|
||||||
|
1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX
|
||||||
|
O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl
|
||||||
|
+fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ
|
||||||
|
bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz
|
||||||
|
pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV
|
||||||
|
lyS28jsPht9VAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEA+jzmadukj4Q0qLgJ0at+nDXGruO5JD3HsehobiwO8HrdaaImY+rY
|
||||||
|
CZzxRWM4xryQ2AFuAGbSxGoNQT3dTLvjKNVdGY6jPzlS7vxKbPeNZtc/YMvfZ+Fx
|
||||||
|
uEjvaZ6nDbviVtQhtE0J2EZ32n90Ob8YC8l/7zh0hp+mZO6Wf2DGXWjNvG7d8Ucc
|
||||||
|
p5A1ZVIpJ/VQzdlPaocO+6AvxvSBpaIUF0yGpTwofTOjtUmZyuWbhRndsQj1qMcj
|
||||||
|
e8wzOIgr3HZyhO9wztQGkZ8bzHq65oZe0IIOXZu0icZamFGQ5I6y5duCqxDDe4C/
|
||||||
|
v1/6bD1I+/ujLXRMmkcbJ3NZE+KrZg7KIE5ScGbkJIX7vIicqtsf+7VipdOh3/wp
|
||||||
|
qaDxX9Sp2cbVUU0M/aJ14nDSeFlx0XQAgWkPjG2lYtTNEC2zuudBCuCD8es8EhAW
|
||||||
|
FrU94cYg9lVId0NDMOpWPMH2QJFS4tk3Hc66si3+gkCOt2GOaSQeD+gGWkdwDzn3
|
||||||
|
S8iAur2GohFFAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
B4914rKqUc51Q1nq8CrA/e7EaMQ0ug08qlBqWyzZSDiBKVCoQj446ZJMU9VKlzJF
|
||||||
|
XtuURlJ7zswXMze7HceakrkxZAc7GiAGKO5hgbbI8XGLvXn16Lsr/MP1cmbKoI04
|
||||||
|
g5tG9Kx6yOB4r/l2TQY9Tw22YcdJ24W2/mw6TmDv0b+IorsIBnxIDv7Q7j25IkNE
|
||||||
|
hW3F9R+Ntja1RWPqKnptp8nxBt5/2jVr637BFczDv9K509QX+HHKyICA1hnvDDU7
|
||||||
|
N5Y1/mVu4JwQrBAFL857XbobP4QaLsZ34Q8LRE4dveuyw+vjVa1YimZ6h/RvrYyP
|
||||||
|
8DUi4XnzFyztecivXbdSTpMTSMfC4NQXFeT+XStRdWlapZyCFhp74w3wv7HCB0z6
|
||||||
|
7QT1HWMKPRvj1DsHhvPviyLVCL2tl2x+G7aaledOPf6BbhO7VolNeHiubyYCQl2H
|
||||||
|
t/Vy72DZbQeuLhf5GyqVyUm9uugzvVrryUiNUApOW8Xta2dAEBqinDrrY6iMYxh/
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
UrJN3Ey1hSHTaMUAhINCVFhojt48ppxky0bvwztQ9p/Vy7dfRx0APNbL70/XZOrR
|
||||||
|
sRj8zxtx2+tc5Lnkfaah63bmVsUNTgD6LudDaffXiV8XhIeVbzS0r/YJ0U1OsbK+
|
||||||
|
ApDItNDUz+VIJL5JUDjq/6fojFlWPYNIwyk5G8zOM70Atjk6UDyCIihV2u5pofW3
|
||||||
|
znFaFp/XhC14S8lMPZYKbnyl2iQ7UsqLpTxg3EwivIlSVFs5YQe0yXgJFX0oNd9Z
|
||||||
|
gAf3JIonA2g8Oo9EkgRfYCI33AwyVoU3QN1/AmLH2uPWTKhMu7k+OHktuIBfyFTR
|
||||||
|
9jbUq+YTU1ni6kEsJVBP/0I4n9Xb4VYIoqOq0BrcEp3lQ8BCEWjIGwLh1HYc9/DY
|
||||||
|
meE+cwLp0RNU8cuxyrGnkLA350bsNxrDkiaHAkj5ZA8W9VTGYsBxVhbLdQzN3GOm
|
||||||
|
63GJBgjdaOsD6WXs/737nD2sLu6dnA/Jbz84ouZSafQO/FNQZnndfj4osjabmq8O
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 0232AF901C31A04EE9848595AF9BB7620D4C5B2E
|
||||||
|
dir-key-published 2021-08-01 20:00:02
|
||||||
|
dir-key-expires 2022-08-01 20:00:02
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAu9O0Pueesn0+29BlxZs60mBqehjdQtgSnKOm9QZxbQ0xrMQgbFnR
|
||||||
|
hWbKD8erenyeFk2SF6AJkbyzgYC89hyPW+8GBDmg5bE8fRKjgV/nI3tY2m4rkY3u
|
||||||
|
zSmYIdwqHUUc98Xzt9PaQ8IJAlDBY4XLKrWmJMxSyhBlVEept7+9Tj23qowW44Mz
|
||||||
|
xPJZ1aFkB1FpkD6qmoCzVZbhXy3cGt1nDwdJK7KqlaXziz9pFiw8PzTVU2xFgJNy
|
||||||
|
+nEcT72DBtk3G5K2Riu/aXY/D541Cioj9KMV4Nv4g8aBKx58Xq2tq1pFkc1Bqj1y
|
||||||
|
2MomVR3iskFzlqC8yKWGVe4OP2IaOhtcQJYp5GR9q+dWnr53WWNVxNu3sA9iMal3
|
||||||
|
PJUk5pIYrsmArGew5gmlCe+Al46nPINxc7ouztmStAV+2F6SpZlKOcstnT+KJ52O
|
||||||
|
1xnOSaj/WnzG2o4KZ9UrFQoUNOLQJcelPcC+vrinMk9BQPcB072l9NjpUBC9brsW
|
||||||
|
qTCMStn1jfDDAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAp7nHn/R+ZZ8lza379M7BJ00JYPAcncjtoa2K2Z75bDoxlegGvZXp
|
||||||
|
j4D0WhqksaaOr/+YCSPMcs4HAapKE/Dj09p1kjzh6Xu/iVp51NiQAARS5j3tu/5k
|
||||||
|
WJQ7ig207TdtjmslZIx0UU8pieuenRdyUN0PvjOkaoZIpao1+UlIe47DP+42D3QX
|
||||||
|
1J2wu48QDvt7hUUA3y7yLUyNMarqYBbbXQ/MpH8tcMT76TTN1uilP6W/3j1b6Fr7
|
||||||
|
NGtbUrS1EzOOHnCpgpnD8qGcisDKrHcVkNkh1w+8LW9ef7RGpFPpn022hUQG0WLD
|
||||||
|
5zrh19SAsKetWAZY6RlvyCHPVReajIAovwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
ca3I8mHu2zEOCnzySzdk+rbZLpohw5aa3NmTGFzRUXqOeHClOYHRc+glAyCrtUA3
|
||||||
|
lEa5fiFaZTImKu0J/uroyR4uF5JpzLOfojTQi9P5hMCBSdd7uGzoKC+/dKb2OngZ
|
||||||
|
VkBjptMf1S9dy2lUdDksHnnyg8UrV7EolIHUFNdEBI1LeONkdesZ5oQMg3HRlVpU
|
||||||
|
v+m/7y/MB+o3KAXkQyAxTcV4bKdsHm3Pf0CSfDgOPImwFS4lwyEW0STlOmVHojZR
|
||||||
|
5wm+5dwt9vbD7K6ectbnWtWjiSrvtGjqixO652lxz1qrsid99S5wEzJNhfif8lYe
|
||||||
|
VsB9h7YagNHJHLiGeBT1kg==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
ZkHpe8JVvGsiAsH8gw1eZVIIE8WuM+3Sdd37U2tOyDi7FVwJV+oJ+aKwcCTqTLaj
|
||||||
|
jglQJbg2JdV4ofy49ZaQa6FBGLrzxAS6Gx0jg+28Kzbr0xu9hSX81oPSXKn9KDLr
|
||||||
|
BvmuSqKBB+5B9nIEBjm6FwPc8MjqlvNesuJ3IpW9+e85eB7qsH4ozjHF0GIgpXu/
|
||||||
|
qXrk2TEK1nMc9EN+VCYuy3gAm46GHQEYR1U7gIofCYf7LQpDrfj1sAGquCQ3vYqT
|
||||||
|
Ex3GtqcDV22IME67Cou5rv9OmMnmy1dbeHO4g843RX0LXtEDdGYGSLHzl8EAscrg
|
||||||
|
i55XFlS6z5OwCbdDvFTkHUWRlaiDtoymaxAEW6GUmNjHhgWY9wJwgroVNRsP8Ihi
|
||||||
|
aex9HIND1MY4ERS41Csba/0grf+FahMVI12gwpmrnKfF95QHWw2MEvT1pzZGtMnq
|
||||||
|
XD8mcVNYJtcTvYM/cUa0I4BFD1AyeIP54hEXwIsqHm8KBJpjX/ZpPzksnc4NY8i0
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 49015F787433103580E3B66A1707A00E60F2D15B
|
||||||
|
dir-key-published 2021-11-28 16:32:54
|
||||||
|
dir-key-expires 2022-02-28 16:32:54
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAxVbS0noZKz1Ei6858RGyyuQgwQUKG4Urrp2BiAzkYxwX+6fURlut
|
||||||
|
AjeLb4XysqCdNdUipuLRQ2QIy1C220QiCHV6jZAsM4tmEq6TpK6q1lxi5YPKqbGS
|
||||||
|
CfUQFT1nO4s4DCYSLCwiRNy6bMe8tNHc0MpXP3loCbPkYCoXrEL6vYIROw3oeGWE
|
||||||
|
KbFPQrzYJAPHgUubBibsY5lkUY9N/5QZw2y1bn+dq9mFOoCIHLd6DkQmySmftnMe
|
||||||
|
QrpYA2WvE4M5yN2HB8QGT7TdzXPPL6889rFw/mjqYExQPX7cqmILkchsB7I5whjA
|
||||||
|
u0oodF8Y9ooK9QT0GeK4h3xQhzNG17anuUxbZ7sxzmBwBNmkNyLWEeIntazyjRFr
|
||||||
|
P2mDY/9YK2JOQKkh3tKl1whcCG9ZtAhKmm/ijG7OrhqtusdGKBXIgALf4f111AK1
|
||||||
|
gNcacDx2fJzRHuNK8zkIORAzStxKdLbAbBNeLENk1zBjSkrxCOJH4mBpr8TXULq1
|
||||||
|
ThLI/8OzZq4LAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAo32l4qg46cqP/sAL+oLmQM0mDiQUy6EtNa73vyy0BJEGWJeImUO4
|
||||||
|
gHNg9pyMFqyF+rP824gAzwX9Un9HaKgFpIrsKcZzg+Yl2vlrBQpJ0NPIkN9oqj27
|
||||||
|
W/A7RftMhH2itv0v87QudD7FqJpxdYNf3wpr9GvsAiHZMBfC88WhCnmJoDBwyucY
|
||||||
|
HFH7gzjPeDx37KD57o2M1KC/SRVtQtrccA/WzcxNypgAYkJu4yE2gaDr2WFn3hFv
|
||||||
|
kscW0jn6+157UuKH0rCNeRFDx8SsSS0nr6Zk/n+dlXzHGDO3vQIKCoRoH9yL4T//
|
||||||
|
hkMYE/4qc9R49VyXxK+n/qU6HQYpQMi+VwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
KKrOMRAg1bx+XFLRjhQB5OFjtupkqkFnGjS3LZQ5FHNwJ7cKG1X7K0aJNAumRPMD
|
||||||
|
w9xraIMuuok46wj35P9Tcy68qi3EqIJP5378ZtdK3Ncy9KkSWJSA9MLPmB3fClL/
|
||||||
|
/5TwboePXRdlt++Bcw9OC83HDuFVBqZArFIvopKf/AJOyViRVHlBmgNKFpm9RJTo
|
||||||
|
XsD415rJAi79tAfXzKuagke6DTVqobMhxrUmp3RjbEEEC6icQ3YX9X6NOPQ4Gwl2
|
||||||
|
bpWOVi3/9EGRge0X8IYsqB6/pnEXM2FSOTMdwo4YQzIgW/HLE9hXjFCx7QcPkcos
|
||||||
|
AZHvl12tKzZF3F9MKPcNyQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
wb40bfNLWyU9pWW+2BAHbrmZZfbs9UEIS/6G66VE6823/r6M90RCmFx1JlwqgmaV
|
||||||
|
/WMbBE9DxFKILyhuQi6whIKoYndg72VDeZL5BzWctalw24VpJePVjeGLcTdJHBVh
|
||||||
|
a6UiQFaQdH+bTX6qNIFv9nNwq7ZzJRBvaYF9bK8kaTrZilFKoRVBxXssBUFjEz6t
|
||||||
|
f+sei5WIiBnzaQOUxdMjvdDAHci4DXwGw1U2M7jcYARo4FfvWkAxzWLxocWmauPM
|
||||||
|
8tDn0fSgMnLlSOR2crnriQMFhYD+9xyxfOq1IDH2IWCKlejz7j3DHSqBYiUSO9oD
|
||||||
|
uX6htwbMWwZQeqt+LttE/zZX1Tcv6PJqemT8uabH0s94W2A3sJpstWJ+0capb+Mj
|
||||||
|
bvTXj7t2ilqa5RX35KKhaQ6wlh4OXZb2ydeJZc7wtyG8eN53aVqJNJQ+WZn4IiTq
|
||||||
|
fefr2ojy2VDJLDHJVNpKQQzmjXtSs+69wCvrqdHGjGAQl5L31LjZgaNLNj14RI+H
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint ED03BB616EB2F60BEC80151114BB25CEF515B226
|
||||||
|
dir-key-published 2021-03-29 03:27:58
|
||||||
|
dir-key-expires 2022-03-29 03:27:58
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEA1d6uTRiqdMp4BHBYIHKR6NB599Z1Bqw4TbOVkM2N1aSA4V/L/hKI
|
||||||
|
nl6m/2LL/UAS+E3NCFX0dhw2+D7r7BTJyfGwz0H2MR6Py5/rCMAnPl20wCjXk2qY
|
||||||
|
ACQa0rJvIqXobwGnDlvxn4ezsj0IEY/FEb61zHnnPHf6d3uyFR1QT06qEOQyYzML
|
||||||
|
76f/Lud8MUt+8KzsdnadAPL8okNvcS/nqa2bWbbGhC8S8rtDpPg5BhX2ikXa88RM
|
||||||
|
QdrrackdppB2ttHlq9+iH3c8Wyp7bvdH8uhv410W7RnIE4P+KIxt3L0gqkxCjjyh
|
||||||
|
mn9ONcdgNOKe31q2cdW5LOPSIK+I5/VTjYjICza7Euyg03drpoBMGLuuJZY6FXEV
|
||||||
|
auIBncWe+So8FMxqU/fwo5xm6x085U1MwXUmi4XDYpr/kau6ytPnzzw9J++4W9iC
|
||||||
|
em5Jp0vaxrDnPdphqT0FWsBAwsZFL7nZRnmUlTgGsXUa0oSM9/MErDwzELh/NwG4
|
||||||
|
DNyyzRG8iP61AgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAsw2ZJlGsmfDmDwoKbzjOno759Xwqn6JX+tFasI8eRjOFnOyjYzd1
|
||||||
|
XjG6Gj2hVpF/ze2NiTuUyRu3Ybp8G9/gs8VGPljxSHkEugGjQdYFoST02ma0vUHA
|
||||||
|
8YqpBYOiLvsXnqfEkl3Yj6HVxmVJA9j8BxODODlBtxRMJWFrpp/b+qCo/YyGmCh3
|
||||||
|
n0qd3QNqFPLIzwvjWVhaFfga8dXBT73wX9uYT7nT/e3pV7ZvTw0caqi7svNzj0I8
|
||||||
|
/OxOEjoBQEQMQVPT2bNZKBe9X8QKDSgdealZQwBT9wdZ4KndtCj6Y8MVjj15/YtH
|
||||||
|
fWfNyUHgVqOmfDK7m3pHXR9fGgsLQexIfQIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
GyN9MMaPABXJ16WAFIhdzOhNT59BI0RAfV9ZpUJgzkAAmpoj+WwUtWfcrW7a08CT
|
||||||
|
9g60QwJonP/Nh+8iLvQYH5ZyEqsEj0HEUD/yI2kvN41Y5QBD1Sku8Cu4E2UaICzL
|
||||||
|
V63oitjQzppKlVXHyP/SXsI2bUjoHLtT2pBvxRJ84DlZBEQ/ZqS38NN/+Z6DtMR/
|
||||||
|
kn0l7W5yA3bYWzeKy1TeKLWo7p0hHzv/Hswe/eha+27LuwZZwwfSQrRy1fi66Fmj
|
||||||
|
0xBP+iXXtmNleFegFuhEBPXa+9udrT9rodSdazkGPzjyF6HWRMP5DtmTI6ovJDVX
|
||||||
|
60UQ0hNb6KAP+FZKPz9/dA==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
zAgmCR7tf0btsogvBmdxJ7+RWjPBzmDSA7f+zlK0jOc3lDDD4pxuQO6iNcoEDYMC
|
||||||
|
5hkzVoGBMYsxLfLZXFGE518dn79iKr6SQoq87AhnAsIiAfXMk2AWLkWI7MTzZo2U
|
||||||
|
dcgo+7vzxMObk86vzFxYWrSqp6CSZ7RwBRnH3vCGLfOMZ1lXMug+MQAQYAyl6KIR
|
||||||
|
3d/uEu3+sPFJcHQFP3C/7bHDG5j/76kwoFzjSjg974rSjr1j1FbrpNn35mLc+2X/
|
||||||
|
11n7cOADHWaSN3MlLWGsYxuuX2l1w/XZNfFEezDwK3BOotbj5spU2nQ8xbDFPB5+
|
||||||
|
ixDfc00TC3YbveSz+S8W9czfysJt3KaWmQczDtSIXag1qrL52CBGUVGP6+R7xnpR
|
||||||
|
/4QD6yCKmDcNk2D1YnindwYC48ydDt/u9A/97cEBpUbul3feW7eKLk79MIklWlWo
|
||||||
|
3c3aQVH6Ewrb76oXYYwzNbqJOp2ceREu72/Fk/keprVcupVDtVoqHgDDpfOUYTJd
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint D586D18309DED4CD6D57C18FDB97EFA96D330566
|
||||||
|
dir-key-published 2021-09-06 18:42:41
|
||||||
|
dir-key-expires 2022-09-06 18:42:41
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAvi5+A+XPw4jxMYhmEI4+MpnaX3dUEbsMGHA+xAMnmVhuxbm3Dn5c
|
||||||
|
TyhQNY2LOlsieE84UYG+J4dABfaFH4w0l6zUJkuytX4+6WRQontw9puR/IcXkRwM
|
||||||
|
8Tv/tY675OYRCm9DgDAWfqZM0IgTzSrYRDl8eFPSFCOP0NhMrQZeUrdKgwAXVZWP
|
||||||
|
xt9nTCwT4K9BMp47LEmZKdEokeVsr0l29Z9v5+r24k9x8EQjDexsoHwlVrxWfarG
|
||||||
|
1klWssfSFpkMN+FkTQnBC6ByiBh5ZKM5AC/HkVFvuHjehUpfrtNk6XNFcKbDvEIg
|
||||||
|
qPdg1QWuuSWpZVA+/EwSBtwMNcq9pv60L8Cm9WCJoSC691WByiGwFCy1/XcBI4J/
|
||||||
|
BkoMEvP3kAxzm92jqGbpFSJawFRPZKy89FDKpha/So3CERQPV0ar+DTpVqDlryWV
|
||||||
|
N4x1IzpPeSHFj7T74q8qdrxx0wcAjWJ9WYoGQif6FK3hHcmbSGSgyvAFeoYxyUCL
|
||||||
|
JHkjBCD4WTWVAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEA1Hguh3PNTfMd7kLD8NupSdye1KB6hhQitx8DipvT71ZaCZYI8fZ3
|
||||||
|
z5xa6fCcJXv/xoz1tzKeJ1n4/AzAbc7ltCyyWkj9CbiB99cEe+sVE9R899eFvPP9
|
||||||
|
DUmsmgy0Bn2MrdfD/N5VeJ219TTtqI75BJMd9n1+r5zUzhji2ihcLWYgi0GVZoec
|
||||||
|
6B+xfPtYbifCdrPRBwrMAW4EhtMKeJfzsYFO220f7x2OmmZB9muesi5O8/0zjwu1
|
||||||
|
xOKldXCFbccTfFN88nYmaO8j0SpG9nOveFXavPs0LyVzhuMkbLXSWAN+M/S6GC4L
|
||||||
|
1kbkjQ6YhuYSnKxGFo/wdax41jrSFCf3qQIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
r2a4uvuN2LUgSuHoWYckJusjzeaEfTTN+DHJdQjJrMueZtxhhz+C+soYoSAvBsHI
|
||||||
|
huc2y0wLbeNMpLXeyGoYh0M4zm6RyjMksHQZbgPjkibflbUI3csJcvaBMQonfo9B
|
||||||
|
knoqOzeQd8NioOlnbYQ+k78swGtg2ndHpK4G4NMBK6ZQrbhrIk0nVhOhaIHpGdiN
|
||||||
|
icr+czGq6SzH4Snp26dJ+J+9SAdTOzgat/C2Othdu122JR2/7GzCnz8dqS3LabN9
|
||||||
|
iWJWMLxayFKi+Z5f1WjCNOVh5lSjpeLjUNSrA1hXXKSRD0eFOQFRvgvO60gyvooH
|
||||||
|
C8amqpSD8HqsCK6MvN7V9g==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
uuQhm7YYbqR4/fGSDWqzwiw40nr7y3laCmfiTDHOA5N6lVOw/tM4bdMbGH58wkkK
|
||||||
|
XBIEz4zQnIT4Sgaumc9PZK3/a8wkx3HgvSNZAEvv5GK2iD8QQNaR0mv7/gbCOLeD
|
||||||
|
4MAsWH7ehc2u0AcebYehYWE7/fknYRfIGLRzeAeR479LgtFIaaZ54lGeEWKA7qBc
|
||||||
|
B3njJcNDlekChydxw2JRMw2GmK7Gn/cVRLjFiG32aaTPA37Ietw6Z8wXEjTy4087
|
||||||
|
KTzTe6puX0g9kCWMaGIBzod+ucNOG9WhgVfy6M+OMddI4KbgizUM7a5c3DZwnQHk
|
||||||
|
nn5yqib/W7NmHZOL1k2qYlKQlbr412bsDgBDoFYSYPIkbO4x7LHJnGGiwxYx4vmx
|
||||||
|
caxDySQtqCcR9ygMrZVrL9W/Z+w2N/KCXnL+SgTmN0x/Saor1ZTkONj5Tfn4dg/W
|
||||||
|
xDxvLO02DpVTfgidUsBeHSnMQn7w0iG0abhWFmYNFDjxZFEWy30mRCEYADC/1NCI
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 27102BC123E7AF1D4741AE047E160C91ADC76B21
|
||||||
|
dir-key-published 2021-08-21 23:12:45
|
||||||
|
dir-key-expires 2022-08-21 23:12:45
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAuxgnMVH4vwBjMeGvrEODOYcjbCS4N+Wt0SZ6XA5I08HyMf5AbaaF
|
||||||
|
MDscJBRIUOp7DyLmUwK+jp+QI8pUjjKsB8S0ctb/J3Im2T6CXnP2KgEfVmpNVQmV
|
||||||
|
XdMm8cRZl1uIZDDBAXizSQ51f9A17TJh7pF/5khYp/SAzl6aO5ETn7ry0ITiJnNa
|
||||||
|
6cY+400F7ZBA8NuXnCHVGfmpFFsiJKFrS1Kve629eeaNEd3mynRviBXJy5a4NEGf
|
||||||
|
y42Ev8on6SxEnF9OG0NMJ081/+mP+j8Dsl3+Uehzr9B42MQQfDo4RdYGrt9XolBm
|
||||||
|
L4eay1ieZEsFeDy0TMfiGGbr90wo1fgGLHIRSfTNLhhPJ/f9cTZPe98rhSgGWiAd
|
||||||
|
RvK5SljoIOR4qdS9/aiZkj1P+etvh1rIQUcG4/xCOBnouEBK+DDHZFqyMtpMPtV0
|
||||||
|
Bxi20DVaMJcyhdfjVqcRSyuR8tlOnTid6QwBj6kgIIfMaC+4Ht6yO/SYquCWlaZl
|
||||||
|
y7Pu7li8WyW9AgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAu1QJ+qlCbtrYsg9QENtOpvMrEDc+WgH1ZFxEqk0v/ad2ACQYe4dT
|
||||||
|
g1gJ6VZyGths3p8+WQXIA9YbcEr2oajXlLmLT2QAlqlsXMPKwwIpeG4rvR43Wwq5
|
||||||
|
mQ7aX+/VjZ9YZNoZVEAy1O7ti7GIXJzJYDOdgBjLifSjpjcEmSaf+v4E357azs9R
|
||||||
|
ndLHRRwbBLdUl7G3aMkL4ejrv6AAXexPxAL90xsb/MAhVEOQrJNcVMTgII0fSf56
|
||||||
|
P1J17SQwthNZ4rTMo2O9TvWUGNf1sMb9kdm+A2Nwo2CKmUR0uo5wHN4YHSBYFDcb
|
||||||
|
hxRtZlhSFfBJvJgrX8/+CnJrBFC6S/7vJwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
VzdxGiA6egLcZjm3hHrTW+N+7sPwaEcdYR5/GW757MO79O8QwjOLJSa5dOF5yDWa
|
||||||
|
3Ie+QDB2Q++a3+w776zqpFsaGCuEHBCfU9pxatKdoTsExZdQnWHJg4u9YD1JcYvL
|
||||||
|
dZq9uCCWaKa91OjA6/U9zp/LY3tOPUWCyO4MHehHYggzapbcF5uaMG0AT0lZzaXJ
|
||||||
|
vh180N5YGMfm0eYXJqkJyX3WCZhGroh7o3DyaqtBSJ1cY4NzTNgPoCAi3J/XEoCI
|
||||||
|
3JzxfH97uyqQngR1yGb5KggdM2ejci3Ld9q99hjXlzYRtsobUQBTlZca2vUk5ALh
|
||||||
|
vFWU7GzcNIdDjKBUd+IhTQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
WldVJc0L3fByDY9D+Yha2/8Bw5nqRpHu8RL8lU8zXb0rhfiA6DN2aefSCG9WEay1
|
||||||
|
sTVs4zhS8N0+278oP51Lg7S+V6SmXxKZbF3I2zNaFMIPVspRA3OF0R9vCP1YMxeo
|
||||||
|
D4EDQXiRxNNeM9hAjmmLiE0j7ZMetZ88ewwsOOXAvPHmCth09nWdCYKwibwUW/U3
|
||||||
|
w1HXCHK4BdZ7XXkMJNry7kZP/H1/5oYyuKshue4+f8tgRa0xg0wbHDrdbrR1qBBu
|
||||||
|
Xg9Q11hV29RIdD0ZgugUdyGKlpRa6Mb3GD5DzN845sFhCjsPrYyZv7Xo/S+uTtN4
|
||||||
|
t59BtF1TjnsAhUk7shk2W3zzaauzUarkDA1v+mb9NZ3CFsNgfxt6d1yDDyuxJgaC
|
||||||
|
VkIfO9nX9dCORSC9Ow+XOq+D/o4FfSe4q0VvrJJILAcw2Nu1Zg4ZhHBeugP9f4I9
|
||||||
|
p/+ZMrEr+YAKkjPw+uIEdR0l/YZEhcrjymX4FY829LNll2AceqMCKoapFWuEzzDP
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58
|
||||||
|
dir-key-published 2021-11-09 19:16:37
|
||||||
|
dir-key-expires 2023-05-09 19:16:37
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAu/DOrbv/4IAYvyxsy/6ivC3q5yCQBWLKHZGYKQa5G/3rem8wen0f
|
||||||
|
qF7y4ye6U6faWc5kcNMHEKMIeBzMErxwF345qoGHITxbbOWnizgwPgrdCwlK3p0H
|
||||||
|
1XZGU/TTjoaM25P+ZNCBvGmDQRAtgs2odnv+i8hpu6vrcAUZYXmmw/Ag1Ou2AlLC
|
||||||
|
mPpbjV1O5SMylgC4IuCBPr3iA+M1kKkvj4LmwU6pJxjAae76GLzzQ/Ffvi7rRpvU
|
||||||
|
2BHetjehk+7/t8izgbhT4VABtzKgrv9ATnhfEgPeT/WBq0E75iciBBAXRPF5kEA4
|
||||||
|
k++NPy21XpL7jkQ4wnMs2HyiFhHbUwbLcoyQ/JVq/WBboSwStYbkdizRpkhJ1eNg
|
||||||
|
LiD8CPWcZnhWZi9VWrwT0xl+Mu4v6kwo9kVnXhOfcK8Wni9FqiBu2tmNDoGPG1Ac
|
||||||
|
wptYQSIoujuLgn4MARREwo9cWrKp2w+D7Dt4U7U5OrXL7TXjonEKuEHwRhzz1JA8
|
||||||
|
7LXm/wENwn1/AgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAuxJxHCGOw9DgNtw4wqi78OE3djdiLwbie+2CevKMRaO14IhuQGVK
|
||||||
|
w1PYsnTuVLVcJl3Y4QKQ4nnbe1QCiGrLq9wueQy7ZvBeZry3f+QD1Q/PAG19n6/7
|
||||||
|
hlhXclSOJ/jRah0Gi+QXAycKE5RES/Qn4F5fNE7MxzM0ZQHIlszZLNUrcpeLE9nX
|
||||||
|
avlqlSqK8FmLPOpOSRrdPtzKP2sjW9UUFVGMfurDYIC51hkZI/nyy8A1C844sfuF
|
||||||
|
LV6oYpYw5+soA122zBqGqP6vApwFCvWSDcGlx8xj1Irdo+JIDfK8vklu9P11rTWB
|
||||||
|
R7dZw9pD21reD0pf0Bipzneho6iiL++w+QIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
aMzjdOHri8Kmdoy0qt1a33Y9/e5vKkJQkzCKdHN34Il5FMMCkOrJ1yeQgZyp6mU4
|
||||||
|
jPSpUZlr1Iq52x5ers4fH4SybvX16BDq+p6+Zel9f5TpFg1vzdpJH1WOJ3ZoES1N
|
||||||
|
S8CpiXVz8flc5Ez6Dc7uZGSE2fYRl1Pswn3GuLfR1Wjw0VNp1VgHZk6xYXRk/YLx
|
||||||
|
OyjZTWEWAF/0qw3usXtvTvh6wGniVxr0rg3zZbesLXti4TAn3B3N6VG1TPOizna6
|
||||||
|
s26edpQ6RQPigAuccEwU5iaIQEGkIxcoe61qnPvAoWP3Jk/sZAGCqhbya0CBCH8U
|
||||||
|
pEW/OauwlDlr3yXEKh05aQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
XhAoF04YrM2zJUvrQuEsGhU53Pbf1B0jv5F4YkMlRX2y15rKXKI93vQTM1LbnYc0
|
||||||
|
ETkhSOQB2rpnX0bcE+K+x0sWXiMRtR1HSX/oIPDI9MNqHv75eZlEkSaDJHIsQJlj
|
||||||
|
Dd++tMHkRc49nNNo2J25J3TiBU0ecpVYYvtJzynE3W8tX3io6EmvTehkj2o79z0A
|
||||||
|
ax2A5JG65plch0ES2yK2jqgBEmkA/eZENDNQAaERXMFJbbpHIMBaGguwCEieJe77
|
||||||
|
JBAOxJFRGpL6MhMpcvi5MgEMqfAv3AhlBo93n4apT2CYR8PdCHUZyq7FrgwTSJS7
|
||||||
|
ndl3YmvxJ7wnyTXitw0GcSVeQaYMQV+LR9Z1VkmjIwRuHliUn7hR79pYqs3t11aQ
|
||||||
|
muW8jOrx+5QsiTLEPV6Hs0pzXc9XDw7mnJ6M2gxxF8fZCztal3TNLs9+1O22fxME
|
||||||
|
0VU1oS7SG6T4M1YOXgKFUP20gLl8sZf+3lGp3aLZIK8psR3vzggpaRSUKgip4Lqv
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 23D15D965BC35114467363C165C4F724B64B4F66
|
||||||
|
dir-key-published 2021-09-18 16:07:20
|
||||||
|
dir-key-expires 2022-09-18 16:07:20
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAlv6XS+VppPaQzOgor0YFlcXLWeXiMn5N3VBneXuw8maLOu9oPJ9z
|
||||||
|
2/oMQN8a+VOWTf+/jebGzOBK6MamXpgsIZPQWiT18gZMsYdR8mcqBYqVP3khwUWh
|
||||||
|
9QYkV+m+Auxa0TLzTrsi6dLDJ384XdpDweU+YJghMJNZ1NqiT8ogj84hxs5Tf+Qf
|
||||||
|
bn7EBIcU7SAKr5Lw25KrMb5e3AZSC5MilBS/KLgVTq/GiWb7pKd5pxGwlGolNX8a
|
||||||
|
PccZ2ZT2DrSQsct4wVxhSbUqANI3PfMpXvmUDxWWBgbQwLF02/4gi+13snlHtqwl
|
||||||
|
y1WjE55HVfx1CTX13SStwmF/N3SFtFf1qil3j5qrHdHtKlAYOaTfqab1eLVH1l83
|
||||||
|
LI5QWD7ri9GpPqIjlh6PuaHjaO2FW20SouZtS9jJKwi1l1G3ef1tSlha1cxkRxIp
|
||||||
|
U/ngvQBsoa9X26VfQA4MieZgVVdMVwjCNh2YC9aEXc/KxfcBueZkM1194qP88cVu
|
||||||
|
dOFYaftOkuGPAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEA3OigVlkOvlx54wcY0RRuExNw2sPYHr8m8QP+SnzARDbrubvsKT0S
|
||||||
|
z/+aVWccgacBtihOpF9juQLHb+nqhea9s6QS8XAQ98bqm8foKToWuxnIRS9c+8e1
|
||||||
|
qcENTfh6U2Dr8ckwVcKAPtnLnPtbxuFF5UiqXAPA89ZmtqUPv+DfmDr5fdeb0bCu
|
||||||
|
Lo6TCFLQOcn2Qz1WsSv/2JRkSBy8pgaC01zErgv9oRVIzFfLn8YpfnWZkFiRGwX6
|
||||||
|
/GBLsS19SLLX0xLkPwQ/CwN6OkipOtYi6UNq0osHw9xfm5sCzcnltJShA1YtIp72
|
||||||
|
e1HkTx03a43uAKlJBo1rMD29stVJu9ABEwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
r2YFJIj1zR9iMPWRJYMDEKuLlV0Gbis9232Gog5sS06LpUFPYL6clLDf7eWAimPs
|
||||||
|
u8rUUP4JEjmAY7bWHyqbG3D5iljNin50W7kvY8ip+Vqf64vjNUXFDKUbi0iGkfVC
|
||||||
|
nfX67FL0JF74hqtCtMlS5QPvD4oLsC40DdmPD4kCulaSrMlmsFRGFdl60HeSLbeP
|
||||||
|
oopRA4yYB4ZGJxJUaSuMm6RrcK08G2l7vLfHpxhcJWQVb2fKB7Ds+AogZYnc6ZYF
|
||||||
|
hpGAP9y+Yn8TUUqPMhhZwLw/8eUAhtv8G2aBBxHyctlGvg1YFiquPP6VEn88h9GZ
|
||||||
|
X4d/mLOAQeYWEalQC812iw==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
OlLQuEDdagECnVy1Nke/C7dpS8+8XvgLK/hGgV/OpCWr+Gq8bL6/NpK9GP7EbsUI
|
||||||
|
NxsguJ2r1wkEGTixz88gdKWDCC3evGW1pqnsjkCk69gHGtCxmrFeiCxCSomaOjzw
|
||||||
|
HCnp3TcT1DA4EstoXUqPysVkBYkx8OBO6rGhvE+G1S4bVG/EJkPCMhjPlxX41ON6
|
||||||
|
NWvtf32dviA5W1BrYKWJy/v0pCsApgjZa6qpaLdgqQabG5YEJA0rONS1hL+AcJks
|
||||||
|
CnvkSS7iU/4jrDPfgOLoVxEkH68swLol2Qf0RFHg12EL5kf0xbPnfE84aQyt99an
|
||||||
|
6VAMVIy/tCxR2efZ0+uQmQk7S35uQH/PxZ3/mq6cDMw7+WZdYbrkyfmFK/A+yL2P
|
||||||
|
op71Ik0Xf0Qwd0qMhTZMVPZpZDQmxvr0j0r3xHia0Ez+PhovnnxqI9/cThRQ/ceN
|
||||||
|
jE2cA46H4ZfYn5OdCP+mP9L+MsqJYoHj/SigcIrXUX58R1D0JWVX2KPU+tVyQ03B
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
dir-address 154.35.175.225:80
|
||||||
|
fingerprint EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97
|
||||||
|
dir-key-published 2021-02-08 18:16:07
|
||||||
|
dir-key-expires 2022-02-08 18:16:07
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAwBmqdD+G0q3smN5OBFHCcK5pQH5G1GIpFJ1JxCVEp92tTK4ZHnot
|
||||||
|
9RzMfag6zQFqwLaJ+yEb1DOjTdTMfcUTsj5f3GUqPB+U7shSMAvvAAM+Bx/4m1AU
|
||||||
|
u6sk4XmPB1bCBfcRl4zhnY6XFIbj0ktuBDblcxHz3lDgHFpBoci9sF59mM14MZ09
|
||||||
|
EdwgeckcU5oeq6ApuSlUVaOT8xsKV/yeK4SKaFfDclwPAJuitQ5CpqctP7ExmlrY
|
||||||
|
sboTDtz7/Xa6OccaGDEUf7TRlipvUX6rvlmvHm3qjdixVfExpa8E5QG79GZTL82p
|
||||||
|
1zBd3iqc6QEnRDTiW9cMUeQt4EvrwOUVVYPWo3hp1C/iiNzWraDays2xuhaSB0gj
|
||||||
|
fPatu2CFW5XB2vd9IvIiWeklSFqnF8DL38jDL7DbFiETJreGsDMR03yHWVd0MbPz
|
||||||
|
OrvAxG4tJn+JtnwhzlbRjnfk53jOTbiM0vMV8h/ztapCiJeT/6i7nVQ1xL2boeYw
|
||||||
|
5RDUlwZaQiaXAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEApIIcKBWvD0P2YQtsrFKEF1kprJUCEUlWqzV4mVbTcVdzVQpct8t8
|
||||||
|
NAO8kDbxRSyU2S6gKecusy4H1MJWVAe2qvKIY974espuJwBXWFgT70jSBTFzjMpB
|
||||||
|
dAaTTY+kNZa66kjBjCVolr8UfFvL7HaL3CCtWD9ds7+ep76co1h3s3sD2BWW/M5m
|
||||||
|
V6ML8kYkjRW6SW8YHW6By3G+UuqRiGziJIIwQAoPnNSWrzW6UTLpVRDjdo70bQvU
|
||||||
|
vvfppUuNNji5SFfzSiakxHIse/eHG/rTNSzOvlpjuZxzPIcekr71eu1hCVHb2QdA
|
||||||
|
9Ikc5pUQeB0zImI8WJ9OVJDFUEgjJ9LGtQIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
cy+VPbSGSJ5aI7egCwgNY6mgSlJumULFmUN8gfahvMo5hUwVLqP1FtoKIO8yBUc0
|
||||||
|
Y47pt6G5a0fjm6mjapFbU7IpqIUl+5gLBRKD6ugx+hr2IoqIVJY7WQUvVMBnfqHp
|
||||||
|
Z5N6kXfFBT+EbnbLiUqoRo1/AHC6E6CqI5pdhV86UCFydmuLf/MfwJpXiYRJueqk
|
||||||
|
DnPYEflq+Zu/RReL5aJlVOVuWq0ZpuzUHk4gIicKESLGkv4eI2CvuB5HTeNAB9L5
|
||||||
|
laMe+YpoXqgqMae1HT+rupPXYeONPygFXXbNLNVrR7OjAYG2TOaqdUTQkFefFVtD
|
||||||
|
ungKyPS6LTytSuU/rjWCbQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
sV4ouMb8pmCM3WjLTFxfRVb6qZl8rQ0tYM/AjKz1ufU0UmL7yx/7JMg2InDcYPH3
|
||||||
|
4PIUQrDLoAMxnnNVMDaDGoGDGI5keUmU1eSGvdJYN7okd0aRvA9LFGw4uDVVyB0K
|
||||||
|
l7BOk80y15P34R4G6oPvcR8aCxoiMh9UusbhiVjBr6dAfJGVVxZAO1ZJ8pa8fcrA
|
||||||
|
IbtNks2vut6Oy4oaC7zLCwcbRJM6dSvzcbzBpCf7/b9w6NQNqCBBQkqKgUl0FqKM
|
||||||
|
QRKqHWuhbqcL9+lj7rvgWCEigLu9ff1+E7C4BV7GzOm5FPcRqfkPaMsjQuM/HErH
|
||||||
|
swhf2Ra+Tcdk9gdI4AomqwaoD6B2uKsZkcFpZhq4HAle6rOP9eC16DpqsokpqoW9
|
||||||
|
vb5Mic7ABYVpB4t3o5wOI9D4exXmzv6gpuOyl5rJGL5ORYSEhnMGsKMyPceCGysg
|
||||||
|
SzwfPWBqRTM2LfBxhW05UEBJev4EXk7AA5sr6GkcX/CXeR47pyXQAyc2doZo7Aoq
|
||||||
|
-----END SIGNATURE-----
|
44395
integration_test/env/aliceandbob1/dev/tor/data-dir-783322795/cached-microdesc-consensus
vendored
Normal file
67608
integration_test/env/aliceandbob1/dev/tor/data-dir-783322795/cached-microdescs.new
vendored
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
# Tor state file last generated on 2022-02-04 13:53:23 local time
|
||||||
|
# Other times below are in UTC
|
||||||
|
# You *do not* need to edit this file.
|
||||||
|
|
||||||
|
CircuitBuildTimeBin 675 1
|
||||||
|
CircuitBuildTimeBin 825 1
|
||||||
|
CircuitBuildTimeBin 875 1
|
||||||
|
CircuitBuildTimeBin 925 1
|
||||||
|
CircuitBuildTimeBin 975 1
|
||||||
|
CircuitBuildTimeBin 1075 1
|
||||||
|
CircuitBuildTimeBin 1125 2
|
||||||
|
CircuitBuildTimeBin 1175 1
|
||||||
|
CircuitBuildTimeBin 1225 9
|
||||||
|
CircuitBuildTimeBin 1275 21
|
||||||
|
CircuitBuildTimeBin 1325 7
|
||||||
|
CircuitBuildTimeBin 1375 6
|
||||||
|
CircuitBuildTimeBin 1425 9
|
||||||
|
CircuitBuildTimeBin 1475 2
|
||||||
|
CircuitBuildTimeBin 1525 6
|
||||||
|
CircuitBuildTimeBin 1575 4
|
||||||
|
CircuitBuildTimeBin 1625 4
|
||||||
|
CircuitBuildTimeBin 1675 13
|
||||||
|
CircuitBuildTimeBin 1725 3
|
||||||
|
CircuitBuildTimeBin 1775 1
|
||||||
|
CircuitBuildTimeBin 1875 1
|
||||||
|
CircuitBuildTimeBin 1925 1
|
||||||
|
CircuitBuildTimeBin 1975 3
|
||||||
|
CircuitBuildTimeBin 2025 1
|
||||||
|
CircuitBuildTimeBin 2075 2
|
||||||
|
CircuitBuildTimeBin 2275 1
|
||||||
|
CircuitBuildTimeBin 2325 1
|
||||||
|
CircuitBuildTimeBin 2575 1
|
||||||
|
CircuitBuildTimeBin 2725 1
|
||||||
|
CircuitBuildTimeBin 2775 2
|
||||||
|
Dormant 0
|
||||||
|
Guard in=default rsa_id=BD4C647508162F59CB44E4DFC1C2B2B8A9387CCA nickname=regar42 sampled_on=2022-01-27T11:01:16 sampled_idx=0 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-01-25T23:44:41 confirmed_idx=2 pb_use_attempts=78.000000 pb_use_successes=78.000000 pb_circ_attempts=102.000000 pb_circ_successes=100.000000 pb_successful_circuits_closed=100.000000 pb_timeouts=1.000000
|
||||||
|
Guard in=default rsa_id=AADD84AF8D3C24F492D9EC1E08360D1C7CD5730D nickname=axeTorC sampled_on=2022-01-28T04:55:37 sampled_idx=1 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-02-04T01:41:15 confirmed_idx=0 pb_use_attempts=1.000000 pb_use_successes=1.000000 pb_circ_attempts=1.000000 pb_circ_successes=1.000000 pb_successful_circuits_closed=1.000000
|
||||||
|
Guard in=default rsa_id=F7B8A4B5F16ECDF6CA626F96F4E3C219D1A664EC nickname=kerneloopsRelay sampled_on=2022-01-26T16:41:28 sampled_idx=2 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-01-24T18:55:06 confirmed_idx=1
|
||||||
|
Guard in=default rsa_id=274A1DC6210E91827CDF40DC0E95E4A3CA929A08 nickname=AllanonTor sampled_on=2022-01-26T18:56:19 sampled_idx=3 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=891FB8477529A6B2894B7A3129402E0FD5DD281F nickname=hers sampled_on=2022-01-31T03:58:06 sampled_idx=4 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=898B2FBA56F3707B72A0B97CC492CBB466D9D707 nickname=julianrelay sampled_on=2022-01-30T07:22:54 sampled_idx=5 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=84A9473665250B752B621892834E71EECBD610FF nickname=flyingcubetech sampled_on=2022-01-24T19:47:40 sampled_idx=6 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=7DFC30D7EAAEF6E74B081EC0291757E9414A8C06 nickname=TorRelay1337 sampled_on=2022-01-27T01:43:00 sampled_idx=7 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=A5E42F1A3AFA948A7F2FDB1954A4CF6C6489D418 nickname=bauruine sampled_on=2022-01-31T11:16:43 sampled_idx=8 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=F9AEA07ACE06E8E7D55E10FFBAE037E8C833FA93 nickname=DTFNODE46 sampled_on=2022-01-24T22:18:09 sampled_idx=9 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=3910C5CA0CC5AFE22C709DF471A2B5B6B4AEDC98 nickname=criticalcat sampled_on=2022-01-25T22:53:24 sampled_idx=10 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=FD449127D30D8F5D124653D9EF736EDF4A12B4DC nickname=lw sampled_on=2022-02-01T00:36:22 sampled_idx=11 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=0E2EEC125A6AC8D5EBF5DB36B776A3DA5510E7A0 nickname=Nako sampled_on=2022-02-04T00:40:19 sampled_idx=12 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=2C7C9294CFA7AAFB3D25B72DEAED242E96927F03 nickname=ChomelesDEnetcup sampled_on=2022-01-30T05:51:02 sampled_idx=13 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=916DC3199F639168CD20AEC4D45969268E807699 nickname=defcon777 sampled_on=2022-01-27T11:01:04 sampled_idx=14 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=A6C3B64EC8EE20D77987EBC5E894CA6CCE4B5295 nickname=OwlRelay sampled_on=2022-01-30T19:20:11 sampled_idx=15 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=6FB33CCBEF5135AFA3D6D33CE030F96728EDD70C nickname=MDMIT1 sampled_on=2022-01-31T16:49:37 sampled_idx=16 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=85703987A509438D96E22AD367E99FF295E089AF nickname=gbtUSicebeer09b sampled_on=2022-02-03T22:13:49 sampled_idx=17 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=BA053C72E476C1EB9D05237D0D6A289C18FBE8E7 nickname=straDEicebeer02b sampled_on=2022-01-24T08:18:24 sampled_idx=18 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=225A8EA367DF3073433E0A845DDDA26D2357E4C6 nickname=Manureva sampled_on=2022-01-29T21:39:31 sampled_idx=19 sampled_by=0.4.5.9 listed=1
|
||||||
|
LastWritten 2022-02-04 21:53:23
|
||||||
|
TorVersion Tor 0.4.5.9 (git-d0ed04d50e80fe1c)
|
||||||
|
TotalBuildTimes 108
|
|
@ -0,0 +1,3 @@
|
||||||
|
SocksPort 9667 OnionTrafficOnly
|
||||||
|
ControlPort 9668
|
||||||
|
HashedControlPassword 16:501107AD0642A3C66029D6A37845E976D5F55B4DED7C4A43CC044638A5
|
|
@ -0,0 +1 @@
|
||||||
|
ó„Ý g–Þd7èfª>ZrPòV`dB<(÷ ôÈW`½
7¾c´¬n•ËnŠ.ü¾s8lÿ·“*dZUmÊŠí&‹¸ÊhøEëö8mê’<1E>«Y ŸüñrÒý×W’²H%{¸iùFÃÎ<äÿ[0²Ñâ”\yÚø-¯R½L´¨ -'
|
|
@ -0,0 +1,411 @@
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58
|
||||||
|
dir-key-published 2021-11-09 19:16:37
|
||||||
|
dir-key-expires 2023-05-09 19:16:37
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAu/DOrbv/4IAYvyxsy/6ivC3q5yCQBWLKHZGYKQa5G/3rem8wen0f
|
||||||
|
qF7y4ye6U6faWc5kcNMHEKMIeBzMErxwF345qoGHITxbbOWnizgwPgrdCwlK3p0H
|
||||||
|
1XZGU/TTjoaM25P+ZNCBvGmDQRAtgs2odnv+i8hpu6vrcAUZYXmmw/Ag1Ou2AlLC
|
||||||
|
mPpbjV1O5SMylgC4IuCBPr3iA+M1kKkvj4LmwU6pJxjAae76GLzzQ/Ffvi7rRpvU
|
||||||
|
2BHetjehk+7/t8izgbhT4VABtzKgrv9ATnhfEgPeT/WBq0E75iciBBAXRPF5kEA4
|
||||||
|
k++NPy21XpL7jkQ4wnMs2HyiFhHbUwbLcoyQ/JVq/WBboSwStYbkdizRpkhJ1eNg
|
||||||
|
LiD8CPWcZnhWZi9VWrwT0xl+Mu4v6kwo9kVnXhOfcK8Wni9FqiBu2tmNDoGPG1Ac
|
||||||
|
wptYQSIoujuLgn4MARREwo9cWrKp2w+D7Dt4U7U5OrXL7TXjonEKuEHwRhzz1JA8
|
||||||
|
7LXm/wENwn1/AgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAuxJxHCGOw9DgNtw4wqi78OE3djdiLwbie+2CevKMRaO14IhuQGVK
|
||||||
|
w1PYsnTuVLVcJl3Y4QKQ4nnbe1QCiGrLq9wueQy7ZvBeZry3f+QD1Q/PAG19n6/7
|
||||||
|
hlhXclSOJ/jRah0Gi+QXAycKE5RES/Qn4F5fNE7MxzM0ZQHIlszZLNUrcpeLE9nX
|
||||||
|
avlqlSqK8FmLPOpOSRrdPtzKP2sjW9UUFVGMfurDYIC51hkZI/nyy8A1C844sfuF
|
||||||
|
LV6oYpYw5+soA122zBqGqP6vApwFCvWSDcGlx8xj1Irdo+JIDfK8vklu9P11rTWB
|
||||||
|
R7dZw9pD21reD0pf0Bipzneho6iiL++w+QIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
aMzjdOHri8Kmdoy0qt1a33Y9/e5vKkJQkzCKdHN34Il5FMMCkOrJ1yeQgZyp6mU4
|
||||||
|
jPSpUZlr1Iq52x5ers4fH4SybvX16BDq+p6+Zel9f5TpFg1vzdpJH1WOJ3ZoES1N
|
||||||
|
S8CpiXVz8flc5Ez6Dc7uZGSE2fYRl1Pswn3GuLfR1Wjw0VNp1VgHZk6xYXRk/YLx
|
||||||
|
OyjZTWEWAF/0qw3usXtvTvh6wGniVxr0rg3zZbesLXti4TAn3B3N6VG1TPOizna6
|
||||||
|
s26edpQ6RQPigAuccEwU5iaIQEGkIxcoe61qnPvAoWP3Jk/sZAGCqhbya0CBCH8U
|
||||||
|
pEW/OauwlDlr3yXEKh05aQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
XhAoF04YrM2zJUvrQuEsGhU53Pbf1B0jv5F4YkMlRX2y15rKXKI93vQTM1LbnYc0
|
||||||
|
ETkhSOQB2rpnX0bcE+K+x0sWXiMRtR1HSX/oIPDI9MNqHv75eZlEkSaDJHIsQJlj
|
||||||
|
Dd++tMHkRc49nNNo2J25J3TiBU0ecpVYYvtJzynE3W8tX3io6EmvTehkj2o79z0A
|
||||||
|
ax2A5JG65plch0ES2yK2jqgBEmkA/eZENDNQAaERXMFJbbpHIMBaGguwCEieJe77
|
||||||
|
JBAOxJFRGpL6MhMpcvi5MgEMqfAv3AhlBo93n4apT2CYR8PdCHUZyq7FrgwTSJS7
|
||||||
|
ndl3YmvxJ7wnyTXitw0GcSVeQaYMQV+LR9Z1VkmjIwRuHliUn7hR79pYqs3t11aQ
|
||||||
|
muW8jOrx+5QsiTLEPV6Hs0pzXc9XDw7mnJ6M2gxxF8fZCztal3TNLs9+1O22fxME
|
||||||
|
0VU1oS7SG6T4M1YOXgKFUP20gLl8sZf+3lGp3aLZIK8psR3vzggpaRSUKgip4Lqv
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
dir-address 154.35.175.225:80
|
||||||
|
fingerprint EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97
|
||||||
|
dir-key-published 2021-02-08 18:16:07
|
||||||
|
dir-key-expires 2022-02-08 18:16:07
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAwBmqdD+G0q3smN5OBFHCcK5pQH5G1GIpFJ1JxCVEp92tTK4ZHnot
|
||||||
|
9RzMfag6zQFqwLaJ+yEb1DOjTdTMfcUTsj5f3GUqPB+U7shSMAvvAAM+Bx/4m1AU
|
||||||
|
u6sk4XmPB1bCBfcRl4zhnY6XFIbj0ktuBDblcxHz3lDgHFpBoci9sF59mM14MZ09
|
||||||
|
EdwgeckcU5oeq6ApuSlUVaOT8xsKV/yeK4SKaFfDclwPAJuitQ5CpqctP7ExmlrY
|
||||||
|
sboTDtz7/Xa6OccaGDEUf7TRlipvUX6rvlmvHm3qjdixVfExpa8E5QG79GZTL82p
|
||||||
|
1zBd3iqc6QEnRDTiW9cMUeQt4EvrwOUVVYPWo3hp1C/iiNzWraDays2xuhaSB0gj
|
||||||
|
fPatu2CFW5XB2vd9IvIiWeklSFqnF8DL38jDL7DbFiETJreGsDMR03yHWVd0MbPz
|
||||||
|
OrvAxG4tJn+JtnwhzlbRjnfk53jOTbiM0vMV8h/ztapCiJeT/6i7nVQ1xL2boeYw
|
||||||
|
5RDUlwZaQiaXAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEApIIcKBWvD0P2YQtsrFKEF1kprJUCEUlWqzV4mVbTcVdzVQpct8t8
|
||||||
|
NAO8kDbxRSyU2S6gKecusy4H1MJWVAe2qvKIY974espuJwBXWFgT70jSBTFzjMpB
|
||||||
|
dAaTTY+kNZa66kjBjCVolr8UfFvL7HaL3CCtWD9ds7+ep76co1h3s3sD2BWW/M5m
|
||||||
|
V6ML8kYkjRW6SW8YHW6By3G+UuqRiGziJIIwQAoPnNSWrzW6UTLpVRDjdo70bQvU
|
||||||
|
vvfppUuNNji5SFfzSiakxHIse/eHG/rTNSzOvlpjuZxzPIcekr71eu1hCVHb2QdA
|
||||||
|
9Ikc5pUQeB0zImI8WJ9OVJDFUEgjJ9LGtQIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
cy+VPbSGSJ5aI7egCwgNY6mgSlJumULFmUN8gfahvMo5hUwVLqP1FtoKIO8yBUc0
|
||||||
|
Y47pt6G5a0fjm6mjapFbU7IpqIUl+5gLBRKD6ugx+hr2IoqIVJY7WQUvVMBnfqHp
|
||||||
|
Z5N6kXfFBT+EbnbLiUqoRo1/AHC6E6CqI5pdhV86UCFydmuLf/MfwJpXiYRJueqk
|
||||||
|
DnPYEflq+Zu/RReL5aJlVOVuWq0ZpuzUHk4gIicKESLGkv4eI2CvuB5HTeNAB9L5
|
||||||
|
laMe+YpoXqgqMae1HT+rupPXYeONPygFXXbNLNVrR7OjAYG2TOaqdUTQkFefFVtD
|
||||||
|
ungKyPS6LTytSuU/rjWCbQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
sV4ouMb8pmCM3WjLTFxfRVb6qZl8rQ0tYM/AjKz1ufU0UmL7yx/7JMg2InDcYPH3
|
||||||
|
4PIUQrDLoAMxnnNVMDaDGoGDGI5keUmU1eSGvdJYN7okd0aRvA9LFGw4uDVVyB0K
|
||||||
|
l7BOk80y15P34R4G6oPvcR8aCxoiMh9UusbhiVjBr6dAfJGVVxZAO1ZJ8pa8fcrA
|
||||||
|
IbtNks2vut6Oy4oaC7zLCwcbRJM6dSvzcbzBpCf7/b9w6NQNqCBBQkqKgUl0FqKM
|
||||||
|
QRKqHWuhbqcL9+lj7rvgWCEigLu9ff1+E7C4BV7GzOm5FPcRqfkPaMsjQuM/HErH
|
||||||
|
swhf2Ra+Tcdk9gdI4AomqwaoD6B2uKsZkcFpZhq4HAle6rOP9eC16DpqsokpqoW9
|
||||||
|
vb5Mic7ABYVpB4t3o5wOI9D4exXmzv6gpuOyl5rJGL5ORYSEhnMGsKMyPceCGysg
|
||||||
|
SzwfPWBqRTM2LfBxhW05UEBJev4EXk7AA5sr6GkcX/CXeR47pyXQAyc2doZo7Aoq
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 49015F787433103580E3B66A1707A00E60F2D15B
|
||||||
|
dir-key-published 2021-11-28 16:32:54
|
||||||
|
dir-key-expires 2022-02-28 16:32:54
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAxVbS0noZKz1Ei6858RGyyuQgwQUKG4Urrp2BiAzkYxwX+6fURlut
|
||||||
|
AjeLb4XysqCdNdUipuLRQ2QIy1C220QiCHV6jZAsM4tmEq6TpK6q1lxi5YPKqbGS
|
||||||
|
CfUQFT1nO4s4DCYSLCwiRNy6bMe8tNHc0MpXP3loCbPkYCoXrEL6vYIROw3oeGWE
|
||||||
|
KbFPQrzYJAPHgUubBibsY5lkUY9N/5QZw2y1bn+dq9mFOoCIHLd6DkQmySmftnMe
|
||||||
|
QrpYA2WvE4M5yN2HB8QGT7TdzXPPL6889rFw/mjqYExQPX7cqmILkchsB7I5whjA
|
||||||
|
u0oodF8Y9ooK9QT0GeK4h3xQhzNG17anuUxbZ7sxzmBwBNmkNyLWEeIntazyjRFr
|
||||||
|
P2mDY/9YK2JOQKkh3tKl1whcCG9ZtAhKmm/ijG7OrhqtusdGKBXIgALf4f111AK1
|
||||||
|
gNcacDx2fJzRHuNK8zkIORAzStxKdLbAbBNeLENk1zBjSkrxCOJH4mBpr8TXULq1
|
||||||
|
ThLI/8OzZq4LAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAo32l4qg46cqP/sAL+oLmQM0mDiQUy6EtNa73vyy0BJEGWJeImUO4
|
||||||
|
gHNg9pyMFqyF+rP824gAzwX9Un9HaKgFpIrsKcZzg+Yl2vlrBQpJ0NPIkN9oqj27
|
||||||
|
W/A7RftMhH2itv0v87QudD7FqJpxdYNf3wpr9GvsAiHZMBfC88WhCnmJoDBwyucY
|
||||||
|
HFH7gzjPeDx37KD57o2M1KC/SRVtQtrccA/WzcxNypgAYkJu4yE2gaDr2WFn3hFv
|
||||||
|
kscW0jn6+157UuKH0rCNeRFDx8SsSS0nr6Zk/n+dlXzHGDO3vQIKCoRoH9yL4T//
|
||||||
|
hkMYE/4qc9R49VyXxK+n/qU6HQYpQMi+VwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
KKrOMRAg1bx+XFLRjhQB5OFjtupkqkFnGjS3LZQ5FHNwJ7cKG1X7K0aJNAumRPMD
|
||||||
|
w9xraIMuuok46wj35P9Tcy68qi3EqIJP5378ZtdK3Ncy9KkSWJSA9MLPmB3fClL/
|
||||||
|
/5TwboePXRdlt++Bcw9OC83HDuFVBqZArFIvopKf/AJOyViRVHlBmgNKFpm9RJTo
|
||||||
|
XsD415rJAi79tAfXzKuagke6DTVqobMhxrUmp3RjbEEEC6icQ3YX9X6NOPQ4Gwl2
|
||||||
|
bpWOVi3/9EGRge0X8IYsqB6/pnEXM2FSOTMdwo4YQzIgW/HLE9hXjFCx7QcPkcos
|
||||||
|
AZHvl12tKzZF3F9MKPcNyQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
wb40bfNLWyU9pWW+2BAHbrmZZfbs9UEIS/6G66VE6823/r6M90RCmFx1JlwqgmaV
|
||||||
|
/WMbBE9DxFKILyhuQi6whIKoYndg72VDeZL5BzWctalw24VpJePVjeGLcTdJHBVh
|
||||||
|
a6UiQFaQdH+bTX6qNIFv9nNwq7ZzJRBvaYF9bK8kaTrZilFKoRVBxXssBUFjEz6t
|
||||||
|
f+sei5WIiBnzaQOUxdMjvdDAHci4DXwGw1U2M7jcYARo4FfvWkAxzWLxocWmauPM
|
||||||
|
8tDn0fSgMnLlSOR2crnriQMFhYD+9xyxfOq1IDH2IWCKlejz7j3DHSqBYiUSO9oD
|
||||||
|
uX6htwbMWwZQeqt+LttE/zZX1Tcv6PJqemT8uabH0s94W2A3sJpstWJ+0capb+Mj
|
||||||
|
bvTXj7t2ilqa5RX35KKhaQ6wlh4OXZb2ydeJZc7wtyG8eN53aVqJNJQ+WZn4IiTq
|
||||||
|
fefr2ojy2VDJLDHJVNpKQQzmjXtSs+69wCvrqdHGjGAQl5L31LjZgaNLNj14RI+H
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint D586D18309DED4CD6D57C18FDB97EFA96D330566
|
||||||
|
dir-key-published 2021-09-06 18:42:41
|
||||||
|
dir-key-expires 2022-09-06 18:42:41
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAvi5+A+XPw4jxMYhmEI4+MpnaX3dUEbsMGHA+xAMnmVhuxbm3Dn5c
|
||||||
|
TyhQNY2LOlsieE84UYG+J4dABfaFH4w0l6zUJkuytX4+6WRQontw9puR/IcXkRwM
|
||||||
|
8Tv/tY675OYRCm9DgDAWfqZM0IgTzSrYRDl8eFPSFCOP0NhMrQZeUrdKgwAXVZWP
|
||||||
|
xt9nTCwT4K9BMp47LEmZKdEokeVsr0l29Z9v5+r24k9x8EQjDexsoHwlVrxWfarG
|
||||||
|
1klWssfSFpkMN+FkTQnBC6ByiBh5ZKM5AC/HkVFvuHjehUpfrtNk6XNFcKbDvEIg
|
||||||
|
qPdg1QWuuSWpZVA+/EwSBtwMNcq9pv60L8Cm9WCJoSC691WByiGwFCy1/XcBI4J/
|
||||||
|
BkoMEvP3kAxzm92jqGbpFSJawFRPZKy89FDKpha/So3CERQPV0ar+DTpVqDlryWV
|
||||||
|
N4x1IzpPeSHFj7T74q8qdrxx0wcAjWJ9WYoGQif6FK3hHcmbSGSgyvAFeoYxyUCL
|
||||||
|
JHkjBCD4WTWVAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEA1Hguh3PNTfMd7kLD8NupSdye1KB6hhQitx8DipvT71ZaCZYI8fZ3
|
||||||
|
z5xa6fCcJXv/xoz1tzKeJ1n4/AzAbc7ltCyyWkj9CbiB99cEe+sVE9R899eFvPP9
|
||||||
|
DUmsmgy0Bn2MrdfD/N5VeJ219TTtqI75BJMd9n1+r5zUzhji2ihcLWYgi0GVZoec
|
||||||
|
6B+xfPtYbifCdrPRBwrMAW4EhtMKeJfzsYFO220f7x2OmmZB9muesi5O8/0zjwu1
|
||||||
|
xOKldXCFbccTfFN88nYmaO8j0SpG9nOveFXavPs0LyVzhuMkbLXSWAN+M/S6GC4L
|
||||||
|
1kbkjQ6YhuYSnKxGFo/wdax41jrSFCf3qQIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
r2a4uvuN2LUgSuHoWYckJusjzeaEfTTN+DHJdQjJrMueZtxhhz+C+soYoSAvBsHI
|
||||||
|
huc2y0wLbeNMpLXeyGoYh0M4zm6RyjMksHQZbgPjkibflbUI3csJcvaBMQonfo9B
|
||||||
|
knoqOzeQd8NioOlnbYQ+k78swGtg2ndHpK4G4NMBK6ZQrbhrIk0nVhOhaIHpGdiN
|
||||||
|
icr+czGq6SzH4Snp26dJ+J+9SAdTOzgat/C2Othdu122JR2/7GzCnz8dqS3LabN9
|
||||||
|
iWJWMLxayFKi+Z5f1WjCNOVh5lSjpeLjUNSrA1hXXKSRD0eFOQFRvgvO60gyvooH
|
||||||
|
C8amqpSD8HqsCK6MvN7V9g==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
uuQhm7YYbqR4/fGSDWqzwiw40nr7y3laCmfiTDHOA5N6lVOw/tM4bdMbGH58wkkK
|
||||||
|
XBIEz4zQnIT4Sgaumc9PZK3/a8wkx3HgvSNZAEvv5GK2iD8QQNaR0mv7/gbCOLeD
|
||||||
|
4MAsWH7ehc2u0AcebYehYWE7/fknYRfIGLRzeAeR479LgtFIaaZ54lGeEWKA7qBc
|
||||||
|
B3njJcNDlekChydxw2JRMw2GmK7Gn/cVRLjFiG32aaTPA37Ietw6Z8wXEjTy4087
|
||||||
|
KTzTe6puX0g9kCWMaGIBzod+ucNOG9WhgVfy6M+OMddI4KbgizUM7a5c3DZwnQHk
|
||||||
|
nn5yqib/W7NmHZOL1k2qYlKQlbr412bsDgBDoFYSYPIkbO4x7LHJnGGiwxYx4vmx
|
||||||
|
caxDySQtqCcR9ygMrZVrL9W/Z+w2N/KCXnL+SgTmN0x/Saor1ZTkONj5Tfn4dg/W
|
||||||
|
xDxvLO02DpVTfgidUsBeHSnMQn7w0iG0abhWFmYNFDjxZFEWy30mRCEYADC/1NCI
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint ED03BB616EB2F60BEC80151114BB25CEF515B226
|
||||||
|
dir-key-published 2021-03-29 03:27:58
|
||||||
|
dir-key-expires 2022-03-29 03:27:58
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEA1d6uTRiqdMp4BHBYIHKR6NB599Z1Bqw4TbOVkM2N1aSA4V/L/hKI
|
||||||
|
nl6m/2LL/UAS+E3NCFX0dhw2+D7r7BTJyfGwz0H2MR6Py5/rCMAnPl20wCjXk2qY
|
||||||
|
ACQa0rJvIqXobwGnDlvxn4ezsj0IEY/FEb61zHnnPHf6d3uyFR1QT06qEOQyYzML
|
||||||
|
76f/Lud8MUt+8KzsdnadAPL8okNvcS/nqa2bWbbGhC8S8rtDpPg5BhX2ikXa88RM
|
||||||
|
QdrrackdppB2ttHlq9+iH3c8Wyp7bvdH8uhv410W7RnIE4P+KIxt3L0gqkxCjjyh
|
||||||
|
mn9ONcdgNOKe31q2cdW5LOPSIK+I5/VTjYjICza7Euyg03drpoBMGLuuJZY6FXEV
|
||||||
|
auIBncWe+So8FMxqU/fwo5xm6x085U1MwXUmi4XDYpr/kau6ytPnzzw9J++4W9iC
|
||||||
|
em5Jp0vaxrDnPdphqT0FWsBAwsZFL7nZRnmUlTgGsXUa0oSM9/MErDwzELh/NwG4
|
||||||
|
DNyyzRG8iP61AgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAsw2ZJlGsmfDmDwoKbzjOno759Xwqn6JX+tFasI8eRjOFnOyjYzd1
|
||||||
|
XjG6Gj2hVpF/ze2NiTuUyRu3Ybp8G9/gs8VGPljxSHkEugGjQdYFoST02ma0vUHA
|
||||||
|
8YqpBYOiLvsXnqfEkl3Yj6HVxmVJA9j8BxODODlBtxRMJWFrpp/b+qCo/YyGmCh3
|
||||||
|
n0qd3QNqFPLIzwvjWVhaFfga8dXBT73wX9uYT7nT/e3pV7ZvTw0caqi7svNzj0I8
|
||||||
|
/OxOEjoBQEQMQVPT2bNZKBe9X8QKDSgdealZQwBT9wdZ4KndtCj6Y8MVjj15/YtH
|
||||||
|
fWfNyUHgVqOmfDK7m3pHXR9fGgsLQexIfQIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
GyN9MMaPABXJ16WAFIhdzOhNT59BI0RAfV9ZpUJgzkAAmpoj+WwUtWfcrW7a08CT
|
||||||
|
9g60QwJonP/Nh+8iLvQYH5ZyEqsEj0HEUD/yI2kvN41Y5QBD1Sku8Cu4E2UaICzL
|
||||||
|
V63oitjQzppKlVXHyP/SXsI2bUjoHLtT2pBvxRJ84DlZBEQ/ZqS38NN/+Z6DtMR/
|
||||||
|
kn0l7W5yA3bYWzeKy1TeKLWo7p0hHzv/Hswe/eha+27LuwZZwwfSQrRy1fi66Fmj
|
||||||
|
0xBP+iXXtmNleFegFuhEBPXa+9udrT9rodSdazkGPzjyF6HWRMP5DtmTI6ovJDVX
|
||||||
|
60UQ0hNb6KAP+FZKPz9/dA==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
zAgmCR7tf0btsogvBmdxJ7+RWjPBzmDSA7f+zlK0jOc3lDDD4pxuQO6iNcoEDYMC
|
||||||
|
5hkzVoGBMYsxLfLZXFGE518dn79iKr6SQoq87AhnAsIiAfXMk2AWLkWI7MTzZo2U
|
||||||
|
dcgo+7vzxMObk86vzFxYWrSqp6CSZ7RwBRnH3vCGLfOMZ1lXMug+MQAQYAyl6KIR
|
||||||
|
3d/uEu3+sPFJcHQFP3C/7bHDG5j/76kwoFzjSjg974rSjr1j1FbrpNn35mLc+2X/
|
||||||
|
11n7cOADHWaSN3MlLWGsYxuuX2l1w/XZNfFEezDwK3BOotbj5spU2nQ8xbDFPB5+
|
||||||
|
ixDfc00TC3YbveSz+S8W9czfysJt3KaWmQczDtSIXag1qrL52CBGUVGP6+R7xnpR
|
||||||
|
/4QD6yCKmDcNk2D1YnindwYC48ydDt/u9A/97cEBpUbul3feW7eKLk79MIklWlWo
|
||||||
|
3c3aQVH6Ewrb76oXYYwzNbqJOp2ceREu72/Fk/keprVcupVDtVoqHgDDpfOUYTJd
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4
|
||||||
|
dir-key-published 2021-09-01 00:00:00
|
||||||
|
dir-key-expires 2022-03-01 00:00:00
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2
|
||||||
|
R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD
|
||||||
|
0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW
|
||||||
|
1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX
|
||||||
|
O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl
|
||||||
|
+fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ
|
||||||
|
bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz
|
||||||
|
pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV
|
||||||
|
lyS28jsPht9VAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEA+jzmadukj4Q0qLgJ0at+nDXGruO5JD3HsehobiwO8HrdaaImY+rY
|
||||||
|
CZzxRWM4xryQ2AFuAGbSxGoNQT3dTLvjKNVdGY6jPzlS7vxKbPeNZtc/YMvfZ+Fx
|
||||||
|
uEjvaZ6nDbviVtQhtE0J2EZ32n90Ob8YC8l/7zh0hp+mZO6Wf2DGXWjNvG7d8Ucc
|
||||||
|
p5A1ZVIpJ/VQzdlPaocO+6AvxvSBpaIUF0yGpTwofTOjtUmZyuWbhRndsQj1qMcj
|
||||||
|
e8wzOIgr3HZyhO9wztQGkZ8bzHq65oZe0IIOXZu0icZamFGQ5I6y5duCqxDDe4C/
|
||||||
|
v1/6bD1I+/ujLXRMmkcbJ3NZE+KrZg7KIE5ScGbkJIX7vIicqtsf+7VipdOh3/wp
|
||||||
|
qaDxX9Sp2cbVUU0M/aJ14nDSeFlx0XQAgWkPjG2lYtTNEC2zuudBCuCD8es8EhAW
|
||||||
|
FrU94cYg9lVId0NDMOpWPMH2QJFS4tk3Hc66si3+gkCOt2GOaSQeD+gGWkdwDzn3
|
||||||
|
S8iAur2GohFFAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
B4914rKqUc51Q1nq8CrA/e7EaMQ0ug08qlBqWyzZSDiBKVCoQj446ZJMU9VKlzJF
|
||||||
|
XtuURlJ7zswXMze7HceakrkxZAc7GiAGKO5hgbbI8XGLvXn16Lsr/MP1cmbKoI04
|
||||||
|
g5tG9Kx6yOB4r/l2TQY9Tw22YcdJ24W2/mw6TmDv0b+IorsIBnxIDv7Q7j25IkNE
|
||||||
|
hW3F9R+Ntja1RWPqKnptp8nxBt5/2jVr637BFczDv9K509QX+HHKyICA1hnvDDU7
|
||||||
|
N5Y1/mVu4JwQrBAFL857XbobP4QaLsZ34Q8LRE4dveuyw+vjVa1YimZ6h/RvrYyP
|
||||||
|
8DUi4XnzFyztecivXbdSTpMTSMfC4NQXFeT+XStRdWlapZyCFhp74w3wv7HCB0z6
|
||||||
|
7QT1HWMKPRvj1DsHhvPviyLVCL2tl2x+G7aaledOPf6BbhO7VolNeHiubyYCQl2H
|
||||||
|
t/Vy72DZbQeuLhf5GyqVyUm9uugzvVrryUiNUApOW8Xta2dAEBqinDrrY6iMYxh/
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
UrJN3Ey1hSHTaMUAhINCVFhojt48ppxky0bvwztQ9p/Vy7dfRx0APNbL70/XZOrR
|
||||||
|
sRj8zxtx2+tc5Lnkfaah63bmVsUNTgD6LudDaffXiV8XhIeVbzS0r/YJ0U1OsbK+
|
||||||
|
ApDItNDUz+VIJL5JUDjq/6fojFlWPYNIwyk5G8zOM70Atjk6UDyCIihV2u5pofW3
|
||||||
|
znFaFp/XhC14S8lMPZYKbnyl2iQ7UsqLpTxg3EwivIlSVFs5YQe0yXgJFX0oNd9Z
|
||||||
|
gAf3JIonA2g8Oo9EkgRfYCI33AwyVoU3QN1/AmLH2uPWTKhMu7k+OHktuIBfyFTR
|
||||||
|
9jbUq+YTU1ni6kEsJVBP/0I4n9Xb4VYIoqOq0BrcEp3lQ8BCEWjIGwLh1HYc9/DY
|
||||||
|
meE+cwLp0RNU8cuxyrGnkLA350bsNxrDkiaHAkj5ZA8W9VTGYsBxVhbLdQzN3GOm
|
||||||
|
63GJBgjdaOsD6WXs/737nD2sLu6dnA/Jbz84ouZSafQO/FNQZnndfj4osjabmq8O
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 27102BC123E7AF1D4741AE047E160C91ADC76B21
|
||||||
|
dir-key-published 2021-08-21 23:12:45
|
||||||
|
dir-key-expires 2022-08-21 23:12:45
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAuxgnMVH4vwBjMeGvrEODOYcjbCS4N+Wt0SZ6XA5I08HyMf5AbaaF
|
||||||
|
MDscJBRIUOp7DyLmUwK+jp+QI8pUjjKsB8S0ctb/J3Im2T6CXnP2KgEfVmpNVQmV
|
||||||
|
XdMm8cRZl1uIZDDBAXizSQ51f9A17TJh7pF/5khYp/SAzl6aO5ETn7ry0ITiJnNa
|
||||||
|
6cY+400F7ZBA8NuXnCHVGfmpFFsiJKFrS1Kve629eeaNEd3mynRviBXJy5a4NEGf
|
||||||
|
y42Ev8on6SxEnF9OG0NMJ081/+mP+j8Dsl3+Uehzr9B42MQQfDo4RdYGrt9XolBm
|
||||||
|
L4eay1ieZEsFeDy0TMfiGGbr90wo1fgGLHIRSfTNLhhPJ/f9cTZPe98rhSgGWiAd
|
||||||
|
RvK5SljoIOR4qdS9/aiZkj1P+etvh1rIQUcG4/xCOBnouEBK+DDHZFqyMtpMPtV0
|
||||||
|
Bxi20DVaMJcyhdfjVqcRSyuR8tlOnTid6QwBj6kgIIfMaC+4Ht6yO/SYquCWlaZl
|
||||||
|
y7Pu7li8WyW9AgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAu1QJ+qlCbtrYsg9QENtOpvMrEDc+WgH1ZFxEqk0v/ad2ACQYe4dT
|
||||||
|
g1gJ6VZyGths3p8+WQXIA9YbcEr2oajXlLmLT2QAlqlsXMPKwwIpeG4rvR43Wwq5
|
||||||
|
mQ7aX+/VjZ9YZNoZVEAy1O7ti7GIXJzJYDOdgBjLifSjpjcEmSaf+v4E357azs9R
|
||||||
|
ndLHRRwbBLdUl7G3aMkL4ejrv6AAXexPxAL90xsb/MAhVEOQrJNcVMTgII0fSf56
|
||||||
|
P1J17SQwthNZ4rTMo2O9TvWUGNf1sMb9kdm+A2Nwo2CKmUR0uo5wHN4YHSBYFDcb
|
||||||
|
hxRtZlhSFfBJvJgrX8/+CnJrBFC6S/7vJwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
VzdxGiA6egLcZjm3hHrTW+N+7sPwaEcdYR5/GW757MO79O8QwjOLJSa5dOF5yDWa
|
||||||
|
3Ie+QDB2Q++a3+w776zqpFsaGCuEHBCfU9pxatKdoTsExZdQnWHJg4u9YD1JcYvL
|
||||||
|
dZq9uCCWaKa91OjA6/U9zp/LY3tOPUWCyO4MHehHYggzapbcF5uaMG0AT0lZzaXJ
|
||||||
|
vh180N5YGMfm0eYXJqkJyX3WCZhGroh7o3DyaqtBSJ1cY4NzTNgPoCAi3J/XEoCI
|
||||||
|
3JzxfH97uyqQngR1yGb5KggdM2ejci3Ld9q99hjXlzYRtsobUQBTlZca2vUk5ALh
|
||||||
|
vFWU7GzcNIdDjKBUd+IhTQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
WldVJc0L3fByDY9D+Yha2/8Bw5nqRpHu8RL8lU8zXb0rhfiA6DN2aefSCG9WEay1
|
||||||
|
sTVs4zhS8N0+278oP51Lg7S+V6SmXxKZbF3I2zNaFMIPVspRA3OF0R9vCP1YMxeo
|
||||||
|
D4EDQXiRxNNeM9hAjmmLiE0j7ZMetZ88ewwsOOXAvPHmCth09nWdCYKwibwUW/U3
|
||||||
|
w1HXCHK4BdZ7XXkMJNry7kZP/H1/5oYyuKshue4+f8tgRa0xg0wbHDrdbrR1qBBu
|
||||||
|
Xg9Q11hV29RIdD0ZgugUdyGKlpRa6Mb3GD5DzN845sFhCjsPrYyZv7Xo/S+uTtN4
|
||||||
|
t59BtF1TjnsAhUk7shk2W3zzaauzUarkDA1v+mb9NZ3CFsNgfxt6d1yDDyuxJgaC
|
||||||
|
VkIfO9nX9dCORSC9Ow+XOq+D/o4FfSe4q0VvrJJILAcw2Nu1Zg4ZhHBeugP9f4I9
|
||||||
|
p/+ZMrEr+YAKkjPw+uIEdR0l/YZEhcrjymX4FY829LNll2AceqMCKoapFWuEzzDP
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 0232AF901C31A04EE9848595AF9BB7620D4C5B2E
|
||||||
|
dir-key-published 2021-08-01 20:00:02
|
||||||
|
dir-key-expires 2022-08-01 20:00:02
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAu9O0Pueesn0+29BlxZs60mBqehjdQtgSnKOm9QZxbQ0xrMQgbFnR
|
||||||
|
hWbKD8erenyeFk2SF6AJkbyzgYC89hyPW+8GBDmg5bE8fRKjgV/nI3tY2m4rkY3u
|
||||||
|
zSmYIdwqHUUc98Xzt9PaQ8IJAlDBY4XLKrWmJMxSyhBlVEept7+9Tj23qowW44Mz
|
||||||
|
xPJZ1aFkB1FpkD6qmoCzVZbhXy3cGt1nDwdJK7KqlaXziz9pFiw8PzTVU2xFgJNy
|
||||||
|
+nEcT72DBtk3G5K2Riu/aXY/D541Cioj9KMV4Nv4g8aBKx58Xq2tq1pFkc1Bqj1y
|
||||||
|
2MomVR3iskFzlqC8yKWGVe4OP2IaOhtcQJYp5GR9q+dWnr53WWNVxNu3sA9iMal3
|
||||||
|
PJUk5pIYrsmArGew5gmlCe+Al46nPINxc7ouztmStAV+2F6SpZlKOcstnT+KJ52O
|
||||||
|
1xnOSaj/WnzG2o4KZ9UrFQoUNOLQJcelPcC+vrinMk9BQPcB072l9NjpUBC9brsW
|
||||||
|
qTCMStn1jfDDAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAp7nHn/R+ZZ8lza379M7BJ00JYPAcncjtoa2K2Z75bDoxlegGvZXp
|
||||||
|
j4D0WhqksaaOr/+YCSPMcs4HAapKE/Dj09p1kjzh6Xu/iVp51NiQAARS5j3tu/5k
|
||||||
|
WJQ7ig207TdtjmslZIx0UU8pieuenRdyUN0PvjOkaoZIpao1+UlIe47DP+42D3QX
|
||||||
|
1J2wu48QDvt7hUUA3y7yLUyNMarqYBbbXQ/MpH8tcMT76TTN1uilP6W/3j1b6Fr7
|
||||||
|
NGtbUrS1EzOOHnCpgpnD8qGcisDKrHcVkNkh1w+8LW9ef7RGpFPpn022hUQG0WLD
|
||||||
|
5zrh19SAsKetWAZY6RlvyCHPVReajIAovwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
ca3I8mHu2zEOCnzySzdk+rbZLpohw5aa3NmTGFzRUXqOeHClOYHRc+glAyCrtUA3
|
||||||
|
lEa5fiFaZTImKu0J/uroyR4uF5JpzLOfojTQi9P5hMCBSdd7uGzoKC+/dKb2OngZ
|
||||||
|
VkBjptMf1S9dy2lUdDksHnnyg8UrV7EolIHUFNdEBI1LeONkdesZ5oQMg3HRlVpU
|
||||||
|
v+m/7y/MB+o3KAXkQyAxTcV4bKdsHm3Pf0CSfDgOPImwFS4lwyEW0STlOmVHojZR
|
||||||
|
5wm+5dwt9vbD7K6ectbnWtWjiSrvtGjqixO652lxz1qrsid99S5wEzJNhfif8lYe
|
||||||
|
VsB9h7YagNHJHLiGeBT1kg==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
ZkHpe8JVvGsiAsH8gw1eZVIIE8WuM+3Sdd37U2tOyDi7FVwJV+oJ+aKwcCTqTLaj
|
||||||
|
jglQJbg2JdV4ofy49ZaQa6FBGLrzxAS6Gx0jg+28Kzbr0xu9hSX81oPSXKn9KDLr
|
||||||
|
BvmuSqKBB+5B9nIEBjm6FwPc8MjqlvNesuJ3IpW9+e85eB7qsH4ozjHF0GIgpXu/
|
||||||
|
qXrk2TEK1nMc9EN+VCYuy3gAm46GHQEYR1U7gIofCYf7LQpDrfj1sAGquCQ3vYqT
|
||||||
|
Ex3GtqcDV22IME67Cou5rv9OmMnmy1dbeHO4g843RX0LXtEDdGYGSLHzl8EAscrg
|
||||||
|
i55XFlS6z5OwCbdDvFTkHUWRlaiDtoymaxAEW6GUmNjHhgWY9wJwgroVNRsP8Ihi
|
||||||
|
aex9HIND1MY4ERS41Csba/0grf+FahMVI12gwpmrnKfF95QHWw2MEvT1pzZGtMnq
|
||||||
|
XD8mcVNYJtcTvYM/cUa0I4BFD1AyeIP54hEXwIsqHm8KBJpjX/ZpPzksnc4NY8i0
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 23D15D965BC35114467363C165C4F724B64B4F66
|
||||||
|
dir-key-published 2021-09-18 16:07:20
|
||||||
|
dir-key-expires 2022-09-18 16:07:20
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAlv6XS+VppPaQzOgor0YFlcXLWeXiMn5N3VBneXuw8maLOu9oPJ9z
|
||||||
|
2/oMQN8a+VOWTf+/jebGzOBK6MamXpgsIZPQWiT18gZMsYdR8mcqBYqVP3khwUWh
|
||||||
|
9QYkV+m+Auxa0TLzTrsi6dLDJ384XdpDweU+YJghMJNZ1NqiT8ogj84hxs5Tf+Qf
|
||||||
|
bn7EBIcU7SAKr5Lw25KrMb5e3AZSC5MilBS/KLgVTq/GiWb7pKd5pxGwlGolNX8a
|
||||||
|
PccZ2ZT2DrSQsct4wVxhSbUqANI3PfMpXvmUDxWWBgbQwLF02/4gi+13snlHtqwl
|
||||||
|
y1WjE55HVfx1CTX13SStwmF/N3SFtFf1qil3j5qrHdHtKlAYOaTfqab1eLVH1l83
|
||||||
|
LI5QWD7ri9GpPqIjlh6PuaHjaO2FW20SouZtS9jJKwi1l1G3ef1tSlha1cxkRxIp
|
||||||
|
U/ngvQBsoa9X26VfQA4MieZgVVdMVwjCNh2YC9aEXc/KxfcBueZkM1194qP88cVu
|
||||||
|
dOFYaftOkuGPAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEA3OigVlkOvlx54wcY0RRuExNw2sPYHr8m8QP+SnzARDbrubvsKT0S
|
||||||
|
z/+aVWccgacBtihOpF9juQLHb+nqhea9s6QS8XAQ98bqm8foKToWuxnIRS9c+8e1
|
||||||
|
qcENTfh6U2Dr8ckwVcKAPtnLnPtbxuFF5UiqXAPA89ZmtqUPv+DfmDr5fdeb0bCu
|
||||||
|
Lo6TCFLQOcn2Qz1WsSv/2JRkSBy8pgaC01zErgv9oRVIzFfLn8YpfnWZkFiRGwX6
|
||||||
|
/GBLsS19SLLX0xLkPwQ/CwN6OkipOtYi6UNq0osHw9xfm5sCzcnltJShA1YtIp72
|
||||||
|
e1HkTx03a43uAKlJBo1rMD29stVJu9ABEwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
r2YFJIj1zR9iMPWRJYMDEKuLlV0Gbis9232Gog5sS06LpUFPYL6clLDf7eWAimPs
|
||||||
|
u8rUUP4JEjmAY7bWHyqbG3D5iljNin50W7kvY8ip+Vqf64vjNUXFDKUbi0iGkfVC
|
||||||
|
nfX67FL0JF74hqtCtMlS5QPvD4oLsC40DdmPD4kCulaSrMlmsFRGFdl60HeSLbeP
|
||||||
|
oopRA4yYB4ZGJxJUaSuMm6RrcK08G2l7vLfHpxhcJWQVb2fKB7Ds+AogZYnc6ZYF
|
||||||
|
hpGAP9y+Yn8TUUqPMhhZwLw/8eUAhtv8G2aBBxHyctlGvg1YFiquPP6VEn88h9GZ
|
||||||
|
X4d/mLOAQeYWEalQC812iw==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
OlLQuEDdagECnVy1Nke/C7dpS8+8XvgLK/hGgV/OpCWr+Gq8bL6/NpK9GP7EbsUI
|
||||||
|
NxsguJ2r1wkEGTixz88gdKWDCC3evGW1pqnsjkCk69gHGtCxmrFeiCxCSomaOjzw
|
||||||
|
HCnp3TcT1DA4EstoXUqPysVkBYkx8OBO6rGhvE+G1S4bVG/EJkPCMhjPlxX41ON6
|
||||||
|
NWvtf32dviA5W1BrYKWJy/v0pCsApgjZa6qpaLdgqQabG5YEJA0rONS1hL+AcJks
|
||||||
|
CnvkSS7iU/4jrDPfgOLoVxEkH68swLol2Qf0RFHg12EL5kf0xbPnfE84aQyt99an
|
||||||
|
6VAMVIy/tCxR2efZ0+uQmQk7S35uQH/PxZ3/mq6cDMw7+WZdYbrkyfmFK/A+yL2P
|
||||||
|
op71Ik0Xf0Qwd0qMhTZMVPZpZDQmxvr0j0r3xHia0Ez+PhovnnxqI9/cThRQ/ceN
|
||||||
|
jE2cA46H4ZfYn5OdCP+mP9L+MsqJYoHj/SigcIrXUX58R1D0JWVX2KPU+tVyQ03B
|
||||||
|
-----END SIGNATURE-----
|
44395
integration_test/env/default/dev/tor/data-dir-605268872/cached-microdesc-consensus
vendored
Normal file
67608
integration_test/env/default/dev/tor/data-dir-605268872/cached-microdescs.new
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
# Tor state file last generated on 2022-02-04 13:57:02 local time
|
||||||
|
# Other times below are in UTC
|
||||||
|
# You *do not* need to edit this file.
|
||||||
|
|
||||||
|
CircuitBuildTimeBin 875 1
|
||||||
|
CircuitBuildTimeBin 1025 1
|
||||||
|
CircuitBuildTimeBin 1125 1
|
||||||
|
CircuitBuildTimeBin 1175 1
|
||||||
|
CircuitBuildTimeBin 1275 1
|
||||||
|
CircuitBuildTimeBin 1475 1
|
||||||
|
CircuitBuildTimeBin 1875 1
|
||||||
|
CircuitBuildTimeBin 1925 1
|
||||||
|
CircuitBuildTimeBin 2025 1
|
||||||
|
CircuitBuildTimeBin 2375 1
|
||||||
|
Dormant 0
|
||||||
|
Guard in=default rsa_id=D70A5E01EC14D078164D5E587608949F85FD771B nickname=leaders2 sampled_on=2022-01-30T18:34:14 sampled_idx=0 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-02-02T06:04:33 confirmed_idx=1 pb_circ_attempts=13.000000 pb_circ_successes=10.000000 pb_successful_circuits_closed=10.000000 pb_timeouts=1.000000
|
||||||
|
Guard in=default rsa_id=598C8E4E92D8D7750991D23F6776EE92EC1A00C1 nickname=Unnamed sampled_on=2022-02-01T01:24:07 sampled_idx=1 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-01-29T15:09:32 confirmed_idx=2
|
||||||
|
Guard in=default rsa_id=013ABAED8F4CDB677BE0B5212E4B2583B86035EE nickname=b0rken sampled_on=2022-01-27T22:32:07 sampled_idx=2 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-02-03T10:23:27 confirmed_idx=0
|
||||||
|
Guard in=default rsa_id=66DFC51E724E38DDCB3AB67DDF4C0BB0F1F49C0B nickname=Seccom04 sampled_on=2022-01-26T06:52:32 sampled_idx=3 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=9400AF52EC2929DA41E6DDD3B684F23643BC316C nickname=BM03 sampled_on=2022-01-30T16:35:42 sampled_idx=4 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=DD0C8EEC5CA402A9FA4478F10C31A440F71F6885 nickname=chaosDelroth sampled_on=2022-01-31T18:30:35 sampled_idx=5 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=6055FE90C18DD4B2593A9D0E02DDC4D68E9BA62E nickname=elects2 sampled_on=2022-01-29T10:24:36 sampled_idx=6 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=79233E8202A0EE755B39BC24BE80939C023B3FCD nickname=m83fr2 sampled_on=2022-02-01T17:58:48 sampled_idx=7 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=C4BDBFD1049EE1D4F6977C42485F94CD5F97BA92 nickname=lenin sampled_on=2022-01-29T15:57:51 sampled_idx=8 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=876C5AC1D2811E650AD4C78B77841C1ACB3B0088 nickname=whoUSicebeer05b sampled_on=2022-01-29T15:26:49 sampled_idx=9 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=FF8B7CAD5F508972509D79F933FB24D2F524AB75 nickname=einNettesRelay sampled_on=2022-02-02T09:24:01 sampled_idx=10 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=BFB14B9ADF1F19E59258CAE7FCDBAAC9937B7B10 nickname=Yggdrasil sampled_on=2022-02-02T13:42:48 sampled_idx=11 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=ACBD72F9395DE8DE293D37CCF7733F1BE23EDA53 nickname=hopUSicebeer7b sampled_on=2022-02-02T18:42:20 sampled_idx=12 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=F79370BA46ADC03CC10866924EE4A3C470BAFE93 nickname=skankhunt42de4 sampled_on=2022-01-25T11:00:17 sampled_idx=13 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=C1939D36649DE98A202429631D8EFC70128D5F5F nickname=rinderwahnRelay10L sampled_on=2022-01-26T01:10:26 sampled_idx=14 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=3BC258C20BBB8094C12DA7CB982B36D1502FAC3C nickname=Assange041us sampled_on=2022-01-31T23:57:37 sampled_idx=15 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=B2242163F681F77F93190663AC5F696ACF76C4FD nickname=torexit42 sampled_on=2022-02-03T12:50:47 sampled_idx=16 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=1F953ACBFB9F44CE38543B7E9C0E0BE1BDC7E941 nickname=bauruine sampled_on=2022-01-24T00:30:24 sampled_idx=17 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=F00C8B7589FEE52BE84387CDB422C1F1386979C0 nickname=JennyRelay sampled_on=2022-01-30T03:59:39 sampled_idx=18 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=CD39C258265B25EAA4ABA4FDCB2DF98104CAA362 nickname=normaray sampled_on=2022-01-30T09:12:11 sampled_idx=19 sampled_by=0.4.5.9 listed=1
|
||||||
|
LastWritten 2022-02-04 21:57:02
|
||||||
|
MinutesSinceUserActivity 3
|
||||||
|
TorVersion Tor 0.4.5.9 (git-d0ed04d50e80fe1c)
|
||||||
|
TotalBuildTimes 10
|
|
@ -0,0 +1,3 @@
|
||||||
|
SocksPort 9735 OnionTrafficOnly
|
||||||
|
ControlPort 9736
|
||||||
|
HashedControlPassword 16:178423CBFA6B25BD608424EE12A1FACF5D36FF43215636A5917F8D64DF
|
|
@ -0,0 +1,2 @@
|
||||||
|
DÍkHzöĺ’N(Ăĺ•őŐ`x<>ć—×ë#€ÍěĎ3—]Öc˛QŽ,Ą2_Ś3‰őťŞRC6~-zSÉĘ?JŽčĐ<>4 fřŔăhŢýüv˝F†8áBü1Q\˛"lHh5í§
<¦‹;$J3č"źúBamT5<Á4îě•Żcj™ÚŽśËgˇŹÉ›/<2F>‰vęĽnKÄßVG†Ű~YdŞG ÝrQPÁrôŕ<C3B4>l›jěăČ-Aľ‹‹Z’Ľy÷_Ľ¸˙˛M·ôÄĽĂ!AX^HR˘¦ç<>őX;ăŘ©Ô)@2šŔ”tŕÍŁä ý´[cdX®ĹĹ+ý,0wa}ß%<25><11>
|
||||||
|
Ď9˘x[ÝČNP]Ĺ5o‘_‘M@Ą†™±!©•Ű0:IÄŮóv€ó;ź ÔĂP¨Öe?€˛Śip*‰{<ŐČ—´,RyMnď-‡gËťëĺÉfŹÚV›<56>Dá>łĐ;S8őĎ0l¦k
"ľÖöĘ1˝żA4ţ<11>vG6î€Uş^–"zÓ«H¸´e”S•<53>°u\čč=Ś5ńë¨Ů¤»]aď˝3ąďí©g`î-SŻŢŰ…ý#ăE÷× ¸=Śµ˘W,8đdŚĚä.˙ŽŇ‰=şPüÖ•Ąń_<C584>jäĎřĚvyěž,Ľî<˙xokV»`<60>vQ|Ć/©˙ťs˝0şę-tÖ-ßĂ[şa›=ýôßć<>ŕé÷µ×łëöNřmďV!qŘŹZ†Đ˘˛Ł ̲±saŢSúT‚ż€”ôîěuDąL<>-‘Ç"šŇíRşŁŰ<*'ófgߧČM~ŇŚ"sŐ<73>âl/xuĹ<řsÂÄ4÷~Ůf>yś§`¦NÝ{ľ¨b!Ey'ˇězęoZ!×<>\"´a(Ýp,PhŔrZ…Ő‹Mµ-…ë+ĐľÇƹɌťÎĘÝô\}ë~ł?sJL|ú©z‚˙·°IaXYh/áRüą2;vą“u§…ÉĽ<C389>P€(
|
|
@ -0,0 +1,411 @@
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4
|
||||||
|
dir-key-published 2021-09-01 00:00:00
|
||||||
|
dir-key-expires 2022-03-01 00:00:00
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEA7cZXvDRxfjDYtr9/9UsQ852+6cmHMr8VVh8GkLwbq3RzqjkULwQ2
|
||||||
|
R9mFvG4FnqMcMKXi62rYYA3fZL1afhT804cpvyp/D3dPM8QxW88fafFAgIFP4LiD
|
||||||
|
0JYjnF8cva5qZ0nzlWnMXLb32IXSvsGSE2FRyAV0YN9a6k967LSgCfUnZ+IKMezW
|
||||||
|
1vhL9YK4QIfsDowgtVsavg63GzGmA7JvZmn77+/J5wKz11vGr7Wttf8XABbH2taX
|
||||||
|
O9j/KGBOX2OKhoF3mXfZSmUO2dV9NMwtkJ7zD///Ny6sfApWV6kVP4O9TdG3bAsl
|
||||||
|
+fHCoCKgF/jAAWzh6VckQTOPzQZaH5aMWfXrDlzFWg17MjonI+bBTD2Ex2pHczzJ
|
||||||
|
bN7coDMRH2SuOXv8wFf27KdUxZ/GcrXSRGzlRLygxqlripUanjVGN2JvrVQVr0kz
|
||||||
|
pjNjiZl2z8ZyZ5d4zQuBi074JPGgx62xAstP37v1mPw14sIWfLgY16ewYuS5bCxV
|
||||||
|
lyS28jsPht9VAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEA+jzmadukj4Q0qLgJ0at+nDXGruO5JD3HsehobiwO8HrdaaImY+rY
|
||||||
|
CZzxRWM4xryQ2AFuAGbSxGoNQT3dTLvjKNVdGY6jPzlS7vxKbPeNZtc/YMvfZ+Fx
|
||||||
|
uEjvaZ6nDbviVtQhtE0J2EZ32n90Ob8YC8l/7zh0hp+mZO6Wf2DGXWjNvG7d8Ucc
|
||||||
|
p5A1ZVIpJ/VQzdlPaocO+6AvxvSBpaIUF0yGpTwofTOjtUmZyuWbhRndsQj1qMcj
|
||||||
|
e8wzOIgr3HZyhO9wztQGkZ8bzHq65oZe0IIOXZu0icZamFGQ5I6y5duCqxDDe4C/
|
||||||
|
v1/6bD1I+/ujLXRMmkcbJ3NZE+KrZg7KIE5ScGbkJIX7vIicqtsf+7VipdOh3/wp
|
||||||
|
qaDxX9Sp2cbVUU0M/aJ14nDSeFlx0XQAgWkPjG2lYtTNEC2zuudBCuCD8es8EhAW
|
||||||
|
FrU94cYg9lVId0NDMOpWPMH2QJFS4tk3Hc66si3+gkCOt2GOaSQeD+gGWkdwDzn3
|
||||||
|
S8iAur2GohFFAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
B4914rKqUc51Q1nq8CrA/e7EaMQ0ug08qlBqWyzZSDiBKVCoQj446ZJMU9VKlzJF
|
||||||
|
XtuURlJ7zswXMze7HceakrkxZAc7GiAGKO5hgbbI8XGLvXn16Lsr/MP1cmbKoI04
|
||||||
|
g5tG9Kx6yOB4r/l2TQY9Tw22YcdJ24W2/mw6TmDv0b+IorsIBnxIDv7Q7j25IkNE
|
||||||
|
hW3F9R+Ntja1RWPqKnptp8nxBt5/2jVr637BFczDv9K509QX+HHKyICA1hnvDDU7
|
||||||
|
N5Y1/mVu4JwQrBAFL857XbobP4QaLsZ34Q8LRE4dveuyw+vjVa1YimZ6h/RvrYyP
|
||||||
|
8DUi4XnzFyztecivXbdSTpMTSMfC4NQXFeT+XStRdWlapZyCFhp74w3wv7HCB0z6
|
||||||
|
7QT1HWMKPRvj1DsHhvPviyLVCL2tl2x+G7aaledOPf6BbhO7VolNeHiubyYCQl2H
|
||||||
|
t/Vy72DZbQeuLhf5GyqVyUm9uugzvVrryUiNUApOW8Xta2dAEBqinDrrY6iMYxh/
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
UrJN3Ey1hSHTaMUAhINCVFhojt48ppxky0bvwztQ9p/Vy7dfRx0APNbL70/XZOrR
|
||||||
|
sRj8zxtx2+tc5Lnkfaah63bmVsUNTgD6LudDaffXiV8XhIeVbzS0r/YJ0U1OsbK+
|
||||||
|
ApDItNDUz+VIJL5JUDjq/6fojFlWPYNIwyk5G8zOM70Atjk6UDyCIihV2u5pofW3
|
||||||
|
znFaFp/XhC14S8lMPZYKbnyl2iQ7UsqLpTxg3EwivIlSVFs5YQe0yXgJFX0oNd9Z
|
||||||
|
gAf3JIonA2g8Oo9EkgRfYCI33AwyVoU3QN1/AmLH2uPWTKhMu7k+OHktuIBfyFTR
|
||||||
|
9jbUq+YTU1ni6kEsJVBP/0I4n9Xb4VYIoqOq0BrcEp3lQ8BCEWjIGwLh1HYc9/DY
|
||||||
|
meE+cwLp0RNU8cuxyrGnkLA350bsNxrDkiaHAkj5ZA8W9VTGYsBxVhbLdQzN3GOm
|
||||||
|
63GJBgjdaOsD6WXs/737nD2sLu6dnA/Jbz84ouZSafQO/FNQZnndfj4osjabmq8O
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint D586D18309DED4CD6D57C18FDB97EFA96D330566
|
||||||
|
dir-key-published 2021-09-06 18:42:41
|
||||||
|
dir-key-expires 2022-09-06 18:42:41
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAvi5+A+XPw4jxMYhmEI4+MpnaX3dUEbsMGHA+xAMnmVhuxbm3Dn5c
|
||||||
|
TyhQNY2LOlsieE84UYG+J4dABfaFH4w0l6zUJkuytX4+6WRQontw9puR/IcXkRwM
|
||||||
|
8Tv/tY675OYRCm9DgDAWfqZM0IgTzSrYRDl8eFPSFCOP0NhMrQZeUrdKgwAXVZWP
|
||||||
|
xt9nTCwT4K9BMp47LEmZKdEokeVsr0l29Z9v5+r24k9x8EQjDexsoHwlVrxWfarG
|
||||||
|
1klWssfSFpkMN+FkTQnBC6ByiBh5ZKM5AC/HkVFvuHjehUpfrtNk6XNFcKbDvEIg
|
||||||
|
qPdg1QWuuSWpZVA+/EwSBtwMNcq9pv60L8Cm9WCJoSC691WByiGwFCy1/XcBI4J/
|
||||||
|
BkoMEvP3kAxzm92jqGbpFSJawFRPZKy89FDKpha/So3CERQPV0ar+DTpVqDlryWV
|
||||||
|
N4x1IzpPeSHFj7T74q8qdrxx0wcAjWJ9WYoGQif6FK3hHcmbSGSgyvAFeoYxyUCL
|
||||||
|
JHkjBCD4WTWVAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEA1Hguh3PNTfMd7kLD8NupSdye1KB6hhQitx8DipvT71ZaCZYI8fZ3
|
||||||
|
z5xa6fCcJXv/xoz1tzKeJ1n4/AzAbc7ltCyyWkj9CbiB99cEe+sVE9R899eFvPP9
|
||||||
|
DUmsmgy0Bn2MrdfD/N5VeJ219TTtqI75BJMd9n1+r5zUzhji2ihcLWYgi0GVZoec
|
||||||
|
6B+xfPtYbifCdrPRBwrMAW4EhtMKeJfzsYFO220f7x2OmmZB9muesi5O8/0zjwu1
|
||||||
|
xOKldXCFbccTfFN88nYmaO8j0SpG9nOveFXavPs0LyVzhuMkbLXSWAN+M/S6GC4L
|
||||||
|
1kbkjQ6YhuYSnKxGFo/wdax41jrSFCf3qQIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
r2a4uvuN2LUgSuHoWYckJusjzeaEfTTN+DHJdQjJrMueZtxhhz+C+soYoSAvBsHI
|
||||||
|
huc2y0wLbeNMpLXeyGoYh0M4zm6RyjMksHQZbgPjkibflbUI3csJcvaBMQonfo9B
|
||||||
|
knoqOzeQd8NioOlnbYQ+k78swGtg2ndHpK4G4NMBK6ZQrbhrIk0nVhOhaIHpGdiN
|
||||||
|
icr+czGq6SzH4Snp26dJ+J+9SAdTOzgat/C2Othdu122JR2/7GzCnz8dqS3LabN9
|
||||||
|
iWJWMLxayFKi+Z5f1WjCNOVh5lSjpeLjUNSrA1hXXKSRD0eFOQFRvgvO60gyvooH
|
||||||
|
C8amqpSD8HqsCK6MvN7V9g==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
uuQhm7YYbqR4/fGSDWqzwiw40nr7y3laCmfiTDHOA5N6lVOw/tM4bdMbGH58wkkK
|
||||||
|
XBIEz4zQnIT4Sgaumc9PZK3/a8wkx3HgvSNZAEvv5GK2iD8QQNaR0mv7/gbCOLeD
|
||||||
|
4MAsWH7ehc2u0AcebYehYWE7/fknYRfIGLRzeAeR479LgtFIaaZ54lGeEWKA7qBc
|
||||||
|
B3njJcNDlekChydxw2JRMw2GmK7Gn/cVRLjFiG32aaTPA37Ietw6Z8wXEjTy4087
|
||||||
|
KTzTe6puX0g9kCWMaGIBzod+ucNOG9WhgVfy6M+OMddI4KbgizUM7a5c3DZwnQHk
|
||||||
|
nn5yqib/W7NmHZOL1k2qYlKQlbr412bsDgBDoFYSYPIkbO4x7LHJnGGiwxYx4vmx
|
||||||
|
caxDySQtqCcR9ygMrZVrL9W/Z+w2N/KCXnL+SgTmN0x/Saor1ZTkONj5Tfn4dg/W
|
||||||
|
xDxvLO02DpVTfgidUsBeHSnMQn7w0iG0abhWFmYNFDjxZFEWy30mRCEYADC/1NCI
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 49015F787433103580E3B66A1707A00E60F2D15B
|
||||||
|
dir-key-published 2021-11-28 16:32:54
|
||||||
|
dir-key-expires 2022-02-28 16:32:54
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAxVbS0noZKz1Ei6858RGyyuQgwQUKG4Urrp2BiAzkYxwX+6fURlut
|
||||||
|
AjeLb4XysqCdNdUipuLRQ2QIy1C220QiCHV6jZAsM4tmEq6TpK6q1lxi5YPKqbGS
|
||||||
|
CfUQFT1nO4s4DCYSLCwiRNy6bMe8tNHc0MpXP3loCbPkYCoXrEL6vYIROw3oeGWE
|
||||||
|
KbFPQrzYJAPHgUubBibsY5lkUY9N/5QZw2y1bn+dq9mFOoCIHLd6DkQmySmftnMe
|
||||||
|
QrpYA2WvE4M5yN2HB8QGT7TdzXPPL6889rFw/mjqYExQPX7cqmILkchsB7I5whjA
|
||||||
|
u0oodF8Y9ooK9QT0GeK4h3xQhzNG17anuUxbZ7sxzmBwBNmkNyLWEeIntazyjRFr
|
||||||
|
P2mDY/9YK2JOQKkh3tKl1whcCG9ZtAhKmm/ijG7OrhqtusdGKBXIgALf4f111AK1
|
||||||
|
gNcacDx2fJzRHuNK8zkIORAzStxKdLbAbBNeLENk1zBjSkrxCOJH4mBpr8TXULq1
|
||||||
|
ThLI/8OzZq4LAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAo32l4qg46cqP/sAL+oLmQM0mDiQUy6EtNa73vyy0BJEGWJeImUO4
|
||||||
|
gHNg9pyMFqyF+rP824gAzwX9Un9HaKgFpIrsKcZzg+Yl2vlrBQpJ0NPIkN9oqj27
|
||||||
|
W/A7RftMhH2itv0v87QudD7FqJpxdYNf3wpr9GvsAiHZMBfC88WhCnmJoDBwyucY
|
||||||
|
HFH7gzjPeDx37KD57o2M1KC/SRVtQtrccA/WzcxNypgAYkJu4yE2gaDr2WFn3hFv
|
||||||
|
kscW0jn6+157UuKH0rCNeRFDx8SsSS0nr6Zk/n+dlXzHGDO3vQIKCoRoH9yL4T//
|
||||||
|
hkMYE/4qc9R49VyXxK+n/qU6HQYpQMi+VwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
KKrOMRAg1bx+XFLRjhQB5OFjtupkqkFnGjS3LZQ5FHNwJ7cKG1X7K0aJNAumRPMD
|
||||||
|
w9xraIMuuok46wj35P9Tcy68qi3EqIJP5378ZtdK3Ncy9KkSWJSA9MLPmB3fClL/
|
||||||
|
/5TwboePXRdlt++Bcw9OC83HDuFVBqZArFIvopKf/AJOyViRVHlBmgNKFpm9RJTo
|
||||||
|
XsD415rJAi79tAfXzKuagke6DTVqobMhxrUmp3RjbEEEC6icQ3YX9X6NOPQ4Gwl2
|
||||||
|
bpWOVi3/9EGRge0X8IYsqB6/pnEXM2FSOTMdwo4YQzIgW/HLE9hXjFCx7QcPkcos
|
||||||
|
AZHvl12tKzZF3F9MKPcNyQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
wb40bfNLWyU9pWW+2BAHbrmZZfbs9UEIS/6G66VE6823/r6M90RCmFx1JlwqgmaV
|
||||||
|
/WMbBE9DxFKILyhuQi6whIKoYndg72VDeZL5BzWctalw24VpJePVjeGLcTdJHBVh
|
||||||
|
a6UiQFaQdH+bTX6qNIFv9nNwq7ZzJRBvaYF9bK8kaTrZilFKoRVBxXssBUFjEz6t
|
||||||
|
f+sei5WIiBnzaQOUxdMjvdDAHci4DXwGw1U2M7jcYARo4FfvWkAxzWLxocWmauPM
|
||||||
|
8tDn0fSgMnLlSOR2crnriQMFhYD+9xyxfOq1IDH2IWCKlejz7j3DHSqBYiUSO9oD
|
||||||
|
uX6htwbMWwZQeqt+LttE/zZX1Tcv6PJqemT8uabH0s94W2A3sJpstWJ+0capb+Mj
|
||||||
|
bvTXj7t2ilqa5RX35KKhaQ6wlh4OXZb2ydeJZc7wtyG8eN53aVqJNJQ+WZn4IiTq
|
||||||
|
fefr2ojy2VDJLDHJVNpKQQzmjXtSs+69wCvrqdHGjGAQl5L31LjZgaNLNj14RI+H
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 27102BC123E7AF1D4741AE047E160C91ADC76B21
|
||||||
|
dir-key-published 2021-08-21 23:12:45
|
||||||
|
dir-key-expires 2022-08-21 23:12:45
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAuxgnMVH4vwBjMeGvrEODOYcjbCS4N+Wt0SZ6XA5I08HyMf5AbaaF
|
||||||
|
MDscJBRIUOp7DyLmUwK+jp+QI8pUjjKsB8S0ctb/J3Im2T6CXnP2KgEfVmpNVQmV
|
||||||
|
XdMm8cRZl1uIZDDBAXizSQ51f9A17TJh7pF/5khYp/SAzl6aO5ETn7ry0ITiJnNa
|
||||||
|
6cY+400F7ZBA8NuXnCHVGfmpFFsiJKFrS1Kve629eeaNEd3mynRviBXJy5a4NEGf
|
||||||
|
y42Ev8on6SxEnF9OG0NMJ081/+mP+j8Dsl3+Uehzr9B42MQQfDo4RdYGrt9XolBm
|
||||||
|
L4eay1ieZEsFeDy0TMfiGGbr90wo1fgGLHIRSfTNLhhPJ/f9cTZPe98rhSgGWiAd
|
||||||
|
RvK5SljoIOR4qdS9/aiZkj1P+etvh1rIQUcG4/xCOBnouEBK+DDHZFqyMtpMPtV0
|
||||||
|
Bxi20DVaMJcyhdfjVqcRSyuR8tlOnTid6QwBj6kgIIfMaC+4Ht6yO/SYquCWlaZl
|
||||||
|
y7Pu7li8WyW9AgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAu1QJ+qlCbtrYsg9QENtOpvMrEDc+WgH1ZFxEqk0v/ad2ACQYe4dT
|
||||||
|
g1gJ6VZyGths3p8+WQXIA9YbcEr2oajXlLmLT2QAlqlsXMPKwwIpeG4rvR43Wwq5
|
||||||
|
mQ7aX+/VjZ9YZNoZVEAy1O7ti7GIXJzJYDOdgBjLifSjpjcEmSaf+v4E357azs9R
|
||||||
|
ndLHRRwbBLdUl7G3aMkL4ejrv6AAXexPxAL90xsb/MAhVEOQrJNcVMTgII0fSf56
|
||||||
|
P1J17SQwthNZ4rTMo2O9TvWUGNf1sMb9kdm+A2Nwo2CKmUR0uo5wHN4YHSBYFDcb
|
||||||
|
hxRtZlhSFfBJvJgrX8/+CnJrBFC6S/7vJwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
VzdxGiA6egLcZjm3hHrTW+N+7sPwaEcdYR5/GW757MO79O8QwjOLJSa5dOF5yDWa
|
||||||
|
3Ie+QDB2Q++a3+w776zqpFsaGCuEHBCfU9pxatKdoTsExZdQnWHJg4u9YD1JcYvL
|
||||||
|
dZq9uCCWaKa91OjA6/U9zp/LY3tOPUWCyO4MHehHYggzapbcF5uaMG0AT0lZzaXJ
|
||||||
|
vh180N5YGMfm0eYXJqkJyX3WCZhGroh7o3DyaqtBSJ1cY4NzTNgPoCAi3J/XEoCI
|
||||||
|
3JzxfH97uyqQngR1yGb5KggdM2ejci3Ld9q99hjXlzYRtsobUQBTlZca2vUk5ALh
|
||||||
|
vFWU7GzcNIdDjKBUd+IhTQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
WldVJc0L3fByDY9D+Yha2/8Bw5nqRpHu8RL8lU8zXb0rhfiA6DN2aefSCG9WEay1
|
||||||
|
sTVs4zhS8N0+278oP51Lg7S+V6SmXxKZbF3I2zNaFMIPVspRA3OF0R9vCP1YMxeo
|
||||||
|
D4EDQXiRxNNeM9hAjmmLiE0j7ZMetZ88ewwsOOXAvPHmCth09nWdCYKwibwUW/U3
|
||||||
|
w1HXCHK4BdZ7XXkMJNry7kZP/H1/5oYyuKshue4+f8tgRa0xg0wbHDrdbrR1qBBu
|
||||||
|
Xg9Q11hV29RIdD0ZgugUdyGKlpRa6Mb3GD5DzN845sFhCjsPrYyZv7Xo/S+uTtN4
|
||||||
|
t59BtF1TjnsAhUk7shk2W3zzaauzUarkDA1v+mb9NZ3CFsNgfxt6d1yDDyuxJgaC
|
||||||
|
VkIfO9nX9dCORSC9Ow+XOq+D/o4FfSe4q0VvrJJILAcw2Nu1Zg4ZhHBeugP9f4I9
|
||||||
|
p/+ZMrEr+YAKkjPw+uIEdR0l/YZEhcrjymX4FY829LNll2AceqMCKoapFWuEzzDP
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint ED03BB616EB2F60BEC80151114BB25CEF515B226
|
||||||
|
dir-key-published 2021-03-29 03:27:58
|
||||||
|
dir-key-expires 2022-03-29 03:27:58
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEA1d6uTRiqdMp4BHBYIHKR6NB599Z1Bqw4TbOVkM2N1aSA4V/L/hKI
|
||||||
|
nl6m/2LL/UAS+E3NCFX0dhw2+D7r7BTJyfGwz0H2MR6Py5/rCMAnPl20wCjXk2qY
|
||||||
|
ACQa0rJvIqXobwGnDlvxn4ezsj0IEY/FEb61zHnnPHf6d3uyFR1QT06qEOQyYzML
|
||||||
|
76f/Lud8MUt+8KzsdnadAPL8okNvcS/nqa2bWbbGhC8S8rtDpPg5BhX2ikXa88RM
|
||||||
|
QdrrackdppB2ttHlq9+iH3c8Wyp7bvdH8uhv410W7RnIE4P+KIxt3L0gqkxCjjyh
|
||||||
|
mn9ONcdgNOKe31q2cdW5LOPSIK+I5/VTjYjICza7Euyg03drpoBMGLuuJZY6FXEV
|
||||||
|
auIBncWe+So8FMxqU/fwo5xm6x085U1MwXUmi4XDYpr/kau6ytPnzzw9J++4W9iC
|
||||||
|
em5Jp0vaxrDnPdphqT0FWsBAwsZFL7nZRnmUlTgGsXUa0oSM9/MErDwzELh/NwG4
|
||||||
|
DNyyzRG8iP61AgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAsw2ZJlGsmfDmDwoKbzjOno759Xwqn6JX+tFasI8eRjOFnOyjYzd1
|
||||||
|
XjG6Gj2hVpF/ze2NiTuUyRu3Ybp8G9/gs8VGPljxSHkEugGjQdYFoST02ma0vUHA
|
||||||
|
8YqpBYOiLvsXnqfEkl3Yj6HVxmVJA9j8BxODODlBtxRMJWFrpp/b+qCo/YyGmCh3
|
||||||
|
n0qd3QNqFPLIzwvjWVhaFfga8dXBT73wX9uYT7nT/e3pV7ZvTw0caqi7svNzj0I8
|
||||||
|
/OxOEjoBQEQMQVPT2bNZKBe9X8QKDSgdealZQwBT9wdZ4KndtCj6Y8MVjj15/YtH
|
||||||
|
fWfNyUHgVqOmfDK7m3pHXR9fGgsLQexIfQIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
GyN9MMaPABXJ16WAFIhdzOhNT59BI0RAfV9ZpUJgzkAAmpoj+WwUtWfcrW7a08CT
|
||||||
|
9g60QwJonP/Nh+8iLvQYH5ZyEqsEj0HEUD/yI2kvN41Y5QBD1Sku8Cu4E2UaICzL
|
||||||
|
V63oitjQzppKlVXHyP/SXsI2bUjoHLtT2pBvxRJ84DlZBEQ/ZqS38NN/+Z6DtMR/
|
||||||
|
kn0l7W5yA3bYWzeKy1TeKLWo7p0hHzv/Hswe/eha+27LuwZZwwfSQrRy1fi66Fmj
|
||||||
|
0xBP+iXXtmNleFegFuhEBPXa+9udrT9rodSdazkGPzjyF6HWRMP5DtmTI6ovJDVX
|
||||||
|
60UQ0hNb6KAP+FZKPz9/dA==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
zAgmCR7tf0btsogvBmdxJ7+RWjPBzmDSA7f+zlK0jOc3lDDD4pxuQO6iNcoEDYMC
|
||||||
|
5hkzVoGBMYsxLfLZXFGE518dn79iKr6SQoq87AhnAsIiAfXMk2AWLkWI7MTzZo2U
|
||||||
|
dcgo+7vzxMObk86vzFxYWrSqp6CSZ7RwBRnH3vCGLfOMZ1lXMug+MQAQYAyl6KIR
|
||||||
|
3d/uEu3+sPFJcHQFP3C/7bHDG5j/76kwoFzjSjg974rSjr1j1FbrpNn35mLc+2X/
|
||||||
|
11n7cOADHWaSN3MlLWGsYxuuX2l1w/XZNfFEezDwK3BOotbj5spU2nQ8xbDFPB5+
|
||||||
|
ixDfc00TC3YbveSz+S8W9czfysJt3KaWmQczDtSIXag1qrL52CBGUVGP6+R7xnpR
|
||||||
|
/4QD6yCKmDcNk2D1YnindwYC48ydDt/u9A/97cEBpUbul3feW7eKLk79MIklWlWo
|
||||||
|
3c3aQVH6Ewrb76oXYYwzNbqJOp2ceREu72/Fk/keprVcupVDtVoqHgDDpfOUYTJd
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 23D15D965BC35114467363C165C4F724B64B4F66
|
||||||
|
dir-key-published 2021-09-18 16:07:20
|
||||||
|
dir-key-expires 2022-09-18 16:07:20
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAlv6XS+VppPaQzOgor0YFlcXLWeXiMn5N3VBneXuw8maLOu9oPJ9z
|
||||||
|
2/oMQN8a+VOWTf+/jebGzOBK6MamXpgsIZPQWiT18gZMsYdR8mcqBYqVP3khwUWh
|
||||||
|
9QYkV+m+Auxa0TLzTrsi6dLDJ384XdpDweU+YJghMJNZ1NqiT8ogj84hxs5Tf+Qf
|
||||||
|
bn7EBIcU7SAKr5Lw25KrMb5e3AZSC5MilBS/KLgVTq/GiWb7pKd5pxGwlGolNX8a
|
||||||
|
PccZ2ZT2DrSQsct4wVxhSbUqANI3PfMpXvmUDxWWBgbQwLF02/4gi+13snlHtqwl
|
||||||
|
y1WjE55HVfx1CTX13SStwmF/N3SFtFf1qil3j5qrHdHtKlAYOaTfqab1eLVH1l83
|
||||||
|
LI5QWD7ri9GpPqIjlh6PuaHjaO2FW20SouZtS9jJKwi1l1G3ef1tSlha1cxkRxIp
|
||||||
|
U/ngvQBsoa9X26VfQA4MieZgVVdMVwjCNh2YC9aEXc/KxfcBueZkM1194qP88cVu
|
||||||
|
dOFYaftOkuGPAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEA3OigVlkOvlx54wcY0RRuExNw2sPYHr8m8QP+SnzARDbrubvsKT0S
|
||||||
|
z/+aVWccgacBtihOpF9juQLHb+nqhea9s6QS8XAQ98bqm8foKToWuxnIRS9c+8e1
|
||||||
|
qcENTfh6U2Dr8ckwVcKAPtnLnPtbxuFF5UiqXAPA89ZmtqUPv+DfmDr5fdeb0bCu
|
||||||
|
Lo6TCFLQOcn2Qz1WsSv/2JRkSBy8pgaC01zErgv9oRVIzFfLn8YpfnWZkFiRGwX6
|
||||||
|
/GBLsS19SLLX0xLkPwQ/CwN6OkipOtYi6UNq0osHw9xfm5sCzcnltJShA1YtIp72
|
||||||
|
e1HkTx03a43uAKlJBo1rMD29stVJu9ABEwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
r2YFJIj1zR9iMPWRJYMDEKuLlV0Gbis9232Gog5sS06LpUFPYL6clLDf7eWAimPs
|
||||||
|
u8rUUP4JEjmAY7bWHyqbG3D5iljNin50W7kvY8ip+Vqf64vjNUXFDKUbi0iGkfVC
|
||||||
|
nfX67FL0JF74hqtCtMlS5QPvD4oLsC40DdmPD4kCulaSrMlmsFRGFdl60HeSLbeP
|
||||||
|
oopRA4yYB4ZGJxJUaSuMm6RrcK08G2l7vLfHpxhcJWQVb2fKB7Ds+AogZYnc6ZYF
|
||||||
|
hpGAP9y+Yn8TUUqPMhhZwLw/8eUAhtv8G2aBBxHyctlGvg1YFiquPP6VEn88h9GZ
|
||||||
|
X4d/mLOAQeYWEalQC812iw==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
OlLQuEDdagECnVy1Nke/C7dpS8+8XvgLK/hGgV/OpCWr+Gq8bL6/NpK9GP7EbsUI
|
||||||
|
NxsguJ2r1wkEGTixz88gdKWDCC3evGW1pqnsjkCk69gHGtCxmrFeiCxCSomaOjzw
|
||||||
|
HCnp3TcT1DA4EstoXUqPysVkBYkx8OBO6rGhvE+G1S4bVG/EJkPCMhjPlxX41ON6
|
||||||
|
NWvtf32dviA5W1BrYKWJy/v0pCsApgjZa6qpaLdgqQabG5YEJA0rONS1hL+AcJks
|
||||||
|
CnvkSS7iU/4jrDPfgOLoVxEkH68swLol2Qf0RFHg12EL5kf0xbPnfE84aQyt99an
|
||||||
|
6VAMVIy/tCxR2efZ0+uQmQk7S35uQH/PxZ3/mq6cDMw7+WZdYbrkyfmFK/A+yL2P
|
||||||
|
op71Ik0Xf0Qwd0qMhTZMVPZpZDQmxvr0j0r3xHia0Ez+PhovnnxqI9/cThRQ/ceN
|
||||||
|
jE2cA46H4ZfYn5OdCP+mP9L+MsqJYoHj/SigcIrXUX58R1D0JWVX2KPU+tVyQ03B
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
dir-address 154.35.175.225:80
|
||||||
|
fingerprint EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97
|
||||||
|
dir-key-published 2021-02-08 18:16:07
|
||||||
|
dir-key-expires 2022-02-08 18:16:07
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAwBmqdD+G0q3smN5OBFHCcK5pQH5G1GIpFJ1JxCVEp92tTK4ZHnot
|
||||||
|
9RzMfag6zQFqwLaJ+yEb1DOjTdTMfcUTsj5f3GUqPB+U7shSMAvvAAM+Bx/4m1AU
|
||||||
|
u6sk4XmPB1bCBfcRl4zhnY6XFIbj0ktuBDblcxHz3lDgHFpBoci9sF59mM14MZ09
|
||||||
|
EdwgeckcU5oeq6ApuSlUVaOT8xsKV/yeK4SKaFfDclwPAJuitQ5CpqctP7ExmlrY
|
||||||
|
sboTDtz7/Xa6OccaGDEUf7TRlipvUX6rvlmvHm3qjdixVfExpa8E5QG79GZTL82p
|
||||||
|
1zBd3iqc6QEnRDTiW9cMUeQt4EvrwOUVVYPWo3hp1C/iiNzWraDays2xuhaSB0gj
|
||||||
|
fPatu2CFW5XB2vd9IvIiWeklSFqnF8DL38jDL7DbFiETJreGsDMR03yHWVd0MbPz
|
||||||
|
OrvAxG4tJn+JtnwhzlbRjnfk53jOTbiM0vMV8h/ztapCiJeT/6i7nVQ1xL2boeYw
|
||||||
|
5RDUlwZaQiaXAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEApIIcKBWvD0P2YQtsrFKEF1kprJUCEUlWqzV4mVbTcVdzVQpct8t8
|
||||||
|
NAO8kDbxRSyU2S6gKecusy4H1MJWVAe2qvKIY974espuJwBXWFgT70jSBTFzjMpB
|
||||||
|
dAaTTY+kNZa66kjBjCVolr8UfFvL7HaL3CCtWD9ds7+ep76co1h3s3sD2BWW/M5m
|
||||||
|
V6ML8kYkjRW6SW8YHW6By3G+UuqRiGziJIIwQAoPnNSWrzW6UTLpVRDjdo70bQvU
|
||||||
|
vvfppUuNNji5SFfzSiakxHIse/eHG/rTNSzOvlpjuZxzPIcekr71eu1hCVHb2QdA
|
||||||
|
9Ikc5pUQeB0zImI8WJ9OVJDFUEgjJ9LGtQIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
cy+VPbSGSJ5aI7egCwgNY6mgSlJumULFmUN8gfahvMo5hUwVLqP1FtoKIO8yBUc0
|
||||||
|
Y47pt6G5a0fjm6mjapFbU7IpqIUl+5gLBRKD6ugx+hr2IoqIVJY7WQUvVMBnfqHp
|
||||||
|
Z5N6kXfFBT+EbnbLiUqoRo1/AHC6E6CqI5pdhV86UCFydmuLf/MfwJpXiYRJueqk
|
||||||
|
DnPYEflq+Zu/RReL5aJlVOVuWq0ZpuzUHk4gIicKESLGkv4eI2CvuB5HTeNAB9L5
|
||||||
|
laMe+YpoXqgqMae1HT+rupPXYeONPygFXXbNLNVrR7OjAYG2TOaqdUTQkFefFVtD
|
||||||
|
ungKyPS6LTytSuU/rjWCbQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
sV4ouMb8pmCM3WjLTFxfRVb6qZl8rQ0tYM/AjKz1ufU0UmL7yx/7JMg2InDcYPH3
|
||||||
|
4PIUQrDLoAMxnnNVMDaDGoGDGI5keUmU1eSGvdJYN7okd0aRvA9LFGw4uDVVyB0K
|
||||||
|
l7BOk80y15P34R4G6oPvcR8aCxoiMh9UusbhiVjBr6dAfJGVVxZAO1ZJ8pa8fcrA
|
||||||
|
IbtNks2vut6Oy4oaC7zLCwcbRJM6dSvzcbzBpCf7/b9w6NQNqCBBQkqKgUl0FqKM
|
||||||
|
QRKqHWuhbqcL9+lj7rvgWCEigLu9ff1+E7C4BV7GzOm5FPcRqfkPaMsjQuM/HErH
|
||||||
|
swhf2Ra+Tcdk9gdI4AomqwaoD6B2uKsZkcFpZhq4HAle6rOP9eC16DpqsokpqoW9
|
||||||
|
vb5Mic7ABYVpB4t3o5wOI9D4exXmzv6gpuOyl5rJGL5ORYSEhnMGsKMyPceCGysg
|
||||||
|
SzwfPWBqRTM2LfBxhW05UEBJev4EXk7AA5sr6GkcX/CXeR47pyXQAyc2doZo7Aoq
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint 0232AF901C31A04EE9848595AF9BB7620D4C5B2E
|
||||||
|
dir-key-published 2021-08-01 20:00:02
|
||||||
|
dir-key-expires 2022-08-01 20:00:02
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAu9O0Pueesn0+29BlxZs60mBqehjdQtgSnKOm9QZxbQ0xrMQgbFnR
|
||||||
|
hWbKD8erenyeFk2SF6AJkbyzgYC89hyPW+8GBDmg5bE8fRKjgV/nI3tY2m4rkY3u
|
||||||
|
zSmYIdwqHUUc98Xzt9PaQ8IJAlDBY4XLKrWmJMxSyhBlVEept7+9Tj23qowW44Mz
|
||||||
|
xPJZ1aFkB1FpkD6qmoCzVZbhXy3cGt1nDwdJK7KqlaXziz9pFiw8PzTVU2xFgJNy
|
||||||
|
+nEcT72DBtk3G5K2Riu/aXY/D541Cioj9KMV4Nv4g8aBKx58Xq2tq1pFkc1Bqj1y
|
||||||
|
2MomVR3iskFzlqC8yKWGVe4OP2IaOhtcQJYp5GR9q+dWnr53WWNVxNu3sA9iMal3
|
||||||
|
PJUk5pIYrsmArGew5gmlCe+Al46nPINxc7ouztmStAV+2F6SpZlKOcstnT+KJ52O
|
||||||
|
1xnOSaj/WnzG2o4KZ9UrFQoUNOLQJcelPcC+vrinMk9BQPcB072l9NjpUBC9brsW
|
||||||
|
qTCMStn1jfDDAgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAp7nHn/R+ZZ8lza379M7BJ00JYPAcncjtoa2K2Z75bDoxlegGvZXp
|
||||||
|
j4D0WhqksaaOr/+YCSPMcs4HAapKE/Dj09p1kjzh6Xu/iVp51NiQAARS5j3tu/5k
|
||||||
|
WJQ7ig207TdtjmslZIx0UU8pieuenRdyUN0PvjOkaoZIpao1+UlIe47DP+42D3QX
|
||||||
|
1J2wu48QDvt7hUUA3y7yLUyNMarqYBbbXQ/MpH8tcMT76TTN1uilP6W/3j1b6Fr7
|
||||||
|
NGtbUrS1EzOOHnCpgpnD8qGcisDKrHcVkNkh1w+8LW9ef7RGpFPpn022hUQG0WLD
|
||||||
|
5zrh19SAsKetWAZY6RlvyCHPVReajIAovwIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
ca3I8mHu2zEOCnzySzdk+rbZLpohw5aa3NmTGFzRUXqOeHClOYHRc+glAyCrtUA3
|
||||||
|
lEa5fiFaZTImKu0J/uroyR4uF5JpzLOfojTQi9P5hMCBSdd7uGzoKC+/dKb2OngZ
|
||||||
|
VkBjptMf1S9dy2lUdDksHnnyg8UrV7EolIHUFNdEBI1LeONkdesZ5oQMg3HRlVpU
|
||||||
|
v+m/7y/MB+o3KAXkQyAxTcV4bKdsHm3Pf0CSfDgOPImwFS4lwyEW0STlOmVHojZR
|
||||||
|
5wm+5dwt9vbD7K6ectbnWtWjiSrvtGjqixO652lxz1qrsid99S5wEzJNhfif8lYe
|
||||||
|
VsB9h7YagNHJHLiGeBT1kg==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
ZkHpe8JVvGsiAsH8gw1eZVIIE8WuM+3Sdd37U2tOyDi7FVwJV+oJ+aKwcCTqTLaj
|
||||||
|
jglQJbg2JdV4ofy49ZaQa6FBGLrzxAS6Gx0jg+28Kzbr0xu9hSX81oPSXKn9KDLr
|
||||||
|
BvmuSqKBB+5B9nIEBjm6FwPc8MjqlvNesuJ3IpW9+e85eB7qsH4ozjHF0GIgpXu/
|
||||||
|
qXrk2TEK1nMc9EN+VCYuy3gAm46GHQEYR1U7gIofCYf7LQpDrfj1sAGquCQ3vYqT
|
||||||
|
Ex3GtqcDV22IME67Cou5rv9OmMnmy1dbeHO4g843RX0LXtEDdGYGSLHzl8EAscrg
|
||||||
|
i55XFlS6z5OwCbdDvFTkHUWRlaiDtoymaxAEW6GUmNjHhgWY9wJwgroVNRsP8Ihi
|
||||||
|
aex9HIND1MY4ERS41Csba/0grf+FahMVI12gwpmrnKfF95QHWw2MEvT1pzZGtMnq
|
||||||
|
XD8mcVNYJtcTvYM/cUa0I4BFD1AyeIP54hEXwIsqHm8KBJpjX/ZpPzksnc4NY8i0
|
||||||
|
-----END SIGNATURE-----
|
||||||
|
dir-key-certificate-version 3
|
||||||
|
fingerprint E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58
|
||||||
|
dir-key-published 2021-11-09 19:16:37
|
||||||
|
dir-key-expires 2023-05-09 19:16:37
|
||||||
|
dir-identity-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBigKCAYEAu/DOrbv/4IAYvyxsy/6ivC3q5yCQBWLKHZGYKQa5G/3rem8wen0f
|
||||||
|
qF7y4ye6U6faWc5kcNMHEKMIeBzMErxwF345qoGHITxbbOWnizgwPgrdCwlK3p0H
|
||||||
|
1XZGU/TTjoaM25P+ZNCBvGmDQRAtgs2odnv+i8hpu6vrcAUZYXmmw/Ag1Ou2AlLC
|
||||||
|
mPpbjV1O5SMylgC4IuCBPr3iA+M1kKkvj4LmwU6pJxjAae76GLzzQ/Ffvi7rRpvU
|
||||||
|
2BHetjehk+7/t8izgbhT4VABtzKgrv9ATnhfEgPeT/WBq0E75iciBBAXRPF5kEA4
|
||||||
|
k++NPy21XpL7jkQ4wnMs2HyiFhHbUwbLcoyQ/JVq/WBboSwStYbkdizRpkhJ1eNg
|
||||||
|
LiD8CPWcZnhWZi9VWrwT0xl+Mu4v6kwo9kVnXhOfcK8Wni9FqiBu2tmNDoGPG1Ac
|
||||||
|
wptYQSIoujuLgn4MARREwo9cWrKp2w+D7Dt4U7U5OrXL7TXjonEKuEHwRhzz1JA8
|
||||||
|
7LXm/wENwn1/AgMBAAE=
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-signing-key
|
||||||
|
-----BEGIN RSA PUBLIC KEY-----
|
||||||
|
MIIBCgKCAQEAuxJxHCGOw9DgNtw4wqi78OE3djdiLwbie+2CevKMRaO14IhuQGVK
|
||||||
|
w1PYsnTuVLVcJl3Y4QKQ4nnbe1QCiGrLq9wueQy7ZvBeZry3f+QD1Q/PAG19n6/7
|
||||||
|
hlhXclSOJ/jRah0Gi+QXAycKE5RES/Qn4F5fNE7MxzM0ZQHIlszZLNUrcpeLE9nX
|
||||||
|
avlqlSqK8FmLPOpOSRrdPtzKP2sjW9UUFVGMfurDYIC51hkZI/nyy8A1C844sfuF
|
||||||
|
LV6oYpYw5+soA122zBqGqP6vApwFCvWSDcGlx8xj1Irdo+JIDfK8vklu9P11rTWB
|
||||||
|
R7dZw9pD21reD0pf0Bipzneho6iiL++w+QIDAQAB
|
||||||
|
-----END RSA PUBLIC KEY-----
|
||||||
|
dir-key-crosscert
|
||||||
|
-----BEGIN ID SIGNATURE-----
|
||||||
|
aMzjdOHri8Kmdoy0qt1a33Y9/e5vKkJQkzCKdHN34Il5FMMCkOrJ1yeQgZyp6mU4
|
||||||
|
jPSpUZlr1Iq52x5ers4fH4SybvX16BDq+p6+Zel9f5TpFg1vzdpJH1WOJ3ZoES1N
|
||||||
|
S8CpiXVz8flc5Ez6Dc7uZGSE2fYRl1Pswn3GuLfR1Wjw0VNp1VgHZk6xYXRk/YLx
|
||||||
|
OyjZTWEWAF/0qw3usXtvTvh6wGniVxr0rg3zZbesLXti4TAn3B3N6VG1TPOizna6
|
||||||
|
s26edpQ6RQPigAuccEwU5iaIQEGkIxcoe61qnPvAoWP3Jk/sZAGCqhbya0CBCH8U
|
||||||
|
pEW/OauwlDlr3yXEKh05aQ==
|
||||||
|
-----END ID SIGNATURE-----
|
||||||
|
dir-key-certification
|
||||||
|
-----BEGIN SIGNATURE-----
|
||||||
|
XhAoF04YrM2zJUvrQuEsGhU53Pbf1B0jv5F4YkMlRX2y15rKXKI93vQTM1LbnYc0
|
||||||
|
ETkhSOQB2rpnX0bcE+K+x0sWXiMRtR1HSX/oIPDI9MNqHv75eZlEkSaDJHIsQJlj
|
||||||
|
Dd++tMHkRc49nNNo2J25J3TiBU0ecpVYYvtJzynE3W8tX3io6EmvTehkj2o79z0A
|
||||||
|
ax2A5JG65plch0ES2yK2jqgBEmkA/eZENDNQAaERXMFJbbpHIMBaGguwCEieJe77
|
||||||
|
JBAOxJFRGpL6MhMpcvi5MgEMqfAv3AhlBo93n4apT2CYR8PdCHUZyq7FrgwTSJS7
|
||||||
|
ndl3YmvxJ7wnyTXitw0GcSVeQaYMQV+LR9Z1VkmjIwRuHliUn7hR79pYqs3t11aQ
|
||||||
|
muW8jOrx+5QsiTLEPV6Hs0pzXc9XDw7mnJ6M2gxxF8fZCztal3TNLs9+1O22fxME
|
||||||
|
0VU1oS7SG6T4M1YOXgKFUP20gLl8sZf+3lGp3aLZIK8psR3vzggpaRSUKgip4Lqv
|
||||||
|
-----END SIGNATURE-----
|
44395
integration_test/env/persist/dev/tor/data-dir-642188460/cached-microdesc-consensus
vendored
Normal file
67608
integration_test/env/persist/dev/tor/data-dir-642188460/cached-microdescs.new
vendored
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
# Tor state file last generated on 2022-02-04 13:58:29 local time
|
||||||
|
# Other times below are in UTC
|
||||||
|
# You *do not* need to edit this file.
|
||||||
|
|
||||||
|
CircuitBuildTimeBin 1075 1
|
||||||
|
CircuitBuildTimeBin 1175 1
|
||||||
|
CircuitBuildTimeBin 1325 1
|
||||||
|
CircuitBuildTimeBin 1675 1
|
||||||
|
CircuitBuildTimeBin 2125 2
|
||||||
|
CircuitBuildTimeBin 2175 1
|
||||||
|
Dormant 0
|
||||||
|
Guard in=default rsa_id=73283C4DEBC01D3E4A5FD1BB1F2B50D927379F59 nickname=rinderwahnRelay29L sampled_on=2022-01-31T13:54:49 sampled_idx=0 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-01-26T00:18:13 confirmed_idx=2 pb_circ_attempts=7.000000 pb_circ_successes=7.000000 pb_successful_circuits_closed=7.000000
|
||||||
|
Guard in=default rsa_id=955F15325D6F3E3350EA8A70EB5C49C5BF95C5A0 nickname=XTOMDUS sampled_on=2022-01-31T07:54:08 sampled_idx=1 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-02-01T08:12:17 confirmed_idx=1
|
||||||
|
Guard in=default rsa_id=82DA9678A0BAE60087AA68A3E1D6E6A2C4246D6D nickname=Ichotolot63 sampled_on=2022-02-03T05:29:22 sampled_idx=2 sampled_by=0.4.5.9 listed=1 confirmed_on=2022-02-02T08:46:50 confirmed_idx=0
|
||||||
|
Guard in=default rsa_id=77A3ADC5D455778B53C2803761916DFB7DA0A790 nickname=redvader sampled_on=2022-02-02T15:23:39 sampled_idx=3 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=2096BCFEBB95A1134F39FCF8CEB076FF41A2B48B nickname=freja sampled_on=2022-02-03T19:51:55 sampled_idx=4 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=AE4FAE2EB5DC5D078458F0FCBF2B37F5D73F0868 nickname=sinkrlogin sampled_on=2022-01-24T19:30:40 sampled_idx=5 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=680F212ADE23311C658CC560DAF80DB42FEB85DF nickname=a9 sampled_on=2022-01-28T12:54:55 sampled_idx=6 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=3D5D6178C44537E3692853B344385F6572A55767 nickname=TorZabehlice sampled_on=2022-01-31T02:57:52 sampled_idx=7 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=CEDB8AB22915097A3A14F63F28E1E43F86CBECC0 nickname=knight sampled_on=2022-01-26T09:02:31 sampled_idx=8 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=0B555940D37DC849728841C0B290074E1A1BDCA8 nickname=TORro sampled_on=2022-01-26T04:11:45 sampled_idx=9 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=2A6D9EAE2FB319486C5E3BF5CC0F83F06B73CE0F nickname=clicker1 sampled_on=2022-01-28T16:27:29 sampled_idx=10 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=7B3535760987464C8B5686F203B6EBE767C0873E nickname=Hydra69 sampled_on=2022-01-25T23:46:36 sampled_idx=11 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=0F0F690AF1D32C7C3C72C543836625628887BA85 nickname=Hydra57 sampled_on=2022-01-24T15:26:39 sampled_idx=12 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=AC2275831607A95CD8B939C3B8DC466CCF48E2B9 nickname=notsorelay sampled_on=2022-01-25T04:52:58 sampled_idx=13 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=38F732DD349A2E59078434651162A2F4201934A5 nickname=mixminion sampled_on=2022-01-25T18:16:12 sampled_idx=14 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=2F844B6701E6C614240214489A99DF607F43C5B0 nickname=3totalrecovery3 sampled_on=2022-01-31T01:50:15 sampled_idx=15 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=EBE718E1A49EE229071702964F8DB1F318075FF8 nickname=fluxe4 sampled_on=2022-01-24T07:17:01 sampled_idx=16 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=8118F4C0E60C84A453ACCD1641F3A7328CBE6280 nickname=wilfong sampled_on=2022-02-01T10:05:37 sampled_idx=17 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=2AA5F598F9A1812F01CD99E3B59BB87362ED7438 nickname=setsun sampled_on=2022-02-01T12:40:07 sampled_idx=18 sampled_by=0.4.5.9 listed=1
|
||||||
|
Guard in=default rsa_id=CF6A6080091BB210AA3892FEFE2F6A396DA08DF3 nickname=cryzrelay01 sampled_on=2022-02-01T11:05:41 sampled_idx=19 sampled_by=0.4.5.9 listed=1
|
||||||
|
LastWritten 2022-02-04 21:58:29
|
||||||
|
MinutesSinceUserActivity 1
|
||||||
|
TorVersion Tor 0.4.5.9 (git-d0ed04d50e80fe1c)
|
||||||
|
TotalBuildTimes 7
|
|
@ -0,0 +1,3 @@
|
||||||
|
SocksPort 9982 OnionTrafficOnly
|
||||||
|
ControlPort 9983
|
||||||
|
HashedControlPassword 16:D95A03E7895DC6A2605B7AF7E28AB1E24D813742A0E86A2818C7179CE6
|
|
@ -0,0 +1,14 @@
|
||||||
|
@env:clean
|
||||||
|
Feature: Splash screen displays and then closes
|
||||||
|
Scenario: splash screen appears
|
||||||
|
Then I expect the widget 'SplashView' to be present within 1 second
|
||||||
|
Scenario: splash screen completes
|
||||||
|
Then I expect the widget 'ProfileManagerView' to be present within 10 seconds
|
||||||
|
Scenario: first-run of cwtch creates expected files and folders
|
||||||
|
Given I expect the widget 'ProfileManagerView' to be present within 10 seconds
|
||||||
|
Then I expect the folder 'integration_test/env/temp' to exist
|
||||||
|
And I expect the folder 'integration_test/env/temp/dev' to exist
|
||||||
|
And I expect the file 'integration_test/env/temp/dev/SALT' to exist
|
||||||
|
And I expect the file 'integration_test/env/temp/dev/ui.globals' to exist
|
||||||
|
And I expect the folder 'integration_test/env/temp/dev/tor' to exist
|
||||||
|
And I expect the file 'integration_test/env/temp/dev/tor/torrc' to exist
|
|
@ -0,0 +1,49 @@
|
||||||
|
@env:persist
|
||||||
|
Feature: Settings pane opens and can save settings persistently
|
||||||
|
Scenario: Open the Settings pane
|
||||||
|
Given I tap the 'OpenSettingsView' button
|
||||||
|
Then I expect the text 'Cwtch Settings' to be present
|
||||||
|
And I take a screenshot
|
||||||
|
|
||||||
|
Scenario: Change every setting (except Language)
|
||||||
|
Given I tap the 'OpenSettingsView' button
|
||||||
|
And I wait for 1 second
|
||||||
|
When I tap the widget that contains the text "Use Light Themes"
|
||||||
|
#And I choose option 3 from the "DropdownTheme" dropdown
|
||||||
|
#When I tap the "DropdownTheme" button
|
||||||
|
#And I tap the first "ddi_mermaid" element
|
||||||
|
#And I tap the element that contains the text "Mermaid"
|
||||||
|
#And I tap the element that contains the text "Mermaid" within the "DropdownTheme"
|
||||||
|
And I tap the widget that contains the text "Block Unknown Contacts"
|
||||||
|
And I tap the widget that contains the text "Streamer/Presentation Mode"
|
||||||
|
And I tap the widget that contains the text "Enable Experiments"
|
||||||
|
And I tap the widget that contains the text "Enable Group Chat"
|
||||||
|
And I tap the widget that contains the text "Hosting Servers"
|
||||||
|
And I tap the widget that contains the text "File Sharing"
|
||||||
|
And I tap the widget that contains the text "Image Previews and Profile Pictures"
|
||||||
|
And I fill the "DownloadFolderPicker" field with "/this/is/a/test"
|
||||||
|
And I tap the widget that contains the text "Enable Clickable Links"
|
||||||
|
Then I expect the switch that contains the text "Use Light Themes" to be checked
|
||||||
|
And I expect the switch that contains the text "Block Unknown Contacts" to be checked
|
||||||
|
And I expect the switch that contains the text "Streamer/Presentation Mode" to be checked
|
||||||
|
And I expect the switch that contains the text "Enable Experiments" to be checked
|
||||||
|
And I expect the switch that contains the text "Enable Group Chat" to be checked
|
||||||
|
And I expect the switch that contains the text "Hosting Servers" to be checked
|
||||||
|
And I expect the switch that contains the text "File Sharing" to be checked
|
||||||
|
And I expect the switch that contains the text "Image Previews and Profile Pictures" to be checked
|
||||||
|
And I expect the "DownloadFolderPicker" to be "/this/is/a/test"
|
||||||
|
And I expect the switch that contains the text "Enable Clickable Links" to be checked
|
||||||
|
|
||||||
|
Scenario: When the app is reloaded, settings from the previous scenario have persisted
|
||||||
|
Given I tap the 'OpenSettingsView' button
|
||||||
|
And I wait for 1 second
|
||||||
|
Then I expect the switch that contains the text "Use Light Themes" to be checked
|
||||||
|
And I expect the switch that contains the text "Block Unknown Contacts" to be checked
|
||||||
|
And I expect the switch that contains the text "Streamer/Presentation Mode" to be checked
|
||||||
|
And I expect the switch that contains the text "Enable Experiments" to be checked
|
||||||
|
And I expect the switch that contains the text "Enable Group Chat" to be checked
|
||||||
|
And I expect the switch that contains the text "Hosting Servers" to be checked
|
||||||
|
And I expect the switch that contains the text "File Sharing" to be checked
|
||||||
|
And I expect the switch that contains the text "Image Previews and Profile Pictures" to be checked
|
||||||
|
And I expect the "DownloadFolderPicker" to be "/this/is/a/test"
|
||||||
|
And I expect the switch that contains the text "Enable Clickable Links" to be checked
|
|
@ -0,0 +1,11 @@
|
||||||
|
Feature: Tor initializes correctly
|
||||||
|
Scenario: Check the Tor version
|
||||||
|
Given I tap the icon with type "TorIcon"
|
||||||
|
Then I expect the Tor version to be present
|
||||||
|
And I expect the string 'Online' to be present within 60 seconds
|
||||||
|
|
||||||
|
Scenario: Reset Tor
|
||||||
|
Given I tap the icon with type "TorIcon"
|
||||||
|
Then I expect the string 'Online' to be present within 60 seconds
|
||||||
|
Then I tap the button with text "Reset"
|
||||||
|
Then I expect the text "Online" to be absent
|
|
@ -0,0 +1,7 @@
|
||||||
|
Feature: Shutdown Cwtch button works correctly
|
||||||
|
Scenario: Clicking 'Shutdown Cwtch' shuts down Cwtch
|
||||||
|
Given I tap the button with tooltip 'Shutdown Cwtch'
|
||||||
|
Then I expect the text 'Shutdown Cwtch?' to be present
|
||||||
|
#this also kills the testing framework sadly. will have to find a workaround
|
||||||
|
#And I tap the button that contains the text 'Shutdown Cwtch'
|
||||||
|
#Then I wait until the widget with type 'ProfileMgrView' is absent
|
|
@ -0,0 +1,14 @@
|
||||||
|
Feature: Global 'language' setting
|
||||||
|
Scenario: Change the language to French and back
|
||||||
|
Given I tap the 'OpenSettingsView' button
|
||||||
|
And I wait for 1 second
|
||||||
|
Then I expect the text 'Language' to be present
|
||||||
|
And I expect the text 'Langue' to be absent
|
||||||
|
When I tap the widget that contains the text "English"
|
||||||
|
And I tap the widget that contains the text "Frances"
|
||||||
|
Then I expect the text 'Langue' to be present
|
||||||
|
And I expect the text 'Language' to be absent
|
||||||
|
When I tap the widget that contains the text "Français"
|
||||||
|
And I tap the widget that contains the text "Anglais"
|
||||||
|
Then I expect the text 'Language' to be present
|
||||||
|
And I expect the text 'Langue' to be absent
|
|
@ -0,0 +1,10 @@
|
||||||
|
Feature: Global 'Theme' setting
|
||||||
|
Scenario: Change the theme to Mermaid
|
||||||
|
Given I tap the 'OpenSettingsView' button
|
||||||
|
And I wait for 1 second
|
||||||
|
When I tap the "DropdownTheme" button
|
||||||
|
And I tap the element that contains the text "Mermaid"
|
||||||
|
Scenario: Change the theme to Light Mode
|
||||||
|
Given I tap the 'OpenSettingsView' button
|
||||||
|
And I wait for 1 second
|
||||||
|
And I tap the widget that contains the text "Theme"
|
|
@ -0,0 +1,20 @@
|
||||||
|
@env:aliceandbob1
|
||||||
|
Feature: Block unknown contacts setting
|
||||||
|
Scenario: Carol adds Alice but Alice doesn't see it because Block Unknowns is enabled
|
||||||
|
Given I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
Given I tap the 'OpenSettingsView' button
|
||||||
|
When I tap the widget that contains the text "Block Unknown Contacts"
|
||||||
|
Then I expect the switch that contains the text "Block Unknown Contacts" to be checked
|
||||||
|
Given I tap the back button
|
||||||
|
And I wait until the text "Carol" is present
|
||||||
|
And I tap the button that contains the text "Carol"
|
||||||
|
And I tap the button with tooltip "Add a new contact or conversation"
|
||||||
|
When I fill the "txtAddP2P" field with "vbmmsbx3rhndpfz6t3jkrd7m3yu62xzrldxkdgsw4rsehiwuw3tmo7yd"
|
||||||
|
And I wait for 1 second
|
||||||
|
And I take a screenshot
|
||||||
|
And I tap the back button
|
||||||
|
And I wait until the text "Alice" is present
|
||||||
|
And I wait until the tooltip "Online" is present
|
||||||
|
And I tap the button that contains the text "Alice"
|
||||||
|
And I wait for 20 seconds
|
||||||
|
Then I expect the text "yxj2pvhozedflp4g7yitpqkeho63maaffi2qgsj3e6s2fbmosuuas2qd" to be absent
|
|
@ -0,0 +1,18 @@
|
||||||
|
@env:aliceandbob1
|
||||||
|
Feature: Streamer mode
|
||||||
|
Scenario: All onions disappear when Streamer Mode is enabled
|
||||||
|
Given I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
And I wait until the text "vbmmsbx3rhndpfz6t3jkrd7m3yu62xzrldxkdgsw4rsehiwuw3tmo7yd" is present
|
||||||
|
And I wait until the text "pjurzypqui3dnpxj6aemk6cqz22yx6zfr5lq4jzu7muwe2yyx2zrnzyd" is present
|
||||||
|
Given I tap the 'OpenSettingsView' button
|
||||||
|
And I wait for 1 second
|
||||||
|
And I tap the widget that contains the text "Streamer/Presentation Mode"
|
||||||
|
Then I expect the switch that contains the text "Streamer/Presentation Mode" to be checked
|
||||||
|
When I tap the back button
|
||||||
|
And I wait until the text "Alice" is present
|
||||||
|
And I wait until the text "Bob" is present
|
||||||
|
Then I expect the text "vbmmsbx3rhndpfz6t3jkrd7m3yu62xzrldxkdgsw4rsehiwuw3tmo7yd" to be absent
|
||||||
|
And I expect the text "pjurzypqui3dnpxj6aemk6cqz22yx6zfr5lq4jzu7muwe2yyx2zrnzyd" to be absent
|
||||||
|
When I tap the button that contains the text "Alice"
|
||||||
|
Then I expect the text "vbmmsbx3rhndpfz6t3jkrd7m3yu62xzrldxkdgsw4rsehiwuw3tmo7yd" to be absent
|
||||||
|
And I expect the text "pjurzypqui3dnpxj6aemk6cqz22yx6zfr5lq4jzu7muwe2yyx2zrnzyd" to be absent
|
|
@ -0,0 +1,90 @@
|
||||||
|
@env:persist
|
||||||
|
Feature: Basic Profile Management
|
||||||
|
Scenario: Error on Creating a Profile without a Display Name
|
||||||
|
Given I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
And I tap the button with tooltip "Add new profile"
|
||||||
|
Then I expect the text 'Display Name' to be present
|
||||||
|
And I expect the text 'New Password' to be present
|
||||||
|
And I expect the text 'Please enter a display name' to be absent
|
||||||
|
Then I tap the "button" widget with label "Add new profile"
|
||||||
|
And I expect the text 'Please enter a display name' to be present
|
||||||
|
And I take a screenshot
|
||||||
|
|
||||||
|
Scenario: Create Unencrypted Profile
|
||||||
|
Given I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
And I tap the button with tooltip "Add new profile"
|
||||||
|
Then I expect the text 'Display Name' to be present
|
||||||
|
And I expect the text 'New Password' to be present
|
||||||
|
And I take a screenshot
|
||||||
|
Then I tap the "passwordCheckBox" widget
|
||||||
|
And I expect the text 'New Password' to be absent
|
||||||
|
And I take a screenshot
|
||||||
|
Then I fill the "displayNameFormElement" field with "Alice (Unencrypted)"
|
||||||
|
Then I tap the "button" widget with label "Add new profile"
|
||||||
|
And I expect a "ProfileRow" widget with text "Alice (Unencrypted)"
|
||||||
|
And I take a screenshot
|
||||||
|
Then I tap the "ProfileRow" widget with label "Alice (Unencrypted)"
|
||||||
|
And I expect the text "Alice (Unencrypted) » Conversations" to be present
|
||||||
|
And I take a screenshot
|
||||||
|
|
||||||
|
Scenario: Load Unencrypted Profile
|
||||||
|
Given I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
Then I expect a "ProfileRow" widget with text "Alice (Unencrypted)"
|
||||||
|
|
||||||
|
Scenario: Create Encrypted Profile
|
||||||
|
Given I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
And I tap the button with tooltip "Add new profile"
|
||||||
|
Then I expect the text 'Display Name' to be present
|
||||||
|
And I expect the text 'New Password' to be present
|
||||||
|
And I take a screenshot
|
||||||
|
Then I fill the "displayNameFormElement" field with "Alice (Encrypted)"
|
||||||
|
Then I fill the "passwordFormElement" field with "password1"
|
||||||
|
Then I fill the "confirmPasswordFormElement" field with "password1"
|
||||||
|
And I take a screenshot
|
||||||
|
Then I tap the "button" widget with label "Add new profile"
|
||||||
|
And I expect a "ProfileRow" widget with text "Alice (Encrypted)"
|
||||||
|
And I take a screenshot
|
||||||
|
Then I tap the "ProfileRow" widget with label "Alice (Encrypted)"
|
||||||
|
And I expect the text 'Alice (Encrypted) » Conversations' to be present
|
||||||
|
And I take a screenshot
|
||||||
|
|
||||||
|
Scenario: Load an Encrypted Profile by Unlocking it with a Password
|
||||||
|
Given I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
Then I expect the text 'Enter a password to view your profiles' to be absent
|
||||||
|
And I tap the button with tooltip "Unlock encrypted profiles by entering their password."
|
||||||
|
Then I expect the text 'Enter a password to view your profiles' to be present
|
||||||
|
When I fill the "unlockPasswordProfileElement" field with "password1"
|
||||||
|
And I tap the "button" widget with label "Unlock"
|
||||||
|
Then I expect a "ProfileRow" widget with text "Alice (Encrypted)"
|
||||||
|
|
||||||
|
Scenario: Load an Encrypted Profile by Unlocking it with a Password and Change the Name
|
||||||
|
Given I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
Then I expect the text 'Enter a password to view your profiles' to be absent
|
||||||
|
And I tap the button with tooltip "Unlock encrypted profiles by entering their password."
|
||||||
|
Then I expect the text 'Enter a password to view your profiles' to be present
|
||||||
|
When I fill the "unlockPasswordProfileElement" field with "password1"
|
||||||
|
And I tap the "button" widget with label "Unlock"
|
||||||
|
Then I expect a "ProfileRow" widget with text "Alice (Encrypted)"
|
||||||
|
When I tap the "IconButton" widget with tooltip "Edit Profile Alice (Encrypted)"
|
||||||
|
Then I expect the text 'Display Name' to be present
|
||||||
|
Then I fill the "displayNameFormElement" field with "Carol (Encrypted)"
|
||||||
|
And I tap the "button" widget with label "Save Profile"
|
||||||
|
And I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
Then I expect a "ProfileRow" widget with text "Carol (Encrypted)"
|
||||||
|
|
||||||
|
Scenario: Delete an Encrypted Profile
|
||||||
|
Given I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
Then I expect the text 'Enter a password to view your profiles' to be absent
|
||||||
|
And I tap the button with tooltip "Unlock encrypted profiles by entering their password."
|
||||||
|
Then I expect the text 'Enter a password to view your profiles' to be present
|
||||||
|
When I fill the "unlockPasswordProfileElement" field with "password1"
|
||||||
|
And I tap the "button" widget with label "Unlock"
|
||||||
|
Then I expect a "ProfileRow" widget with text "Carol (Encrypted)"
|
||||||
|
And I take a screenshot
|
||||||
|
When I tap the "IconButton" widget with tooltip "Edit Profile Carol (Encrypted)"
|
||||||
|
Then I expect the text 'Display Name' to be present
|
||||||
|
When I tap the button that contains the text "Delete"
|
||||||
|
Then I expect the text "Really Delete Profile" to be present
|
||||||
|
When I tap the "button" widget with label "Really Delete Profile"
|
||||||
|
And I wait until the widget with type 'ProfileMgrView' is present
|
||||||
|
Then I expect a "ProfileRow" widget with text "Carol (Encrypted)" to be absent
|
|
@ -0,0 +1,31 @@
|
||||||
|
@env:aliceandbob1
|
||||||
|
Feature: Sending and receiving chat messages
|
||||||
|
Background:
|
||||||
|
Given I wait until the widget with type "ProfileRow" is present
|
||||||
|
And I wait for 4 seconds
|
||||||
|
Given I tap the button that contains the text "Alice"
|
||||||
|
And I tap the button that contains the text "Bob"
|
||||||
|
And I wait until the text "Contact is offline, messages can't be delivered right now" is absent
|
||||||
|
#And I wait for 6 seconds
|
||||||
|
When I fill the "txtCompose" field with "hello! this is a test!"
|
||||||
|
And I tap the "btnSend" button
|
||||||
|
Then I expect a "MessageBubble" widget with text "hello! this is a test!\u202F" to be present within 5 seconds
|
||||||
|
#Then I expect the text "hello! this is a test!" to be present
|
||||||
|
And I tap the back button
|
||||||
|
And I tap the back button
|
||||||
|
|
||||||
|
Scenario: Bob receives the message from Alice
|
||||||
|
Given I tap the button that contains the text "Bob"
|
||||||
|
And I tap the button that contains the text "Alice"
|
||||||
|
Then I expect a "MessageBubble" widget with text "hello! this is a test!\u202F" to be present within 5 seconds
|
||||||
|
|
||||||
|
Scenario: Bob replies to a message from Alice
|
||||||
|
Given I tap the button that contains the text "Bob"
|
||||||
|
And I tap the button that contains the text "Alice"
|
||||||
|
#When I swipe right by 15 pixels on the element that contains the text "hello! this is a test!\u202F"
|
||||||
|
#When I swipe right by 15 pixels on the widget of type "MessageBubble" with text "hello! this is a test!\u202F"
|
||||||
|
And I tap the button with tooltip "Reply to this message"
|
||||||
|
And I fill the "txtCompose" field with "yay the test worked"
|
||||||
|
And I tap the "btnSend" button
|
||||||
|
Then I expect to see the message "yay the test worked\u202F" replying to "hello! this is a test!" within 5 seconds
|
||||||
|
And I take a screenshot
|