tor-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
July 2020
- 17 participants
- 2100 discussions
commit f23332cffa8161ce6f08cb29572a586c53a796df
Author: antonela <antonela(a)torproject.org>
Date: Fri Jul 24 13:42:56 2020 -0300
Update membership.html
---
templates/membership.html | 28 ++++++++++++++++++----------
1 file changed, 18 insertions(+), 10 deletions(-)
diff --git a/templates/membership.html b/templates/membership.html
index d1382043..b70fb7e1 100644
--- a/templates/membership.html
+++ b/templates/membership.html
@@ -42,24 +42,32 @@
<div class="container" id="shallot">
<div class="row py-5">
<h3 class="col-12 text-primary display-4">Shallot Onion Members</h3>
- <div class="col-md-6 col-xl-6 my-2">
+ <div class="col-md-4 col-xl-4 my-2">
<div class="card border-1 h-100">
<img class="card-img-top" src="{{ '../../static/images/membership/logos/MullvadVPN.svg' }}" alt="MullvadVPN">
<div class="card-body">
- <p><a href="#">Mullvad VPN</a></p>
+ <p><a href="#" class="h4">Mullvad VPN</a></p>
Mullvad is a VPN service that helps users keep their online activity, identity, and location private. With a fundamental belief in privacy as a universal right, Mullvad's ultimate goal is to make Internet censorship and mass surveillance ineffective.
</div>
</div>
</div>
- <div class="col-md-6 col-xl-6 my-2">
+ <div class="col-md-4 col-xl-4 my-2">
<div class="card border-1 h-100">
- <img class="card-img-top" src="#" alt="Card image cap">
+ <img class="card-img-top" src="#" alt="">
<div class="card-body">
- <h4><a href="#">Shallot Onion Member</a></h4>
- Some description
+ <p><a href="#" class="h4"></a></p>
</div>
</div>
</div>
+ <div class="col-md-4 col-xl-4 my-2">
+ <div class="card border-1 h-100">
+ <img class="card-img-top" src="#" alt="">
+ <div class="card-body">
+ <p><a href="#" class="h4"></a></p>
+ </div>
+ </div>
+ </div>
+ </div>
</div>
<div class="container" id="vidalia">
<div class="row py-5">
@@ -71,17 +79,17 @@
</div>
<div class="col-md-3 col-xl-3 my-2">
<div class="card border-1 h-100">
- <img class="card-img-top" src="#" alt="Card image cap">
+ <img class="card-img-top" src="#" alt="">
</div>
</div>
<div class="col-md-3 col-xl-3 my-2">
<div class="card border-1 h-100">
- <img class="card-img-top" src="#" alt="Card image cap">
+ <img class="card-img-top" src="#" alt="">
</div>
</div>
<div class="col-md-3 col-xl-3 my-2">
<div class="card border-1 h-100">
- <img class="card-img-top" src="#" alt="Card image cap">
+ <img class="card-img-top" src="#" alt="">
</div>
</div>
</div>
@@ -115,7 +123,7 @@
</div>
</div>
</div>
-<div class="col-12 bg-membership" style="background-image: url('../../static/images/membership/header.png'); background-size:cover;">
+<div class="col-12 py-5 bg-membership" style="background-image: url('../../static/images/membership/header.png'); background-size:cover;">
<div class="row col-sm-8 py-5 text-center mx-auto"/>
<h2 class="bg-white text-primary text-center p-4 mx-auto my-0">Become a Member</h2>
<p class="bg-white text-center p-4">Join the Tor Project Membership Program and demonstrate your commitment to privacy online and become more deeply involved in the Tor community. Email us at <mark>giving(a)torproject.org.</mark> to get started.</p>
1
0
commit 081f7d12d13a8835598fccf3f56f267558b4ef02
Merge: 81066907 56d4e85e
Author: gus <gus(a)torproject.org>
Date: Fri Jul 24 13:33:50 2020 -0400
Merge branch 'membership'
assets/static/images/membership/green.png | Bin 0 -> 239288 bytes
assets/static/images/membership/header.png | Bin 0 -> 334841 bytes
assets/static/images/membership/logos/Avast.png | Bin 0 -> 78009 bytes
.../static/images/membership/logos/MullvadVPN.svg | 197 +++++++++++++++++++++
assets/static/images/membership/shallot.png | Bin 0 -> 208458 bytes
assets/static/images/membership/vidalia.png | Bin 0 -> 169283 bytes
content/about/membership/contents.lr | 13 ++
templates/membership.html | 138 +++++++++++++++
8 files changed, 348 insertions(+)
1
0
commit e516b476ba403ed7d1b8d716330028300b32a7c2
Author: antonela <antonela(a)torproject.org>
Date: Fri Jul 24 13:39:43 2020 -0300
Improve Shallot view
---
.../static/images/membership/logos/MullvadVPN.svg | 225 ++++++++++++++++-----
templates/membership.html | 18 +-
2 files changed, 176 insertions(+), 67 deletions(-)
diff --git a/assets/static/images/membership/logos/MullvadVPN.svg b/assets/static/images/membership/logos/MullvadVPN.svg
index 94262ea9..f58d766d 100644
--- a/assets/static/images/membership/logos/MullvadVPN.svg
+++ b/assets/static/images/membership/logos/MullvadVPN.svg
@@ -1,20 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Mullvad_VPN_Logo_Positive" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
- x="0px" y="0px" viewBox="0 0 1405.7 575.4" style="enable-background:new 0 0 1405.7 575.4;" xml:space="preserve">
+ x="0px" y="0px" viewBox="0 0 400 400" style="enable-background:new 0 0 400 400;" xml:space="preserve">
<style type="text/css">
- .st0{fill-rule:evenodd;clip-rule:evenodd;fill:#192E45;}
- .st1{fill-rule:evenodd;clip-rule:evenodd;fill:#D0933A;}
- .st2{fill-rule:evenodd;clip-rule:evenodd;fill:#FFCC86;}
- .st3{fill-rule:evenodd;clip-rule:evenodd;fill:#FDD321;}
- .st4{fill:#FFFFFF;}
- .st5{fill:#1D2A3A;}
- .st6{fill:#192E45;}
+ .st0{clip-path:url(#SVGID_1_);}
+ .st1{clip-path:url(#SVGID_2_);}
+ .st2{clip-path:url(#SVGID_3_);}
+ .st3{clip-path:url(#SVGID_4_);fill:none;stroke:#002C5B;stroke-width:6;stroke-miterlimit:10;}
+ .st4{fill-rule:evenodd;clip-rule:evenodd;fill:#192E45;}
+ .st5{fill-rule:evenodd;clip-rule:evenodd;fill:#D0933A;}
+ .st6{fill-rule:evenodd;clip-rule:evenodd;fill:#FFCC86;}
+ .st7{fill-rule:evenodd;clip-rule:evenodd;fill:#FDD321;}
+ .st8{fill:#FFFFFF;}
+ .st9{fill:#1D2A3A;}
+ .st10{fill:#192E45;}
</style>
<g id="Logo">
- <path id="bg" class="st0" d="M566.2,200c0,69.8,56.6,126.3,126.3,126.3S818.9,269.8,818.9,200S762.3,73.7,692.5,73.7
- S566.2,130.2,566.2,200L566.2,200L566.2,200L566.2,200z"/>
- <path id="Mullvad_Fur" class="st1" d="M583.1,184.9l9.6-13.4c0,0.1-0.6,19.3-0.6,19.3l2.7-14.5c8,16.2,27.6,38.6,45.5,50.6
+ <g id="strokes">
+ <defs>
+ <path id="SVGID_61_" d="M309.4,297.7c5.7-6.4,11.2-13.6,16.3-22.1"/>
+ </defs>
+ <defs>
+ <path id="SVGID_60_" d="M74.3,275.6c5.1,8.5,10.6,15.7,16.2,22"/>
+ </defs>
+ <defs>
+ <path id="SVGID_59_" d="M53.5,203.2c0.1,6.7,0.7,13.4,1.8,20l0,0l0,0l0,0c3.1,19.1,9.7,36.8,19.1,52.4"/>
+ </defs>
+ <defs>
+ <path id="SVGID_58_" d="M325.7,275.6c12.8-21.3,20.6-45.6,21-72.3"/>
+ </defs>
+ <clipPath id="SVGID_1_">
+ <use xlink:href="#SVGID_61_" style="overflow:visible;"/>
+ </clipPath>
+ <clipPath id="SVGID_2_" class="st0">
+ <use xlink:href="#SVGID_60_" style="overflow:visible;"/>
+ </clipPath>
+ <clipPath id="SVGID_3_" class="st1">
+ <use xlink:href="#SVGID_59_" style="overflow:visible;"/>
+ </clipPath>
+ <clipPath id="SVGID_4_" class="st2">
+ <use xlink:href="#SVGID_58_" style="overflow:visible;"/>
+ </clipPath>
+ <path class="st3" d="M166.2,52l19.7-3.2C263,36.5,335.6,89,348,166.2l3.2,19.7C363.5,263,311,335.6,233.8,348l-19.7,3.2
+ C137,363.5,64.4,311,52,233.8l-3.2-19.7C36.5,137,89,64.4,166.2,52z"/>
+
+ <use xlink:href="#SVGID_61_" style="overflow:visible;fill-rule:evenodd;clip-rule:evenodd;fill:none;stroke:#002C5B;stroke-width:6;stroke-miterlimit:10;"/>
+
+ <use xlink:href="#SVGID_60_" style="overflow:visible;fill-rule:evenodd;clip-rule:evenodd;fill:none;stroke:#002C5B;stroke-width:6;stroke-miterlimit:10;"/>
+
+ <use xlink:href="#SVGID_59_" style="overflow:visible;fill-rule:evenodd;clip-rule:evenodd;fill:none;stroke:#002C5B;stroke-width:6;stroke-miterlimit:10;"/>
+
+ <use xlink:href="#SVGID_58_" style="overflow:visible;fill-rule:evenodd;clip-rule:evenodd;fill:none;stroke:#002C5B;stroke-width:6;stroke-miterlimit:10;"/>
+ </g>
+ <path id="bg" class="st4" d="M73.7,200c0,69.8,56.6,126.3,126.3,126.3S326.3,269.8,326.3,200S269.8,73.7,200,73.7
+ S73.7,130.2,73.7,200L73.7,200L73.7,200L73.7,200z"/>
+ <path id="Mullvad_Fur" class="st5" d="M90.6,184.9l9.6-13.4c0,0.1-0.6,19.3-0.6,19.3l2.7-14.5c8,16.2,27.6,38.6,45.5,50.6
c1.9,1.3,3.5,2.7,4.6,4.1c2.3,0.9,4.6,1.4,6.9,1.8c1.2,0.2,2.5,0.3,3.7,0.4c1.2,0.1,2.5,0.1,3.7,0.1c1.2,0,2.4-0.1,3.6-0.2
c1.2-0.1,2.4-0.3,3.6-0.5c1.2-0.2,2.4-0.4,3.5-0.8c1.2-0.3,2.3-0.6,3.5-1c1.1-0.3,2.3-0.8,3.4-1.2c1.1-0.5,2.2-0.9,3.3-1.5
c1.1-0.6,2.2-1.1,3.2-1.7c1.1-0.5,2.1-1.2,3.2-1.8c1.1-0.6,2.1-1.3,3.2-1.9c1.1-0.6,2.1-1.3,3.1-1.9c1-0.7,2.1-1.3,3.1-2
@@ -25,54 +65,133 @@
c-0.4-5.2-8.6-7.7-14.3-20.4c1.6,0.5,4,1.2,4,1.1c0-0.1-6.8-11.1-7.1-12.2l4.4,0.3c0,0-5.8-7.2-6-7.9l5.9-0.8c0,0-7.4-8.5-7.5-9.2
l7.5,1.2l-8.2-9.9h3.9l-4.6-6.7c-0.8-0.3-1.6-0.5-2.4-0.7c-1-0.3-2-0.6-3-0.9c-11.2-3.5-21.8-6.7-32-13.1
c-14.3-8.9-27.1-19.8-36.7-28.3l-19.3-9.4c-18.5-1.4-35.9-0.9-46.5,1.2l6.8-11.6l-10.4,12.5c-0.7-0.2-0.9-0.6-0.9-0.6l0.7-15.4
- l-3.3,13.9c-1-0.5-2.2-0.7-3.4-0.7c-4.6,0-8.3,3.7-8.3,8.3c0,4.2,3.1,7.7,7.2,8.2L583.1,184.9L583.1,184.9L583.1,184.9L583.1,184.9
- z"/>
- <path id="Mullvad_Nose" class="st2" d="M594.8,154.5c-1-0.4-2.2-0.7-3.3-0.7c-4.6,0-8.3,3.7-8.3,8.3c0,4,2.9,7.4,6.7,8.2
- c0.1,0,0.1,0,0.2,0c2.5-0.8,7.5-7.5,6.7-11.7C596.4,157.1,595.8,155.7,594.8,154.5L594.8,154.5L594.8,154.5L594.8,154.5z"/>
- <path id="Mullvad_Helmet" class="st3" d="M667.6,143.8c-1.5-4.1-1.1-9.4,1-14.4c3-6.9,8.7-11.5,14.1-11.5c1.1,0,2.1,0.2,3.1,0.6
+ l-3.3,13.9c-1-0.5-2.2-0.7-3.4-0.7c-4.6,0-8.3,3.7-8.3,8.3c0,4.2,3.1,7.7,7.2,8.2L90.6,184.9L90.6,184.9L90.6,184.9L90.6,184.9z"/>
+ <path id="Mullvad_Nose" class="st6" d="M102.2,154.5c-1-0.4-2.2-0.7-3.3-0.7c-4.6,0-8.3,3.7-8.3,8.3c0,4,2.9,7.4,6.7,8.2
+ c0.1,0,0.1,0,0.2,0c2.5-0.8,7.5-7.5,6.7-11.7C103.9,157.1,103.2,155.7,102.2,154.5L102.2,154.5L102.2,154.5L102.2,154.5z"/>
+ <path id="Mullvad_Helmet" class="st7" d="M175.1,143.8c-1.5-4.1-1.1-9.4,1-14.4c3-6.9,8.7-11.5,14.1-11.5c1.1,0,2.1,0.2,3.1,0.6
c3.1-2.8,6.7-5.1,10.7-6.7c22.1-8.8,54.4,6.9,62.7,28.6c4,10.5,2.8,22-0.6,32.5c-2.8,8.6-13,21-9.2,30.4
- c-1.5-0.4-33.1-10.2-41.9-15.8c-14.1-8.8-26.8-19.6-36.3-28l-0.3-0.3L638.8,144c-0.4-0.2-0.8-0.4-1.1-0.6
- C642.3,143.4,659.8,145.5,667.6,143.8"/>
+ c-1.5-0.4-33.1-10.2-41.9-15.8c-14.1-8.8-26.8-19.6-36.3-28l-0.3-0.3L146.3,144c-0.4-0.2-0.8-0.4-1.1-0.6
+ C149.8,143.4,167.3,145.5,175.1,143.8"/>
<g id="Helmet_Lamp">
- <path class="st4" d="M677.1,147.4c-0.9,0-1.6-0.2-2.3-0.5c-1.6-0.7-2.8-2-3.6-4c-1.4-3.4-1-8.1,0.9-12.5c2.5-5.6,7.3-9.7,11.5-9.7
- c0.8,0,1.6,0.2,2.4,0.5c2.1,0.9,3.6,3,4.1,6c0.6,3.2,0.1,6.9-1.5,10.4C686.2,143.3,681.3,147.4,677.1,147.4z"/>
+ <path class="st8" d="M184.6,147.4c-0.9,0-1.7-0.2-2.3-0.5c-1.6-0.7-2.8-2-3.6-4c-1.4-3.4-1-8.1,0.9-12.5c2.5-5.7,7.2-9.7,11.5-9.7
+ c0.8,0,1.6,0.2,2.4,0.5c2.1,0.9,3.6,3,4.1,6c0.6,3.2,0.1,6.9-1.5,10.4C193.6,143.3,188.8,147.4,184.6,147.4z"/>
<g>
- <path class="st5" d="M683.6,122.3c0.6,0,1.2,0.1,1.8,0.4c1.6,0.7,2.8,2.5,3.2,4.9c0.5,2.9,0.1,6.3-1.4,9.5
+ <path class="st9" d="M191,122.3c0.6,0,1.2,0.1,1.8,0.4c1.6,0.7,2.8,2.5,3.2,4.9c0.5,2.9,0.1,6.3-1.4,9.5
c-2.2,5.1-6.5,8.8-10.1,8.8c-0.6,0-1.2-0.1-1.7-0.3l0,0l0,0c-1.5-0.6-2.3-2-2.7-3.1c-1.2-3-0.9-7.4,0.8-11.4
- C675.7,126,680,122.3,683.6,122.3 M683.6,119.3c-4.8,0-10.1,4.4-12.9,10.7c-2.1,4.7-2.4,9.8-0.9,13.7c0.9,2.3,2.4,3.9,4.3,4.8
+ C183.2,126,187.4,122.3,191,122.3 M191,119.3c-4.8,0-10.1,4.4-12.9,10.7c-2.1,4.7-2.4,9.8-0.9,13.7c0.9,2.3,2.4,3.9,4.3,4.8
c0.9,0.4,1.9,0.6,3,0.6c4.8,0,10.1-4.4,12.8-10.7c1.7-3.8,2.2-7.8,1.6-11.3c-0.6-3.5-2.4-6-5-7.1
- C685.6,119.5,684.6,119.3,683.6,119.3L683.6,119.3z"/>
+ C193.1,119.5,192.1,119.3,191,119.3L191,119.3z"/>
</g>
</g>
-</g>
-<g>
- <path class="st6" d="M212.8,369.7c0-0.9,0.6-1.5,1.5-1.5h17.8c1.2,0,2,0.4,2.4,1.5l25.8,58.2h0.6l25.3-58.2c0.4-1,1.2-1.5,2.4-1.5
- h17.5c0.9,0,1.5,0.6,1.5,1.5v99c0,0.9-0.6,1.5-1.5,1.5h-17c-0.9,0-1.5-0.6-1.5-1.5v-57.4h-0.6l-18.9,43c-0.6,1.4-1.5,2-2.8,2h-10.3
- c-1.3,0-2.2-0.6-2.8-2l-18.9-43h-0.6v57.4c0,0.9-0.6,1.5-1.5,1.5h-16.9c-0.9,0-1.5-0.6-1.5-1.5V369.7z"/>
- <path class="st6" d="M329.8,432.7v-63c0-0.9,0.6-1.5,1.5-1.5h19c0.9,0,1.5,0.6,1.5,1.5v63.6c0,12.1,6.8,19,17.1,19
- c10.2,0,16.9-6.9,16.9-19v-63.6c0-0.9,0.6-1.5,1.5-1.5h19c0.9,0,1.5,0.6,1.5,1.5v63c0,25.3-16.2,39.1-39,39.1
- C346,471.9,329.8,458.1,329.8,432.7z"/>
- <path class="st6" d="M430,369.7c0-0.9,0.6-1.5,1.5-1.5h19c0.9,0,1.5,0.6,1.5,1.5v79.9c0,0.6,0.3,0.9,0.9,0.9h45
- c0.9,0,1.5,0.6,1.5,1.5v16.6c0,0.9-0.6,1.5-1.5,1.5h-66.4c-0.9,0-1.5-0.6-1.5-1.5V369.7z"/>
- <path class="st6" d="M515.5,369.7c0-0.9,0.6-1.5,1.5-1.5h19c0.9,0,1.5,0.6,1.5,1.5v79.9c0,0.6,0.3,0.9,0.9,0.9h45
- c0.9,0,1.5,0.6,1.5,1.5v16.6c0,0.9-0.6,1.5-1.5,1.5H517c-0.9,0-1.5-0.6-1.5-1.5V369.7z"/>
- <path class="st6" d="M616.4,470.2c-1,0-1.6-0.6-1.9-1.5l-32.4-98.8c-0.3-1.1,0.3-1.6,1.3-1.6h19.5c1,0,1.7,0.4,2,1.5l20.4,66.9h0.4
- l19.8-66.9c0.3-1,0.9-1.5,1.9-1.5h19.3c0.9,0,1.5,0.6,1.2,1.6l-32.4,98.8c-0.3,0.9-0.9,1.5-1.8,1.5H616.4z"/>
- <path class="st6" d="M703.9,369.7c0.3-0.9,0.9-1.5,2-1.5h18.9c1,0,1.6,0.6,1.9,1.5l34.5,99c0.3,0.9,0,1.5-1,1.5h-19.5
- c-1,0-1.7-0.5-2-1.5l-5.8-17.8h-35.7l-5.7,17.8c-0.3,1-0.9,1.5-2,1.5h-19.6c-1,0-1.3-0.6-1-1.5L703.9,369.7z M726.8,432.1
- l-11.5-35.7h-0.4l-11.5,35.7H726.8z"/>
- <path class="st6" d="M776,369.7c0-0.9,0.6-1.5,1.5-1.5h37.9c17.8,0,30.3,7.6,35.2,22.9c1.8,5.7,2.7,11.4,2.7,28s-0.9,22.3-2.7,28
- c-4.9,15.3-17.4,22.9-35.2,22.9h-37.9c-0.9,0-1.5-0.6-1.5-1.5V369.7z M799,450.6h11.5c10.2,0,16.3-3,18.9-11.2
- c1-3,1.7-6.9,1.7-20.1c0-13.2-0.6-17.1-1.7-20.1c-2.5-8.2-8.7-11.2-18.9-11.2H799c-0.6,0-0.9,0.3-0.9,0.9v60.9
- C798.1,450.3,798.4,450.6,799,450.6z"/>
- <path class="st6" d="M933.8,470.2c-1.1,0-1.7-0.6-2-1.5l-32.4-98.8c-0.3-1.1,0.3-1.6,1.3-1.6h19.5c1,0,1.7,0.4,2,1.5l20.4,66.9h0.4
- l19.8-66.9c0.3-1,0.9-1.5,1.9-1.5h19.3c0.9,0,1.5,0.6,1.2,1.6L953,468.7c-0.3,0.9-0.9,1.5-1.8,1.5H933.8z"/>
- <path class="st6" d="M1001.3,470.2c-0.9,0-1.5-0.6-1.5-1.5v-99c0-0.9,0.6-1.5,1.5-1.5h39.6c22.2,0,35.5,13.3,35.5,32.8
- c0,19.2-13.5,32.7-35.5,32.7h-18.1c-0.6,0-0.9,0.3-0.9,0.9v34c0,0.9-0.6,1.5-1.5,1.5H1001.3z M1054.4,401.1
- c0-8.2-5.5-13.8-14.8-13.8h-16.8c-0.6,0-0.9,0.3-0.9,0.9v25.6c0,0.6,0.3,0.9,0.9,0.9h16.8C1048.9,414.7,1054.4,409.3,1054.4,401.1z
- "/>
- <path class="st6" d="M1093.6,369.7c0-0.9,0.6-1.5,1.5-1.5h18c1,0,2,0.4,2.5,1.5l36,64.2h0.8v-64.2c0-0.9,0.6-1.5,1.5-1.5h16.9
- c0.9,0,1.5,0.6,1.5,1.5v99c0,0.9-0.6,1.5-1.5,1.5H1153c-1.2,0-2-0.5-2.5-1.5l-36.1-64h-0.8v64c0,0.9-0.6,1.5-1.5,1.5h-16.9
- c-0.9,0-1.5-0.6-1.5-1.5V369.7z"/>
+ <g id="Privacy_is_a_universal_right">
+ <path class="st10" d="M62.6,195.3c0,0.2-0.2,0.3-0.4,0.3l-20.2-3.6c-0.2,0-0.3-0.2-0.3-0.4l1.5-8.1c0.8-4.5,4-6.8,8-6
+ c3.9,0.7,6.2,4,5.4,8.5l-0.7,3.7c0,0.1,0,0.2,0.2,0.2l6.9,1.3c0.2,0,0.3,0.2,0.3,0.4L62.6,195.3z M50.5,181.9
+ c-1.7-0.3-3,0.6-3.4,2.5l-0.6,3.4c0,0.1,0,0.2,0.2,0.2l5.2,0.9c0.1,0,0.2,0,0.2-0.2l0.6-3.4C53.1,183.6,52.2,182.2,50.5,181.9z"/>
+ <path class="st10" d="M67.5,165.5c-0.1,0.3-0.2,0.3-0.4,0.4l-8.4,1.8l-0.6,2.8c0,0.1,0,0.2,0.1,0.2l7.4,1.7c0.2,0,0.3,0.2,0.2,0.4
+ l-0.9,3.9c0,0.2-0.2,0.3-0.4,0.2l-20-4.6c-0.2,0-0.3-0.2-0.2-0.4l1.9-8.2c1-4.2,4.2-6.4,8-5.5c2.6,0.6,4.4,2.5,4.9,5l9.1-2.2
+ c0.2,0,0.4,0.1,0.3,0.3L67.5,165.5z M53.2,162.6c-1.5-0.4-2.8,0.5-3.2,2.2l-0.8,3.6c0,0.1,0,0.2,0.1,0.2l4.8,1.1
+ c0.1,0,0.2,0,0.2-0.1l0.8-3.6C55.5,164.2,54.8,162.9,53.2,162.6z"/>
+ <path class="st10" d="M49.8,151.9c-0.2-0.1-0.3-0.2-0.2-0.4l1.3-3.7c0.1-0.2,0.2-0.3,0.4-0.2l19.5,6.5c0.2,0.1,0.3,0.2,0.2,0.4
+ l-1.3,3.7c-0.1,0.2-0.2,0.3-0.4,0.2L49.8,151.9z"/>
+ <path class="st10" d="M74.3,145.9c-0.1,0.2-0.3,0.3-0.4,0.2l-21.5-2.2c-0.2,0-0.3-0.2-0.2-0.4l1.6-3.7c0.1-0.2,0.2-0.3,0.4-0.2
+ l14.4,1.8l0-0.1l-11-9.4c-0.2-0.1-0.2-0.3-0.1-0.5l1.6-3.7c0.1-0.2,0.2-0.2,0.4-0.1l16,14.5c0.1,0.1,0.2,0.3,0.1,0.5L74.3,145.9z"
+ />
+ <path class="st10" d="M64.1,120c-0.1-0.2-0.2-0.3-0.1-0.5l2-3.3c0.1-0.2,0.3-0.2,0.5-0.2l21.3,4.6c0.2,0,0.3,0.2,0.2,0.3l-2.1,3.5
+ c-0.1,0.2-0.3,0.2-0.5,0.2l-3.8-0.9l-3.9,6.3l2.5,2.9c0.2,0.2,0.2,0.3,0.1,0.5l-2.1,3.5c-0.1,0.2-0.3,0.2-0.4,0L64.1,120z
+ M77.6,122.7l-7.6-1.8l0,0.1l5.1,5.9L77.6,122.7z"/>
+ <path class="st10" d="M80.1,113.9c-2.6-2-3.3-2.8-4.1-4c-2-3-1.7-6.2,0.6-9.1c2.2-2.8,5.2-3.7,8.3-2.8c0.2,0,0.3,0.2,0.2,0.4
+ l-0.9,3.6c0,0.2-0.2,0.3-0.4,0.2c-1.4-0.4-2.9-0.3-4,1.1c-1,1.3-1,2.7-0.2,3.9c0.5,0.7,1,1.2,3.3,3.1c2.4,1.9,3,2.3,3.8,2.6
+ c1.4,0.5,2.8,0.3,3.8-1c1.1-1.4,0.9-2.8,0.2-4.1c-0.1-0.2,0-0.3,0.2-0.4l3.3-1.7c0.2-0.1,0.3-0.1,0.4,0.1c1.6,2.8,1.3,5.9-0.9,8.7
+ c-2.3,2.9-5.4,3.9-8.8,2.6C83.6,116.5,82.7,115.9,80.1,113.9z"/>
+ <path class="st10" d="M103.1,103.4c-0.1,0.1-0.3,0.1-0.4,0L97,97.5L83.9,93c-0.2-0.1-0.2-0.2-0.1-0.4l2.9-2.8
+ c0.2-0.2,0.3-0.2,0.6-0.1l8.1,2.9l0.1-0.1l-2.6-8.2c-0.1-0.2,0-0.4,0.1-0.5l2.8-2.7c0.2-0.2,0.3-0.1,0.4,0.1l4.2,13.2l5.7,5.8
+ c0.1,0.1,0.1,0.3,0,0.4L103.1,103.4z"/>
+ <path class="st10" d="M104.8,74.3c-0.1-0.2-0.1-0.3,0.1-0.4l3.2-2.3c0.2-0.1,0.3-0.1,0.4,0.1l12.2,16.5c0.1,0.2,0.1,0.3-0.1,0.4
+ l-3.2,2.3c-0.2,0.1-0.3,0.1-0.4-0.1L104.8,74.3z"/>
+ <path class="st10" d="M121.5,84.5c-0.2,0-0.3-0.2-0.3-0.4l0.6-3.5c0-0.2,0.2-0.3,0.4-0.3c1.8,0.2,3.9,0.2,5.9-1
+ c1.9-1.1,2.4-2.7,1.7-3.9c-0.6-1.1-1.7-1.4-4-0.4l-1,0.4c-4,1.7-7.1,1.2-9-2c-2-3.3-0.8-7.1,3.1-9.4c2.4-1.4,5.1-2.1,7.3-1.8
+ c0.2,0,0.3,0.1,0.3,0.4l-0.2,3.4c0,0.2-0.1,0.3-0.3,0.3c-1.9-0.1-3.6,0.2-5,1.1c-1.6,1-1.9,2.3-1.2,3.4c0.6,1,1.8,1.3,4,0.3l1-0.4
+ c4-1.7,7-1.2,9,2.1c2,3.3,1,7.2-3.7,10C127.1,84.5,123.7,85,121.5,84.5z"/>
+ <path class="st10" d="M143.6,52.7c0-0.2,0.1-0.4,0.3-0.4l3.7-1.3c0.2-0.1,0.4,0,0.5,0.2l13.8,16.8c0.1,0.2,0.1,0.3-0.1,0.4
+ l-3.8,1.4c-0.2,0.1-0.4,0-0.5-0.2l-2.4-3.1l-7,2.5l0.2,3.9c0,0.2-0.1,0.4-0.3,0.4l-3.8,1.4c-0.2,0.1-0.3,0-0.3-0.2L143.6,52.7z
+ M152.6,63.2l-4.8-6.1l-0.1,0l0.3,7.8L152.6,63.2z"/>
+ <path class="st10" d="M169.2,58.4l-2-12.9c0-0.2,0.1-0.3,0.3-0.4l3.9-0.6c0.2,0,0.3,0.1,0.4,0.3l2.1,13c0.4,2.5,2,3.7,4.1,3.4
+ c2.1-0.3,3.2-2,2.9-4.5l-2.1-13c0-0.2,0.1-0.3,0.3-0.4l3.9-0.6c0.2,0,0.3,0.1,0.4,0.3l2,12.9c0.8,5.2-2.1,8.5-6.7,9.3
+ C173.8,65.9,170.1,63.6,169.2,58.4z"/>
+ <path class="st10" d="M189.4,42.5c0-0.2,0.1-0.3,0.3-0.3l3.7-0.1c0.2,0,0.4,0.1,0.5,0.3l7.7,13.2l0.2,0l-0.2-13.3
+ c0-0.2,0.1-0.3,0.3-0.3l3.5-0.1c0.2,0,0.3,0.1,0.3,0.3l0.3,20.5c0,0.2-0.1,0.3-0.3,0.3l-3.7,0.1c-0.2,0-0.4-0.1-0.5-0.3l-7.7-13.2
+ l-0.2,0l0.2,13.3c0,0.2-0.1,0.3-0.3,0.3l-3.5,0.1c-0.2,0-0.3-0.1-0.3-0.3L189.4,42.5z"/>
+ <path class="st10" d="M211.3,42.7c0-0.2,0.2-0.3,0.3-0.3l3.9,0.3c0.2,0,0.3,0.2,0.3,0.3l-1.8,20.5c0,0.2-0.2,0.3-0.3,0.3l-3.9-0.3
+ c-0.2,0-0.3-0.2-0.3-0.3L211.3,42.7z"/>
+ <path class="st10" d="M223,65.1c-0.2,0-0.3-0.2-0.3-0.4l-2.9-21.4c0-0.2,0.1-0.3,0.3-0.3l4,0.7c0.2,0,0.3,0.2,0.3,0.4l1.7,14.4
+ l0.1,0l6.5-12.9c0.1-0.2,0.2-0.3,0.5-0.2l3.9,0.7c0.2,0,0.3,0.2,0.2,0.4l-10.3,19c-0.1,0.2-0.2,0.3-0.4,0.2L223,65.1z"/>
+ <path class="st10" d="M241.5,47.7c0.1-0.2,0.2-0.3,0.4-0.2l12.9,4.1c0.2,0.1,0.3,0.2,0.2,0.4l-1,3.2c-0.1,0.2-0.2,0.3-0.4,0.2
+ l-8.7-2.8c-0.1,0-0.2,0-0.2,0.1l-1.3,4c0,0.1,0,0.2,0.1,0.2l7.2,2.3c0.2,0.1,0.3,0.2,0.2,0.4l-1,3.1c-0.1,0.2-0.2,0.3-0.4,0.2
+ l-7.2-2.3c-0.1,0-0.2,0-0.2,0.1l-1.3,4.2c0,0.1,0,0.2,0.1,0.2l8.7,2.8c0.2,0.1,0.3,0.2,0.2,0.4l-1,3.2c-0.1,0.2-0.2,0.3-0.4,0.2
+ l-12.9-4.1c-0.2-0.1-0.3-0.2-0.2-0.4L241.5,47.7z"/>
+ <path class="st10" d="M261.8,77.8c-0.3-0.1-0.3-0.2-0.3-0.5l0-8.6l-2.6-1.2c-0.1-0.1-0.2,0-0.2,0.1l-3.2,6.8
+ c-0.1,0.2-0.2,0.2-0.4,0.1l-3.6-1.7c-0.2-0.1-0.2-0.2-0.1-0.4l8.7-18.6c0.1-0.2,0.2-0.2,0.4-0.1l7.6,3.6c3.9,1.8,5.3,5.5,3.7,9
+ c-1.2,2.4-3.4,3.8-5.9,3.7l0.2,9.3c0,0.2-0.2,0.3-0.4,0.2L261.8,77.8z M267.7,64.5c0.7-1.4,0.1-2.8-1.5-3.6l-3.4-1.6
+ c-0.1-0.1-0.2,0-0.2,0.1l-2.1,4.4c-0.1,0.1,0,0.2,0.1,0.2l3.4,1.6C265.6,66.4,267,66,267.7,64.5z"/>
+ <path class="st10" d="M268.6,78.4c0-0.2,0-0.4,0.3-0.5l3.5-1c0.2-0.1,0.3,0,0.4,0.2c0.6,1.7,1.6,3.6,3.5,4.8
+ c1.9,1.2,3.5,1,4.3-0.2c0.7-1,0.5-2.1-1.5-3.8l-0.9-0.7c-3.3-2.8-4.2-5.8-2.2-9c2.1-3.3,6-3.8,9.8-1.4c2.4,1.5,4.1,3.6,4.8,5.8
+ c0.1,0.2,0,0.3-0.2,0.4l-3.1,1.3c-0.2,0.1-0.3,0-0.4-0.2c-0.8-1.8-1.8-3.1-3.2-4c-1.6-1-2.9-0.7-3.6,0.4c-0.7,1-0.3,2.1,1.5,3.7
+ l0.9,0.7c3.3,2.9,4.2,5.8,2.1,9c-2.1,3.2-6,4.1-10.6,1.1C271.1,83.4,269.1,80.6,268.6,78.4z"/>
+ <path class="st10" d="M300.6,78.6c0.2-0.1,0.3-0.1,0.5,0l3,2.5c0.2,0.1,0.2,0.3,0.1,0.5l-7.9,20.2c-0.1,0.2-0.2,0.2-0.4,0.1
+ l-3.1-2.6c-0.2-0.1-0.2-0.3-0.1-0.5l1.5-3.6l-5.6-4.8l-3.3,2c-0.2,0.1-0.3,0.1-0.5,0l-3.1-2.6c-0.2-0.1-0.1-0.3,0-0.4L300.6,78.6z
+ M295.8,91.5l3-7.2l-0.1-0.1l-6.6,4.1L295.8,91.5z"/>
+ <path class="st10" d="M312.7,89.6c0.1-0.1,0.3-0.1,0.4,0l2.6,2.9c0.1,0.1,0.1,0.3,0,0.4l-12.3,11.1c-0.1,0.1-0.1,0.2,0,0.3
+ l6.2,6.9c0.1,0.1,0.1,0.3,0,0.4l-2.6,2.3c-0.1,0.1-0.3,0.1-0.4,0l-9.2-10.2c-0.1-0.1-0.1-0.3,0-0.4L312.7,89.6z"/>
+ <path class="st10" d="M318.5,131.5c-0.1-0.2-0.1-0.4,0-0.6l4.7-7.2l-1.5-2.4c-0.1-0.1-0.2-0.1-0.3-0.1l-6.4,4
+ c-0.2,0.1-0.3,0.1-0.4-0.1l-2.1-3.4c-0.1-0.2-0.1-0.3,0.1-0.4l17.5-10.8c0.2-0.1,0.3-0.1,0.4,0.1l4.4,7.2c2.3,3.7,1.5,7.5-1.8,9.6
+ c-2.3,1.4-4.9,1.3-7-0.1l-4.9,7.9c-0.1,0.2-0.3,0.2-0.4,0L318.5,131.5z M330.8,123.6c1.3-0.8,1.6-2.3,0.7-3.8l-2-3.2
+ c-0.1-0.1-0.2-0.1-0.3-0.1l-4.2,2.6c-0.1,0.1-0.1,0.2-0.1,0.3l2,3.2C327.9,124,329.4,124.4,330.8,123.6z"/>
+ <path class="st10" d="M340.7,128.7c0.2-0.1,0.3,0,0.4,0.1l1.7,3.5c0.1,0.2,0,0.3-0.1,0.4l-18.4,9c-0.2,0.1-0.3,0-0.4-0.1l-1.7-3.5
+ c-0.1-0.2,0-0.3,0.1-0.4L340.7,128.7z"/>
+ <path class="st10" d="M335.3,140.9c2.9-1.1,4.1-1.4,5.6-1.5c3.6-0.2,6.2,2,7.5,5.5c1.4,3.7,0.4,6.8-1.6,8.6
+ c-0.1,0.2-0.3,0.2-0.5,0l-2.5-2.6c-0.1-0.2-0.1-0.3,0-0.5c1-1.3,1.4-2.5,0.8-4.2c-0.6-1.7-1.9-2.4-3.4-2.4c-0.8,0-1.8,0.3-4.3,1.2
+ c-2.6,1-3.5,1.4-4.1,1.9c-1.2,0.9-1.6,2.3-1,4c0.6,1.5,1.8,2.5,3.2,2.4c0.5,0,1.2-0.2,2-0.5c0.1,0,0.2-0.1,0.1-0.2l-1-2.7
+ c-0.1-0.2,0-0.3,0.2-0.4l2.8-1c0.2-0.1,0.3,0,0.4,0.2l2.5,6.8c0.1,0.2,0,0.3-0.2,0.4l-1.6,0.6c-1.8,0.6-3.4,1.1-4.6,1.2
+ c-3.5,0.2-6.3-1.9-7.6-5.4c-1.3-3.5-0.7-6.9,2.1-9.1C331.3,142.6,332.4,142,335.3,140.9z"/>
+ <path class="st10" d="M352.3,158.4c0.2,0,0.3,0.1,0.4,0.2l0.8,3.9c0,0.2-0.1,0.3-0.2,0.4l-7.8,1.7c-0.1,0-0.2,0.1-0.1,0.2l1.5,6.7
+ c0,0.1,0.1,0.2,0.2,0.1l7.8-1.7c0.2,0,0.3,0.1,0.4,0.2l0.8,3.9c0,0.2-0.1,0.3-0.2,0.4l-20.1,4.4c-0.2,0-0.3-0.1-0.4-0.2l-0.8-3.9
+ c0-0.2,0.1-0.3,0.2-0.4l8-1.7c0.1,0,0.2-0.1,0.1-0.2l-1.5-6.7c0-0.1-0.1-0.2-0.2-0.1l-8,1.7c-0.2,0-0.3-0.1-0.4-0.2l-0.8-3.9
+ c0-0.2,0.1-0.3,0.2-0.4L352.3,158.4z"/>
+ <path class="st10" d="M336.2,186.9c0-0.2,0.1-0.3,0.3-0.3l16.5-1.3c0.1,0,0.2-0.1,0.2-0.2l-0.4-5.3c0-0.2,0.1-0.3,0.3-0.3l3.4-0.3
+ c0.2,0,0.3,0.1,0.3,0.3l1.3,15.6c0,0.2-0.1,0.3-0.3,0.3l-3.4,0.3c-0.2,0-0.3-0.1-0.3-0.3l-0.4-5.3c0-0.1-0.1-0.2-0.2-0.2
+ l-16.5,1.3c-0.2,0-0.3-0.1-0.3-0.3L336.2,186.9z"/>
+ </g>
+ <g id="Mullvad_VPN">
+ <path class="st10" d="M103.7,296.2c0.1-0.2,0.3-0.2,0.5,0l3.3,2.8c0.2,0.2,0.3,0.4,0.2,0.7l-4.3,14.8l0.1,0.1l13.8-6.8
+ c0.2-0.1,0.5-0.1,0.7,0.1l3.2,2.7c0.2,0.1,0.2,0.3,0,0.5l-15.5,18.3c-0.1,0.2-0.3,0.2-0.5,0l-3.1-2.7c-0.2-0.1-0.2-0.3,0-0.5
+ l9-10.6l-0.1-0.1l-10.2,5c-0.3,0.2-0.6,0.1-0.8-0.1l-1.9-1.6c-0.2-0.2-0.3-0.5-0.2-0.8l3.2-10.9l-0.1-0.1l-9,10.6
+ c-0.1,0.2-0.3,0.2-0.5,0l-3.1-2.7c-0.2-0.1-0.2-0.3,0-0.5L103.7,296.2z"/>
+ <path class="st10" d="M116.3,326l7.7-13.2c0.1-0.2,0.3-0.2,0.5-0.1l4,2.3c0.2,0.1,0.2,0.3,0.1,0.5l-7.7,13.3
+ c-1.5,2.5-0.9,4.8,1.3,6.1c2.1,1.2,4.4,0.6,5.9-1.9l7.7-13.3c0.1-0.2,0.3-0.2,0.5-0.1l4,2.3c0.2,0.1,0.2,0.3,0.1,0.5l-7.7,13.2
+ c-3.1,5.3-8.2,6.2-12.9,3.5C115,336.2,113.2,331.3,116.3,326z"/>
+ <path class="st10" d="M143.5,323.6c0.1-0.2,0.3-0.3,0.5-0.2l4.3,1.7c0.2,0.1,0.3,0.3,0.2,0.5l-7.1,18.1c-0.1,0.1,0,0.2,0.1,0.3
+ l10.2,4c0.2,0.1,0.3,0.3,0.2,0.5l-1.5,3.8c-0.1,0.2-0.3,0.3-0.5,0.2l-15-5.9c-0.2-0.1-0.3-0.3-0.2-0.5L143.5,323.6z"/>
+ <path class="st10" d="M161.1,330.2c0.1-0.2,0.2-0.3,0.4-0.3l4.5,1.1c0.2,0.1,0.3,0.2,0.3,0.4l-4.5,18.9c0,0.1,0,0.2,0.2,0.3
+ l10.6,2.5c0.2,0.1,0.3,0.2,0.3,0.4l-0.9,3.9c-0.1,0.2-0.2,0.3-0.4,0.3l-15.7-3.7c-0.2-0.1-0.3-0.2-0.3-0.4L161.1,330.2z"/>
+ <path class="st10" d="M180.7,358.9c-0.3,0-0.4-0.2-0.4-0.4l-5.3-24.7c0-0.3,0.1-0.4,0.4-0.4l4.7,0.5c0.3,0,0.4,0.2,0.4,0.4
+ l3.2,16.7l0.1,0l6.5-15.6c0.1-0.2,0.3-0.3,0.5-0.3l4.7,0.5c0.2,0,0.3,0.2,0.2,0.4l-10.4,23c-0.1,0.2-0.3,0.3-0.5,0.3L180.7,358.9z
+ "/>
+ <path class="st10" d="M202.4,335.6c0.1-0.2,0.2-0.4,0.5-0.4l4.6-0.2c0.3,0,0.4,0.1,0.5,0.3l9.2,23.7c0.1,0.2,0,0.4-0.2,0.4
+ l-4.7,0.2c-0.3,0-0.4-0.1-0.5-0.3l-1.6-4.3l-8.7,0.3l-1.2,4.4c-0.1,0.3-0.2,0.4-0.5,0.4l-4.8,0.2c-0.3,0-0.3-0.1-0.3-0.4
+ L202.4,335.6z M208.5,350.6l-3.1-8.5l-0.1,0l-2.5,8.8L208.5,350.6z"/>
+ <path class="st10" d="M217.8,334.8c0-0.2,0.1-0.4,0.3-0.4l9-1.8c4.2-0.8,7.6,0.4,9.5,3.8c0.7,1.3,1.2,2.6,2,6.5s0.8,5.4,0.7,6.8
+ c-0.5,3.9-3,6.3-7.3,7.1l-9,1.8c-0.2,0-0.4-0.1-0.4-0.3L217.8,334.8z M227.1,352.9l2.7-0.5c2.4-0.5,3.7-1.5,4-3.6
+ c0.1-0.8,0.1-1.7-0.6-4.9c-0.6-3.1-1-4-1.3-4.7c-1-1.8-2.6-2.3-5-1.8l-2.7,0.5c-0.1,0-0.2,0.1-0.2,0.3l2.9,14.5
+ C226.9,352.9,227,353,227.1,352.9z"/>
+ <path class="st10" d="M261.1,347.9c-0.2,0.1-0.4,0-0.6-0.1l-16.7-18.9c-0.2-0.2-0.1-0.4,0.1-0.5l4.3-1.9c0.2-0.1,0.4-0.1,0.6,0.1
+ l10.9,13l0.1,0l-2-16.8c0-0.3,0.1-0.4,0.3-0.5l4.3-1.9c0.2-0.1,0.4,0,0.4,0.3l2.2,25.1c0,0.2-0.1,0.4-0.3,0.5L261.1,347.9z"/>
+ <path class="st10" d="M277.5,340.3c-0.2,0.1-0.4,0.1-0.5-0.1l-12.7-20.4c-0.1-0.2-0.1-0.4,0.1-0.5l8.1-5.1c4.6-2.8,9-1.8,11.5,2.2
+ c2.5,4,1.4,8.5-3.1,11.3l-3.7,2.3c-0.1,0.1-0.1,0.2-0.1,0.3l4.4,7c0.1,0.2,0.1,0.4-0.1,0.5L277.5,340.3z M279.5,319.2
+ c-1.1-1.7-2.9-2.1-4.8-0.9l-3.5,2.2c-0.1,0.1-0.1,0.2-0.1,0.3l3.3,5.3c0.1,0.1,0.2,0.1,0.3,0.1l3.5-2.2
+ C280.2,322.8,280.6,320.9,279.5,319.2z"/>
+ <path class="st10" d="M281.7,308.7c-0.1-0.2-0.1-0.4,0-0.5l3.3-2.9c0.2-0.2,0.4-0.2,0.7-0.1l16.8,6l0.1-0.1l-10.2-11.7
+ c-0.1-0.2-0.1-0.4,0-0.5l3.1-2.7c0.2-0.1,0.4-0.1,0.5,0l15.8,18.1c0.1,0.2,0.1,0.4,0,0.5l-3.3,2.8c-0.2,0.2-0.4,0.2-0.7,0.1
+ l-16.8-6l-0.1,0.1l10.2,11.7c0.1,0.2,0.1,0.4,0,0.5l-3.1,2.7c-0.2,0.1-0.4,0.1-0.5,0L281.7,308.7z"/>
+ </g>
</g>
</svg>
diff --git a/templates/membership.html b/templates/membership.html
index 8c3efaec..d1382043 100644
--- a/templates/membership.html
+++ b/templates/membership.html
@@ -42,25 +42,16 @@
<div class="container" id="shallot">
<div class="row py-5">
<h3 class="col-12 text-primary display-4">Shallot Onion Members</h3>
- <div class="col-md-4 col-xl-4 my-2">
+ <div class="col-md-6 col-xl-6 my-2">
<div class="card border-1 h-100">
<img class="card-img-top" src="{{ '../../static/images/membership/logos/MullvadVPN.svg' }}" alt="MullvadVPN">
<div class="card-body">
- <h4><a href="#">Mullvad VPN</a></h4>
- Some description
- </div>
- </div>
- </div>
- <div class="col-md-4 col-xl-4 my-2">
- <div class="card border-1 h-100">
- <img class="card-img-top" src="#" alt="Card image cap">
- <div class="card-body">
- <h4><a href="#">Shallot Onion Member</a></h4>
- Some description
+ <p><a href="#">Mullvad VPN</a></p>
+ Mullvad is a VPN service that helps users keep their online activity, identity, and location private. With a fundamental belief in privacy as a universal right, Mullvad's ultimate goal is to make Internet censorship and mass surveillance ineffective.
</div>
</div>
</div>
- <div class="col-md-4 col-xl-4 my-2">
+ <div class="col-md-6 col-xl-6 my-2">
<div class="card border-1 h-100">
<img class="card-img-top" src="#" alt="Card image cap">
<div class="card-body">
@@ -69,7 +60,6 @@
</div>
</div>
</div>
- </div>
</div>
<div class="container" id="vidalia">
<div class="row py-5">
1
0

24 Jul '20
commit 0aa75bf9eaa39c55074ffaa32845b7399466798a
Author: David Goulet <dgoulet(a)ev0ke.net>
Date: Fri Jul 24 13:15:33 2020 -0400
update: New updated list for 2020
Signed-off-by: David Goulet <dgoulet(a)ev0ke.net>
---
fallback_offer_list | 239 +++++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 200 insertions(+), 39 deletions(-)
diff --git a/fallback_offer_list b/fallback_offer_list
index 4e6964d..0fa71ca 100644
--- a/fallback_offer_list
+++ b/fallback_offer_list
@@ -62,16 +62,8 @@
# https://lists.torproject.org/pipermail/tor-relays/2015-December/008381.html
# Sent additional emails to teor with updated relays
-81.7.11.96:9030 orport=9001 id=8FA37B93397015B2BC5A525C908485260BE9F422 # Doedel22
-# 9F5068310818ED7C70B0BC4087AB55CB12CB4377 not found in current consensus
-178.254.19.101:80 orport=443 id=F9246DEF2B653807236DA134F2AEAB103D58ABFE # Freebird31
-178.254.19.101:9030 orport=9001 id=0C475BA4D3AA3C289B716F95954CAD616E50C4E5 # Freebird32
-81.7.14.253:9001 orport=443 id=1AE039EE0B11DB79E4B4B29CBA9F752864A0259E # Ichotolot60
81.7.11.186:1080 orport=443 id=B86137AE9681701901C6720E55C16805B46BD8E3 # BeastieJoy60
-85.25.213.211:465 orport=80 id=CE47F0356D86CF0A1A2008D97623216D560FB0A8 # BeastieJoy61
-85.25.159.65:995 orport=80 id=52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9 # BeastieJoy63
81.7.3.67:993 orport=443 id=A2E6BB5C391CD46B38C55B4329C35304540771F1 # BeastieJoy62
-81.7.14.31:9001 orport=443 id=7600680249A22080ECC6173FBBF64D6FCF330A61 # Ichotolot62
# https://lists.torproject.org/pipermail/tor-relays/2015-December/008382.html
51.255.33.237:9091 orport=9001 id=A360C21FA87FFA2046D92C17086A6B47E5C68109
@@ -687,36 +679,10 @@
193.70.112.165:80 orport=443 id=F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC # ParkBenchInd001
# Email sent directly to teor
-185.220.101.6:10006 orport=20006 id=C08DE49658E5B3CFC6F2A952B453C4B608C9A16A # niftyvolcanorabbit
-185.220.101.13:10013 orport=20013 id=71AB4726D830FAE776D74AEF790CF04D8E0151B4 # niftycottontail
-185.220.101.5:10005 orport=20005 id=1084200B44021D308EA4253F256794671B1D099A # niftyhedgehog
-185.220.101.9:10009 orport=20009 id=14877C6384A9E793F422C8D1DDA447CACA4F7C4B # niftywoodmouse
-185.220.101.8:10008 orport=20008 id=24E91955D969AEA1D80413C64FE106FAE7FD2EA9 # niftymouse
-185.220.101.1:10001 orport=20001 id=28F4F392F8F19E3FBDE09616D9DB8143A1E2DDD3 # niftycottonmouse
-185.220.101.21:10021 orport=20021 id=348B89013EDDD99E4755951D1EC284D9FED71226 # niftysquirrel
-185.220.101.10:10010 orport=20010 id=4031460683AE9E0512D3620C2758D98758AC6C93 # niftyeuropeanrabbit
-185.220.101.34:10034 orport=20034 id=47C42E2094EE482E7C9B586B10BABFB67557030B # niftyquokka
185.220.101.18:10018 orport=20018 id=5D5006E4992F2F97DF4F8B926C3688870EB52BD8 # niftyplagiodontia
-185.220.101.28:10028 orport=20028 id=609E598FB6A00BCF7872906B602B705B64541C50 # niftychipmunk
-185.220.101.20:10020 orport=20020 id=619349D82424C601CAEB94161A4CF778993DAEE7 # niftytucotuco
-185.220.101.17:10017 orport=20017 id=644DECC5A1879C0FE23DE927DD7049F58BBDF349 # niftyhutia
-185.220.101.0:10000 orport=20000 id=6E94866ED8CA098BACDFD36D4E8E2B459B8A734E # niftybeaver
-185.220.101.30:10030 orport=20030 id=71CFDEB4D9E00CCC3E31EC4E8A29E109BBC1FB36 # niftypedetidae
-185.220.101.29:10029 orport=20029 id=7DC52AE6667A30536BA2383CD102CFC24F20AD71 # niftyllipika
-185.220.101.41:10041 orport=20041 id=7E281CD2C315C4F7A84BC7C8721C3BC974DDBFA3 # niftyporcupine
-185.220.101.25:10025 orport=20025 id=8EE0534532EA31AA5172B1892F53B2F25C76EB02 # niftyjerboa
-185.220.101.33:10033 orport=20033 id=906DCB390F2BA987AE258D745E60BAAABAD31DE8 # niftyquokka
-185.220.101.26:10026 orport=20026 id=92A6085EABAADD928B6F8E871540A1A41CBC08BA # niftypedetes
185.220.101.40:10040 orport=20040 id=9A857254F379194D1CD76F4A79A20D2051BEDA3F # niftynutria
-185.220.101.42:10042 orport=20042 id=9B816A5B3EB20B8E4E9B9D1FBA299BD3F40F0320 # niftypygmyjerboa
-185.220.101.2:10002 orport=20002 id=B740BCECC4A9569232CDD45C0E1330BA0D030D33 # niftybunny
-185.220.101.32:10032 orport=20032 id=B771AA877687F88E6F1CA5354756DF6C8A7B6B24 # niftypika
185.220.101.12:10012 orport=20012 id=BC82F2190DE2E97DE65F49B4A95572374BDC0789 # niftycapybara
-185.220.101.22:10022 orport=20022 id=CA37CD46799449D83B6B98B8C22C649906307888 # niftyjackrabbit
-185.220.101.4:10004 orport=20004 id=CDA2EA326E2272C57ACB26773D7252C211795B78 # niftygerbil
185.220.101.14:10014 orport=20014 id=E7EBA5D8A4E09684D11A1DF24F75362817333768 # niftyhare
-185.220.101.16:10016 orport=20016 id=EC1997D51892E4607C68E800549A1E7E4694005A # niftyguineapig
-185.220.101.24:10024 orport=20024 id=FDA70EC93DB01E3CB418CB6943B0C68464B18B4C # niftyrat
# Email sent directly to teor, verified using relay contact info
198.232.165.2:9030 orport=9001 id=30C19B81981F450C402306E2E7CFB6C3F79CB6B2
@@ -833,7 +799,6 @@
# Email sent directly to teor
# https://lists.torproject.org/pipermail/tor-relays/2017-December/013961.html
-178.17.174.14:9030 orport=9001 id=B06F093A3D4DFAD3E923F4F28A74901BD4F74EB1 # TorExitMoldova
178.17.170.23:9030 orport=9001 id=742C45F2D9004AADE0077E528A4418A6A81BC2BA # TorExitMoldova2
# Email sent directly to teor
@@ -858,7 +823,6 @@
139.99.130.178:80 orport=443 id=867B95CACD64653FEEC4D2CEFC5C49B4620307A7 # coffswifi2
# https://lists.torproject.org/pipermail/tor-relays/2017-December/013946.html
-172.98.193.43:80 orport=443 id=5E56738E7F97AA81DEEF59AF28494293DFBFCCDF # Backplane
# Email sent directly to teor
62.210.254.132:80 orport=443 id=8456DFA94161CDD99E480C2A2992C366C6564410 # turingmachine
@@ -890,7 +854,6 @@
85.230.184.93:9030 orport=443 id=855BC2DABE24C861CD887DB9B2E950424B49FC34 # Logforme
# https://lists.torproject.org/pipermail/tor-relays/2018-January/014024.html
-82.161.212.209:9030 orport=9001 id=4E8CE6F5651E7342C1E7E5ED031E82078134FB0D ipv6=[2001:980:d7ed:1:ff:b0ff:fe00:d0b]:9001 # ymkeo
# https://lists.torproject.org/pipermail/tor-relays/2018-January/014055.html
37.157.255.35:9030 orport=9090 id=361D33C96D0F161275EE67E2C91EE10B276E778B # cxx4freedom
@@ -989,10 +952,8 @@
37.252.187.111:9030 orport=443 id=EE4AF632058F0734C1426B1AD689F47445CA2056 ipv6=[2a00:63c1:c:111::2]:443
51.38.134.104:9030 orport=443 id=B57A87009FA838471FB2227DDE68165AB2A2FCC4
195.123.245.141:9030 orport=443 id=465D17C6FC297E3857B5C6F152006A1E212944EA
-185.112.82.50:9030 orport=443 id=7AAF5597B18D82CC90CA95FB7976A1CEA4A32E06 ipv6=[2a0c:f040::dcd2:faff:fe8f:70f3]:443
213.183.60.21:9030 orport=443 id=39F91959416763AFD34DBEEC05474411B964B2DC
185.25.50.25:9030 orport=443 id=4DC4E6187F1193F2717A5E3DF5ACEBD6B162D5CC ipv6=[2a04:2180:0:1::d1e0:514e]:443
-91.201.65.91:9030 orport=443 id=57C6DF5B93E54EB9C8DB90029D9E9A1111BD34D2
5.39.60.243:9030 orport=443 id=3B07C500AC17E7B5A1EE616613E104A094AB87F3
5.34.183.29:9030 orport=443 id=8F6197E5508338B3E3A6BFF59F9EC8F21E1375FB
185.225.17.173:9030 orport=443 id=79E683340B80676DCEB029E48FBD36BC66EBDA1E ipv6=[2a0a:c800:1:5::86]:443
@@ -1092,3 +1053,203 @@
50.7.74.174:9030 orport=9001 id=3AFDAAD91A15B4C6A7686A53AA8627CA871FF491 ipv6=[2001:49f0:d002:2::57]:443 # theia7
50.7.74.170:80 orport=443 id=5BF17163CBE73D8CD9FDBE030C944EA05707DA93 ipv6=[2001:49f0:d002:2::58]:443 # theia8
50.7.74.170:9030 orport=9001 id=C36A434DB54C66E1A97A5653858CE36024352C4D ipv6=[2001:49f0:d002:2::59]:443 # theia9
+
+
+#
+# Email sent to tor-relays@ or ggus personally. See:
+# https://gitlab.torproject.org/tpo/core/fallback-scripts/-/issues/30971
+#
+185.220.101.21:20021 orport=10021 id=FAEC86A9A37152F0371D67917ABA398467DFBD9C ipv6=[2a0b:f4c2::21]:10021 # niftytreerat
+91.143.88.62:80 orport=443 id=F9246DEF2B653807236DA134F2AEAB103D58ABFE # Freebird31
+185.220.101.3:40003 orport=30003 id=F8E9C0C3A4B61E7599AA7A23D7ADE77E5BAB2663 ipv6=[2a0b:f4c2::3]:20003 # niftyleithia
+185.220.101.9:20009 orport=10009 id=EEB8F7554A54A96B51245AB47EB7B7DD99A98493 ipv6=[2a0b:f4c2::9]:10009 # niftyexit1
+185.220.101.10:40010 orport=30010 id=EDC4243F57F9B856B400398D5F6C354F8408EEA9 ipv6=[2a0b:f4c2::10]:20010 # niftyjunipervole
+185.220.101.137:40137 orport=30137 id=E6FAC9A7F33EE66F03C55C119770B2D45D3C576B ipv6=[2a0b:f4c2:1::137]:20137 # niftydormouse
+185.220.101.1:20001 orport=10001 id=E6288334BC0F95345817811880DDEA184E63AE69 ipv6=[2a0b:f4c2::1]:10001 # niftyentry106
+185.220.101.2:40002 orport=30002 id=E4B04C7D734B2294E8ECE057303E89B91EE88462 ipv6=[2a0b:f4c2::2]:20002 # niftyhousemouse
+185.220.101.2:20002 orport=10002 id=E321D0118DAD44BBC74A5C26FE7CFDBAAF3DA077 ipv6=[2a0b:f4c2::2]:10002 # niftyexit
+185.220.101.143:20143 orport=10143 id=E013CC98CCC1E6AFDCFC9681A53DC2DEFE5D4CCC ipv6=[2a0b:f4c2:1::143]:10143 # niftyblythsvole
+192.166.245.138:9030 orport=9001 id=D78D1B4489CF4FFB0FD74014BDF2D600D8EE5B05 # TorExitAlbania2
+212.83.166.62:80 orport=443 id=D7082DB97E7F0481CBF4B88CA5F5683399E196A3 # shhop
+45.20.152.171:80 orport=443 id=D0F2882D84450F47C3FC922D5F6A262AB1395D6D ipv6=[2001:470:1f06:488::2]:443 # CoolcomputersTOR
+85.25.213.211:465 orport=80 id=CE47F0356D86CF0A1A2008D97623216D560FB0A8 # BeastieJoy61
+185.220.101.143:40143 orport=30143 id=CD97DD0842A79184A7D057ECACEF7408C239C710 ipv6=[2a0b:f4c2:1::143]:20143 # niftychionomy
+185.220.101.17:20017 orport=10017 id=CA37CD46799449D83B6B98B8C22C649906307888 ipv6=[2a0b:f4c2::17]:10017 # niftyjackrabbit
+130.63.78.95:9030 orport=9001 id=C14CE6C2145688B640EB6457F39C1C6E1DC684D4 # YankleRotaryEngine
+185.220.101.14:40014 orport=30014 id=C08DE49658E5B3CFC6F2A952B453C4B608C9A16A ipv6=[2a0b:f4c2::14]:20014 # niftyvolcanorabbit
+185.220.101.129:20129 orport=10129 id=C00C28C2B1A7D8038517626CECA9BCB23B0A31D2 ipv6=[2a0b:f4c2:1::129]:10129 # niftybankvole
+185.220.101.5:40005 orport=30005 id=FDA70EC93DB01E3CB418CB6943B0C68464B18B4C ipv6=[2a0b:f4c2::5]:20005 # niftyrat
+185.21.217.33:20043 orport=10043 id=BCDE75725B927738B6FD34EA2D78F4FA77B99848 # niftyentry117
+185.220.101.12:20012 orport=10012 id=B771AA877687F88E6F1CA5354756DF6C8A7B6B24 ipv6=[2a0b:f4c2::12]:10012 # niftypika
+185.220.101.136:40136 orport=30136 id=B740BCECC4A9569232CDD45C0E1330BA0D030D33 ipv6=[2a0b:f4c2:1::136]:20136 # niftybunny
+185.220.101.142:40142 orport=30142 id=B4DD1F46C6E5B43D9654FF56BD32333D6586E536 ipv6=[2a0b:f4c2:1::142]:20142 # niftyalloumyraion
+185.220.101.8:40008 orport=30008 id=B2002D5C75A0FAD8F33962614718F35CB672CC57 ipv6=[2a0b:f4c2::8]:2008 # niftyentry107
+178.17.174.14:9030 orport=9001 id=B06F093A3D4DFAD3E923F4F28A74901BD4F74EB1 ipv6=[2a00:1dc0:caff:8b::5b9a]:9001 # TorExitMoldova
+89.163.128.25:9030 orport=9001 id=AE6A8C18E7499B586CD36246AC4BCAFFBBF93AB2 # Doedel21
+89.163.128.29:80 orport=443 id=9F5068310818ED7C70B0BC4087AB55CB12CB4377 # Doedel26
+185.220.101.8:20008 orport=10008 id=9EEDBAD7EE351996DFC91578E882BEF4FE5EDBFA ipv6=[2a0b:f4c2::8]:10008 # niftycastoroides
+185.220.101.13:20013 orport=10013 id=9B94A776DA2C0B974BF4E06A352133EDFE62036C ipv6=[2a0b:f4c2::13]:10013 # niftyredrockrat
+185.220.101.5:20005 orport=10005 id=9B816A5B3EB20B8E4E9B9D1FBA299BD3F40F0320 ipv6=[2a0b:f4c2::5]:10005 # niftypygmyjerboa
+188.127.69.60:80 orport=443 id=9B2BC7EFD661072AFADC533BE8DCF1C19D8C2DCC ipv6=[2a02:29d0:8008:c0de:bad:beef::]:443 # MIGHTYWANG
+185.220.101.131:20131 orport=10131 id=9910C6DEEA9907EE7AEFCE0DA072F94F86EBFD48 ipv6=[2a0b:f4c2:1::131]:10131 # niftyfoxsquirrel
+185.220.101.20:20020 orport=10020 id=97D2A26EA5C9972E66D23F4698E94DBDBA8F6C18 ipv6=[2a0b:f4c2::20]:10020 # niftyredsquirrel
+185.220.101.14:20014 orport=10014 id=957354D72042719C310A907FBFE42A3232C78757 ipv6=[2a0b:f4c2::14]:10014 # niftytamiasatsali
+185.220.101.18:40018 orport=30018 id=92A6085EABAADD928B6F8E871540A1A41CBC08BA ipv6=[2a0b:f4c2::18]:20018 # niftypedetes
+185.220.101.12:40012 orport=30012 id=906DCB390F2BA987AE258D745E60BAAABAD31DE8 ipv6=[2a0b:f4c2::12]:20012 # niftyquokka
+89.163.128.26:9030 orport=9001 id=8FA37B93397015B2BC5A525C908485260BE9F422 # Doedel22
+185.220.101.23:20003 orport=10003 id=8EE0534532EA31AA5172B1892F53B2F25C76EB02 ipv6=[2a0b:f4c2::3]:10003 # niftyjerboa
+145.239.91.163:80 orport=443 id=8E52CC35132AC6DF3781F539148781274D150919 ipv6=[2001:41d0:601:1100::27ea]:443 # Nicenstein2
+188.138.102.98:465 orport=443 id=8CAA470B905758742203E3EB45941719FCA9FEEC # BeastieJoy64
+185.220.101.6:40006 orport=30006 id=88AE3BC088396F1D3FCC4F2F588C0DC837599D20 ipv6=[2a0b:f4c2::6]:20006 # niftytamiasaristus
+152.89.106.147:9030 orport=9001 id=8111FEB45EF2950EB8F84BFD8FF070AB07AEE9DD ipv6=[2a03:4000:39:605:c4f2:c9ff:fe64:c215]:9001 # TugaOnionMR3
+185.21.217.33:20035 orport=10035 id=7ED3D8AFAC750F8CC0BDF8C87FE3BCBA2BBE2209 # niftyentry100
+185.220.101.19:20019 orport=10019 id=7E281CD2C315C4F7A84BC7C8721C3BC974DDBFA3 ipv6=[2a0b:f4c2::19]:10019 # niftyporcupine
+185.220.101.11:20011 orport=10011 id=7DC52AE6667A30536BA2383CD102CFC24F20AD71 ipv6=[2a0b:f4c2::11]:10011 # niftyllipika
+185.220.101.4:20004 orport=10004 id=7D921363817BE896B5462E90033DA937BEF7CE3F ipv6=[2a0b:f4c2::4]:10004 # niftymuskrat
+62.171.144.155:80 orport=443 id=7614EF326635DA810638E2F5D449D10AE2BB7158 ipv6=[2a02:c207:3004:8874::1]:443 # Nicenstein
+81.7.14.31:9001 orport=443 id=7600680249A22080ECC6173FBBF64D6FCF330A61 # Ichotolot62
+185.220.101.15:20015 orport=10015 id=7226BE09B7A81000BBF7D959E360B2FE41CCC639 ipv6=[2a0b:f4c2::15]:10015 # niftyentry103
+185.220.101.4:40004 orport=30004 id=71CFDEB4D9E00CCC3E31EC4E8A29E109BBC1FB36 ipv6=[2a0b:f4c2::4]:20004 # niftypedetidae
+185.220.101.144:20144 orport=10144 id=71AB4726D830FAE776D74AEF790CF04D8E0151B4 ipv6=[2a0b:f4c2:1::144]:10144 # niftycottontail
+51.15.117.50:80 orport=443 id=6F647831035CDB891B33103A073AEB9028122129 # torturing
+185.220.101.136:20136 orport=10136 id=6E94866ED8CA098BACDFD36D4E8E2B459B8A734E ipv6=[2a0b:f4c2:1::136]:10136 # niftybeaver
+185.220.101.16:40016 orport=30016 id=6C64AE6D7EFDA52A463FB6ADCDAE2D2DDE0677C3 ipv6=[2a0b:f4c2::16]:20016 # niftyhornedgopher
+185.220.101.10:20010 orport=10010 id=644DECC5A1879C0FE23DE927DD7049F58BBDF349 ipv6=[2a0b:f4c2::10]:10010 # niftyhutia
+185.220.101.7:10007 orport=20007 id=619349D82424C601CAEB94161A4CF778993DAEE7 ipv6=[2a0b:f4c2::7]:10007 # niftytucotuco
+185.220.101.130:20130 orport=10130 id=609E598FB6A00BCF7872906B602B705B64541C50 ipv6=[2a0b:f4c2:1::130]:10130 # niftychipmunk
+172.98.193.43:80 orport=443 id=5E56738E7F97AA81DEEF59AF28494293DFBFCCDF # Backplane
+185.21.217.32:20041 orport=10041 id=5CCC3569C67B7F1BB733664D43DF4645F2A4B04D # niftyentry115
+205.185.127.217:80 orport=443 id=576F242DC99996D31FFEF6DD5E083FD439ECF4C7 ipv6=[2605:6400:20:97:707a:ed00:b00b:135]:443 # HawaiianShirts5
+185.220.101.135:40135 orport=30135 id=56850752096EE63711F99B2FA5A812477561697D ipv6=[2a0b:f4c2:1::135]:20135 # niftyafricagiantrat
+85.25.159.65:995 orport=80 id=52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9 # BeastieJoy63
+176.223.141.106:80 orport=443 id=5262556D44A7F2434990FDE1AE7973C67DF49E58 # Theoden
+185.220.101.130:40130 orport=30130 id=50B787A9FB21417BFD7B5067707DBF82D71DB11C ipv6=[2a0b:f4c2:1::130]:20130 # niftydiatomys
+185.220.101.13:40013 orport=30013 id=48BE372CA2104D2422D49CD321060E7F697B52D9 ipv6=[2a0b:f4c2::13]:20013 # niftysteppemarmot
+185.220.101.20:40020 orport=30020 id=47C42E2094EE482E7C9B586B10BABFB67557030B ipv6=[2a0b:f4c2::20]:20020 # niftysugarglider
+185.220.101.144:40144 orport=30144 id=4031460683AE9E0512D3620C2758D98758AC6C93 ipv6=[2a0b:f4c2:1::144]:20144 # niftyeuropeanrabbit
+185.220.101.21:40021 orport=30021 id=3F129FB71EB2B019B47403A5552EB2D40E5369F2 ipv6=[2a0b:f4c2::21]:20021 # niftywoodlemming
+95.216.211.81:80 orport=443 id=3CCF9573F59137E52787D9C322AC19D2BD090B70 ipv6=[2a01:4f9:c010:4dfa::1]:443 # BurningMan
+185.220.101.6:20006 orport=10006 id=348B89013EDDD99E4755951D1EC284D9FED71226 ipv6=[2a0b:f4c2::6]:10006 # niftysquirrel
+185.220.101.1:40001 orport=30001 id=30E747B3058994CCCBEAF8B5B4791A9F1628AB7D ipv6=[2a0b:f4c2::1]:20001 # niftyentry113
+185.220.101.16:20016 orport=10016 id=2E44E8EB8C7711C1157BD8025F07165CFF8FA2B6 ipv6=[2a0b:f4c2::16]:10016 # niftyexit8
+89.163.128.28:9030 orport=9001 id=2CE96A8A1DA032664C90F574AFFBECE18A6E8DFC # Doedel24
+5.181.50.99:80 orport=443 id=2BB85DC5BD3C6F0D81A4F2B5882176C6BF7ECF5A ipv6=[2a03:4000:3f:16c:3851:6bff:fe07:bd2]:443 # AlanTuring
+185.220.101.11:40011 orport=30011 id=2A231A5CA7AF91029B7475511D7D16DF85EC9221 ipv6=[2a0b:f4c2::11]:20011 # niftyneochoerus
+185.220.101.137:20137 orport=10137 id=28F4F392F8F19E3FBDE09616D9DB8143A1E2DDD3 ipv6=[2a0b:f4c2:1::137]:10137 # niftycottonmouse
+185.220.101.15:40015 orport=30015 id=28A4C64C34120E075701B0415D74906EC687F21F ipv6=[2a0b:f4c2::15]:20015 # niftyentry108
+185.220.101.19:40019 orport=30019 id=25526E61B8BC22B662E3D4A50504021CC3D9873D ipv6=[2a0b:f4c2::19]:20019 # niftyrabbitrat
+185.220.101.18:20018 orport=10018 id=24E91955D969AEA1D80413C64FE106FAE7FD2EA9 ipv6=[2a0b:f4c2::18]:10018 # niftymouse
+185.220.101.17:40017 orport=30017 id=1D89A810BDF84522B6036034F499A766EF294DB1 ipv6=[2a0b:f4c2::17]:20017 # niftylagurus
+81.7.14.253:9001 orport=443 id=1AE039EE0B11DB79E4B4B29CBA9F752864A0259E # Ichotolot60
+136.57.177.228:9030 orport=443 id=17CC4D25E33993D011CDA6E68806435FFFD2E6C7 ipv6=[2605:a601:a1bb:d700:1700:332f:2831:cc37]:443 # elguaposghost
+185.220.101.7:40007 orport=30007 id=14877C6384A9E793F422C8D1DDA447CACA4F7C4B ipv6=[2a0b:f4c2::7]:20007 # niftywoodmouse
+185.220.101.9:40009 orport=30009 id=1084200B44021D308EA4253F256794671B1D099A ipv6=[2a0b:f4c2::9]:20009 # niftyhedgehog
+81.7.18.7:9030 orport=9001 id=0C475BA4D3AA3C289B716F95954CAD616E50C4E5 # Freebird32
+185.220.101.129:40129 orport=30129 id=0B3C8C2B2B1A1CA4429B9649F533BEB4D7470AEA ipv6=[2a0b:f4c2:1::129]:20129 # niftyboglemming
+81.7.10.193:9002 orport=993 id=03C3069E814E296EB18776EB61B1ECB754ED89FE # Ichotolot61
+185.21.217.32:20042 orport=10042 id=02758CD398E3F842EF82478078AAAE0273770DB2 # niftyentry116
+185.220.101.214:40214 orport=30214 id=C74469EC04787CC458FB1DCDF456C5092CF08B19 ipv6=[2a0b:f4c2:2::214]:20214 # niftywabbit19
+185.220.101.202:40202 orport=30202 id=C6E184C0983C68B7E8BFC6215E7289E09E97AA0E ipv6=[2a0b:f4c2:2::202]:20202 # niftyentry85
+185.220.101.215:20215 orport=10215 id=C47E8F025645C621BE8BF8B5F6C8564A41259F7B ipv6=[2a0b:f4c2:2::215]:10215 # niftywabbit3
+185.220.101.203:40203 orport=30203 id=C8F6F6C1834454F1E927A4A05E8E54EB623D4B73 ipv6=[2a0b:f4c2:2::203]:20203 # niftyguard07
+185.220.101.138:20138 orport=10138 id=CDA2EA326E2272C57ACB26773D7252C211795B78 ipv6=[2a0b:f4c2:1::138]:10138 # niftygerbil
+185.220.101.140:20140 orport=10140 id=BC38744FD82618B37EE6A5A61BBCCE8788D55E3D ipv6=[2a0b:f4c2:1::140]:10140 # niftyguard59
+185.220.101.198:40198 orport=30198 id=B36006D88E2CCEF2E1EF0826C7F1B0EDC8DE6C06 ipv6=[2a0b:f4c2:2::198]:20198 # niftywabbit17
+185.220.101.142:20142 orport=10142 id=D27208881BBDB5EA56EFD1D1799187519591E325 ipv6=[2a0b:f4c2:1::142]:10142 # niftytelicomys
+185.220.101.147:20147 orport=10147 id=AF022F351A4B6F2514A09F9245F9FF5ACA729735 ipv6=[2a0b:f4c2:1::147]:10147 # niftyguard60
+185.220.101.132:20132 orport=10132 id=AD1359B9D74D526FEF3F58AF41105C623A3A8C18 ipv6=[2a0b:f4c2:1::132]:10132 # niftyguard46
+185.220.101.147:40147 orport=30147 id=A78E86015376B3F2507E2E6602FDFD278F2871B3 ipv6=[2a0b:f4c2:1::147]:20147 # niftyguard74
+185.220.101.148:40148 orport=30148 id=A3901DDB7799A11E9BAB90BD1DDA734DBA196337 ipv6=[2a0b:f4c2:1::148]:20148 # niftysnowshoehare
+185.220.101.213:20213 orport=10213 id=A14F90953AE9462CF3A862C4CA95F73BF94A6F8B ipv6=[2a0b:f4c2:2::213]:10213 # niftywabbit10
+185.220.101.200:40200 orport=30200 id=D286ED33FCB28385BAD9DA3D6B12A604C0834313 ipv6=[2a0b:f4c2:2::200]:20200 # niftyentry64
+185.220.101.207:40207 orport=30207 id=DFAA86AD46BEA875D5018CC1CECD77C9F979FB0E ipv6=[2a0b:f4c2:2::207]:20207 # niftywabbit5
+185.220.101.135:20135 orport=10135 id=986E29FB17C8C7A1FEAFF203F012D5930BA079DB ipv6=[2a0b:f4c2:1::135]:10135 # niftyspinymouse
+185.220.101.214:20214 orport=10214 id=9664A7EFB405F555F3C0079FA7618B2EE6CE6D2A ipv6=[2a0b:f4c2:2::214]:10214 # niftywabbit16
+185.220.101.140:40140 orport=30140 id=9634E9F53EB46828AE7E06839FEE595950286B1D ipv6=[2a0b:f4c2:1::140]:20140 # niftyguard71
+185.220.101.195:20195 orport=10195 id=95B9052EECDB4B833F130ABD564E720643BA7952 ipv6=[2a0b:f4c2:2::195]:10195 # niftyentry92
+185.220.101.205:40205 orport=30205 id=902E21BC05A7B1EC8CE85D78C47C3D8EAD5EFE6F ipv6=[2a0b:f4c2:2::205]:20205 # niftywabbit12
+185.220.101.193:40193 orport=30193 id=8FF2896A94BCAA5F0A7C5A56AD6586492CD448AF ipv6=[2a0b:f4c2:2::193]:20193 # niftyentry74
+185.220.101.211:20211 orport=10211 id=8CA736F332937E4FA0F5F48488B823F31883123C ipv6=[2a0b:f4c2:2::211]:10211 # niftyentry99
+185.220.101.146:20146 orport=10146 id=8C9DF7FE2C6C8E253048D07EB1F3986841CF2407 ipv6=[2a0b:f4c2:1::146]:10146 # niftyguard51
+185.220.101.210:20210 orport=10210 id=8BE58BA7A28DC6B4F211CE8EE86783B85133488D ipv6=[2a0b:f4c2:2::210]:10210 # niftyentry80
+185.220.101.139:40139 orport=30139 id=8839E8FBE28219B85392EEA5A4DBC41D315F4B83 ipv6=[2a0b:f4c2:1::139]:20139 # niftyguard49
+185.220.101.203:20203 orport=10203 id=863FDDA3CA537CE03646B3AEBD3FD1CC6B077FBE ipv6=[2a0b:f4c2:2::203]:10203 # niftyentry95
+185.220.101.133:20133 orport=10133 id=8054F105829438B029E7265BB1070F9258705112 ipv6=[2a0b:f4c2:1::133]:10133 # niftyguard57
+185.220.101.195:40195 orport=30195 id=7F7BE7926AF718D6A3DED24D694D94C1D5FACF28 ipv6=[2a0b:f4c2:2::195]:20195 # niftyguard02
+185.220.101.210:40210 orport=30210 id=E2B9BA96723C59E65AE07E82B74C7A31AF874225 ipv6=[2a0b:f4c2:2::210]:20210 # niftyentry88
+185.220.101.215:40215 orport=30215 id=7C7FFB1C48B7E0C5C9B3D11FEC2F8500F464786A ipv6=[2a0b:f4c2:2::215]:20215 # niftywabbit6
+185.220.101.193:20193 orport=10193 id=7B7C7F31205D7AEB5DFFEDA08E00282A78CD76E0 ipv6=[2a0b:f4c2:2::193]:10193 # niftyentrynice
+185.220.101.204:40204 orport=30204 id=7404DC4E6B17D5B751BF343E509F6D4B940FC104 ipv6=[2a0b:f4c2:2::204]:20204 # niftyguard21
+185.220.101.202:20202 orport=10202 id=71730F1BEB5372C9A6FF36704FF1A6A48AEE7813 ipv6=[2a0b:f4c2:2::202]:10202 # niftyentry79
+185.220.101.209:20209 orport=10209 id=E330A88754840629644527394FD43001D5B89C7A ipv6=[2a0b:f4c2:2::209]:10209 # niftyentry71
+185.220.101.146:40146 orport=30146 id=6CB7D0F355B60EF166439E96876BCDEBF8FD8E0F ipv6=[2a0b:f4c2:1::146]:20146 # niftyguard56
+185.220.101.148:20148 orport=10148 id=6781471814DF164C2A6F17CD1F2584923FDE2101 ipv6=[2a0b:f4c2:1::148]:10148 # niftyhare
+185.220.101.141:20141 orport=10141 id=EC1997D51892E4607C68E800549A1E7E4694005A ipv6=[2a0b:f4c2:1::141]:10141 # niftyguineapig
+185.220.101.132:40132 orport=30132 id=6372CADE2B9A608E5114002A7A825AF0D11B449A ipv6=[2a0b:f4c2:1::132]:20132 # niftyguard52
+185.220.101.201:20201 orport=10201 id=ED6AF8CE8CF4126A6F33572376B6D8977FED2DD9 ipv6=[2a0b:f4c2:2::201]:10201 # niftyentry70
+185.220.101.201:40201 orport=30201 id=621EA822CEAC095845A0CFFFA503D2993AB10FF3 ipv6=[2a0b:f4c2:2::201]:20201 # niftyentry75
+185.220.101.145:40145 orport=30145 id=5B9BB7A543C2C035A423A6B411780E50645782C0 ipv6=[2a0b:f4c2:1::145]:20145 # niftyguard44
+185.220.101.212:40212 orport=30212 id=583CEFCFF76B3189D3A37C81A49D1619D04DCB34 ipv6=[2a0b:f4c2:2::212]:20212 # niftyguard26
+185.220.101.194:40194 orport=30194 id=562C61C7F885741D599DB7A1235791D928BEADFD ipv6=[2a0b:f4c2:2::194]:20194 # niftyentry83
+185.220.101.199:40199 orport=30199 id=53CBD4285918F168B92D05CAA9BC0CF499DF72C7 ipv6=[2a0b:f4c2:2::199]:20199 # niftywabbit4
+185.220.101.197:40197 orport=30197 id=520C85ABE6E731CECC28B1055854053FAA28061B ipv6=[2a0b:f4c2:2::197]:20197 # niftywabbit11
+185.220.101.208:40208 orport=30208 id=EE859849E8D8EF083EEF2025555396A6C3552A8E ipv6=[2a0b:f4c2:2::208]:20208 # niftyentry67
+185.220.101.216:20216 orport=10216 id=50D1473A213DB343E97664C71C09D28EC2692CB3 ipv6=[2a0b:f4c2:2::216]:10216 # niftywabbit9
+185.220.101.206:40206 orport=30206 id=50A0CFB654D39F420F52D362B1DF50A12B33D5A0 ipv6=[2a0b:f4c2:2::206]:20206 # niftywabbit18
+185.220.101.139:20139 orport=10139 id=4C07CB3365CF3E06A56FD2DC8ECA4E97A6521983 ipv6=[2a0b:f4c2:1::139]:10139 # niftyguard54
+185.220.101.206:20206 orport=10206 id=4AD9C116A1942D58A714433CA24F087F18036A7E ipv6=[2a0b:f4c2:2::206]:10206 # niftywabbit15
+185.220.101.145:20145 orport=10145 id=4AD0B40B0FC679CC300F398BCEBE9D000833F62C ipv6=[2a0b:f4c2:1::145]:10145 # niftyguard41
+185.220.101.133:40133 orport=30133 id=F1624D70C3AD373C849A5B2A8D07A20C73C0C7AD ipv6=[2a0b:f4c2:1::133]:20133 # niftyguard68
+185.220.101.207:20207 orport=10207 id=470BC5C6A8BD1D9FDBB55689FB3030310181EAE2 ipv6=[2a0b:f4c2:2::207]:10207 # niftywabbit20
+185.220.101.196:40196 orport=30196 id=456F6E4998EB17B975DB5A19273607868E5F8AFA ipv6=[2a0b:f4c2:2::196]:20196 # niftyguard
+185.220.101.131:40131 orport=30131 id=F8AEA2825629E4383599FD2A4BD5740CD1322CBC ipv6=[2a0b:f4c2:1::131]:20131 # niftyguard42
+185.220.101.138:40138 orport=30138 id=FB8796036069BB4787D639F92681ECC2FD7AEB22 ipv6=[2a0b:f4c2:1::138]:20138 # niftyguard43
+185.220.101.194:20194 orport=10194 id=380F79145FF9C2332CBF41313062C99DBA9B0E50 ipv6=[2a0b:f4c2:2::194]:10194 # niftyentry78
+185.220.101.196:20196 orport=10196 id=FDBF608F9A2ECD0C600CAF96398A7D5B08D46CA9 ipv6=[2a0b:f4c2:2::196]:10196 # niftyguard11
+185.220.101.141:40141 orport=30141 id=34F5D33DD46D7FBD380B11567132A18773BC4F57 ipv6=[2a0b:f4c2:1::141]:20141 # niftyleastchipmunk
+185.220.101.211:40211 orport=30211 id=31F373571AA6ECB4D73266E114D58B0AF7227369 ipv6=[2a0b:f4c2:2::211]:20211 # niftyguard09
+185.220.101.205:20205 orport=10205 id=30DBF7A773F4EE3BF6D1B7407DAECF40220AC8CD ipv6=[2a0b:f4c2:2::205]:10205 # niftywabbit
+185.220.101.134:20134 orport=10134 id=2FD03FFE27AF20DD6B1CBE5ABEFEF7B06693D557 ipv6=[2a0b:f4c2:1::134]:10134 # niftyguard79
+185.220.101.199:20199 orport=10199 id=2F64EA527C4AA6F99E261318DD1FF127828E2525 ipv6=[2a0b:f4c2:2::199]:10199 # niftywabbit2
+185.220.101.208:20208 orport=10208 id=FDFD675D05216549EB7DA545E32ECFCEEAE805F2 ipv6=[2a0b:f4c2:2::208]:10208 # niftywabbit8
+185.220.101.149:20149 orport=10149 id=283312BB249FCB6633A7C7E1E8241461000E6004 ipv6=[2a0b:f4c2:1::149]:10149 # niftywoodlandvole
+185.220.101.198:20198 orport=10198 id=24352D30196BEFE5BB29A50923F79A2804527611 ipv6=[2a0b:f4c2:2::198]:10198 # niftywabbit14
+185.220.101.197:20197 orport=10197 id=1B9235656503E80E913E9C9A139AD89D36E2DFFD ipv6=[2a0b:f4c2:2::197]:10197 # niftyguard36
+185.220.101.213:40213 orport=30213 id=1B605B2751279B152CA098ED76B1EBCC9ADCA239 ipv6=[2a0b:f4c2:2::213]:20213 # niftywabbit13
+185.220.101.200:20200 orport=10200 id=10644CF3D7F555F10FE28EB1D520111F56FE7180 ipv6=[2a0b:f4c2:2::200]:10200 # niftywabbit
+185.220.101.134:40134 orport=30134 id=0FB2EDAB99D10A2B708370E625323C76EB895FA2 ipv6=[2a0b:f4c2:1::134]:20134 # niftyhazelmouse
+185.220.101.212:20212 orport=10212 id=0A4ED4C74020740A904F3A9936030B7A4C6170BB ipv6=[2a0b:f4c2:2::212]:10212 # niftyguard19
+185.220.101.204:20204 orport=10204 id=05F5BB75DA007361CE03770393033D4D52836D8A ipv6=[2a0b:f4c2:2::204]:10204 # niftyguard15
+185.220.101.209:40209 orport=30209 id=01FDC8E92D3280847D856DA1F9BFC2B4CD2C2EE8 ipv6=[2a0b:f4c2:2::209]:20209 # niftyentry77
+185.220.102.251:80 orport=443 id=FDCFEA18CC64461455DE5EA3FC31834C6B42FEC7 ipv6=[2a0b:f4c1:2::251]:443 # Digitalcourage4ip4a
+5.34.183.29:80 orport=443 id=F8AA8D8CCBA0C5F2836DE6315CDFA6E4A31A0890 ipv6=[2a02:27a8:0:a::197]:443 # rinderwahnRelay17L
+185.233.100.23:80 orport=443 id=F47B13BFCE4EF48CDEF6C4D7C7A99208EBB972B5 ipv6=[2a0c:e300::23]:443 # Elenagb
+178.20.55.16:80 orport=443 id=EFAE44728264982224445E96214C15F9075DEE1D # marcuse1
+185.220.102.254:8080 orport=993 id=D13692D97236C0B8E8E19EA2DD952B5C4F9010BB ipv6=[2a0b:f4c1:2::254]:993 # Digitalcourage4ip7b
+178.20.55.18:80 orport=443 id=C656B41AEFB40A141967EBF49D6E69603C9B4A11 # marcuse2
+109.70.100.3:80 orport=443 id=C282248597D1C8522A2A7525E61C8B77BBC37614 ipv6=[2a03:e600:100::3]:443 # erbse
+185.220.102.248:8080 orport=993 id=BB034C34ED9E60F7709ED93FB432A9BA12A2F2B6 ipv6=[2a0b:f4c1:2::248]:993 # Digitalcourage4ip1b
+185.220.102.249:8080 orport=993 id=BA9D7FB9AB4ED0FBCA56941DA22CF7770BA1A4BC ipv6=[2a0b:f4c1:2::249]:993 # Digitalcourage4ip2b
+185.4.135.157:80 orport=443 id=B93503D458D9FE97DE5C12D211082871D08F1284 ipv6=[2a02:c500:2:217::e528]:443 # rinderwahnRelay30L
+109.70.100.2:80 orport=443 id=B27CF1DCEECD50F7992B07D720D7F6BF0EDF9D40 ipv6=[2a03:e600:100::2]:443 # radieschen
+185.220.102.250:80 orport=443 id=A2DD0EF31813E9B7F6DB435504A406E1AD2B76AB ipv6=[2a0b:f4c1:2::250]:443 # Digitalcourage4ip3a
+95.142.161.63:80 orport=443 id=9BA84E8C90083676F86C7427C8D105925F13716C ipv6=[2001:4b98:dc0:47:216:3eff:fe3d:888c]:443 # ekumen
+185.220.102.252:80 orport=443 id=9AD90317DDA2F898EB0AE0F20976EA97E7AF9012 ipv6=[2a0b:f4c1:2::252]:443 # Digitalcourage4ip5a
+185.220.102.248:80 orport=443 id=97F51AF6791AD33981CE25DC7A2618429F25B3B0 ipv6=[2a0b:f4c1:2::248]:443 # Digitalcourage4ip1a
+109.70.100.5:80 orport=443 id=9661AC95717798884F3E3727D360DD98D66727CC ipv6=[2a03:e600:100::5]:443 # erdapfel
+89.234.157.254:9030 orport=9001 id=90FD830C357A5109AB3C505287713F1AC811174C ipv6=[2001:67c:2608::1]:9001 # marylou2
+185.220.102.252:8080 orport=993 id=902A13399F14FFC7E2912463300C78A25C1F76B6 ipv6=[2a0b:f4c1:2::252]:993 # Digitalcourage4ip5b
+80.67.172.162:80 orport=443 id=8E6EDA78D8E3ABA88D877C3E37D6D4F0938C7B9F ipv6=[2001:910:1410:600::1]:443 # AlGrothendieck
+109.70.100.6:80 orport=443 id=8CF987FF43FB7F3D9AA4C4F3D96FFDF247A9A6C2 ipv6=[2a03:e600:100::6]:443 # zucchini
+185.220.102.251:8080 orport=993 id=8287DADC415B3E667C617EEFB6E7D654C7AC0C47 ipv6=[2a0b:f4c1:2::251]:993 # Digitalcourage4ip4b
+185.112.82.50:80 orport=443 id=7AAF5597B18D82CC90CA95FB7976A1CEA4A32E06 ipv6=[2a0c:f040::dcd2:faff:fe8f:70f3]:443 # rinderwahnRelay8L
+185.220.102.253:8080 orport=993 id=762213D327B0A76057F4B61CD587ED4238CD900E ipv6=[2a0b:f4c1:2::253]:993 # Digitalcourage4ip6b
+185.220.102.253:80 orport=443 id=6B61EFE3AEDEB3351FD3C910443D95556316E01C ipv6=[2a0b:f4c1:2::253]:443 # Digitalcourage4ip6a
+185.220.102.249:80 orport=443 id=68EC657DC8A587B38D5D7763D5C72E93C2CD456C ipv6=[2a0b:f4c1:2::249]:443 # Digitalcourage4ip2a
+91.201.65.91:80 orport=443 id=57C6DF5B93E54EB9C8DB90029D9E9A1111BD34D2 ipv6=[2a06:f905:1:100::4e]:443 # rinderwahnRelay12L
+89.234.157.254:80 orport=443 id=578E007E5E4535FBFEF7758D8587B07B4C8C5D06 ipv6=[2001:67c:2608::1]:443 # marylou1
+185.238.129.9:9030 orport=9001 id=4E8CE6F5651E7342C1E7E5ED031E82078134FB0D ipv6=[2a10:3781:116:1:ff:60ff:fe1e:4473]:9001 # ymkeo
+109.70.100.4:80 orport=443 id=4BFC9C631A93FF4BA3AA84BC6931B4310C38A263 ipv6=[2a03:e600:100::4]:443 # karotte
+87.236.195.253:9030 orport=143 id=3D5D6178C44537E3692853B344385F6572A55767 ipv6=[2a01:5f0:c001:107:2f::]:143 # TorZabehlice
+185.220.102.250:8080 orport=993 id=35B503FB546815CC9EDE91022555B5D0ED04E389 ipv6=[2a0b:f4c1:2::250]:993 # Digitalcourage4ip3b
+185.220.102.254:80 orport=443 id=22296CB6AE56609A96F02FB843AB7B4B0A31CAF4 ipv6=[2a0b:f4c1:2::254]:443 # Digitalcourage4ip7a
1
0

[tor/master] relay: Publish IPv4 descriptor on guessed IPv6 reachability failure
by dgoulet@torproject.org 24 Jul '20
by dgoulet@torproject.org 24 Jul '20
24 Jul '20
commit ad9806b5390f099a51ca8c8d34eff91e432da3f4
Author: David Goulet <dgoulet(a)torproject.org>
Date: Fri Jul 24 09:11:16 2020 -0400
relay: Publish IPv4 descriptor on guessed IPv6 reachability failure
On an IPv6 reachability failure test, if the address was configured, don't
publish the descriptor and log warn. If the address was auto discovered, still
publish the descriptor.
Closes #33247.
Signed-off-by: David Goulet <dgoulet(a)torproject.org>
---
src/feature/relay/relay_periodic.c | 35 +++++++++++++++++++++++++++--------
src/feature/relay/router.c | 30 +++++++++++++++++++++++++++++-
src/feature/relay/router.h | 2 ++
src/feature/relay/selftest.c | 9 ++++++++-
4 files changed, 66 insertions(+), 10 deletions(-)
diff --git a/src/feature/relay/relay_periodic.c b/src/feature/relay/relay_periodic.c
index cc346bc3fc..adff2c6a23 100644
--- a/src/feature/relay/relay_periodic.c
+++ b/src/feature/relay/relay_periodic.c
@@ -12,6 +12,8 @@
#include "orconfig.h"
#include "core/or/or.h"
+#include "app/config/resolve_addr.h"
+
#include "core/mainloop/periodic.h"
#include "core/mainloop/cpuworker.h" // XXXX use a pubsub event.
#include "core/mainloop/mainloop.h"
@@ -218,14 +220,31 @@ reachability_warnings_callback(time_t now, const or_options_t *options)
tor_asprintf(&where6, "[%s]:%d", address6, me->ipv6_orport);
const char *opt_and = (!v4_ok && !v6_ok) ? "and" : "";
- log_warn(LD_CONFIG,
- "Your server has not managed to confirm reachability for "
- "its ORPort(s) at %s%s%s. Relays do not publish descriptors "
- "until their ORPort and DirPort are reachable. Please check "
- "your firewalls, ports, address, /etc/hosts file, etc.",
- where4?where4:"",
- opt_and,
- where6?where6:"");
+ /* IPv4 reachability test worked but not the IPv6. We will _not_
+ * publish the descriptor if our IPv6 was configured. We will if it
+ * was auto discovered. */
+ if (v4_ok && !v6_ok && !resolved_addr_is_configured(AF_INET6)) {
+ static ratelim_t rlim = RATELIM_INIT(3600);
+ log_fn_ratelim(&rlim, LOG_NOTICE, LD_CONFIG,
+ "Auto-discovered IPv6 address %s has not been found "
+ "reachable. However, IPv4 address is reachable. "
+ "Publishing server descriptor without IPv6 address.",
+ where6 ? where6 : "");
+ /* Indicate we want to publish even if reachability test failed. */
+ mark_my_descriptor_if_omit_ipv6_changes("IPv4 is reachable. "
+ "IPv6 is not but was "
+ "auto-discovered", true);
+ } else {
+ log_warn(LD_CONFIG,
+ "Your server has not managed to confirm reachability for "
+ "its ORPort(s) at %s%s%s. Relays do not publish "
+ "descriptors until their ORPort and DirPort are "
+ "reachable. Please check your firewalls, ports, address, "
+ "/etc/hosts file, etc.",
+ where4?where4:"",
+ opt_and,
+ where6?where6:"");
+ }
tor_free(where4);
tor_free(where6);
if (!v4_ok) {
diff --git a/src/feature/relay/router.c b/src/feature/relay/router.c
index 01d8bdcc87..48f53a263d 100644
--- a/src/feature/relay/router.c
+++ b/src/feature/relay/router.c
@@ -2442,6 +2442,34 @@ router_new_consensus_params(const networkstatus_t *ns)
publish_even_when_ipv6_orport_unreachable = ar || ar6;
}
+/** Indicate if the IPv6 address should be omitted from the descriptor when
+ * publishing it. This can happen if the IPv4 is reachable but the
+ * auto-discovered IPv6 is not. We still publish the descriptor.
+ *
+ * Only relays should look at this and only for their descriptor.
+ *
+ * XXX: The real harder fix is to never put in the routerinfo_t a non
+ * reachable address and instead use the last resolved address cache to do
+ * reachability test or anything that has to do with what address tor thinks
+ * it has. */
+static bool omit_ipv6_on_publish = false;
+
+/** Mark our descriptor out of data iff the IPv6 omit status flag is flipped
+ * it changes from its previous value.
+ *
+ * This is used when our IPv6 port is found reachable or not. */
+void
+mark_my_descriptor_if_omit_ipv6_changes(const char *reason, bool omit_ipv6)
+{
+ bool previous = omit_ipv6_on_publish;
+ omit_ipv6_on_publish = omit_ipv6;
+
+ /* Only mark it dirty if the IPv6 omit flag was flipped. */
+ if (previous != omit_ipv6) {
+ mark_my_descriptor_dirty(reason);
+ }
+}
+
/** If our router descriptor ever goes this long without being regenerated
* because something changed, we force an immediate regenerate-and-upload. */
#define FORCE_REGENERATE_DESCRIPTOR_INTERVAL (18*60*60)
@@ -2847,7 +2875,7 @@ router_dump_router_to_string(routerinfo_t *router,
}
}
- if (router->ipv6_orport &&
+ if (!omit_ipv6_on_publish && router->ipv6_orport &&
tor_addr_family(&router->ipv6_addr) == AF_INET6) {
char addr[TOR_ADDR_BUF_LEN];
const char *a;
diff --git a/src/feature/relay/router.h b/src/feature/relay/router.h
index c4e9af039f..89b4a479a4 100644
--- a/src/feature/relay/router.h
+++ b/src/feature/relay/router.h
@@ -84,6 +84,8 @@ void router_new_consensus_params(const networkstatus_t *);
void router_upload_dir_desc_to_dirservers(int force);
void mark_my_descriptor_dirty_if_too_old(time_t now);
void mark_my_descriptor_dirty(const char *reason);
+void mark_my_descriptor_if_omit_ipv6_changes(const char *reason,
+ bool omit_ipv6);
void check_descriptor_bandwidth_changed(time_t now);
void check_descriptor_ipaddress_changed(time_t now);
int router_has_bandwidth_to_be_dirserver(const or_options_t *options);
diff --git a/src/feature/relay/selftest.c b/src/feature/relay/selftest.c
index d24748b297..13264d4a24 100644
--- a/src/feature/relay/selftest.c
+++ b/src/feature/relay/selftest.c
@@ -398,6 +398,7 @@ router_orport_found_reachable(int family)
{
const routerinfo_t *me = router_get_my_routerinfo();
const or_options_t *options = get_options();
+ const char *reachable_reason = "ORPort found reachable";
bool *can_reach_ptr;
if (family == AF_INET) {
can_reach_ptr = &can_reach_or_port_ipv4;
@@ -422,7 +423,13 @@ router_orport_found_reachable(int family)
ready_to_publish(options) ?
" Publishing server descriptor." : "");
- mark_my_descriptor_dirty("ORPort found reachable");
+ /* Make sure our descriptor is marked to publish the IPv6 if it is now
+ * reachable. This can change at runtime. */
+ if (family == AF_INET6) {
+ mark_my_descriptor_if_omit_ipv6_changes(reachable_reason, false);
+ } else {
+ mark_my_descriptor_dirty(reachable_reason);
+ }
/* This is a significant enough change to upload immediately,
* at least in a test network */
if (options->TestingTorNetwork == 1) {
1
0

24 Jul '20
commit bf2b1e7a6f7d0410515468d0b5440d45c0745c5a
Author: David Goulet <dgoulet(a)torproject.org>
Date: Fri Jul 24 09:19:19 2020 -0400
relay: Turn find address "method_used" into enum
Enum allows us to easily compare what is being returned but also better
semantic to the code.
Related #33247
Signed-off-by: David Goulet <dgoulet(a)torproject.org>
---
src/app/config/resolve_addr.c | 111 +++++++++++++++++++++++++++---------------
src/app/config/resolve_addr.h | 24 ++++++++-
src/feature/relay/router.c | 4 +-
src/test/test_config.c | 55 +++++++++++----------
src/test/test_relay.c | 4 +-
5 files changed, 126 insertions(+), 72 deletions(-)
diff --git a/src/app/config/resolve_addr.c b/src/app/config/resolve_addr.c
index 798c703f0a..a9db2655c1 100644
--- a/src/app/config/resolve_addr.c
+++ b/src/app/config/resolve_addr.c
@@ -71,6 +71,29 @@ af_to_idx(const int family)
}
}
+/** Return string representation of the given method. */
+const char *
+resolved_addr_method_to_str(const resolved_addr_method_t method)
+{
+ switch (method) {
+ case RESOLVED_ADDR_NONE:
+ return "NONE";
+ case RESOLVED_ADDR_CONFIGURED:
+ return "CONFIGURED";
+ case RESOLVED_ADDR_CONFIGURED_ORPORT:
+ return "CONFIGURED_ORPORT";
+ case RESOLVED_ADDR_GETHOSTNAME:
+ return "GETHOSTNAME";
+ case RESOLVED_ADDR_INTERFACE:
+ return "INTERFACE";
+ case RESOLVED_ADDR_RESOLVED:
+ return "RESOLVED";
+ default:
+ tor_assert_nonfatal_unreached();
+ return "???";
+ }
+}
+
/** Copy the last suggested address of family into addr_out.
*
* If no last suggested address exists, the addr_out is a null address (use
@@ -178,8 +201,8 @@ address_can_be_used(const tor_addr_t *addr, const or_options_t *options,
* @param options Global configuration options.
* @param warn_severity Log level that should be used on error.
* @param family IP address family. Only AF_INET and AF_INET6 are supported.
- * @param method_out OUT: String denoting by which method the address was
- * found. This is described in the control-spec.txt as
+ * @param method_out OUT: Method denoting how the address was found.
+ * This is described in the control-spec.txt as
* actions for "STATUS_SERVER".
* @param hostname_out OUT: String containing the hostname gotten from the
* Address value if any.
@@ -191,7 +214,7 @@ address_can_be_used(const tor_addr_t *addr, const or_options_t *options,
*/
static fn_address_ret_t
get_address_from_config(const or_options_t *options, int warn_severity,
- int family, const char **method_out,
+ int family, resolved_addr_method_t *method_out,
char **hostname_out, tor_addr_t *addr_out)
{
int ret;
@@ -205,7 +228,7 @@ get_address_from_config(const or_options_t *options, int warn_severity,
/* Set them to NULL for safety reasons. */
*hostname_out = NULL;
- *method_out = NULL;
+ *method_out = RESOLVED_ADDR_NONE;
log_debug(LD_CONFIG, "Attempting to get address from configuration");
@@ -223,7 +246,7 @@ get_address_from_config(const or_options_t *options, int warn_severity,
af = tor_addr_parse(&addr, cfg->value);
if (af == family) {
tor_addr_copy(addr_out, &addr);
- *method_out = "CONFIGURED";
+ *method_out = RESOLVED_ADDR_CONFIGURED;
explicit_ip = true;
num_valid_addr++;
continue;
@@ -237,7 +260,7 @@ get_address_from_config(const or_options_t *options, int warn_severity,
* do a DNS lookup. */
if (!tor_addr_lookup(cfg->value, family, &addr)) {
tor_addr_copy(addr_out, &addr);
- *method_out = "RESOLVED";
+ *method_out = RESOLVED_ADDR_RESOLVED;
if (*hostname_out) {
tor_free(*hostname_out);
}
@@ -299,8 +322,8 @@ get_address_from_config(const or_options_t *options, int warn_severity,
* @param options Global configuration options.
* @param warn_severity Log level that should be used on error.
* @param family IP address family. Only AF_INET and AF_INET6 are supported.
- * @param method_out OUT: String denoting by which method the address was
- * found. This is described in the control-spec.txt as
+ * @param method_out OUT: Method denoting how the address was found.
+ * This is described in the control-spec.txt as
* actions for "STATUS_SERVER".
* @param hostname_out OUT: String containing the local hostname.
* @param addr_out OUT: Tor address resolved from the local hostname.
@@ -310,7 +333,7 @@ get_address_from_config(const or_options_t *options, int warn_severity,
*/
static fn_address_ret_t
get_address_from_hostname(const or_options_t *options, int warn_severity,
- int family, const char **method_out,
+ int family, resolved_addr_method_t *method_out,
char **hostname_out, tor_addr_t *addr_out)
{
int ret;
@@ -321,7 +344,7 @@ get_address_from_hostname(const or_options_t *options, int warn_severity,
/* Set them to NULL for safety reasons. */
*hostname_out = NULL;
- *method_out = NULL;
+ *method_out = RESOLVED_ADDR_NONE;
log_debug(LD_CONFIG, "Attempting to get address from local hostname");
@@ -347,7 +370,7 @@ get_address_from_hostname(const or_options_t *options, int warn_severity,
}
/* addr_out contains the address of the local hostname. */
- *method_out = "GETHOSTNAME";
+ *method_out = RESOLVED_ADDR_GETHOSTNAME;
*hostname_out = tor_strdup(hostname);
/* Found it! */
@@ -361,8 +384,9 @@ get_address_from_hostname(const or_options_t *options, int warn_severity,
* @param options Global configuration options.
* @param warn_severity Log level that should be used on error.
* @param family IP address family. Only AF_INET and AF_INET6 are supported.
- * @param method_out OUT: Always "INTERFACE" on success which is detailed in
- * the control-spec.txt as actions for "STATUS_SERVER".
+ * @param method_out OUT: Always RESOLVED_ADDR_INTERFACE on success which
+ * is detailed in the control-spec.txt as actions
+ * for "STATUS_SERVER".
* @param hostname_out OUT: String containing the local hostname. For this
* function, it is always set to NULL.
* @param addr_out OUT: Tor address found attached to the interface.
@@ -372,7 +396,7 @@ get_address_from_hostname(const or_options_t *options, int warn_severity,
*/
static fn_address_ret_t
get_address_from_interface(const or_options_t *options, int warn_severity,
- int family, const char **method_out,
+ int family, resolved_addr_method_t *method_out,
char **hostname_out, tor_addr_t *addr_out)
{
int ret;
@@ -382,7 +406,7 @@ get_address_from_interface(const or_options_t *options, int warn_severity,
tor_assert(addr_out);
/* Set them to NULL for safety reasons. */
- *method_out = NULL;
+ *method_out = RESOLVED_ADDR_NONE;
*hostname_out = NULL;
log_debug(LD_CONFIG, "Attempting to get address from network interface");
@@ -400,7 +424,7 @@ get_address_from_interface(const or_options_t *options, int warn_severity,
return FN_RET_NEXT;
}
- *method_out = "INTERFACE";
+ *method_out = RESOLVED_ADDR_INTERFACE;
/* Found it! */
log_info(LD_CONFIG, "Address found from interface: %s", fmt_addr(addr_out));
@@ -412,8 +436,8 @@ get_address_from_interface(const or_options_t *options, int warn_severity,
* @param options Global configuration options.
* @param warn_severity Log level that should be used on error.
* @param family IP address family. Only AF_INET and AF_INET6 are supported.
- * @param method_out OUT: Always "CONFIGURED_ORPORT" on success which is
- * detailed in the control-spec.txt as actions
+ * @param method_out OUT: Always RESOLVED_ADDR_CONFIGURED_ORPORT on success
+ * which is detailed in the control-spec.txt as actions
* for "STATUS_SERVER".
* @param hostname_out OUT: String containing the ORPort hostname if any.
* @param addr_out OUT: Tor address found if any.
@@ -423,7 +447,7 @@ get_address_from_interface(const or_options_t *options, int warn_severity,
*/
static fn_address_ret_t
get_address_from_orport(const or_options_t *options, int warn_severity,
- int family, const char **method_out,
+ int family, resolved_addr_method_t *method_out,
char **hostname_out, tor_addr_t *addr_out)
{
int ret;
@@ -433,6 +457,10 @@ get_address_from_orport(const or_options_t *options, int warn_severity,
tor_assert(hostname_out);
tor_assert(addr_out);
+ /* Set them to NULL for safety reasons. */
+ *method_out = RESOLVED_ADDR_NONE;
+ *hostname_out = NULL;
+
log_debug(LD_CONFIG, "Attempting to get address from ORPort");
if (!options->ORPort_set) {
@@ -456,7 +484,7 @@ get_address_from_orport(const or_options_t *options, int warn_severity,
}
/* Found it! */
- *method_out = "CONFIGURED_ORPORT";
+ *method_out = RESOLVED_ADDR_CONFIGURED_ORPORT;
tor_addr_copy(addr_out, addr);
log_fn(warn_severity, LD_CONFIG, "Address found from ORPort: %s",
@@ -481,7 +509,8 @@ get_address_from_orport(const or_options_t *options, int warn_severity,
* NULL. (for logging and control port).
*/
void
-resolved_addr_set_last(const tor_addr_t *addr, const char *method_used,
+resolved_addr_set_last(const tor_addr_t *addr,
+ const resolved_addr_method_t method_used,
const char *hostname_used)
{
/** Have we done a first resolve. This is used to control logging. */
@@ -493,7 +522,6 @@ resolved_addr_set_last(const tor_addr_t *addr, const char *method_used,
tor_addr_t *last_resolved;
tor_assert(addr);
- tor_assert(method_used);
/* Do we have an hostname. */
have_hostname = (hostname_used != NULL);
@@ -520,7 +548,8 @@ resolved_addr_set_last(const tor_addr_t *addr, const char *method_used,
log_notice(LD_NET,
"Your IP address seems to have changed to %s "
"(METHOD=%s%s%s). Updating.",
- fmt_addr(addr), method_used,
+ fmt_addr(addr),
+ resolved_addr_method_to_str(method_used),
have_hostname ? " HOSTNAME=" : "",
have_hostname ? hostname_used : "");
ip_address_changed(0);
@@ -529,7 +558,8 @@ resolved_addr_set_last(const tor_addr_t *addr, const char *method_used,
/* Notify control port. */
control_event_server_status(LOG_NOTICE,
"EXTERNAL_ADDRESS ADDRESS=%s METHOD=%s%s%s",
- fmt_addr(addr), method_used,
+ fmt_addr(addr),
+ resolved_addr_method_to_str(method_used),
have_hostname ? " HOSTNAME=" : "",
have_hostname ? hostname_used : "");
/* Copy address to cache. */
@@ -541,7 +571,8 @@ resolved_addr_set_last(const tor_addr_t *addr, const char *method_used,
typedef fn_address_ret_t
(*fn_address_t)(
const or_options_t *options, int warn_severity, int family,
- const char **method_out, char **hostname_out, tor_addr_t *addr_out);
+ resolved_addr_method_t *method_out, char **hostname_out,
+ tor_addr_t *addr_out);
/** Address discovery function table. The order matters as in the first one is
* executed first and so on. */
@@ -586,16 +617,16 @@ static const size_t fn_address_table_auth_len =
* 1. Look at the configuration Address option.
* If Address is a public address, True is returned and addr_out is set
- * with it, the method_out is set to "CONFIGURED" and hostname_out is set
- * to NULL.
+ * with it, the method_out is set to RESOLVED_ADDR_CONFIGURED and
+ * hostname_out is set to NULL.
*
* If Address is an internal address but NO custom authorities are used,
* an error is returned.
*
* If Address is a hostname, that is it can't be converted to an address,
* it is resolved. On success, addr_out is set with the address,
- * method_out is set to "RESOLVED" and hostname_out is set to the resolved
- * hostname. On failure to resolve, an error is returned.
+ * method_out is set to RESOLVED_ADDR_RESOLVED and hostname_out is set
+ * to the resolved hostname. On failure to resolve, an error is returned.
*
* If no given Address, fallback to the local hostname (see section 2).
*
@@ -606,14 +637,14 @@ static const size_t fn_address_table_auth_len =
*
* On failure, we attempt to look at the local hostname (3).
*
- * On success, addr_out is set with it, method_out is set to "INTERFACE"
- * and hostname_out is set to NULL.
+ * On success, addr_out is set with it, method_out is set to
+ * RESOLVED_ADDR_INTERFACE and hostname_out is set to NULL.
*
* 3. Look at the local hostname.
*
* If the local hostname resolves to a non internal address, addr_out is
- * set with it, method_out is set to "GETHOSTNAME" and hostname_out is set
- * to the resolved hostname.
+ * set with it, method_out is set to RESOLVED_ADDR_GETHOSTNAME and
+ * hostname_out is set to the resolved hostname.
*
* If a local hostname can NOT be found, an error is returned.
*
@@ -626,11 +657,11 @@ static const size_t fn_address_table_auth_len =
* @param family IP address family. Only AF_INET and AF_INET6 are supported.
* @param warn_severity Logging level.
* @param addr_out OUT: Set with the IP address found if any.
- * @param method_out OUT: (optional) String denoting by which method the
- * address was found. This is described in the
- * control-spec.txt as actions for "STATUS_SERVER".
+ * @param method_out OUT: (optional) Method denoting how the address wa
+ * found. This is described in the control-spec.txt as
+ * actions for "STATUS_SERVER".
* @param hostname_out OUT: String containing the hostname if any was used.
- * Only be set for "RESOLVED" and "GETHOSTNAME" methods.
+ * Only be set for RESOLVED and GETHOSTNAME methods.
* Else it is set to NULL.
*
* @return True if the address was found for the given family. False if not or
@@ -638,10 +669,10 @@ static const size_t fn_address_table_auth_len =
*/
bool
find_my_address(const or_options_t *options, int family, int warn_severity,
- tor_addr_t *addr_out, const char **method_out,
+ tor_addr_t *addr_out, resolved_addr_method_t *method_out,
char **hostname_out)
{
- const char *method_used = NULL;
+ resolved_addr_method_t method_used = RESOLVED_ADDR_NONE;
char *hostname_used = NULL;
tor_addr_t my_addr;
const fn_address_t *table = fn_address_table;
@@ -652,7 +683,7 @@ find_my_address(const or_options_t *options, int family, int warn_severity,
/* Set them to NULL for safety reasons. */
tor_addr_make_unspec(addr_out);
- if (method_out) *method_out = NULL;
+ if (method_out) *method_out = RESOLVED_ADDR_NONE;
if (hostname_out) *hostname_out = NULL;
/* If an IPv6 is requested, check if IPv6 address discovery is disabled and
diff --git a/src/app/config/resolve_addr.h b/src/app/config/resolve_addr.h
index c279d19f6e..f435f9f41f 100644
--- a/src/app/config/resolve_addr.h
+++ b/src/app/config/resolve_addr.h
@@ -14,16 +14,36 @@
#include "app/config/or_options_st.h"
+/** Method used to resolved an address. In other words, how was the address
+ * discovered by tor. */
+typedef enum {
+ /* Default value. Indiate that no method found the address. */
+ RESOLVED_ADDR_NONE = 0,
+ /* Found from the "Address" configuration option. */
+ RESOLVED_ADDR_CONFIGURED = 1,
+ /* Found from the "ORPort" configuration option. */
+ RESOLVED_ADDR_CONFIGURED_ORPORT = 2,
+ /* Found by resolving the local hostname. */
+ RESOLVED_ADDR_GETHOSTNAME = 3,
+ /* Found by querying the local interface(s). */
+ RESOLVED_ADDR_INTERFACE = 4,
+ /* Found by resolving the hostname from the Address configuration option. */
+ RESOLVED_ADDR_RESOLVED = 5,
+} resolved_addr_method_t;
+
+const char *resolved_addr_method_to_str(const resolved_addr_method_t method);
+
#define get_orport_addr(family) \
(portconf_get_first_advertised_addr(CONN_TYPE_OR_LISTENER, family))
bool find_my_address(const or_options_t *options, int family,
int warn_severity, tor_addr_t *addr_out,
- const char **method_out, char **hostname_out);
+ resolved_addr_method_t *method_out, char **hostname_out);
void resolved_addr_get_last(int family, tor_addr_t *addr_out);
void resolved_addr_reset_last(int family);
-void resolved_addr_set_last(const tor_addr_t *addr, const char *method_used,
+void resolved_addr_set_last(const tor_addr_t *addr,
+ const resolved_addr_method_t method_used,
const char *hostname_used);
void resolved_addr_get_suggested(int family, tor_addr_t *addr_out);
diff --git a/src/feature/relay/router.c b/src/feature/relay/router.c
index 206545bdec..01d8bdcc87 100644
--- a/src/feature/relay/router.c
+++ b/src/feature/relay/router.c
@@ -2598,7 +2598,7 @@ void
check_descriptor_ipaddress_changed(time_t now)
{
const routerinfo_t *my_ri = router_get_my_routerinfo();
- const char *method = NULL;
+ resolved_addr_method_t method = RESOLVED_ADDR_NONE;
char *hostname = NULL;
int families[2] = { AF_INET, AF_INET6 };
bool has_changed = false;
@@ -2629,7 +2629,7 @@ check_descriptor_ipaddress_changed(time_t now)
if (!tor_addr_eq(previous, ¤t)) {
char *source;
tor_asprintf(&source, "METHOD=%s%s%s",
- method ? method : "UNKNOWN",
+ resolved_addr_method_to_str(method),
hostname ? " HOSTNAME=" : "",
hostname ? hostname : "");
log_addr_has_changed(LOG_NOTICE, previous, ¤t, source);
diff --git a/src/test/test_config.c b/src/test/test_config.c
index 121b51e925..9eadfeed33 100644
--- a/src/test/test_config.c
+++ b/src/test/test_config.c
@@ -1244,8 +1244,7 @@ get_interface_address6_failure(int severity, sa_family_t family,
#define VALIDATE_FOUND_ADDRESS(ret, method, hostname) \
do { \
tt_int_op(retval, OP_EQ, ret); \
- if (method == NULL) tt_assert(!method_used); \
- else tt_str_op(method_used, OP_EQ, method); \
+ tt_int_op(method, OP_EQ, method_used); \
if (hostname == NULL) tt_assert(!hostname_out); \
else tt_str_op(hostname_out, OP_EQ, hostname); \
if (ret == true) { \
@@ -1274,7 +1273,7 @@ test_config_find_my_address_mixed(void *arg)
{
or_options_t *options;
tor_addr_t resolved_addr, test_addr;
- const char *method_used;
+ resolved_addr_method_t method_used;
char *hostname_out = NULL;
bool retval;
@@ -1294,7 +1293,7 @@ test_config_find_my_address_mixed(void *arg)
/* IPv6 address should be found and considered configured. */
retval = find_my_address(options, AF_INET6, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "CONFIGURED", NULL);
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_CONFIGURED, NULL);
CLEANUP_FOUND_ADDRESS;
@@ -1309,13 +1308,13 @@ test_config_find_my_address_mixed(void *arg)
/* IPv4 address should be found and considered configured. */
retval = find_my_address(options, AF_INET, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "CONFIGURED", NULL);
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_CONFIGURED, NULL);
/* IPv6 address should be found and considered configured. */
tor_addr_parse(&test_addr, "2a01:4f8:fff0:4f:266:37ff:fe2c:5d19");
retval = find_my_address(options, AF_INET6, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "CONFIGURED", NULL);
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_CONFIGURED, NULL);
CLEANUP_FOUND_ADDRESS;
@@ -1332,14 +1331,16 @@ test_config_find_my_address_mixed(void *arg)
tor_addr_parse(&test_addr, "1.1.1.1");
retval = find_my_address(options, AF_INET, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "RESOLVED", "www.torproject.org.v4");
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_RESOLVED,
+ "www.torproject.org.v4");
tor_free(hostname_out);
/* IPv6 address should be found and considered resolved. */
tor_addr_parse(&test_addr, "0101::0101");
retval = find_my_address(options, AF_INET6, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "RESOLVED", "www.torproject.org.v6");
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_RESOLVED,
+ "www.torproject.org.v6");
CLEANUP_FOUND_ADDRESS;
UNMOCK(tor_addr_lookup);
@@ -1357,13 +1358,14 @@ test_config_find_my_address_mixed(void *arg)
tor_addr_parse(&test_addr, "1.1.1.1");
retval = find_my_address(options, AF_INET, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "CONFIGURED", NULL);
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_CONFIGURED, NULL);
/* IPv6 address should be found and considered resolved. */
tor_addr_parse(&test_addr, "0101::0101");
retval = find_my_address(options, AF_INET6, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "RESOLVED", "www.torproject.org.v6");
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_RESOLVED,
+ "www.torproject.org.v6");
CLEANUP_FOUND_ADDRESS;
UNMOCK(tor_addr_lookup);
@@ -1381,14 +1383,15 @@ test_config_find_my_address_mixed(void *arg)
tor_addr_parse(&test_addr, "1.1.1.1");
retval = find_my_address(options, AF_INET, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "RESOLVED", "www.torproject.org.v4");
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_RESOLVED,
+ "www.torproject.org.v4");
tor_free(hostname_out);
/* IPv6 address should be found and considered resolved. */
tor_addr_parse(&test_addr, "0101::0101");
retval = find_my_address(options, AF_INET6, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "CONFIGURED", NULL);
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_CONFIGURED, NULL);
CLEANUP_FOUND_ADDRESS;
UNMOCK(tor_addr_lookup);
@@ -1439,7 +1442,7 @@ test_config_find_my_address(void *arg)
{
or_options_t *options;
tor_addr_t resolved_addr, test_addr;
- const char *method_used;
+ resolved_addr_method_t method_used;
char *hostname_out = NULL;
bool retval;
int prev_n_hostname_01010101;
@@ -1470,7 +1473,7 @@ test_config_find_my_address(void *arg)
retval = find_my_address(options, p->family, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(false, NULL, NULL);
+ VALIDATE_FOUND_ADDRESS(false, RESOLVED_ADDR_NONE, NULL);
CLEANUP_FOUND_ADDRESS;
}
@@ -1486,7 +1489,7 @@ test_config_find_my_address(void *arg)
retval = find_my_address(options, p->family, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "CONFIGURED", NULL);
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_CONFIGURED, NULL);
CLEANUP_FOUND_ADDRESS;
/*
@@ -1503,7 +1506,7 @@ test_config_find_my_address(void *arg)
&method_used, &hostname_out);
tt_int_op(n_hostname_01010101, OP_EQ, ++prev_n_hostname_01010101);
- VALIDATE_FOUND_ADDRESS(true, "RESOLVED", "www.torproject.org");
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_RESOLVED, "www.torproject.org");
CLEANUP_FOUND_ADDRESS;
UNMOCK(tor_addr_lookup);
@@ -1523,7 +1526,7 @@ test_config_find_my_address(void *arg)
"public IP addresses.");
teardown_capture_of_logs();
- VALIDATE_FOUND_ADDRESS(false, NULL, NULL);
+ VALIDATE_FOUND_ADDRESS(false, RESOLVED_ADDR_NONE, NULL);
CLEANUP_FOUND_ADDRESS;
/*
@@ -1537,7 +1540,7 @@ test_config_find_my_address(void *arg)
retval = find_my_address(options, p->family, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "CONFIGURED", NULL);
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_CONFIGURED, NULL);
CLEANUP_FOUND_ADDRESS;
/*
@@ -1554,7 +1557,7 @@ test_config_find_my_address(void *arg)
expect_log_msg_containing("Found 2 Address statement of address family");
teardown_capture_of_logs();
- VALIDATE_FOUND_ADDRESS(false, NULL, NULL);
+ VALIDATE_FOUND_ADDRESS(false, RESOLVED_ADDR_NONE, NULL);
CLEANUP_FOUND_ADDRESS;
/*
@@ -1575,7 +1578,7 @@ test_config_find_my_address(void *arg)
&method_used, &hostname_out);
tt_int_op(n_get_interface_address6, OP_EQ, ++prev_n_get_interface_address6);
- VALIDATE_FOUND_ADDRESS(true, "INTERFACE", NULL);
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_INTERFACE, NULL);
CLEANUP_FOUND_ADDRESS;
UNMOCK(get_interface_address6);
@@ -1608,7 +1611,7 @@ test_config_find_my_address(void *arg)
++prev_n_hostname_01010101);
tt_int_op(n_gethostname_replacement, OP_EQ,
++prev_n_gethostname_replacement);
- VALIDATE_FOUND_ADDRESS(true, "GETHOSTNAME", "onionrouter!");
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_GETHOSTNAME, "onionrouter!");
CLEANUP_FOUND_ADDRESS;
UNMOCK(get_interface_address6);
@@ -1642,7 +1645,7 @@ test_config_find_my_address(void *arg)
++prev_n_hostname_localhost);
tt_int_op(n_gethostname_localhost, OP_EQ,
++prev_n_gethostname_localhost);
- VALIDATE_FOUND_ADDRESS(false, NULL, NULL);
+ VALIDATE_FOUND_ADDRESS(false, RESOLVED_ADDR_NONE, NULL);
CLEANUP_FOUND_ADDRESS;
UNMOCK(get_interface_address6);
@@ -1672,7 +1675,7 @@ test_config_find_my_address(void *arg)
++prev_n_get_interface_address6_failure);
tt_int_op(n_gethostname_failure, OP_EQ,
++prev_n_gethostname_failure);
- VALIDATE_FOUND_ADDRESS(false, NULL, NULL);
+ VALIDATE_FOUND_ADDRESS(false, RESOLVED_ADDR_NONE, NULL);
CLEANUP_FOUND_ADDRESS;
UNMOCK(get_interface_address6);
@@ -1705,7 +1708,7 @@ test_config_find_my_address(void *arg)
++prev_n_gethostname_replacement);
tt_int_op(n_hostname_failure, OP_EQ,
++prev_n_hostname_failure);
- VALIDATE_FOUND_ADDRESS(false, NULL, NULL);
+ VALIDATE_FOUND_ADDRESS(false, RESOLVED_ADDR_NONE, NULL);
CLEANUP_FOUND_ADDRESS;
/*
@@ -1736,7 +1739,7 @@ test_config_find_my_address(void *arg)
retval = find_my_address(options, p->family, LOG_NOTICE, &resolved_addr,
&method_used, &hostname_out);
- VALIDATE_FOUND_ADDRESS(true, "CONFIGURED_ORPORT", NULL);
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_CONFIGURED_ORPORT, NULL);
CLEANUP_FOUND_ADDRESS;
/*
@@ -1774,7 +1777,7 @@ test_config_find_my_address(void *arg)
&method_used, &hostname_out);
tt_int_op(n_get_interface_address6, OP_EQ, ++prev_n_get_interface_address6);
- VALIDATE_FOUND_ADDRESS(true, "INTERFACE", NULL);
+ VALIDATE_FOUND_ADDRESS(true, RESOLVED_ADDR_INTERFACE, NULL);
CLEANUP_FOUND_ADDRESS;
UNMOCK(get_interface_address6);
diff --git a/src/test/test_relay.c b/src/test/test_relay.c
index ee704ceb8c..545cb4ac46 100644
--- a/src/test/test_relay.c
+++ b/src/test/test_relay.c
@@ -307,13 +307,13 @@ test_find_addr_to_publish(void *arg)
/* Populate our resolved cache with a valid IPv4 and IPv6. */
family = tor_addr_parse(&ipv4_addr, "1.2.3.4");
tt_int_op(family, OP_EQ, AF_INET);
- resolved_addr_set_last(&ipv4_addr, "NA", NULL);
+ resolved_addr_set_last(&ipv4_addr, RESOLVED_ADDR_CONFIGURED, NULL);
resolved_addr_get_last(AF_INET, &cache_addr);
tt_assert(tor_addr_eq(&ipv4_addr, &cache_addr));
family = tor_addr_parse(&ipv6_addr, "[4242::4242]");
tt_int_op(family, OP_EQ, AF_INET6);
- resolved_addr_set_last(&ipv6_addr, "NA", NULL);
+ resolved_addr_set_last(&ipv6_addr, RESOLVED_ADDR_CONFIGURED, NULL);
resolved_addr_get_last(AF_INET6, &cache_addr);
tt_assert(tor_addr_eq(&ipv6_addr, &cache_addr));
1
0

[tor/master] relay: Add a cache that tracks which address was configured
by dgoulet@torproject.org 24 Jul '20
by dgoulet@torproject.org 24 Jul '20
24 Jul '20
commit fda0fa02bfcf2faef4a973d24877dc7966f6d428
Author: David Goulet <dgoulet(a)torproject.org>
Date: Fri Jul 24 09:19:49 2020 -0400
relay: Add a cache that tracks which address was configured
Related to #33247
Signed-off-by: David Goulet <dgoulet(a)torproject.org>
---
src/app/config/resolve_addr.c | 24 ++++++++++++++++++++++++
src/app/config/resolve_addr.h | 2 ++
2 files changed, 26 insertions(+)
diff --git a/src/app/config/resolve_addr.c b/src/app/config/resolve_addr.c
index a9db2655c1..a153d63974 100644
--- a/src/app/config/resolve_addr.c
+++ b/src/app/config/resolve_addr.c
@@ -55,6 +55,11 @@ static tor_addr_t last_suggested_addrs[] =
{ TOR_ADDR_NULL, TOR_ADDR_NULL, TOR_ADDR_NULL };
CTASSERT(ARRAY_LENGTH(last_suggested_addrs) == IDX_SIZE);
+/** True iff the address was found to be configured that is from the
+ * configuration file either using Address or ORPort. */
+static bool last_addrs_configured[] = { false, false, false };
+CTASSERT(ARRAY_LENGTH(last_addrs_configured) == IDX_SIZE);
+
static inline int
af_to_idx(const int family)
{
@@ -94,6 +99,18 @@ resolved_addr_method_to_str(const resolved_addr_method_t method)
}
}
+/** Return true if the last address of family was configured or not. An
+ * address is considered configured if it was found in the Address or ORPort
+ * statement.
+ *
+ * This applies to the address returned by the function
+ * resolved_addr_get_last() which is the cache of discovered addresses. */
+bool
+resolved_addr_is_configured(int family)
+{
+ return last_addrs_configured[af_to_idx(family)];
+}
+
/** Copy the last suggested address of family into addr_out.
*
* If no last suggested address exists, the addr_out is a null address (use
@@ -565,6 +582,13 @@ resolved_addr_set_last(const tor_addr_t *addr,
/* Copy address to cache. */
tor_addr_copy(last_resolved, addr);
*done_one_resolve = true;
+
+ /* Flag true if the address was configured. Else, indicate it was not. */
+ last_addrs_configured[idx] = false;
+ if (method_used == RESOLVED_ADDR_CONFIGURED ||
+ method_used == RESOLVED_ADDR_CONFIGURED_ORPORT) {
+ last_addrs_configured[idx] = true;
+ }
}
/** Ease our lives. Typedef to the address discovery function signature. */
diff --git a/src/app/config/resolve_addr.h b/src/app/config/resolve_addr.h
index f435f9f41f..96c86eeeea 100644
--- a/src/app/config/resolve_addr.h
+++ b/src/app/config/resolve_addr.h
@@ -49,6 +49,8 @@ void resolved_addr_set_last(const tor_addr_t *addr,
void resolved_addr_get_suggested(int family, tor_addr_t *addr_out);
void resolved_addr_set_suggested(const tor_addr_t *addr);
+bool resolved_addr_is_configured(int family);
+
MOCK_DECL(bool, is_local_to_resolve_addr, (const tor_addr_t *addr));
#ifdef RESOLVE_ADDR_PRIVATE
1
0

[onionperf/develop] Add change log entries for latest two changes.
by karsten@torproject.org 24 Jul '20
by karsten@torproject.org 24 Jul '20
24 Jul '20
commit 251fd9c2b5fe9be1685f4d4e4453b617b505a638
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Fri Jul 24 16:36:34 2020 +0200
Add change log entries for latest two changes.
---
CHANGELOG.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54b632b..0c4c4f2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,10 @@
`onionperf analyze -s/--do-simple-parse` switch. Implements #40005.
- Add JSON schema for analysis results file format 3.0. Implements
#40003.
+ - Correctly compute the start time of failed streams as part of the
+ update to TGen and TGenTools 1.0.0. Fixes #30362.
+ - Refine error codes shown in visualizations into TOR or TGEN errors.
+ Implements #34218.
# Changes in version 0.5 - 2020-07-02
1
0

24 Jul '20
commit c41a7036852b0d7ae93b6cef8e58ed3c364f518e
Merge: dd42ef1 7576ce3
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Fri Jul 24 16:31:42 2020 +0200
Merge branch 'issue-40006' into develop
.gitignore | 4 +--
.gitlab-ci.yml | 23 ----------------
.gitmodules | 0
CHANGELOG.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++
README.md | 6 +++++
Vagrantfile | 35 ------------------------
debian/changelog | 5 ----
debian/compat | 1 -
debian/control | 40 ---------------------------
debian/install | 1 -
debian/rules | 15 -----------
debian/source/format | 1 -
onionperf/__init__.py | 1 +
onionperf/analysis.py | 1 +
onionperf/measurement.py | 1 +
onionperf/model.py | 1 +
onionperf/monitor.py | 1 +
onionperf/onionperf | 1 +
onionperf/util.py | 1 +
onionperf/visualization.py | 1 +
run_tests.sh | 3 ---
21 files changed, 83 insertions(+), 126 deletions(-)
1
0
commit a671736fa1e7328c08e2a1644be280c3c045d29a
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Thu Jul 23 19:44:48 2020 +0200
Add CHANGELOG.md.
---
CHANGELOG.md | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..54b632b
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,67 @@
+# Changes in version 0.6 - 2020-??-??
+
+ - Update to TGen 1.0.0, use TGenTools for parsing TGen log files, and
+ update analysis results file version to 3.0. Implements #33974.
+ - Remove summaries from analysis results files, and remove the
+ `onionperf analyze -s/--do-simple-parse` switch. Implements #40005.
+ - Add JSON schema for analysis results file format 3.0. Implements
+ #40003.
+
+# Changes in version 0.5 - 2020-07-02
+
+ - Add new graph showing the cumulative distribution function of
+ throughput in Mbps. Implements #33257.
+ - Improve `README.md` to make it more useful to developers and
+ researchers. Implements #40001.
+ - Always include the `error_code` column in visualization CSV output,
+ regardless of whether data contains measurements with an error code
+ or not. Fixes #40004.
+ - Write generated torrc files to disk for debugging purposes.
+ Implements #40002.
+
+# Changes in version 0.4 - 2020-06-16
+
+ - Include all measurements when analyzing log files at midnight as
+ part of `onionperf measure`, not just the ones from the day before.
+ Also add `onionperf analyze -x/--date-prefix` switch to prepend a
+ given date string to an analysis results file. Fixes #29369.
+ - Add `size`, `last_modified`, and `sha256` fields to index.xml.
+ Implements #29365.
+ - Add support for single onion services using the switch `onionperf
+ measure -s/--single-onion`. Implements #29368.
+ - Remove unused `onionperf measure --traffic-model` switch.
+ Implements #29370.
+ - Make `onionperf measure -o/--onion-only` and `onionperf measure
+ -i/--inet-only` switches mutually exclusive. Fixes #34316.
+ - Accept one or more paths to analysis results files or directories
+ of such files per dataset in `onionperf visualize -d/--data` to
+ include all contained measurements in a dataset. Implements #34191.
+
+# Changes in version 0.3 - 2020-05-30
+
+ - Automatically compress logs when rotating them. Fixes #33396.
+ - Update to Python 3. Implements #29367.
+ - Integrate reprocessing mode into analysis mode. Implements #34142.
+ - Record download times of smaller file sizes from partial completion
+ times. Implements #26673.
+ - Stop generating .tpf files. Implements #34141.
+ - Update analysis results file version to 2.0. Implements #34224.
+ - Export visualized data to a CSV file. Implements #33258.
+ - Remove version 2 onion service support. Implements #33434.
+ - Reduce timeout and stallout values. Implements #34024.
+ - Remove 50 KiB and 1 MiB downloads. Implements #34023.
+ - Remove existing Tor control log visualizations. Implements #34214.
+ - Update to Networkx version 2.4. Fixes #34298.
+ - Update time to first/last byte definitions to include the time
+ between starting a measurement and receiving the first/last byte.
+ Implements #34215.
+ - Update `requirements.txt` to actual requirements, and switch from
+ distutils to setuptools. Fixes #30586.
+ - Split visualizations into public and onion service measurements.
+ Fixes #34216.
+
+# Changes from before 2020-04
+
+ - Changes made before 2020-04 are not listed here. See `git log` for
+ details.
+
1
0