tor-commits
Threads by month
- ----- 2025 -----
- July
- 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
September 2018
- 17 participants
- 3230 discussions

[translation/torbutton-abouttbupdatedtd_completed] Update translations for torbutton-abouttbupdatedtd_completed
by translation@torproject.org 04 Sep '18
by translation@torproject.org 04 Sep '18
04 Sep '18
commit 49a1396304765d5684c1eabdad2279d558e1f112
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Sep 4 15:48:14 2018 +0000
Update translations for torbutton-abouttbupdatedtd_completed
---
da/abouttbupdate.dtd | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/da/abouttbupdate.dtd b/da/abouttbupdate.dtd
index 450e65cef..84c053afe 100644
--- a/da/abouttbupdate.dtd
+++ b/da/abouttbupdate.dtd
@@ -4,3 +4,7 @@
<!ENTITY aboutTBUpdate.linkLabel "Besøg …
[View More]vores webside">
<!ENTITY aboutTBUpdate.linkSuffix ".">
<!ENTITY aboutTBUpdate.changeLogHeading "Ændringslog:">
+
+<!ENTITY aboutTBUpdate.circuitDisplayHeading "Nyt, redesignet kredsløb-display">
+<!ENTITY aboutTBUpdate.circuitDisplayDescription "Tors kredsløb-display er blev flyttet og forbedret! Klik på stedets identitet-knap (findes på venstre side af URL-linjen) for at se det nye kredskøb-display.">
+<!ENTITY aboutTBUpdate.learnMore "Læs mere">
[View Less]
1
0

[translation/torbutton-abouttbupdatedtd] Update translations for torbutton-abouttbupdatedtd
by translation@torproject.org 04 Sep '18
by translation@torproject.org 04 Sep '18
04 Sep '18
commit 4813807414cbcd0dadc41e74f71e236c68d02555
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Sep 4 15:48:09 2018 +0000
Update translations for torbutton-abouttbupdatedtd
---
da/abouttbupdate.dtd | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/da/abouttbupdate.dtd b/da/abouttbupdate.dtd
index 85a0dfeac..84c053afe 100644
--- a/da/abouttbupdate.dtd
+++ b/da/abouttbupdate.dtd
@@ -5,6 +5,6 @@
<!ENTITY aboutTBUpdate.linkSuffix "."&…
[View More]gt;
<!ENTITY aboutTBUpdate.changeLogHeading "Ændringslog:">
-<!ENTITY aboutTBUpdate.circuitDisplayHeading "New, Redesigned Circuit Display">
-<!ENTITY aboutTBUpdate.circuitDisplayDescription "The Tor circuit display has been relocated and improved! Click the Site Identity button (located on the left side of the URL bar) to see the new circuit display.">
+<!ENTITY aboutTBUpdate.circuitDisplayHeading "Nyt, redesignet kredsløb-display">
+<!ENTITY aboutTBUpdate.circuitDisplayDescription "Tors kredsløb-display er blev flyttet og forbedret! Klik på stedets identitet-knap (findes på venstre side af URL-linjen) for at se det nye kredskøb-display.">
<!ENTITY aboutTBUpdate.learnMore "Læs mere">
[View Less]
1
0
commit 88cfa87c2c548af04a5b6a96a43a3a82e0748adb
Author: traumschule <traumschuleriebau(a)riseup.net>
Date: Sun Sep 2 23:36:17 2018 +0200
fix layout of projects page
---
css/layout | 1 +
css/layout.css | 2 +-
css/layout.min.css | 2 +-
3 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/css/layout b/css/layout
new file mode 100644
index 00000000..f46869fc
--- /dev/null
+++ b/css/layout
@@ -0,0 +1 @@
+html{direction:rtl}.left{float:right}.right{float:left}h1#…
[View More]logo{float:right}h1#logo a,h1#logo a:visited{background-position:right top}#nav{float:left}#nav ul{float:left}#nav ul li{float:right}#calltoaction{float:left;margin-left:5px}#calltoaction ul{float:left}#calltoaction ul li{float:left;margin-right:0}#calltoaction ul li a:link,#calltoaction ul li a:visited{float:left}#banner{background-position:right top}#download a:link,#download a:visited{background-position:right top;float:right;padding:35px 80px 0 0}#download a .download-tor{background-position:left center;padding-left:25px}#banner ul{background-position:right top;float:left;margin:0 0 0 15px;padding:10px 30px 10px 10px}#breadcrumbs{padding:0 5px 10px 0}#home #maincol{float:right;margin-left:20px;margin-right:0}#maincol{float:left}#maincol-left{float:right}.subcol{float:right}#content .first{margin-left:20px}#home #sidecol{float:left}#sidecol{float:right;margin:0 0 0 20px}#sidecol-right{float:left;margin:0 20px 0 0}.user img
,.project-icon{float:right;margin:3px 0 0 10px}.img-shadow{float:right;background-position:bottom left !important;background-position:bottom left;margin:10px 10px 10px 0 !important;margin:10px 5px 10px 0}.img-shadow .infoblock,.img-shadow .important-infoblock,.img-shadow .custom-infoblock,.img-shadow #sidenav,.img-shadow .sidenav-sub{margin:-6px -6px 6px 6px}#sidenav ul li.dropdown a:link,#sidenav ul li.dropdown a:visited{background:url(../images/sidenav-arrow-rtl.gif) right center no-repeat}#sidenav ul li.dropdown a.active{background-position:right center}.sidenav-sub ul li.dropdown a:link,.sidenav-sub ul li.dropdown a:visited{background:url(../images/sidenav-arrow-rtl.gif) right top no-repeat;margin-top:12px}#sidenav ul li a:link,#sidenav ul li a:visited{padding:8px 26px 8px 15px}#sidenav ul li ul li a:link,#sidenav ul li ul li a:visited{padding-right:37px}.sidenav-sub ul li a:link,.sidenav-sub ul li a:visited{display:block;padding:0 26px 10px 15px}#sidenav ul li.active{background
-position:right center}#sidenav ul li ul li ul li a:link,#sidenav ul li ul li ul li a:visited{padding-right:48px}table td img,table tr img{float:right;margin-left:10px}.icon{float:right;margin-left:15px}.calendar{background:url("../images/icon-calendar-flipped.jpg") right top no-repeat;float:right;margin-left:10px}.fauxhead{background-position:left top}.project{float:right}.project img{margin-right:0;margin-left:6px}.meta{float:left}.windows24,.mac24,.linux24,.smartphone24,.sourcecode24{background-position:right center;padding:0 33px 0 0}.warning-top{padding:10px 60px 10px 10px;background:url("../images/warning.png") no-repeat scroll 628px 23px #fffeb6}.warning-top h2{padding-left:15px;padding-right:0}.warning-top p{padding-left:0;padding-right:10px}.warning h2{padding-left:0;padding-right:0}.warning p{padding-left:0;padding-right:10px}.accordionButton{padding-left:0;padding-right:30px}.on:before{left:0;right:10px}.off:before{left:0;right:14px;border-left:0;border-right:7px solid #f
ff}.accordionContent .fauxhead{width:707px}.package p{padding-left:0;padding-right:10px}.downloads{float:left;margin:0 20px 0 0}.lang{float:left;margin:0 0 0 7px;padding:0 3px 0 0}.easy .package p{padding-right:0}.easy .package p.alt-dl{padding-right:0}.easy .downloads{margin-left:0;margin-right:30px}.lang-alt{float:left;margin-right:0;margin-left:10px}.title{background:url(../images/table-title-arrow-rtl.jpg) right top no-repeat;padding:10px 10px 0 25px;float:right}.title a:link,.title a:visited{background-position:right top}.paypal{float:right}.paypal span{padding-left:20px}.focus .icon{float:right;margin-left:10px}input,select{margin:0 0 10px 3px}.donate-btn{background-position:right top}.signup{border-right:1px solid #6ab334;border-left:1px solid #5a952b}select#lang{float:right;margin-left:3px}.go{border-right:1px solid #6ab334;border-left:1px solid #5a952b}.onion{float:right;padding-left:20px}.dbox{margin:0 10px 0 0}.dbox input,.dbox select{padding:0 5px 0 0}.dbox select.cur{ma
rgin-right:0;margin-left:5px;text-align:right}.dbox.donate{text-align:right}.dbox.donate .drow{margin:0 20px 0 0}.dbox.donate ul.amounts{padding-left:40px;padding-right:0}.dbox.donate ul.amounts li{margin-left:0;margin-right:15px}#footer .about{padding-left:30px;border-left:1px solid #ddd;float:right}#footer .newsletter{padding:0 30px 15px 0;margin-right:308px}#footer .col{float:right;margin-right:20px}#footer .first{margin-right:30px}
\ No newline at end of file
diff --git a/css/layout.css b/css/layout.css
index 821b33b8..0db489c8 100644
--- a/css/layout.css
+++ b/css/layout.css
@@ -1285,7 +1285,7 @@ p.blogDate {
left: 0;
}
- .projectbox .projecesc {
+ .projectbox .projectdesc {
margin-left: 100px;
}
/* END */
diff --git a/css/layout.min.css b/css/layout.min.css
index eb15adeb..fee5575d 100644
--- a/css/layout.min.css
+++ b/css/layout.min.css
@@ -1 +1 @@
-@charset "UTF-8";body{background:#fff}#wrap{width:960px;margin:0 auto}.left{float:left}.right{float:right}.twenty{width:20%}.thirty{width:30%}.forty{width:40%}.fifty{width:50%}.sixty{width:60%}.hundred{width:100%}.nopad{padding:0}.toppad{padding-top:10px}.toptwenty{margin-top:20px}.topforty{margin-top:40px}.hidden{display:none}#header{width:960px;height:97px;margin-bottom:23px;position:relative}h1#logo{margin:0;float:left}h1#logo a,h1#logo a:visited{background:url(../images/tor-logo.png) left top no-repeat;background-size:150px 97px;text-indent:-9999px;overflow:hidden;width:150px;height:97px;display:block}#nav{position:absolute;top:30px;left:115px;float:right}#nav ul{height:50px;float:right;margin-bottom:0}#nav ul li{float:left;display:inline;width:auto}#calltoaction{height:30px;float:right;margin-top:100px;margin-right:5px;text-align:center}#calltoaction ul{padding:0;margin:0;height:30px;list-style:none;float:right}#calltoaction ul li{list-style:none;display:inline;float:none;width
:100px;margin-left:0}#calltoaction ul li a:link,#calltoaction ul li a:visited{display:block;background:url(../images/cta-buttons.jpg) top center no-repeat #885ca4;padding:4px 8px;color:#fff;font-weight:bold;text-decoration:none;font-size:13px;line-height:22px;height:22px;width:84px;float:left;text-shadow:1px 1px 0 #111}#calltoaction ul li:hover a{background:url(../images/cta-buttons.jpg) bottom center no-repeat #ff9800;font-weight:bold;text-shadow:1px 1px 0 #111}#calltoaction ul li:first-child a:link,#calltoaction ul li:first-child a:visited,#calltoaction ul li:hover:first-child a{-webkit-border-top-left-radius:7px;-webkit-border-bottom-left-radius:7px;-moz-border-radius-topleft:7px;-moz-border-radius-bottomleft:7px;border-top-left-radius:7px;border-bottom-left-radius:7px}#calltoaction ul li:first-child a:link,#calltoaction ul li:first-child a:visited{background:url(../images/cta-buttons.jpg) top left no-repeat #885ca4}#calltoaction ul li:hover:first-child a{background:url(../images
/cta-buttons.jpg) bottom left no-repeat #ff9800}#calltoaction ul li:last-child a:link,#calltoaction ul li:last-child a:visited,#calltoaction ul li:hover:last-child a{-webkit-border-top-right-radius:7px;-webkit-border-bottom-right-radius:7px;-moz-border-radius-topright:7px;-moz-border-radius-bottomright:7px;border-top-right-radius:7px;border-bottom-right-radius:7px}#calltoaction ul li:last-child a:link,#calltoaction ul li:last-child a:visited{background:url(../images/cta-buttons.jpg) top right no-repeat #885ca4;color:#fff}#calltoaction ul li:hover:last-child a{background:url(../images/cta-buttons.jpg) bottom right no-repeat #ff9800}#banner{background:url(../images/bg-banner.jpg) left top no-repeat;height:200px;width:600px;padding:23px 15px;margin-bottom:15px}#download a:link,#download a:visited{margin:-17px 0 0;background:url(../images/button-download.png) left top no-repeat;width:257px;height:79px;float:left;padding:35px 0 0 80px;text-decoration:none}#download a .download-tor{backgr
ound:url(../images/button-download-arrow.png) right center no-repeat;font-family:"Arial Narrow",Arial,sans-serif;color:#fff;font-size:2.167em;letter-spacing:1px;padding-right:25px}#download a .version{color:#bda5cc;font-size:1.167em;line-height:1.167em}#download a .info{color:#bda5cc;font-size:.833em;line-height:.833em}#download a:hover{background-position:0 -114px}#download a:hover .version,#download a:hover .info{color:#f1c6a1}#banner ul{background:#387520 url(../images/banner-gradient.jpg) left top repeat-x;border:1px solid #366b32;width:180px;float:right;margin:0 15px 0 0;padding:10px 10px 10px 30px}#banner ul li{list-style:url(../images/white-bullet.png) outside;padding:5px 0}#content{width:960px}#content img{max-width:710px}#breadcrumbs{padding:0 0 10px 5px}#home #maincol{float:left;width:620px;margin-right:20px}#maincol{float:right;width:710px;margin-bottom:20px}#dow-don-left,#maincol-left{float:left;width:710px;margin-bottom:20px}#maincol .topforty .icon img{border:0}.subcol
{width:280px;float:left;margin:0 0 25px}#content .first{margin-right:20px}#home #sidecol{float:right;width:300px}#sidecol{float:left;width:230px;margin-right:20px}#dow-don-right,#sidecol-right{float:right;width:230px;margin-left:20px;padding-top:100px}#torusers{margin:0 0 27px}.user{margin:0 0 12px;height:auto}.user img,.project-icon{border:1px solid #cac8a7;float:left;margin:3px 10px 0 0}.user p{margin:0}.img-shadow{float:left;background:url(../images/shadowAlpha.png) no-repeat bottom right !important;background:url(../images/shadow.gif) no-repeat bottom right;margin:10px 0 10px 10px !important;margin:10px 0 10px 5px}.img-shadow .infoblock,.img-shadow .important-infoblock,.img-shadow .custom-infoblock,.img-shadow #sidenav,.img-shadow .sidenav-sub{display:block;position:relative;margin:-6px 6px 6px -6px;background-color:#fff;border:1px solid #ddd}.img-shadow .important-infoblock{background-color:#f7f8f0;border:1px solid #eeefe8}.img-shadow .infoblock,.img-shadow .important-infoblock
{padding:15px;width:188px}.img-shadow .custom-infoblock{padding:15px;height:120px;width:426px}.img-shadow .infoblock p,.img-shadow .important-infoblock p,.img-shadow .custom-infoblock p{margin:0}.img-shadow #sidenav,.img-shadow .sidenav-sub{padding:10px 0 0;width:218px}#sidenav ul li,.sidenav-sub ul li{border-bottom:1px solid #ddd}#sidenav ul li.dropdown a:link,#sidenav ul li.dropdown a:visited{background:url(../images/sidenav-arrow.gif) left center no-repeat}#sidenav ul li.dropdown a.active{background:url(../images/sidenav-arrow-active.gif) left center no-repeat}.sidenav-sub ul li.dropdown a:link,.sidenav-sub ul li.dropdown a:visited{background:url(../images/sidenav-arrow.gif) left top no-repeat;margin-top:12px}#sidenav ul li a:link,#sidenav ul li a:visited{display:block;height:auto;padding:8px 15px 8px 26px}#sidenav ul li ul li a:link,#sidenav ul li ul li a:visited{padding-left:37px}.sidenav-sub ul li a:link,.sidenav-sub ul li a:visited{display:block;padding:0 15px 10px 26px;line-
height:16px}#sidenav ul li.active{background:url(../images/sidenav-active.png) left center no-repeat;width:230px;border:0}#sidenav ul li ul li ul li a:link,#sidenav ul li ul li ul li a:visited{padding-left:48px}#press tr:nth-child(even){background-color:#e5e5e5}table{width:100%}td{padding:12px}table td img,table tr img{border:0;float:left;margin-right:10px}.icon{float:left;width:auto;margin-right:15px;padding:10px 0;border:0}.calendar{background:url(../images/icon-calendar.jpg) left top no-repeat;float:left;margin-right:10px;width:45px;height:54px;text-align:center;padding:4px 0}.fauxhead{background:url(../images/table-arrow.jpg) right top no-repeat;width:100%;height:11px}#home-our-projects td{height:92px;width:296px;padding:6px}#ecosystem_presentation{height:30px;padding-top:10px;padding-left:60px;vertical-align:middle;background:url("../images/video.png") no-repeat scroll left center transparent;font-size:1.7em;font-weight:bold}#ecosystem_presentation a{text-decoration:none}.proje
ct{float:left;padding:6px;border:1px solid #cac8a7;height:76px;width:284px;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.project img{border:0;margin-right:6px}.beige{background:#f5f5df}.gray{background:#e0e0e0}.meta{float:right;width:auto}.windows24{background:url("../images/icon-windows24.png") no-repeat scroll left center transparent}.mac24{background:url("../images/icon-mac24.png") no-repeat scroll left center transparent}.linux24{background:url("../images/icon-linux24.png") no-repeat scroll left center transparent}.android24{background: url("../images/icon-android24.png") no-repeat scroll left center transparent;background-size:24px;}.smartphone24{background:url("../images/icon-smartphone24.png") no-repeat scroll left center transparent}.sourcecode24{background:url("../images/icon-sourcecode24.png") no-repeat scroll left center transparent}.windows24,.mac24,.linux24,.android24,.smartphone24,.sourcecode24{display:block;line-height:32px;padding:0 0 0 33px}
.accordionButton{background:url("../images/table-title.jpg") repeat-x left bottom #885ca4;color:#fff;margin:0;font-size:1.1em;font-weight:bold;height:32px;float:left;_float:none;border:1px solid #fff;border-bottom:0;cursor:pointer;-webkit-border-top-left-radius:7px;-webkit-border-top-right-radius:7px;-moz-border-radius-topleft:7px;-moz-border-radius-topright:7px;border-top-left-radius:7px;border-top-right-radius:7px;position:relative;padding-left:30px;width:680px}.accordionButton:hover{background:url("../images/table-title-hover.jpg") repeat-x left bottom #885ca4;text-shadow:1px 1px 0 rgba(17,17,17,1)}.on:before,.off:before{position:absolute;content:'';height:0;width:0;font-size:0;line-height:0}.on:before{top:14px;left:10px;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #fff}.off:before{top:9px;left:14px;border-bottom:7px solid transparent;border-top:7px solid transparent;border-left:7px solid #fff}.accordionContent{width:708px;float:left;_
float:none;background:#fff;display:block}.accordionContent .fauxhead{width:710px}.package{float:left;height:280px;margin:0;padding:25px 20px 20px 20px;border-top:1px solid #888}.package h2{margin-bottom:3px}.package p{margin-top:16px;padding-left:10px}.downloads{display:block;float:left;width:238px;padding:0 16px 0 0;text-align:center}.lang{float:right;display:none;width:80px;height:20px;margin:0 7px 0 0;padding:0 0 0 3px;background-color:#fefff7;border:2px solid #cccfb8;border-top:0;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.button{text-align:center;display:block;width:234px;height:69px;text-decoration:none;background:url(../images/button-downloadpage.png) bottom left no-repeat;margin:0 auto 8px auto;text-shadow:1px 1px 0 rgba(17,17,17,1);-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.button .strong
{display:block;padding:10px 0 0 57px}.button .normal{padding:5px 0 0 57px;display:block}.sig{display:block;margin:3px 0 20px 0}.easy{width:712px;margin-bottom:10px;padding-bottom:8px}#download-donate{background-attachment:scroll;background-clip:border-box;background-color:transparent;background-image:url(../images/headerbg.jpg);background-origin:padding-box;background-position:0 0;background-repeat:no-repeat;background-size:100% 100%}.easy .package h2,.easy .package em{display:block;width:100%;text-align:left}.easy .package h2{padding-top:10px;padding-bottom:5px}.easy .package em{font-size:1.2em;padding-top:8px;padding-bottom:4px}.easy .package p{padding-left:0;font-size:15px;text-align:justify}.easy .package p.alt-dl{text-align:left;text-indent:0;padding-left:0;margin-top:32px}.all-dl{display:block;text-align:left;width:100%;font-size:15px}.all-dl a{text-decoration:none;font-weight:bold}.all-dl a:hover{text-decoration:underline}.easy .package{float:none;padding:0 8px 0 12px}.open{d
isplay:block}.lang-alt{line-height:15px;font-size:10px;float:right;margin-right:10px}.expander{text-align:right;float:right;padding:10px 20px 0 0;font-size:15px;display:none}.title{background:url(../images/table-title-arrow.jpg) right top no-repeat;padding:10px 25px 0 10px;height:33px;float:left}.title a:link,.title a:visited{background:url(../images/table-title.jpg) left top no-repeat;height:33px;display:block}.paypal{float:left;width:auto;min-height:159px;max-width:365px}.paypal span{padding-right:20px}.warning-top{width:618px;padding:10px 10px 10px 60px;margin:0 10px 0 10px;display:block;background:url("../images/warning.png") no-repeat scroll 2px 23px #fffeb6;border:1px solid #a6a427;border-bottom:0;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;border-top-left-radius:5px;border-top-right-radius:5px}.warning-top h2{padding-right:15px;padding-left:0;margin-bottom:5px}.warning-top p{padding-left
:10px;margin-bottom:0}.warning{float:left;_float:none;padding:25px 25px;margin-top:4px}.warning p{padding-left:10px}.focus{background:#f4f2c7;border:1px solid #ebd4a9;padding:10px 15px}.focus .icon{float:left;width:auto;margin-right:10px}.featured-project{width:313px}input,select{margin:0 3px 10px 0}input.textfield{padding:0 10px;vertical-align:top}.donate-btn{background:left top no-repeat;height:26px;width:92px;text-indent:-9999px;overflow:hidden;border:0;vertical-align:top;margin-top:5px}.donate-btn:hover{background-position:0 -26px;cursor:pointer}.signup{background:#96c35a;border-top:1px solid #6ab334;border-left:1px solid #6ab334;border-bottom:1px solid #5a952b;border-right:1px solid #5a952b;height:31px;padding:0 5px;vertical-align:top;color:#222c14;font-weight:bold;font-size:1em;line-height:1em}.signup:hover{background:#6ab334}select#lang{float:left;width:160px;margin-right:3px}.go{background:#96c35a;border-top:1px solid #6ab334;border-left:1px solid #6ab334;border-bottom:1px s
olid #5a952b;border-right:1px solid #5a952b;padding:0 5px;vertical-align:top;color:#222c14;font-weight:bold;font-size:1em;line-height:1em;height:18px}.go:hover{background:#6ab334}#footer{width:1024px;height:200px;border-top:1px solid #ddd;padding:20px 0;margin:20px 0 0}.onion{float:left;width:88px;padding-right:20px;height:100%}#footer .about{width:180px;padding-right:30px;border-right:1px solid #ddd;float:left}#footer .newsletter{padding:0 0 15px 30px;width:auto;margin-left:308px}#footer input.textfield{width:220px;height:26px}#footer input{margin:0}#footer .col{float:left;width:100px;margin-left:20px}#footer .first{margin-left:30px}#footer .wider{width:201px}small{margin:0 auto 0 auto;text-align:center;font-size:10px;font-style:italic}.hlist{text-align:center;display:block;width:100%;padding:0;list-style:none;margin:0 0 18px 0}.hlist li{display:inline-block;border-right:1px solid #444;margin-left:-4px}.hlist li.last{border-right:0 solid #444}.hlist a{display:block;top:0;right:0;bo
ttom:0;left:0;text-decoration:none;font-weight:bold;padding:0 8px}.dbox{float:none;text-align:center;color:#222;border:0;padding:1.4em .7em;width:163px;margin:0 0 0 10px}.dbox p{display:block;padding:0;margin:0}.dbox h2{padding:13px 0 15px 0;position:relative;color:black;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:normal;height:35px;margin-bottom:-20px;margin-left:-6px;z-index:-10}.dbox input.donate-btn{background:url(../images/btn_donateCC_LG.gif) left top no-repeat transparent;height:68px;width:186px;margin-top:0;display:block;background-color:transparent;color:transparent;margin:10px auto 10px auto;padding:0}.dbox span{float:left;padding-right:0}.dbox div label{padding:0 10px 0 0}.dbox h6#ppinfo{width:100%;text-align:center;margin:-15px auto 0 auto}.dbox small,.dbox.donate #ppinfo{margin:0 auto 0 auto;text-align:center;font-size:10px;font-style:normal}.dbox.dl{float:none;width:177px;margin:0 5px 20px 5px}.dbox.dl input.amount{width:87px}.dbox.donate{float:no
ne;padding:30px 30px;width:626px;min-height:0;max-width:none;text-align:left}.dbox.donate input,.dbox.donate select{padding-bottom:0;margin-bottom:0}.dbox.donate .drow{margin:0 0 0 20px}.dbox.donate .drow div{padding:0;width:auto;display:block}.dbox.donate h3{padding-left:0;color:#23300e;margin:0 0 10px 0}.dbox.donate h4{padding-left:20px}.dbox.donate p{padding:5px 20px 15px 40px}.dbox.donate span{float:left;padding-right:0}.dbox.donate div label{padding:0 10px 0 0}.dbox.donate .type{padding-left:20px}.dbox.donate select#t3{width:auto;margin-bottom:0}.dbox.donate ul.amounts{width:auto}.dbox.donate ul.amounts li{display:inline-block}.dbox.donate ul.amounts li label{padding:0 0 0 5px}.dbox.donate input.donate-btn{background:url(../images/btn_donateCC_LG.gif) left top no-repeat transparent;height:26px;width:115px;margin-top:-3px;display:inline-block;background-color:transparent;color:transparent;border:0 solid transparent}.dbox.dsmall{position:relative;display:inline-block;width:170px;
height:140px;text-align:center;margin:0 10px;vertical-align:top}.dbox.dsmall input.donate-btn{background:url() left top no-repeat transparent;width:auto;height:auto;margin-top:0;display:block;background-color:transparent;color:transparent;border:0 solid transparent}.dbox.dsmall div label{padding:0}.dbox.dsmall small{display:block;position:absolute;width:172px;float:none;bottom:20px;margin:0 auto}.givv p{text-align:justify;margin-top:10px;font-size:11px;line-height:13px}dwolla p{text-align:justify;margin-top:10px;font-size:11px;line-height:13px}div.blogRow,div.blogFirstRow{height:40px;padding:3px 10px;margin:0}div.blogLastRow{height:20px;text-align:center}div.blogFirstRow{height:22px;background:url(../images/table-head.jpg) left top repeat-x #885ca4}.blogRow:hover{background:#f6ffd5}div.blogRow1,div.blogRow3{background:#eee8f1}.blogFeed a{text-decoration:none}.blogFeed p{margin:0;font-size:12px}p.blogTitle{font-weight:bold;text-decoration:underline}p.blogAuthor{color:#000;text-align:
right;margin-top:-20px}p.blogAuthor em{color:#4e6a20;text-align:right;margin-top:-20px}p.blogDate{color:#000}.blogFeed h2{font-size:1.467em;margin:0;line-height:23px;color:#f6f6ed}#projectpage td{width:50%}.projectbox{width:710px;position:relative;margin-bottom:80px}.projectbox .name{font-size:1.5em;font-weight:bold}.projectbox a img{float:none;position:absolute;top:0;left:0}.projectbox .projecesc{margin-left:100px}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}.clearfix{display:inline-block}/*\*/* html .clearfix{height:1%}.clearfix{display:block}/**/.joblink{display:block;font-size:128%;font-weight:bold;padding:10px 5px;text-align:right}.joblink a{text-decoration:none}.dropbtn{background-color:white;padding:16px 0 0 0;font-size:100%;border:0;cursor:pointer}.dropdown{position:relative;display:inline-block;padding:0;margin-top:-16px;top:0}.dropdown-content{display:none;position:absolute;background-color:#f9f9f9;box-shadow:0 8px 16px 0 rgba(0,0,0,0.2);
z-index:1;margin:48px 0 0 0}.dropdown-content a{color:black;padding-top:12px 16px;text-decoration:none;display:block}.dropdown:hover .dropdown-content{display:block}
+@charset "UTF-8";body{background:#fff}#wrap{width:960px;margin:0 auto}.left{float:left}.right{float:right}.twenty{width:20%}.thirty{width:30%}.forty{width:40%}.fifty{width:50%}.sixty{width:60%}.hundred{width:100%}.nopad{padding:0}.toppad{padding-top:10px}.toptwenty{margin-top:20px}.topforty{margin-top:40px}.hidden{display:none}#header{width:960px;height:97px;margin-bottom:23px;position:relative}h1#logo{margin:0;float:left}h1#logo a,h1#logo a:visited{background:url(../images/tor-logo.png) left top no-repeat;background-size:150px 97px;text-indent:-9999px;overflow:hidden;width:150px;height:97px;display:block}#nav{position:absolute;top:30px;left:115px;float:right}#nav ul{height:50px;float:right;margin-bottom:0}#nav ul li{float:left;display:inline;width:auto}#calltoaction{height:30px;float:right;margin-top:100px;margin-right:5px;text-align:center}#calltoaction ul{padding:0;margin:0;height:30px;list-style:none;float:right}#calltoaction ul li{list-style:none;display:inline;float:none;width
:100px;margin-left:0}#calltoaction ul li a:link,#calltoaction ul li a:visited{display:block;background:url(../images/cta-buttons.jpg) top center no-repeat #885ca4;padding:4px 8px;color:#fff;font-weight:bold;text-decoration:none;font-size:13px;line-height:22px;height:22px;width:84px;float:left;text-shadow:1px 1px 0 #111}#calltoaction ul li:hover a{background:url(../images/cta-buttons.jpg) bottom center no-repeat #ff9800;font-weight:bold;text-shadow:1px 1px 0 #111}#calltoaction ul li:first-child a:link,#calltoaction ul li:first-child a:visited,#calltoaction ul li:hover:first-child a{-webkit-border-top-left-radius:7px;-webkit-border-bottom-left-radius:7px;-moz-border-radius-topleft:7px;-moz-border-radius-bottomleft:7px;border-top-left-radius:7px;border-bottom-left-radius:7px}#calltoaction ul li:first-child a:link,#calltoaction ul li:first-child a:visited{background:url(../images/cta-buttons.jpg) top left no-repeat #885ca4}#calltoaction ul li:hover:first-child a{background:url(../images
/cta-buttons.jpg) bottom left no-repeat #ff9800}#calltoaction ul li:last-child a:link,#calltoaction ul li:last-child a:visited,#calltoaction ul li:hover:last-child a{-webkit-border-top-right-radius:7px;-webkit-border-bottom-right-radius:7px;-moz-border-radius-topright:7px;-moz-border-radius-bottomright:7px;border-top-right-radius:7px;border-bottom-right-radius:7px}#calltoaction ul li:last-child a:link,#calltoaction ul li:last-child a:visited{background:url(../images/cta-buttons.jpg) top right no-repeat #885ca4;color:#fff}#calltoaction ul li:hover:last-child a{background:url(../images/cta-buttons.jpg) bottom right no-repeat #ff9800}#banner{background:url(../images/bg-banner.jpg) left top no-repeat;height:200px;width:600px;padding:23px 15px;margin-bottom:15px}#download a:link,#download a:visited{margin:-17px 0 0;background:url(../images/button-download.png) left top no-repeat;width:257px;height:79px;float:left;padding:35px 0 0 80px;text-decoration:none}#download a .download-tor{backgr
ound:url(../images/button-download-arrow.png) right center no-repeat;font-family:"Arial Narrow",Arial,sans-serif;color:#fff;font-size:2.167em;letter-spacing:1px;padding-right:25px}#download a .version{color:#bda5cc;font-size:1.167em;line-height:1.167em}#download a .info{color:#bda5cc;font-size:.833em;line-height:.833em}#download a:hover{background-position:0 -114px}#download a:hover .version,#download a:hover .info{color:#f1c6a1}#banner ul{background:#387520 url(../images/banner-gradient.jpg) left top repeat-x;border:1px solid #366b32;width:180px;float:right;margin:0 15px 0 0;padding:10px 10px 10px 30px}#banner ul li{list-style:url(../images/white-bullet.png) outside;padding:5px 0}#content{width:960px}#content img{max-width:710px}#breadcrumbs{padding:0 0 10px 5px}#home #maincol{float:left;width:620px;margin-right:20px}#maincol{float:right;width:710px;margin-bottom:20px}#dow-don-left,#maincol-left{float:left;width:710px;margin-bottom:20px}#maincol .topforty .icon img{border:0}.subcol
{width:280px;float:left;margin:0 0 25px}#content .first{margin-right:20px}#home #sidecol{float:right;width:300px}#sidecol{float:left;width:230px;margin-right:20px}#dow-don-right,#sidecol-right{float:right;width:230px;margin-left:20px;padding-top:100px}#torusers{margin:0 0 27px}.user{margin:0 0 12px;height:auto}.user img,.project-icon{border:1px solid #cac8a7;float:left;margin:3px 10px 0 0}.user p{margin:0}.img-shadow{float:left;background:url(../images/shadowAlpha.png) no-repeat bottom right !important;background:url(../images/shadow.gif) no-repeat bottom right;margin:10px 0 10px 10px !important;margin:10px 0 10px 5px}.img-shadow .infoblock,.img-shadow .important-infoblock,.img-shadow .custom-infoblock,.img-shadow #sidenav,.img-shadow .sidenav-sub{display:block;position:relative;margin:-6px 6px 6px -6px;background-color:#fff;border:1px solid #ddd}.img-shadow .important-infoblock{background-color:#f7f8f0;border:1px solid #eeefe8}.img-shadow .infoblock,.img-shadow .important-infoblock
{padding:15px;width:188px}.img-shadow .custom-infoblock{padding:15px;height:120px;width:426px}.img-shadow .infoblock p,.img-shadow .important-infoblock p,.img-shadow .custom-infoblock p{margin:0}.img-shadow #sidenav,.img-shadow .sidenav-sub{padding:10px 0 0;width:218px}#sidenav ul li,.sidenav-sub ul li{border-bottom:1px solid #ddd}#sidenav ul li.dropdown a:link,#sidenav ul li.dropdown a:visited{background:url(../images/sidenav-arrow.gif) left center no-repeat}#sidenav ul li.dropdown a.active{background:url(../images/sidenav-arrow-active.gif) left center no-repeat}.sidenav-sub ul li.dropdown a:link,.sidenav-sub ul li.dropdown a:visited{background:url(../images/sidenav-arrow.gif) left top no-repeat;margin-top:12px}#sidenav ul li a:link,#sidenav ul li a:visited{display:block;height:auto;padding:8px 15px 8px 26px}#sidenav ul li ul li a:link,#sidenav ul li ul li a:visited{padding-left:37px}.sidenav-sub ul li a:link,.sidenav-sub ul li a:visited{display:block;padding:0 15px 10px 26px;line-
height:16px}#sidenav ul li.active{background:url(../images/sidenav-active.png) left center no-repeat;width:230px;border:0}#sidenav ul li ul li ul li a:link,#sidenav ul li ul li ul li a:visited{padding-left:48px}#press tr:nth-child(even){background-color:#e5e5e5}table{width:100%}td{padding:12px}table td img,table tr img{border:0;float:left;margin-right:10px}.icon{float:left;width:auto;margin-right:15px;padding:10px 0;border:0}.calendar{background:url(../images/icon-calendar.jpg) left top no-repeat;float:left;margin-right:10px;width:45px;height:54px;text-align:center;padding:4px 0}.fauxhead{background:url(../images/table-arrow.jpg) right top no-repeat;width:100%;height:11px}#home-our-projects td{height:92px;width:296px;padding:6px}#ecosystem_presentation{height:30px;padding-top:10px;padding-left:60px;vertical-align:middle;background:url("../images/video.png") no-repeat scroll left center transparent;font-size:1.7em;font-weight:bold}#ecosystem_presentation a{text-decoration:none}.proje
ct{float:left;padding:6px;border:1px solid #cac8a7;height:76px;width:284px;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.project img{border:0;margin-right:6px}.beige{background:#f5f5df}.gray{background:#e0e0e0}.meta{float:right;width:auto}.windows24{background:url("../images/icon-windows24.png") no-repeat scroll left center transparent}.mac24{background:url("../images/icon-mac24.png") no-repeat scroll left center transparent}.linux24{background:url("../images/icon-linux24.png") no-repeat scroll left center transparent}.android24{background:url("../images/icon-android24.png") no-repeat scroll left center transparent;background-size:24px}.smartphone24{background:url("../images/icon-smartphone24.png") no-repeat scroll left center transparent}.sourcecode24{background:url("../images/icon-sourcecode24.png") no-repeat scroll left center transparent}.windows24,.mac24,.linux24,.android24,.smartphone24,.sourcecode24{display:block;line-height:32px;padding:0 0 0 33px}.a
ccordionButton{background:url("../images/table-title.jpg") repeat-x left bottom #885ca4;color:#fff;margin:0;font-size:1.1em;font-weight:bold;height:32px;float:left;_float:none;border:1px solid #fff;border-bottom:0;cursor:pointer;-webkit-border-top-left-radius:7px;-webkit-border-top-right-radius:7px;-moz-border-radius-topleft:7px;-moz-border-radius-topright:7px;border-top-left-radius:7px;border-top-right-radius:7px;position:relative;padding-left:30px;width:680px}.accordionButton:hover{background:url("../images/table-title-hover.jpg") repeat-x left bottom #885ca4;text-shadow:1px 1px 0 rgba(17,17,17,1)}.on:before,.off:before{position:absolute;content:'';height:0;width:0;font-size:0;line-height:0}.on:before{top:14px;left:10px;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #fff}.off:before{top:9px;left:14px;border-bottom:7px solid transparent;border-top:7px solid transparent;border-left:7px solid #fff}.accordionContent{width:708px;float:left;_fl
oat:none;background:#fff;display:block}.accordionContent .fauxhead{width:710px}.package{float:left;height:280px;margin:0;padding:25px 20px 20px 20px;border-top:1px solid #888}.package h2{margin-bottom:3px}.package p{margin-top:16px;padding-left:10px}.downloads{display:block;float:left;width:238px;padding:0 16px 0 0;text-align:center}.lang{float:right;display:none;width:80px;height:20px;margin:0 7px 0 0;padding:0 0 0 3px;background-color:#fefff7;border:2px solid #cccfb8;border-top:0;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.button{text-align:center;display:block;width:234px;height:69px;text-decoration:none;background:url(../images/button-downloadpage.png) bottom left no-repeat;margin:0 auto 8px auto;text-shadow:1px 1px 0 rgba(17,17,17,1);-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.button .strong{d
isplay:block;padding:10px 0 0 57px}.button .normal{padding:5px 0 0 57px;display:block}.sig{display:block;margin:3px 0 20px 0}.easy{width:712px;margin-bottom:10px;padding-bottom:8px}#download-donate{background-attachment:scroll;background-clip:border-box;background-color:transparent;background-image:url(../images/headerbg.jpg);background-origin:padding-box;background-position:0 0;background-repeat:no-repeat;background-size:100% 100%}.easy .package h2,.easy .package em{display:block;width:100%;text-align:left}.easy .package h2{padding-top:10px;padding-bottom:5px}.easy .package em{font-size:1.2em;padding-top:8px;padding-bottom:4px}.easy .package p{padding-left:0;font-size:15px;text-align:justify}.easy .package p.alt-dl{text-align:left;text-indent:0;padding-left:0;margin-top:32px}.all-dl{display:block;text-align:left;width:100%;font-size:15px}.all-dl a{text-decoration:none;font-weight:bold}.all-dl a:hover{text-decoration:underline}.easy .package{float:none;padding:0 8px 0 12px}.open{dis
play:block}.lang-alt{line-height:15px;font-size:10px;float:right;margin-right:10px}.expander{text-align:right;float:right;padding:10px 20px 0 0;font-size:15px;display:none}.title{background:url(../images/table-title-arrow.jpg) right top no-repeat;padding:10px 25px 0 10px;height:33px;float:left}.title a:link,.title a:visited{background:url(../images/table-title.jpg) left top no-repeat;height:33px;display:block}.paypal{float:left;width:auto;min-height:159px;max-width:365px}.paypal span{padding-right:20px}.warning-top{width:618px;padding:10px 10px 10px 60px;margin:0 10px 0 10px;display:block;background:url("../images/warning.png") no-repeat scroll 2px 23px #fffeb6;border:1px solid #a6a427;border-bottom:0;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;border-top-left-radius:5px;border-top-right-radius:5px}.warning-top h2{padding-right:15px;padding-left:0;margin-bottom:5px}.warning-top p{padding-left:1
0px;margin-bottom:0}.warning{float:left;_float:none;padding:25px 25px;margin-top:4px}.warning p{padding-left:10px}.focus{background:#f4f2c7;border:1px solid #ebd4a9;padding:10px 15px}.focus .icon{float:left;width:auto;margin-right:10px}.featured-project{width:313px}input,select{margin:0 3px 10px 0}input.textfield{padding:0 10px;vertical-align:top}.donate-btn{background:left top no-repeat;height:26px;width:92px;text-indent:-9999px;overflow:hidden;border:0;vertical-align:top;margin-top:5px}.donate-btn:hover{background-position:0 -26px;cursor:pointer}.signup{background:#96c35a;border-top:1px solid #6ab334;border-left:1px solid #6ab334;border-bottom:1px solid #5a952b;border-right:1px solid #5a952b;height:31px;padding:0 5px;vertical-align:top;color:#222c14;font-weight:bold;font-size:1em;line-height:1em}.signup:hover{background:#6ab334}select#lang{float:left;width:160px;margin-right:3px}.go{background:#96c35a;border-top:1px solid #6ab334;border-left:1px solid #6ab334;border-bottom:1px sol
id #5a952b;border-right:1px solid #5a952b;padding:0 5px;vertical-align:top;color:#222c14;font-weight:bold;font-size:1em;line-height:1em;height:18px}.go:hover{background:#6ab334}#footer{width:1024px;height:200px;border-top:1px solid #ddd;padding:20px 0;margin:20px 0 0}.onion{float:left;width:88px;padding-right:20px;height:100%}#footer .about{width:180px;padding-right:30px;border-right:1px solid #ddd;float:left}#footer .newsletter{padding:0 0 15px 30px;width:auto;margin-left:308px}#footer input.textfield{width:220px;height:26px}#footer input{margin:0}#footer .col{float:left;width:100px;margin-left:20px}#footer .first{margin-left:30px}#footer .wider{width:201px}small{margin:0 auto 0 auto;text-align:center;font-size:10px;font-style:italic}.hlist{text-align:center;display:block;width:100%;padding:0;list-style:none;margin:0 0 18px 0}.hlist li{display:inline-block;border-right:1px solid #444;margin-left:-4px}.hlist li.last{border-right:0 solid #444}.hlist a{display:block;top:0;right:0;bott
om:0;left:0;text-decoration:none;font-weight:bold;padding:0 8px}.dbox{float:none;text-align:center;color:#222;border:0;padding:1.4em .7em;width:163px;margin:0 0 0 10px}.dbox p{display:block;padding:0;margin:0}.dbox h2{padding:13px 0 15px 0;position:relative;color:black;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:normal;height:35px;margin-bottom:-20px;margin-left:-6px;z-index:-10}.dbox input.donate-btn{background:url(../images/btn_donateCC_LG.gif) left top no-repeat transparent;height:68px;width:186px;margin-top:0;display:block;background-color:transparent;color:transparent;margin:10px auto 10px auto;padding:0}.dbox span{float:left;padding-right:0}.dbox div label{padding:0 10px 0 0}.dbox h6#ppinfo{width:100%;text-align:center;margin:-15px auto 0 auto}.dbox small,.dbox.donate #ppinfo{margin:0 auto 0 auto;text-align:center;font-size:10px;font-style:normal}.dbox.dl{float:none;width:177px;margin:0 5px 20px 5px}.dbox.dl input.amount{width:87px}.dbox.donate{float:none
;padding:30px 30px;width:626px;min-height:0;max-width:none;text-align:left}.dbox.donate input,.dbox.donate select{padding-bottom:0;margin-bottom:0}.dbox.donate .drow{margin:0 0 0 20px}.dbox.donate .drow div{padding:0;width:auto;display:block}.dbox.donate h3{padding-left:0;color:#23300e;margin:0 0 10px 0}.dbox.donate h4{padding-left:20px}.dbox.donate p{padding:5px 20px 15px 40px}.dbox.donate span{float:left;padding-right:0}.dbox.donate div label{padding:0 10px 0 0}.dbox.donate .type{padding-left:20px}.dbox.donate select#t3{width:auto;margin-bottom:0}.dbox.donate ul.amounts{width:auto}.dbox.donate ul.amounts li{display:inline-block}.dbox.donate ul.amounts li label{padding:0 0 0 5px}.dbox.donate input.donate-btn{background:url(../images/btn_donateCC_LG.gif) left top no-repeat transparent;height:26px;width:115px;margin-top:-3px;display:inline-block;background-color:transparent;color:transparent;border:0 solid transparent}.dbox.dsmall{position:relative;display:inline-block;width:170px;he
ight:140px;text-align:center;margin:0 10px;vertical-align:top}.dbox.dsmall input.donate-btn{background:url() left top no-repeat transparent;width:auto;height:auto;margin-top:0;display:block;background-color:transparent;color:transparent;border:0 solid transparent}.dbox.dsmall div label{padding:0}.dbox.dsmall small{display:block;position:absolute;width:172px;float:none;bottom:20px;margin:0 auto}.givv p{text-align:justify;margin-top:10px;font-size:11px;line-height:13px}dwolla p{text-align:justify;margin-top:10px;font-size:11px;line-height:13px}div.blogRow,div.blogFirstRow{height:40px;padding:3px 10px;margin:0}div.blogLastRow{height:20px;text-align:center}div.blogFirstRow{height:22px;background:url(../images/table-head.jpg) left top repeat-x #885ca4}.blogRow:hover{background:#f6ffd5}div.blogRow1,div.blogRow3{background:#eee8f1}.blogFeed a{text-decoration:none}.blogFeed p{margin:0;font-size:12px}p.blogTitle{font-weight:bold;text-decoration:underline}p.blogAuthor{color:#000;text-align:ri
ght;margin-top:-20px}p.blogAuthor em{color:#4e6a20;text-align:right;margin-top:-20px}p.blogDate{color:#000}.blogFeed h2{font-size:1.467em;margin:0;line-height:23px;color:#f6f6ed}#projectpage td{width:50%}.projectbox{width:710px;position:relative;margin-bottom:80px}.projectbox .name{font-size:1.5em;font-weight:bold}.projectbox a img{float:none;position:absolute;top:0;left:0}.projectbox .projectdesc{margin-left:100px}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}.clearfix{display:inline-block}/*\*/* html .clearfix{height:1%}.clearfix{display:block}/**/.joblink{display:block;font-size:128%;font-weight:bold;padding:10px 5px;text-align:right}.joblink a{text-decoration:none}.dropbtn{background-color:white;padding:16px 0 0 0;font-size:100%;border:0;cursor:pointer}.dropdown{position:relative;display:inline-block;padding:0;margin-top:-16px;top:0}.dropdown-content{display:none;position:absolute;background-color:#f9f9f9;box-shadow:0 8px 16px 0 rgba(0,0,0,0.2);
z-index:1;margin:48px 0 0 0}.dropdown-content a{color:black;padding-top:12px 16px;text-decoration:none;display:block}.dropdown:hover .dropdown-content{display:block}
\ No newline at end of file
[View Less]
1
0

04 Sep '18
commit 0756fda8eb80ca08b2d1cf4a455da7681cdf0b29
Author: traumschule <traumschuleriebau(a)riseup.net>
Date: Mon Sep 3 18:35:24 2018 +0200
css: wrap text on higher zoom levels (#22076)
This makes it easier to raise the loom level and to read text
without scrolling.
Limitation: the sidenav jumps down at higher zoom levels. To fix
this changes to the html would be necessary.
---
css/layout.css | 3 +++
css/layout.min.css | 2 +-
2 files changed, 4 …
[View More]insertions(+), 1 deletion(-)
diff --git a/css/layout.css b/css/layout.css
index 0db489c8..b037bfcf 100644
--- a/css/layout.css
+++ b/css/layout.css
@@ -9,6 +9,7 @@ body {
#wrap {
width: 960px;
+ max-width: 100%;
margin: 0 auto;
}
@@ -224,6 +225,7 @@ body {
#content {
width: 960px;
+ max-width: 100%;
}
#content img { max-width: 710px; }
@@ -239,6 +241,7 @@ body {
#maincol {
float: right;
width: 710px;
+ max-width: 75%;
margin-bottom: 20px;
}
diff --git a/css/layout.min.css b/css/layout.min.css
index fee5575d..8bb4ef45 100644
--- a/css/layout.min.css
+++ b/css/layout.min.css
@@ -1 +1 @@
-@charset "UTF-8";body{background:#fff}#wrap{width:960px;margin:0 auto}.left{float:left}.right{float:right}.twenty{width:20%}.thirty{width:30%}.forty{width:40%}.fifty{width:50%}.sixty{width:60%}.hundred{width:100%}.nopad{padding:0}.toppad{padding-top:10px}.toptwenty{margin-top:20px}.topforty{margin-top:40px}.hidden{display:none}#header{width:960px;height:97px;margin-bottom:23px;position:relative}h1#logo{margin:0;float:left}h1#logo a,h1#logo a:visited{background:url(../images/tor-logo.png) left top no-repeat;background-size:150px 97px;text-indent:-9999px;overflow:hidden;width:150px;height:97px;display:block}#nav{position:absolute;top:30px;left:115px;float:right}#nav ul{height:50px;float:right;margin-bottom:0}#nav ul li{float:left;display:inline;width:auto}#calltoaction{height:30px;float:right;margin-top:100px;margin-right:5px;text-align:center}#calltoaction ul{padding:0;margin:0;height:30px;list-style:none;float:right}#calltoaction ul li{list-style:none;display:inline;float:none;width
:100px;margin-left:0}#calltoaction ul li a:link,#calltoaction ul li a:visited{display:block;background:url(../images/cta-buttons.jpg) top center no-repeat #885ca4;padding:4px 8px;color:#fff;font-weight:bold;text-decoration:none;font-size:13px;line-height:22px;height:22px;width:84px;float:left;text-shadow:1px 1px 0 #111}#calltoaction ul li:hover a{background:url(../images/cta-buttons.jpg) bottom center no-repeat #ff9800;font-weight:bold;text-shadow:1px 1px 0 #111}#calltoaction ul li:first-child a:link,#calltoaction ul li:first-child a:visited,#calltoaction ul li:hover:first-child a{-webkit-border-top-left-radius:7px;-webkit-border-bottom-left-radius:7px;-moz-border-radius-topleft:7px;-moz-border-radius-bottomleft:7px;border-top-left-radius:7px;border-bottom-left-radius:7px}#calltoaction ul li:first-child a:link,#calltoaction ul li:first-child a:visited{background:url(../images/cta-buttons.jpg) top left no-repeat #885ca4}#calltoaction ul li:hover:first-child a{background:url(../images
/cta-buttons.jpg) bottom left no-repeat #ff9800}#calltoaction ul li:last-child a:link,#calltoaction ul li:last-child a:visited,#calltoaction ul li:hover:last-child a{-webkit-border-top-right-radius:7px;-webkit-border-bottom-right-radius:7px;-moz-border-radius-topright:7px;-moz-border-radius-bottomright:7px;border-top-right-radius:7px;border-bottom-right-radius:7px}#calltoaction ul li:last-child a:link,#calltoaction ul li:last-child a:visited{background:url(../images/cta-buttons.jpg) top right no-repeat #885ca4;color:#fff}#calltoaction ul li:hover:last-child a{background:url(../images/cta-buttons.jpg) bottom right no-repeat #ff9800}#banner{background:url(../images/bg-banner.jpg) left top no-repeat;height:200px;width:600px;padding:23px 15px;margin-bottom:15px}#download a:link,#download a:visited{margin:-17px 0 0;background:url(../images/button-download.png) left top no-repeat;width:257px;height:79px;float:left;padding:35px 0 0 80px;text-decoration:none}#download a .download-tor{backgr
ound:url(../images/button-download-arrow.png) right center no-repeat;font-family:"Arial Narrow",Arial,sans-serif;color:#fff;font-size:2.167em;letter-spacing:1px;padding-right:25px}#download a .version{color:#bda5cc;font-size:1.167em;line-height:1.167em}#download a .info{color:#bda5cc;font-size:.833em;line-height:.833em}#download a:hover{background-position:0 -114px}#download a:hover .version,#download a:hover .info{color:#f1c6a1}#banner ul{background:#387520 url(../images/banner-gradient.jpg) left top repeat-x;border:1px solid #366b32;width:180px;float:right;margin:0 15px 0 0;padding:10px 10px 10px 30px}#banner ul li{list-style:url(../images/white-bullet.png) outside;padding:5px 0}#content{width:960px}#content img{max-width:710px}#breadcrumbs{padding:0 0 10px 5px}#home #maincol{float:left;width:620px;margin-right:20px}#maincol{float:right;width:710px;margin-bottom:20px}#dow-don-left,#maincol-left{float:left;width:710px;margin-bottom:20px}#maincol .topforty .icon img{border:0}.subcol
{width:280px;float:left;margin:0 0 25px}#content .first{margin-right:20px}#home #sidecol{float:right;width:300px}#sidecol{float:left;width:230px;margin-right:20px}#dow-don-right,#sidecol-right{float:right;width:230px;margin-left:20px;padding-top:100px}#torusers{margin:0 0 27px}.user{margin:0 0 12px;height:auto}.user img,.project-icon{border:1px solid #cac8a7;float:left;margin:3px 10px 0 0}.user p{margin:0}.img-shadow{float:left;background:url(../images/shadowAlpha.png) no-repeat bottom right !important;background:url(../images/shadow.gif) no-repeat bottom right;margin:10px 0 10px 10px !important;margin:10px 0 10px 5px}.img-shadow .infoblock,.img-shadow .important-infoblock,.img-shadow .custom-infoblock,.img-shadow #sidenav,.img-shadow .sidenav-sub{display:block;position:relative;margin:-6px 6px 6px -6px;background-color:#fff;border:1px solid #ddd}.img-shadow .important-infoblock{background-color:#f7f8f0;border:1px solid #eeefe8}.img-shadow .infoblock,.img-shadow .important-infoblock
{padding:15px;width:188px}.img-shadow .custom-infoblock{padding:15px;height:120px;width:426px}.img-shadow .infoblock p,.img-shadow .important-infoblock p,.img-shadow .custom-infoblock p{margin:0}.img-shadow #sidenav,.img-shadow .sidenav-sub{padding:10px 0 0;width:218px}#sidenav ul li,.sidenav-sub ul li{border-bottom:1px solid #ddd}#sidenav ul li.dropdown a:link,#sidenav ul li.dropdown a:visited{background:url(../images/sidenav-arrow.gif) left center no-repeat}#sidenav ul li.dropdown a.active{background:url(../images/sidenav-arrow-active.gif) left center no-repeat}.sidenav-sub ul li.dropdown a:link,.sidenav-sub ul li.dropdown a:visited{background:url(../images/sidenav-arrow.gif) left top no-repeat;margin-top:12px}#sidenav ul li a:link,#sidenav ul li a:visited{display:block;height:auto;padding:8px 15px 8px 26px}#sidenav ul li ul li a:link,#sidenav ul li ul li a:visited{padding-left:37px}.sidenav-sub ul li a:link,.sidenav-sub ul li a:visited{display:block;padding:0 15px 10px 26px;line-
height:16px}#sidenav ul li.active{background:url(../images/sidenav-active.png) left center no-repeat;width:230px;border:0}#sidenav ul li ul li ul li a:link,#sidenav ul li ul li ul li a:visited{padding-left:48px}#press tr:nth-child(even){background-color:#e5e5e5}table{width:100%}td{padding:12px}table td img,table tr img{border:0;float:left;margin-right:10px}.icon{float:left;width:auto;margin-right:15px;padding:10px 0;border:0}.calendar{background:url(../images/icon-calendar.jpg) left top no-repeat;float:left;margin-right:10px;width:45px;height:54px;text-align:center;padding:4px 0}.fauxhead{background:url(../images/table-arrow.jpg) right top no-repeat;width:100%;height:11px}#home-our-projects td{height:92px;width:296px;padding:6px}#ecosystem_presentation{height:30px;padding-top:10px;padding-left:60px;vertical-align:middle;background:url("../images/video.png") no-repeat scroll left center transparent;font-size:1.7em;font-weight:bold}#ecosystem_presentation a{text-decoration:none}.proje
ct{float:left;padding:6px;border:1px solid #cac8a7;height:76px;width:284px;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.project img{border:0;margin-right:6px}.beige{background:#f5f5df}.gray{background:#e0e0e0}.meta{float:right;width:auto}.windows24{background:url("../images/icon-windows24.png") no-repeat scroll left center transparent}.mac24{background:url("../images/icon-mac24.png") no-repeat scroll left center transparent}.linux24{background:url("../images/icon-linux24.png") no-repeat scroll left center transparent}.android24{background:url("../images/icon-android24.png") no-repeat scroll left center transparent;background-size:24px}.smartphone24{background:url("../images/icon-smartphone24.png") no-repeat scroll left center transparent}.sourcecode24{background:url("../images/icon-sourcecode24.png") no-repeat scroll left center transparent}.windows24,.mac24,.linux24,.android24,.smartphone24,.sourcecode24{display:block;line-height:32px;padding:0 0 0 33px}.a
ccordionButton{background:url("../images/table-title.jpg") repeat-x left bottom #885ca4;color:#fff;margin:0;font-size:1.1em;font-weight:bold;height:32px;float:left;_float:none;border:1px solid #fff;border-bottom:0;cursor:pointer;-webkit-border-top-left-radius:7px;-webkit-border-top-right-radius:7px;-moz-border-radius-topleft:7px;-moz-border-radius-topright:7px;border-top-left-radius:7px;border-top-right-radius:7px;position:relative;padding-left:30px;width:680px}.accordionButton:hover{background:url("../images/table-title-hover.jpg") repeat-x left bottom #885ca4;text-shadow:1px 1px 0 rgba(17,17,17,1)}.on:before,.off:before{position:absolute;content:'';height:0;width:0;font-size:0;line-height:0}.on:before{top:14px;left:10px;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #fff}.off:before{top:9px;left:14px;border-bottom:7px solid transparent;border-top:7px solid transparent;border-left:7px solid #fff}.accordionContent{width:708px;float:left;_fl
oat:none;background:#fff;display:block}.accordionContent .fauxhead{width:710px}.package{float:left;height:280px;margin:0;padding:25px 20px 20px 20px;border-top:1px solid #888}.package h2{margin-bottom:3px}.package p{margin-top:16px;padding-left:10px}.downloads{display:block;float:left;width:238px;padding:0 16px 0 0;text-align:center}.lang{float:right;display:none;width:80px;height:20px;margin:0 7px 0 0;padding:0 0 0 3px;background-color:#fefff7;border:2px solid #cccfb8;border-top:0;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.button{text-align:center;display:block;width:234px;height:69px;text-decoration:none;background:url(../images/button-downloadpage.png) bottom left no-repeat;margin:0 auto 8px auto;text-shadow:1px 1px 0 rgba(17,17,17,1);-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.button .strong{d
isplay:block;padding:10px 0 0 57px}.button .normal{padding:5px 0 0 57px;display:block}.sig{display:block;margin:3px 0 20px 0}.easy{width:712px;margin-bottom:10px;padding-bottom:8px}#download-donate{background-attachment:scroll;background-clip:border-box;background-color:transparent;background-image:url(../images/headerbg.jpg);background-origin:padding-box;background-position:0 0;background-repeat:no-repeat;background-size:100% 100%}.easy .package h2,.easy .package em{display:block;width:100%;text-align:left}.easy .package h2{padding-top:10px;padding-bottom:5px}.easy .package em{font-size:1.2em;padding-top:8px;padding-bottom:4px}.easy .package p{padding-left:0;font-size:15px;text-align:justify}.easy .package p.alt-dl{text-align:left;text-indent:0;padding-left:0;margin-top:32px}.all-dl{display:block;text-align:left;width:100%;font-size:15px}.all-dl a{text-decoration:none;font-weight:bold}.all-dl a:hover{text-decoration:underline}.easy .package{float:none;padding:0 8px 0 12px}.open{dis
play:block}.lang-alt{line-height:15px;font-size:10px;float:right;margin-right:10px}.expander{text-align:right;float:right;padding:10px 20px 0 0;font-size:15px;display:none}.title{background:url(../images/table-title-arrow.jpg) right top no-repeat;padding:10px 25px 0 10px;height:33px;float:left}.title a:link,.title a:visited{background:url(../images/table-title.jpg) left top no-repeat;height:33px;display:block}.paypal{float:left;width:auto;min-height:159px;max-width:365px}.paypal span{padding-right:20px}.warning-top{width:618px;padding:10px 10px 10px 60px;margin:0 10px 0 10px;display:block;background:url("../images/warning.png") no-repeat scroll 2px 23px #fffeb6;border:1px solid #a6a427;border-bottom:0;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;border-top-left-radius:5px;border-top-right-radius:5px}.warning-top h2{padding-right:15px;padding-left:0;margin-bottom:5px}.warning-top p{padding-left:1
0px;margin-bottom:0}.warning{float:left;_float:none;padding:25px 25px;margin-top:4px}.warning p{padding-left:10px}.focus{background:#f4f2c7;border:1px solid #ebd4a9;padding:10px 15px}.focus .icon{float:left;width:auto;margin-right:10px}.featured-project{width:313px}input,select{margin:0 3px 10px 0}input.textfield{padding:0 10px;vertical-align:top}.donate-btn{background:left top no-repeat;height:26px;width:92px;text-indent:-9999px;overflow:hidden;border:0;vertical-align:top;margin-top:5px}.donate-btn:hover{background-position:0 -26px;cursor:pointer}.signup{background:#96c35a;border-top:1px solid #6ab334;border-left:1px solid #6ab334;border-bottom:1px solid #5a952b;border-right:1px solid #5a952b;height:31px;padding:0 5px;vertical-align:top;color:#222c14;font-weight:bold;font-size:1em;line-height:1em}.signup:hover{background:#6ab334}select#lang{float:left;width:160px;margin-right:3px}.go{background:#96c35a;border-top:1px solid #6ab334;border-left:1px solid #6ab334;border-bottom:1px sol
id #5a952b;border-right:1px solid #5a952b;padding:0 5px;vertical-align:top;color:#222c14;font-weight:bold;font-size:1em;line-height:1em;height:18px}.go:hover{background:#6ab334}#footer{width:1024px;height:200px;border-top:1px solid #ddd;padding:20px 0;margin:20px 0 0}.onion{float:left;width:88px;padding-right:20px;height:100%}#footer .about{width:180px;padding-right:30px;border-right:1px solid #ddd;float:left}#footer .newsletter{padding:0 0 15px 30px;width:auto;margin-left:308px}#footer input.textfield{width:220px;height:26px}#footer input{margin:0}#footer .col{float:left;width:100px;margin-left:20px}#footer .first{margin-left:30px}#footer .wider{width:201px}small{margin:0 auto 0 auto;text-align:center;font-size:10px;font-style:italic}.hlist{text-align:center;display:block;width:100%;padding:0;list-style:none;margin:0 0 18px 0}.hlist li{display:inline-block;border-right:1px solid #444;margin-left:-4px}.hlist li.last{border-right:0 solid #444}.hlist a{display:block;top:0;right:0;bott
om:0;left:0;text-decoration:none;font-weight:bold;padding:0 8px}.dbox{float:none;text-align:center;color:#222;border:0;padding:1.4em .7em;width:163px;margin:0 0 0 10px}.dbox p{display:block;padding:0;margin:0}.dbox h2{padding:13px 0 15px 0;position:relative;color:black;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:normal;height:35px;margin-bottom:-20px;margin-left:-6px;z-index:-10}.dbox input.donate-btn{background:url(../images/btn_donateCC_LG.gif) left top no-repeat transparent;height:68px;width:186px;margin-top:0;display:block;background-color:transparent;color:transparent;margin:10px auto 10px auto;padding:0}.dbox span{float:left;padding-right:0}.dbox div label{padding:0 10px 0 0}.dbox h6#ppinfo{width:100%;text-align:center;margin:-15px auto 0 auto}.dbox small,.dbox.donate #ppinfo{margin:0 auto 0 auto;text-align:center;font-size:10px;font-style:normal}.dbox.dl{float:none;width:177px;margin:0 5px 20px 5px}.dbox.dl input.amount{width:87px}.dbox.donate{float:none
;padding:30px 30px;width:626px;min-height:0;max-width:none;text-align:left}.dbox.donate input,.dbox.donate select{padding-bottom:0;margin-bottom:0}.dbox.donate .drow{margin:0 0 0 20px}.dbox.donate .drow div{padding:0;width:auto;display:block}.dbox.donate h3{padding-left:0;color:#23300e;margin:0 0 10px 0}.dbox.donate h4{padding-left:20px}.dbox.donate p{padding:5px 20px 15px 40px}.dbox.donate span{float:left;padding-right:0}.dbox.donate div label{padding:0 10px 0 0}.dbox.donate .type{padding-left:20px}.dbox.donate select#t3{width:auto;margin-bottom:0}.dbox.donate ul.amounts{width:auto}.dbox.donate ul.amounts li{display:inline-block}.dbox.donate ul.amounts li label{padding:0 0 0 5px}.dbox.donate input.donate-btn{background:url(../images/btn_donateCC_LG.gif) left top no-repeat transparent;height:26px;width:115px;margin-top:-3px;display:inline-block;background-color:transparent;color:transparent;border:0 solid transparent}.dbox.dsmall{position:relative;display:inline-block;width:170px;he
ight:140px;text-align:center;margin:0 10px;vertical-align:top}.dbox.dsmall input.donate-btn{background:url() left top no-repeat transparent;width:auto;height:auto;margin-top:0;display:block;background-color:transparent;color:transparent;border:0 solid transparent}.dbox.dsmall div label{padding:0}.dbox.dsmall small{display:block;position:absolute;width:172px;float:none;bottom:20px;margin:0 auto}.givv p{text-align:justify;margin-top:10px;font-size:11px;line-height:13px}dwolla p{text-align:justify;margin-top:10px;font-size:11px;line-height:13px}div.blogRow,div.blogFirstRow{height:40px;padding:3px 10px;margin:0}div.blogLastRow{height:20px;text-align:center}div.blogFirstRow{height:22px;background:url(../images/table-head.jpg) left top repeat-x #885ca4}.blogRow:hover{background:#f6ffd5}div.blogRow1,div.blogRow3{background:#eee8f1}.blogFeed a{text-decoration:none}.blogFeed p{margin:0;font-size:12px}p.blogTitle{font-weight:bold;text-decoration:underline}p.blogAuthor{color:#000;text-align:ri
ght;margin-top:-20px}p.blogAuthor em{color:#4e6a20;text-align:right;margin-top:-20px}p.blogDate{color:#000}.blogFeed h2{font-size:1.467em;margin:0;line-height:23px;color:#f6f6ed}#projectpage td{width:50%}.projectbox{width:710px;position:relative;margin-bottom:80px}.projectbox .name{font-size:1.5em;font-weight:bold}.projectbox a img{float:none;position:absolute;top:0;left:0}.projectbox .projectdesc{margin-left:100px}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}.clearfix{display:inline-block}/*\*/* html .clearfix{height:1%}.clearfix{display:block}/**/.joblink{display:block;font-size:128%;font-weight:bold;padding:10px 5px;text-align:right}.joblink a{text-decoration:none}.dropbtn{background-color:white;padding:16px 0 0 0;font-size:100%;border:0;cursor:pointer}.dropdown{position:relative;display:inline-block;padding:0;margin-top:-16px;top:0}.dropdown-content{display:none;position:absolute;background-color:#f9f9f9;box-shadow:0 8px 16px 0 rgba(0,0,0,0.2);
z-index:1;margin:48px 0 0 0}.dropdown-content a{color:black;padding-top:12px 16px;text-decoration:none;display:block}.dropdown:hover .dropdown-content{display:block}
\ No newline at end of file
+@charset "UTF-8";body{background:#fff}#wrap{width:960px;max-width:100%;margin:0 auto}.left{float:left}.right{float:right}.twenty{width:20%}.thirty{width:30%}.forty{width:40%}.fifty{width:50%}.sixty{width:60%}.hundred{width:100%}.nopad{padding:0}.toppad{padding-top:10px}.toptwenty{margin-top:20px}.topforty{margin-top:40px}.hidden{display:none}#header{width:960px;height:97px;margin-bottom:23px;position:relative}h1#logo{margin:0;float:left}h1#logo a,h1#logo a:visited{background:url(../images/tor-logo.png) left top no-repeat;background-size:150px 97px;text-indent:-9999px;overflow:hidden;width:150px;height:97px;display:block}#nav{position:absolute;top:30px;left:115px;float:right}#nav ul{height:50px;float:right;margin-bottom:0}#nav ul li{float:left;display:inline;width:auto}#calltoaction{height:30px;float:right;margin-top:100px;margin-right:5px;text-align:center}#calltoaction ul{padding:0;margin:0;height:30px;list-style:none;float:right}#calltoaction ul li{list-style:none;display:inline;f
loat:none;width:100px;margin-left:0}#calltoaction ul li a:link,#calltoaction ul li a:visited{display:block;background:url(../images/cta-buttons.jpg) top center no-repeat #885ca4;padding:4px 8px;color:#fff;font-weight:bold;text-decoration:none;font-size:13px;line-height:22px;height:22px;width:84px;float:left;text-shadow:1px 1px 0 #111}#calltoaction ul li:hover a{background:url(../images/cta-buttons.jpg) bottom center no-repeat #ff9800;font-weight:bold;text-shadow:1px 1px 0 #111}#calltoaction ul li:first-child a:link,#calltoaction ul li:first-child a:visited,#calltoaction ul li:hover:first-child a{-webkit-border-top-left-radius:7px;-webkit-border-bottom-left-radius:7px;-moz-border-radius-topleft:7px;-moz-border-radius-bottomleft:7px;border-top-left-radius:7px;border-bottom-left-radius:7px}#calltoaction ul li:first-child a:link,#calltoaction ul li:first-child a:visited{background:url(../images/cta-buttons.jpg) top left no-repeat #885ca4}#calltoaction ul li:hover:first-child a{backgroun
d:url(../images/cta-buttons.jpg) bottom left no-repeat #ff9800}#calltoaction ul li:last-child a:link,#calltoaction ul li:last-child a:visited,#calltoaction ul li:hover:last-child a{-webkit-border-top-right-radius:7px;-webkit-border-bottom-right-radius:7px;-moz-border-radius-topright:7px;-moz-border-radius-bottomright:7px;border-top-right-radius:7px;border-bottom-right-radius:7px}#calltoaction ul li:last-child a:link,#calltoaction ul li:last-child a:visited{background:url(../images/cta-buttons.jpg) top right no-repeat #885ca4;color:#fff}#calltoaction ul li:hover:last-child a{background:url(../images/cta-buttons.jpg) bottom right no-repeat #ff9800}#banner{background:url(../images/bg-banner.jpg) left top no-repeat;height:200px;width:600px;padding:23px 15px;margin-bottom:15px}#download a:link,#download a:visited{margin:-17px 0 0;background:url(../images/button-download.png) left top no-repeat;width:257px;height:79px;float:left;padding:35px 0 0 80px;text-decoration:none}#download a .down
load-tor{background:url(../images/button-download-arrow.png) right center no-repeat;font-family:"Arial Narrow",Arial,sans-serif;color:#fff;font-size:2.167em;letter-spacing:1px;padding-right:25px}#download a .version{color:#bda5cc;font-size:1.167em;line-height:1.167em}#download a .info{color:#bda5cc;font-size:.833em;line-height:.833em}#download a:hover{background-position:0 -114px}#download a:hover .version,#download a:hover .info{color:#f1c6a1}#banner ul{background:#387520 url(../images/banner-gradient.jpg) left top repeat-x;border:1px solid #366b32;width:180px;float:right;margin:0 15px 0 0;padding:10px 10px 10px 30px}#banner ul li{list-style:url(../images/white-bullet.png) outside;padding:5px 0}#content{width:960px;max-width:100%}#content img{max-width:710px}#breadcrumbs{padding:0 0 10px 5px}#home #maincol{float:left;width:620px;margin-right:20px}#maincol{float:right;width:710px;max-width:75%;margin-bottom:20px}#dow-don-left,#maincol-left{float:left;width:710px;margin-bottom:20px}#
maincol .topforty .icon img{border:0}.subcol{width:280px;float:left;margin:0 0 25px}#content .first{margin-right:20px}#home #sidecol{float:right;width:300px}#sidecol{float:left;width:230px;margin-right:20px}#dow-don-right,#sidecol-right{float:right;width:230px;margin-left:20px;padding-top:100px}#torusers{margin:0 0 27px}.user{margin:0 0 12px;height:auto}.user img,.project-icon{border:1px solid #cac8a7;float:left;margin:3px 10px 0 0}.user p{margin:0}.img-shadow{float:left;background:url(../images/shadowAlpha.png) no-repeat bottom right !important;background:url(../images/shadow.gif) no-repeat bottom right;margin:10px 0 10px 10px !important;margin:10px 0 10px 5px}.img-shadow .infoblock,.img-shadow .important-infoblock,.img-shadow .custom-infoblock,.img-shadow #sidenav,.img-shadow .sidenav-sub{display:block;position:relative;margin:-6px 6px 6px -6px;background-color:#fff;border:1px solid #ddd}.img-shadow .important-infoblock{background-color:#f7f8f0;border:1px solid #eeefe8}.img-shadow
.infoblock,.img-shadow .important-infoblock{padding:15px;width:188px}.img-shadow .custom-infoblock{padding:15px;height:120px;width:426px}.img-shadow .infoblock p,.img-shadow .important-infoblock p,.img-shadow .custom-infoblock p{margin:0}.img-shadow #sidenav,.img-shadow .sidenav-sub{padding:10px 0 0;width:218px}#sidenav ul li,.sidenav-sub ul li{border-bottom:1px solid #ddd}#sidenav ul li.dropdown a:link,#sidenav ul li.dropdown a:visited{background:url(../images/sidenav-arrow.gif) left center no-repeat}#sidenav ul li.dropdown a.active{background:url(../images/sidenav-arrow-active.gif) left center no-repeat}.sidenav-sub ul li.dropdown a:link,.sidenav-sub ul li.dropdown a:visited{background:url(../images/sidenav-arrow.gif) left top no-repeat;margin-top:12px}#sidenav ul li a:link,#sidenav ul li a:visited{display:block;height:auto;padding:8px 15px 8px 26px}#sidenav ul li ul li a:link,#sidenav ul li ul li a:visited{padding-left:37px}.sidenav-sub ul li a:link,.sidenav-sub ul li a:visited{
display:block;padding:0 15px 10px 26px;line-height:16px}#sidenav ul li.active{background:url(../images/sidenav-active.png) left center no-repeat;width:230px;border:0}#sidenav ul li ul li ul li a:link,#sidenav ul li ul li ul li a:visited{padding-left:48px}#press tr:nth-child(even){background-color:#e5e5e5}table{width:100%}td{padding:12px}table td img,table tr img{border:0;float:left;margin-right:10px}.icon{float:left;width:auto;margin-right:15px;padding:10px 0;border:0}.calendar{background:url(../images/icon-calendar.jpg) left top no-repeat;float:left;margin-right:10px;width:45px;height:54px;text-align:center;padding:4px 0}.fauxhead{background:url(../images/table-arrow.jpg) right top no-repeat;width:100%;height:11px}#home-our-projects td{height:92px;width:296px;padding:6px}#ecosystem_presentation{height:30px;padding-top:10px;padding-left:60px;vertical-align:middle;background:url("../images/video.png") no-repeat scroll left center transparent;font-size:1.7em;font-weight:bold}#ecosyste
m_presentation a{text-decoration:none}.project{float:left;padding:6px;border:1px solid #cac8a7;height:76px;width:284px;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.project img{border:0;margin-right:6px}.beige{background:#f5f5df}.gray{background:#e0e0e0}.meta{float:right;width:auto}.windows24{background:url("../images/icon-windows24.png") no-repeat scroll left center transparent}.mac24{background:url("../images/icon-mac24.png") no-repeat scroll left center transparent}.linux24{background:url("../images/icon-linux24.png") no-repeat scroll left center transparent}.android24{background:url("../images/icon-android24.png") no-repeat scroll left center transparent;background-size:24px}.smartphone24{background:url("../images/icon-smartphone24.png") no-repeat scroll left center transparent}.sourcecode24{background:url("../images/icon-sourcecode24.png") no-repeat scroll left center transparent}.windows24,.mac24,.linux24,.android24,.smartphone24,.sourcecode24{display:
block;line-height:32px;padding:0 0 0 33px}.accordionButton{background:url("../images/table-title.jpg") repeat-x left bottom #885ca4;color:#fff;margin:0;font-size:1.1em;font-weight:bold;height:32px;float:left;_float:none;border:1px solid #fff;border-bottom:0;cursor:pointer;-webkit-border-top-left-radius:7px;-webkit-border-top-right-radius:7px;-moz-border-radius-topleft:7px;-moz-border-radius-topright:7px;border-top-left-radius:7px;border-top-right-radius:7px;position:relative;padding-left:30px;width:680px}.accordionButton:hover{background:url("../images/table-title-hover.jpg") repeat-x left bottom #885ca4;text-shadow:1px 1px 0 rgba(17,17,17,1)}.on:before,.off:before{position:absolute;content:'';height:0;width:0;font-size:0;line-height:0}.on:before{top:14px;left:10px;border-left:7px solid transparent;border-right:7px solid transparent;border-top:7px solid #fff}.off:before{top:9px;left:14px;border-bottom:7px solid transparent;border-top:7px solid transparent;border-left:7px solid #fff}
.accordionContent{width:708px;float:left;_float:none;background:#fff;display:block}.accordionContent .fauxhead{width:710px}.package{float:left;height:280px;margin:0;padding:25px 20px 20px 20px;border-top:1px solid #888}.package h2{margin-bottom:3px}.package p{margin-top:16px;padding-left:10px}.downloads{display:block;float:left;width:238px;padding:0 16px 0 0;text-align:center}.lang{float:right;display:none;width:80px;height:20px;margin:0 7px 0 0;padding:0 0 0 3px;background-color:#fefff7;border:2px solid #cccfb8;border-top:0;-webkit-border-bottom-left-radius:5px;-webkit-border-bottom-right-radius:5px;-moz-border-radius-bottomleft:5px;-moz-border-radius-bottomright:5px;border-bottom-left-radius:5px;border-bottom-right-radius:5px}.button{text-align:center;display:block;width:234px;height:69px;text-decoration:none;background:url(../images/button-downloadpage.png) bottom left no-repeat;margin:0 auto 8px auto;text-shadow:1px 1px 0 rgba(17,17,17,1);-webkit-border-radius:7px;-moz-border-ra
dius:7px;border-radius:7px}.button .strong{display:block;padding:10px 0 0 57px}.button .normal{padding:5px 0 0 57px;display:block}.sig{display:block;margin:3px 0 20px 0}.easy{width:712px;margin-bottom:10px;padding-bottom:8px}#download-donate{background-attachment:scroll;background-clip:border-box;background-color:transparent;background-image:url(../images/headerbg.jpg);background-origin:padding-box;background-position:0 0;background-repeat:no-repeat;background-size:100% 100%}.easy .package h2,.easy .package em{display:block;width:100%;text-align:left}.easy .package h2{padding-top:10px;padding-bottom:5px}.easy .package em{font-size:1.2em;padding-top:8px;padding-bottom:4px}.easy .package p{padding-left:0;font-size:15px;text-align:justify}.easy .package p.alt-dl{text-align:left;text-indent:0;padding-left:0;margin-top:32px}.all-dl{display:block;text-align:left;width:100%;font-size:15px}.all-dl a{text-decoration:none;font-weight:bold}.all-dl a:hover{text-decoration:underline}.easy .packa
ge{float:none;padding:0 8px 0 12px}.open{display:block}.lang-alt{line-height:15px;font-size:10px;float:right;margin-right:10px}.expander{text-align:right;float:right;padding:10px 20px 0 0;font-size:15px;display:none}.title{background:url(../images/table-title-arrow.jpg) right top no-repeat;padding:10px 25px 0 10px;height:33px;float:left}.title a:link,.title a:visited{background:url(../images/table-title.jpg) left top no-repeat;height:33px;display:block}.paypal{float:left;width:auto;min-height:159px;max-width:365px}.paypal span{padding-right:20px}.warning-top{width:618px;padding:10px 10px 10px 60px;margin:0 10px 0 10px;display:block;background:url("../images/warning.png") no-repeat scroll 2px 23px #fffeb6;border:1px solid #a6a427;border-bottom:0;-webkit-border-top-left-radius:5px;-webkit-border-top-right-radius:5px;-moz-border-radius-topleft:5px;-moz-border-radius-topright:5px;border-top-left-radius:5px;border-top-right-radius:5px}.warning-top h2{padding-right:15px;padding-left:0;mar
gin-bottom:5px}.warning-top p{padding-left:10px;margin-bottom:0}.warning{float:left;_float:none;padding:25px 25px;margin-top:4px}.warning p{padding-left:10px}.focus{background:#f4f2c7;border:1px solid #ebd4a9;padding:10px 15px}.focus .icon{float:left;width:auto;margin-right:10px}.featured-project{width:313px}input,select{margin:0 3px 10px 0}input.textfield{padding:0 10px;vertical-align:top}.donate-btn{background:left top no-repeat;height:26px;width:92px;text-indent:-9999px;overflow:hidden;border:0;vertical-align:top;margin-top:5px}.donate-btn:hover{background-position:0 -26px;cursor:pointer}.signup{background:#96c35a;border-top:1px solid #6ab334;border-left:1px solid #6ab334;border-bottom:1px solid #5a952b;border-right:1px solid #5a952b;height:31px;padding:0 5px;vertical-align:top;color:#222c14;font-weight:bold;font-size:1em;line-height:1em}.signup:hover{background:#6ab334}select#lang{float:left;width:160px;margin-right:3px}.go{background:#96c35a;border-top:1px solid #6ab334;border-
left:1px solid #6ab334;border-bottom:1px solid #5a952b;border-right:1px solid #5a952b;padding:0 5px;vertical-align:top;color:#222c14;font-weight:bold;font-size:1em;line-height:1em;height:18px}.go:hover{background:#6ab334}#footer{width:1024px;height:200px;border-top:1px solid #ddd;padding:20px 0;margin:20px 0 0}.onion{float:left;width:88px;padding-right:20px;height:100%}#footer .about{width:180px;padding-right:30px;border-right:1px solid #ddd;float:left}#footer .newsletter{padding:0 0 15px 30px;width:auto;margin-left:308px}#footer input.textfield{width:220px;height:26px}#footer input{margin:0}#footer .col{float:left;width:100px;margin-left:20px}#footer .first{margin-left:30px}#footer .wider{width:201px}small{margin:0 auto 0 auto;text-align:center;font-size:10px;font-style:italic}.hlist{text-align:center;display:block;width:100%;padding:0;list-style:none;margin:0 0 18px 0}.hlist li{display:inline-block;border-right:1px solid #444;margin-left:-4px}.hlist li.last{border-right:0 solid #4
44}.hlist a{display:block;top:0;right:0;bottom:0;left:0;text-decoration:none;font-weight:bold;padding:0 8px}.dbox{float:none;text-align:center;color:#222;border:0;padding:1.4em .7em;width:163px;margin:0 0 0 10px}.dbox p{display:block;padding:0;margin:0}.dbox h2{padding:13px 0 15px 0;position:relative;color:black;font-family:Helvetica,Arial,sans-serif;font-size:18px;font-weight:normal;height:35px;margin-bottom:-20px;margin-left:-6px;z-index:-10}.dbox input.donate-btn{background:url(../images/btn_donateCC_LG.gif) left top no-repeat transparent;height:68px;width:186px;margin-top:0;display:block;background-color:transparent;color:transparent;margin:10px auto 10px auto;padding:0}.dbox span{float:left;padding-right:0}.dbox div label{padding:0 10px 0 0}.dbox h6#ppinfo{width:100%;text-align:center;margin:-15px auto 0 auto}.dbox small,.dbox.donate #ppinfo{margin:0 auto 0 auto;text-align:center;font-size:10px;font-style:normal}.dbox.dl{float:none;width:177px;margin:0 5px 20px 5px}.dbox.dl inp
ut.amount{width:87px}.dbox.donate{float:none;padding:30px 30px;width:626px;min-height:0;max-width:none;text-align:left}.dbox.donate input,.dbox.donate select{padding-bottom:0;margin-bottom:0}.dbox.donate .drow{margin:0 0 0 20px}.dbox.donate .drow div{padding:0;width:auto;display:block}.dbox.donate h3{padding-left:0;color:#23300e;margin:0 0 10px 0}.dbox.donate h4{padding-left:20px}.dbox.donate p{padding:5px 20px 15px 40px}.dbox.donate span{float:left;padding-right:0}.dbox.donate div label{padding:0 10px 0 0}.dbox.donate .type{padding-left:20px}.dbox.donate select#t3{width:auto;margin-bottom:0}.dbox.donate ul.amounts{width:auto}.dbox.donate ul.amounts li{display:inline-block}.dbox.donate ul.amounts li label{padding:0 0 0 5px}.dbox.donate input.donate-btn{background:url(../images/btn_donateCC_LG.gif) left top no-repeat transparent;height:26px;width:115px;margin-top:-3px;display:inline-block;background-color:transparent;color:transparent;border:0 solid transparent}.dbox.dsmall{position:
relative;display:inline-block;width:170px;height:140px;text-align:center;margin:0 10px;vertical-align:top}.dbox.dsmall input.donate-btn{background:url() left top no-repeat transparent;width:auto;height:auto;margin-top:0;display:block;background-color:transparent;color:transparent;border:0 solid transparent}.dbox.dsmall div label{padding:0}.dbox.dsmall small{display:block;position:absolute;width:172px;float:none;bottom:20px;margin:0 auto}.givv p{text-align:justify;margin-top:10px;font-size:11px;line-height:13px}dwolla p{text-align:justify;margin-top:10px;font-size:11px;line-height:13px}div.blogRow,div.blogFirstRow{height:40px;padding:3px 10px;margin:0}div.blogLastRow{height:20px;text-align:center}div.blogFirstRow{height:22px;background:url(../images/table-head.jpg) left top repeat-x #885ca4}.blogRow:hover{background:#f6ffd5}div.blogRow1,div.blogRow3{background:#eee8f1}.blogFeed a{text-decoration:none}.blogFeed p{margin:0;font-size:12px}p.blogTitle{font-weight:bold;text-decoration:und
erline}p.blogAuthor{color:#000;text-align:right;margin-top:-20px}p.blogAuthor em{color:#4e6a20;text-align:right;margin-top:-20px}p.blogDate{color:#000}.blogFeed h2{font-size:1.467em;margin:0;line-height:23px;color:#f6f6ed}#projectpage td{width:50%}.projectbox{width:710px;position:relative;margin-bottom:80px}.projectbox .name{font-size:1.5em;font-weight:bold}.projectbox a img{float:none;position:absolute;top:0;left:0}.projectbox .projectdesc{margin-left:100px}.clearfix:after{content:".";display:block;height:0;clear:both;visibility:hidden}.clearfix{display:inline-block}/*\*/* html .clearfix{height:1%}.clearfix{display:block}/**/.joblink{display:block;font-size:128%;font-weight:bold;padding:10px 5px;text-align:right}.joblink a{text-decoration:none}.dropbtn{background-color:white;padding:16px 0 0 0;font-size:100%;border:0;cursor:pointer}.dropdown{position:relative;display:inline-block;padding:0;margin-top:-16px;top:0}.dropdown-content{display:none;position:absolute;background-color:#f9f
9f9;box-shadow:0 8px 16px 0 rgba(0,0,0,0.2);z-index:1;margin:48px 0 0 0}.dropdown-content a{color:black;padding-top:12px 16px;text-decoration:none;display:block}.dropdown:hover .dropdown-content{display:block}
\ No newline at end of file
[View Less]
1
0

[tor/master] Update sample torrc files to warn about not using BridgeRelay and MyFamily together
by nickm@torproject.org 04 Sep '18
by nickm@torproject.org 04 Sep '18
04 Sep '18
commit ce4f73f8a341335832974c200f4a7050aec89c72
Author: rl1987 <rl1987(a)sdf.lonestar.org>
Date: Sun Sep 2 21:11:52 2018 +0300
Update sample torrc files to warn about not using BridgeRelay and MyFamily together
---
src/config/torrc.minimal.in-staging | 4 ++++
src/config/torrc.sample.in | 4 ++++
2 files changed, 8 insertions(+)
diff --git a/src/config/torrc.minimal.in-staging b/src/config/torrc.minimal.in-staging
index 86429f117..cb3adca35 100644
--- a/src/config/torrc.…
[View More]minimal.in-staging
+++ b/src/config/torrc.minimal.in-staging
@@ -167,6 +167,7 @@
##
## If you are running multiple relays, you MUST set this option.
##
+## Note: do not use MyFamily on bridge relays.
#MyFamily $keyid,$keyid,...
## Uncomment this if you want your relay to allow IPv6 exit traffic.
@@ -212,6 +213,9 @@
## won't be able to block all the bridges. Also, websites won't treat you
## differently because they won't know you're running Tor. If you can
## be a real relay, please do; but if not, be a bridge!
+##
+## Warning: when running your Tor as a bridge, make sure than MyFamily is
+## NOT configured.
#BridgeRelay 1
## By default, Tor will advertise your bridge to users through various
## mechanisms like https://bridges.torproject.org/. If you want to run
diff --git a/src/config/torrc.sample.in b/src/config/torrc.sample.in
index 72cca0be3..8d56b0896 100644
--- a/src/config/torrc.sample.in
+++ b/src/config/torrc.sample.in
@@ -169,6 +169,7 @@
##
## If you are running multiple relays, you MUST set this option.
##
+## Note: do not use MyFamily on bridge relays.
#MyFamily $keyid,$keyid,...
## Uncomment this if you do *not* want your relay to allow any exit traffic.
@@ -218,6 +219,9 @@
## won't be able to block all the bridges. Also, websites won't treat you
## differently because they won't know you're running Tor. If you can
## be a real relay, please do; but if not, be a bridge!
+##
+## Warning: when running your Tor as a bridge, make sure than MyFamily is
+## NOT configured.
#BridgeRelay 1
## By default, Tor will advertise your bridge to users through various
## mechanisms like https://bridges.torproject.org/. If you want to run
[View Less]
1
0

[tor/master] In manpage, warn about combination of MyFamily and BridgeRelay being bad
by nickm@torproject.org 04 Sep '18
by nickm@torproject.org 04 Sep '18
04 Sep '18
commit 5db6cf7cbd4761d7bef3b280af473ef5d9d14624
Author: rl1987 <rl1987(a)sdf.lonestar.org>
Date: Sun Sep 2 21:06:34 2018 +0300
In manpage, warn about combination of MyFamily and BridgeRelay being bad
---
doc/tor.1.txt | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/doc/tor.1.txt b/doc/tor.1.txt
index 7b6c21a74..37c97dc3f 100644
--- a/doc/tor.1.txt
+++ b/doc/tor.1.txt
@@ -1803,7 +1803,10 @@ is non-zero):
Sets the relay to act as a "bridge" with …
[View More]respect to relaying connections
from bridge users to the Tor network. It mainly causes Tor to publish a
server descriptor to the bridge database, rather than
- to the public directory authorities.
+ to the public directory authorities. +
+ +
+ Note: make sure that no MyFamily lines are present in your torrc when
+ relay is configured in bridge mode.
[[BridgeDistribution]] **BridgeDistribution** __string__::
If set along with BridgeRelay, Tor will include a new line in its
@@ -2060,7 +2063,10 @@ is non-zero):
nickname: fingerprints are more reliable. +
+
If you run more than one relay, the MyFamily option on each relay
- **must** list all other relays, as described above.
+ **must** list all other relays, as described above. +
+ +
+ Note: do not use MyFamily when configuring your Tor instance as a
+ brigde.
[[Nickname]] **Nickname** __name__::
Set the server's nickname to \'name'. Nicknames must be between 1 and 19
[View Less]
1
0
commit 19f73f633628a093a6d9af4d0dfeeed402afa939
Author: rl1987 <rl1987(a)sdf.lonestar.org>
Date: Sun Sep 2 21:14:03 2018 +0300
Add changes file
---
changes/doc26908 | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/changes/doc26908 b/changes/doc26908
new file mode 100644
index 000000000..888da8be5
--- /dev/null
+++ b/changes/doc26908
@@ -0,0 +1,4 @@
+ o Documentation:
+ - Warn users that they should not include MyFamily
+ line(s) in their torrc when running Tor …
[View More]bridge.
+ Closes ticket 26908.
[View Less]
1
0

04 Sep '18
commit fd994f55c441922d3c5ae19ad5c254a1ae1eccfd
Merge: 1e71e2c10 19f73f633
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Tue Sep 4 11:08:49 2018 -0400
Merge remote-tracking branch 'rl1987/doc26908'
changes/doc26908 | 4 ++++
doc/tor.1.txt | 10 ++++++++--
src/config/torrc.minimal.in-staging | 4 ++++
src/config/torrc.sample.in | 4 ++++
4 files changed, 20 insertions(+), 2 deletions(-)
1
0

04 Sep '18
commit 9b24609af003cb79091e628c179cf617ff41aae7
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Aug 1 09:24:06 2018 -0400
Remove dependency from socketpair.c on address.h
Also refactor some annoying code in tor_ersatz_socketpair.
---
src/lib/net/.may_include | 1 +
src/lib/net/socketpair.c | 151 ++++++++++++++++++++++++++++-------------------
2 files changed, 92 insertions(+), 60 deletions(-)
diff --git a/src/lib/net/.may_include b/src/lib/net/.may_include
…
[View More]index 1458dad99..13b209bbe 100644
--- a/src/lib/net/.may_include
+++ b/src/lib/net/.may_include
@@ -2,6 +2,7 @@ orconfig.h
siphash.h
ht.h
+lib/arch/*.h
lib/cc/*.h
lib/container/*.h
lib/ctime/*.h
diff --git a/src/lib/net/socketpair.c b/src/lib/net/socketpair.c
index 945bdee69..b656938c4 100644
--- a/src/lib/net/socketpair.c
+++ b/src/lib/net/socketpair.c
@@ -4,23 +4,82 @@
#include "lib/net/socketpair.h"
#include "lib/net/socket.h"
-#include "lib/net/address.h"
+#include "lib/arch/bytes.h"
#include <errno.h>
#include <string.h>
+#ifdef HAVE_NETINET_IN_H
+#include <netinet/in.h>
+#endif
+#ifdef _WIN32
+#include <winsock2.h>
+#include <windows.h>
+#endif
+
#ifdef NEED_ERSATZ_SOCKETPAIR
-static inline socklen_t
-SIZEOF_SOCKADDR(int domain)
+// Avoid warning about call to memcmp.
+#define raw_memcmp memcmp
+
+static tor_socket_t
+get_local_listener(int family, int type)
+{
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+ struct sockaddr *sa;
+ int len;
+
+ memset(&sin, 0, sizeof(sin));
+ memset(&sin6, 0, sizeof(sin6));
+
+ tor_socket_t sock = TOR_INVALID_SOCKET;
+ sock = tor_open_socket(family, type, 0);
+ if (!SOCKET_OK(sock)) {
+ return TOR_INVALID_SOCKET;
+ }
+
+ if (family == AF_INET) {
+ sa = (struct sockaddr *) &sin;
+ sin.sin_family = AF_INET;
+ sin.sin_addr.s_addr = tor_htonl(0x7f000001);
+ len = sizeof(sin);
+ } else {
+ sa = (struct sockaddr *) &sin6;
+ sin6.sin6_family = AF_INET;
+ sin6.sin6_addr.s6_addr[15] = 1;
+ len = sizeof(sin6);
+ }
+
+ if (bind(sock, sa, len) == -1)
+ goto err;
+ if (listen(sock, 1) == -1)
+ goto err;
+
+ return sock;
+ err:
+ tor_close_socket(sock);
+ return TOR_INVALID_SOCKET;
+}
+
+static int
+sockaddr_eq(struct sockaddr *sa1, struct sockaddr *sa2)
{
- switch (domain) {
- case AF_INET:
- return sizeof(struct sockaddr_in);
- case AF_INET6:
- return sizeof(struct sockaddr_in6);
- default:
- return 0;
+ if (sa1->sa_family != sa2->sa_family)
+ return 0;
+
+ if (sa1->sa_family == AF_INET6) {
+ struct sockaddr_in6 *sin6_1 = (struct sockaddr_in6 *) sa1;
+ struct sockaddr_in6 *sin6_2 = (struct sockaddr_in6 *) sa2;
+ return sin6_1->sin6_port == sin6_2->sin6_port &&
+ 0==raw_memcmp(sin6_1->sin6_addr.s6_addr, sin6_2->sin6_addr.s6_addr, 16);
+ } else if (sa1->sa_family == AF_INET) {
+ struct sockaddr_in *sin_1 = (struct sockaddr_in *) sa1;
+ struct sockaddr_in *sin_2 = (struct sockaddr_in *) sa2;
+ return sin_1->sin_port == sin_2->sin_port &&
+ sin_1->sin_addr.s_addr == sin_2->sin_addr.s_addr;
+ } else {
+ return 0;
}
}
@@ -39,21 +98,17 @@ tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
tor_socket_t listener = TOR_INVALID_SOCKET;
tor_socket_t connector = TOR_INVALID_SOCKET;
tor_socket_t acceptor = TOR_INVALID_SOCKET;
- tor_addr_t listen_tor_addr;
- struct sockaddr_storage connect_addr_ss, listen_addr_ss;
- struct sockaddr *listen_addr = (struct sockaddr *) &listen_addr_ss;
- uint16_t listen_port = 0;
- tor_addr_t connect_tor_addr;
- uint16_t connect_port = 0;
+ struct sockaddr_storage accepted_addr_ss;
+ struct sockaddr_storage connect_addr_ss;
struct sockaddr *connect_addr = (struct sockaddr *) &connect_addr_ss;
+ struct sockaddr *accepted_addr = (struct sockaddr *) &accepted_addr_ss;
socklen_t size;
int saved_errno = -1;
int ersatz_domain = AF_INET;
+ socklen_t addrlen = sizeof(struct sockaddr_in);
- memset(&connect_tor_addr, 0, sizeof(connect_tor_addr));
+ memset(&accepted_addr_ss, 0, sizeof(accepted_addr_ss));
memset(&connect_addr_ss, 0, sizeof(connect_addr_ss));
- memset(&listen_tor_addr, 0, sizeof(listen_tor_addr));
- memset(&listen_addr_ss, 0, sizeof(listen_addr_ss));
if (protocol
#ifdef AF_UNIX
@@ -70,42 +125,24 @@ tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
return -EINVAL;
}
- listener = tor_open_socket(ersatz_domain, type, 0);
+ listener = get_local_listener(ersatz_domain, type);
if (!SOCKET_OK(listener)) {
int first_errno = tor_socket_errno(-1);
- if (first_errno == SOCK_ERRNO(EPROTONOSUPPORT)
- && ersatz_domain == AF_INET) {
+ if (first_errno == SOCK_ERRNO(EPROTONOSUPPORT)) {
/* Assume we're on an IPv6-only system */
ersatz_domain = AF_INET6;
- listener = tor_open_socket(ersatz_domain, type, 0);
- if (!SOCKET_OK(listener)) {
- /* Keep the previous behaviour, which was to return the IPv4 error.
- * (This may be less informative on IPv6-only systems.)
- * XX/teor - is there a better way to decide which errno to return?
- * (I doubt we care much either way, once there is an error.)
- */
- return -first_errno;
- }
+ addrlen = sizeof(struct sockaddr_in6);
+ listener = get_local_listener(ersatz_domain, type);
+ }
+ if (!SOCKET_OK(listener)) {
+ /* Keep the previous behaviour, which was to return the IPv4 error.
+ * (This may be less informative on IPv6-only systems.)
+ * XX/teor - is there a better way to decide which errno to return?
+ * (I doubt we care much either way, once there is an error.)
+ */
+ return -first_errno;
}
}
- /* If there is no 127.0.0.1 or ::1, this will and must fail. Otherwise, we
- * risk exposing a socketpair on a routable IP address. (Some BSD jails
- * use a routable address for localhost. Fortunately, they have the real
- * AF_UNIX socketpair.) */
- if (ersatz_domain == AF_INET) {
- tor_addr_from_ipv4h(&listen_tor_addr, INADDR_LOOPBACK);
- } else {
- tor_addr_parse(&listen_tor_addr, "[::1]");
- }
- tor_assert(tor_addr_is_loopback(&listen_tor_addr));
- size = tor_addr_to_sockaddr(&listen_tor_addr,
- 0 /* kernel chooses port. */,
- listen_addr,
- sizeof(listen_addr_ss));
- if (bind(listener, listen_addr, size) == -1)
- goto tidy_up_and_fail;
- if (listen(listener, 1) == -1)
- goto tidy_up_and_fail;
connector = tor_open_socket(ersatz_domain, type, 0);
if (!SOCKET_OK(connector))
@@ -114,33 +151,27 @@ tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
size = sizeof(connect_addr_ss);
if (getsockname(listener, connect_addr, &size) == -1)
goto tidy_up_and_fail;
- if (size != SIZEOF_SOCKADDR (connect_addr->sa_family))
+ if (size != addrlen)
goto abort_tidy_up_and_fail;
if (connect(connector, connect_addr, size) == -1)
goto tidy_up_and_fail;
- size = sizeof(listen_addr_ss);
- acceptor = tor_accept_socket(listener, listen_addr, &size);
+ size = sizeof(accepted_addr_ss);
+ acceptor = tor_accept_socket(listener, accepted_addr, &size);
if (!SOCKET_OK(acceptor))
goto tidy_up_and_fail;
- if (size != SIZEOF_SOCKADDR(listen_addr->sa_family))
+ if (size != addrlen)
goto abort_tidy_up_and_fail;
/* Now check we are talking to ourself by matching port and host on the
two sockets. */
if (getsockname(connector, connect_addr, &size) == -1)
goto tidy_up_and_fail;
/* Set *_tor_addr and *_port to the address and port that was used */
- tor_addr_from_sockaddr(&listen_tor_addr, listen_addr, &listen_port);
- tor_addr_from_sockaddr(&connect_tor_addr, connect_addr, &connect_port);
- if (size != SIZEOF_SOCKADDR (connect_addr->sa_family)
- || tor_addr_compare(&listen_tor_addr, &connect_tor_addr, CMP_SEMANTIC)
- || listen_port != connect_port) {
+ if (!sockaddr_eq(accepted_addr, connect_addr))
goto abort_tidy_up_and_fail;
- }
tor_close_socket(listener);
fd[0] = connector;
fd[1] = acceptor;
-
return 0;
abort_tidy_up_and_fail:
[View Less]
1
0

04 Sep '18
commit 2884639ad63583d2a5a3dd14185c77212e566b5f
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Aug 1 08:47:27 2018 -0400
Extract tor_ersatz_socketpair into a new c file
I'm doing this because I want to make it a lower-level function
again, so that we can use it without linking in the rest of the
universe.
---
src/lib/net/include.am | 4 +-
src/lib/net/socket.c | 155 +-------------------------------------------
src/lib/net/socket.h | 8 ---
…
[View More] src/lib/net/socketpair.c | 164 +++++++++++++++++++++++++++++++++++++++++++++++
src/lib/net/socketpair.h | 19 ++++++
src/test/test_util.c | 1 +
6 files changed, 188 insertions(+), 163 deletions(-)
diff --git a/src/lib/net/include.am b/src/lib/net/include.am
index 67db0d5af..ff0967e78 100644
--- a/src/lib/net/include.am
+++ b/src/lib/net/include.am
@@ -12,7 +12,8 @@ src_lib_libtor_net_a_SOURCES = \
src/lib/net/gethostname.c \
src/lib/net/inaddr.c \
src/lib/net/resolve.c \
- src/lib/net/socket.c
+ src/lib/net/socket.c \
+ src/lib/net/socketpair.c
src_lib_libtor_net_testing_a_SOURCES = \
$(src_lib_libtor_net_a_SOURCES)
@@ -29,4 +30,5 @@ noinst_HEADERS += \
src/lib/net/nettypes.h \
src/lib/net/resolve.h \
src/lib/net/socket.h \
+ src/lib/net/socketpair.h \
src/lib/net/socks5_status.h
diff --git a/src/lib/net/socket.c b/src/lib/net/socket.c
index 5847bb873..5487b8d9d 100644
--- a/src/lib/net/socket.c
+++ b/src/lib/net/socket.c
@@ -11,6 +11,7 @@
#define SOCKET_PRIVATE
#include "lib/net/socket.h"
+#include "lib/net/socketpair.h"
#include "lib/net/address.h"
#include "lib/cc/compat_compiler.h"
#include "lib/err/torerr.h"
@@ -476,160 +477,6 @@ tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
#endif /* defined(HAVE_SOCKETPAIR) && !defined(_WIN32) */
}
-#ifdef NEED_ERSATZ_SOCKETPAIR
-
-static inline socklen_t
-SIZEOF_SOCKADDR(int domain)
-{
- switch (domain) {
- case AF_INET:
- return sizeof(struct sockaddr_in);
- case AF_INET6:
- return sizeof(struct sockaddr_in6);
- default:
- return 0;
- }
-}
-
-/**
- * Helper used to implement socketpair on systems that lack it, by
- * making a direct connection to localhost.
- */
-STATIC int
-tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
-{
- /* This socketpair does not work when localhost is down. So
- * it's really not the same thing at all. But it's close enough
- * for now, and really, when localhost is down sometimes, we
- * have other problems too.
- */
- tor_socket_t listener = TOR_INVALID_SOCKET;
- tor_socket_t connector = TOR_INVALID_SOCKET;
- tor_socket_t acceptor = TOR_INVALID_SOCKET;
- tor_addr_t listen_tor_addr;
- struct sockaddr_storage connect_addr_ss, listen_addr_ss;
- struct sockaddr *listen_addr = (struct sockaddr *) &listen_addr_ss;
- uint16_t listen_port = 0;
- tor_addr_t connect_tor_addr;
- uint16_t connect_port = 0;
- struct sockaddr *connect_addr = (struct sockaddr *) &connect_addr_ss;
- socklen_t size;
- int saved_errno = -1;
- int ersatz_domain = AF_INET;
-
- memset(&connect_tor_addr, 0, sizeof(connect_tor_addr));
- memset(&connect_addr_ss, 0, sizeof(connect_addr_ss));
- memset(&listen_tor_addr, 0, sizeof(listen_tor_addr));
- memset(&listen_addr_ss, 0, sizeof(listen_addr_ss));
-
- if (protocol
-#ifdef AF_UNIX
- || family != AF_UNIX
-#endif
- ) {
-#ifdef _WIN32
- return -WSAEAFNOSUPPORT;
-#else
- return -EAFNOSUPPORT;
-#endif
- }
- if (!fd) {
- return -EINVAL;
- }
-
- listener = tor_open_socket(ersatz_domain, type, 0);
- if (!SOCKET_OK(listener)) {
- int first_errno = tor_socket_errno(-1);
- if (first_errno == SOCK_ERRNO(EPROTONOSUPPORT)
- && ersatz_domain == AF_INET) {
- /* Assume we're on an IPv6-only system */
- ersatz_domain = AF_INET6;
- listener = tor_open_socket(ersatz_domain, type, 0);
- if (!SOCKET_OK(listener)) {
- /* Keep the previous behaviour, which was to return the IPv4 error.
- * (This may be less informative on IPv6-only systems.)
- * XX/teor - is there a better way to decide which errno to return?
- * (I doubt we care much either way, once there is an error.)
- */
- return -first_errno;
- }
- }
- }
- /* If there is no 127.0.0.1 or ::1, this will and must fail. Otherwise, we
- * risk exposing a socketpair on a routable IP address. (Some BSD jails
- * use a routable address for localhost. Fortunately, they have the real
- * AF_UNIX socketpair.) */
- if (ersatz_domain == AF_INET) {
- tor_addr_from_ipv4h(&listen_tor_addr, INADDR_LOOPBACK);
- } else {
- tor_addr_parse(&listen_tor_addr, "[::1]");
- }
- tor_assert(tor_addr_is_loopback(&listen_tor_addr));
- size = tor_addr_to_sockaddr(&listen_tor_addr,
- 0 /* kernel chooses port. */,
- listen_addr,
- sizeof(listen_addr_ss));
- if (bind(listener, listen_addr, size) == -1)
- goto tidy_up_and_fail;
- if (listen(listener, 1) == -1)
- goto tidy_up_and_fail;
-
- connector = tor_open_socket(ersatz_domain, type, 0);
- if (!SOCKET_OK(connector))
- goto tidy_up_and_fail;
- /* We want to find out the port number to connect to. */
- size = sizeof(connect_addr_ss);
- if (getsockname(listener, connect_addr, &size) == -1)
- goto tidy_up_and_fail;
- if (size != SIZEOF_SOCKADDR (connect_addr->sa_family))
- goto abort_tidy_up_and_fail;
- if (connect(connector, connect_addr, size) == -1)
- goto tidy_up_and_fail;
-
- size = sizeof(listen_addr_ss);
- acceptor = tor_accept_socket(listener, listen_addr, &size);
- if (!SOCKET_OK(acceptor))
- goto tidy_up_and_fail;
- if (size != SIZEOF_SOCKADDR(listen_addr->sa_family))
- goto abort_tidy_up_and_fail;
- /* Now check we are talking to ourself by matching port and host on the
- two sockets. */
- if (getsockname(connector, connect_addr, &size) == -1)
- goto tidy_up_and_fail;
- /* Set *_tor_addr and *_port to the address and port that was used */
- tor_addr_from_sockaddr(&listen_tor_addr, listen_addr, &listen_port);
- tor_addr_from_sockaddr(&connect_tor_addr, connect_addr, &connect_port);
- if (size != SIZEOF_SOCKADDR (connect_addr->sa_family)
- || tor_addr_compare(&listen_tor_addr, &connect_tor_addr, CMP_SEMANTIC)
- || listen_port != connect_port) {
- goto abort_tidy_up_and_fail;
- }
- tor_close_socket(listener);
- fd[0] = connector;
- fd[1] = acceptor;
-
- return 0;
-
- abort_tidy_up_and_fail:
-#ifdef _WIN32
- saved_errno = WSAECONNABORTED;
-#else
- saved_errno = ECONNABORTED; /* I hope this is portable and appropriate. */
-#endif
- tidy_up_and_fail:
- if (saved_errno < 0)
- saved_errno = errno;
- if (SOCKET_OK(listener))
- tor_close_socket(listener);
- if (SOCKET_OK(connector))
- tor_close_socket(connector);
- if (SOCKET_OK(acceptor))
- tor_close_socket(acceptor);
- return -saved_errno;
-}
-
-#endif /* defined(NEED_ERSATZ_SOCKETPAIR) */
-
/** Mockable wrapper for getsockname(). */
MOCK_IMPL(int,
tor_getsockname,(tor_socket_t sock, struct sockaddr *address,
diff --git a/src/lib/net/socket.h b/src/lib/net/socket.h
index e2092c727..5b7d6dbbc 100644
--- a/src/lib/net/socket.h
+++ b/src/lib/net/socket.h
@@ -110,14 +110,6 @@ const char *tor_socket_strerror(int e);
#define tor_socket_strerror(e) strerror(e)
#endif /* defined(_WIN32) */
-#ifdef SOCKET_PRIVATE
-#if !defined(HAVE_SOCKETPAIR) || defined(_WIN32) || defined(TOR_UNIT_TESTS)
-#define NEED_ERSATZ_SOCKETPAIR
-STATIC int tor_ersatz_socketpair(int family, int type, int protocol,
- tor_socket_t fd[2]);
-#endif
-#endif /* defined(COMPAT_PRIVATE) */
-
#if defined(_WIN32) && !defined(SIO_IDEAL_SEND_BACKLOG_QUERY)
#define SIO_IDEAL_SEND_BACKLOG_QUERY 0x4004747b
#endif
diff --git a/src/lib/net/socketpair.c b/src/lib/net/socketpair.c
new file mode 100644
index 000000000..945bdee69
--- /dev/null
+++ b/src/lib/net/socketpair.c
@@ -0,0 +1,164 @@
+/* Copyright (c) 2003-2004, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2018, The Tor Project, Inc. */
+
+#include "lib/net/socketpair.h"
+#include "lib/net/socket.h"
+#include "lib/net/address.h"
+
+#include <errno.h>
+#include <string.h>
+
+#ifdef NEED_ERSATZ_SOCKETPAIR
+
+static inline socklen_t
+SIZEOF_SOCKADDR(int domain)
+{
+ switch (domain) {
+ case AF_INET:
+ return sizeof(struct sockaddr_in);
+ case AF_INET6:
+ return sizeof(struct sockaddr_in6);
+ default:
+ return 0;
+ }
+}
+
+/**
+ * Helper used to implement socketpair on systems that lack it, by
+ * making a direct connection to localhost.
+ */
+STATIC int
+tor_ersatz_socketpair(int family, int type, int protocol, tor_socket_t fd[2])
+{
+ /* This socketpair does not work when localhost is down. So
+ * it's really not the same thing at all. But it's close enough
+ * for now, and really, when localhost is down sometimes, we
+ * have other problems too.
+ */
+ tor_socket_t listener = TOR_INVALID_SOCKET;
+ tor_socket_t connector = TOR_INVALID_SOCKET;
+ tor_socket_t acceptor = TOR_INVALID_SOCKET;
+ tor_addr_t listen_tor_addr;
+ struct sockaddr_storage connect_addr_ss, listen_addr_ss;
+ struct sockaddr *listen_addr = (struct sockaddr *) &listen_addr_ss;
+ uint16_t listen_port = 0;
+ tor_addr_t connect_tor_addr;
+ uint16_t connect_port = 0;
+ struct sockaddr *connect_addr = (struct sockaddr *) &connect_addr_ss;
+ socklen_t size;
+ int saved_errno = -1;
+ int ersatz_domain = AF_INET;
+
+ memset(&connect_tor_addr, 0, sizeof(connect_tor_addr));
+ memset(&connect_addr_ss, 0, sizeof(connect_addr_ss));
+ memset(&listen_tor_addr, 0, sizeof(listen_tor_addr));
+ memset(&listen_addr_ss, 0, sizeof(listen_addr_ss));
+
+ if (protocol
+#ifdef AF_UNIX
+ || family != AF_UNIX
+#endif
+ ) {
+#ifdef _WIN32
+ return -WSAEAFNOSUPPORT;
+#else
+ return -EAFNOSUPPORT;
+#endif
+ }
+ if (!fd) {
+ return -EINVAL;
+ }
+
+ listener = tor_open_socket(ersatz_domain, type, 0);
+ if (!SOCKET_OK(listener)) {
+ int first_errno = tor_socket_errno(-1);
+ if (first_errno == SOCK_ERRNO(EPROTONOSUPPORT)
+ && ersatz_domain == AF_INET) {
+ /* Assume we're on an IPv6-only system */
+ ersatz_domain = AF_INET6;
+ listener = tor_open_socket(ersatz_domain, type, 0);
+ if (!SOCKET_OK(listener)) {
+ /* Keep the previous behaviour, which was to return the IPv4 error.
+ * (This may be less informative on IPv6-only systems.)
+ * XX/teor - is there a better way to decide which errno to return?
+ * (I doubt we care much either way, once there is an error.)
+ */
+ return -first_errno;
+ }
+ }
+ }
+ /* If there is no 127.0.0.1 or ::1, this will and must fail. Otherwise, we
+ * risk exposing a socketpair on a routable IP address. (Some BSD jails
+ * use a routable address for localhost. Fortunately, they have the real
+ * AF_UNIX socketpair.) */
+ if (ersatz_domain == AF_INET) {
+ tor_addr_from_ipv4h(&listen_tor_addr, INADDR_LOOPBACK);
+ } else {
+ tor_addr_parse(&listen_tor_addr, "[::1]");
+ }
+ tor_assert(tor_addr_is_loopback(&listen_tor_addr));
+ size = tor_addr_to_sockaddr(&listen_tor_addr,
+ 0 /* kernel chooses port. */,
+ listen_addr,
+ sizeof(listen_addr_ss));
+ if (bind(listener, listen_addr, size) == -1)
+ goto tidy_up_and_fail;
+ if (listen(listener, 1) == -1)
+ goto tidy_up_and_fail;
+
+ connector = tor_open_socket(ersatz_domain, type, 0);
+ if (!SOCKET_OK(connector))
+ goto tidy_up_and_fail;
+ /* We want to find out the port number to connect to. */
+ size = sizeof(connect_addr_ss);
+ if (getsockname(listener, connect_addr, &size) == -1)
+ goto tidy_up_and_fail;
+ if (size != SIZEOF_SOCKADDR (connect_addr->sa_family))
+ goto abort_tidy_up_and_fail;
+ if (connect(connector, connect_addr, size) == -1)
+ goto tidy_up_and_fail;
+
+ size = sizeof(listen_addr_ss);
+ acceptor = tor_accept_socket(listener, listen_addr, &size);
+ if (!SOCKET_OK(acceptor))
+ goto tidy_up_and_fail;
+ if (size != SIZEOF_SOCKADDR(listen_addr->sa_family))
+ goto abort_tidy_up_and_fail;
+ /* Now check we are talking to ourself by matching port and host on the
+ two sockets. */
+ if (getsockname(connector, connect_addr, &size) == -1)
+ goto tidy_up_and_fail;
+ /* Set *_tor_addr and *_port to the address and port that was used */
+ tor_addr_from_sockaddr(&listen_tor_addr, listen_addr, &listen_port);
+ tor_addr_from_sockaddr(&connect_tor_addr, connect_addr, &connect_port);
+ if (size != SIZEOF_SOCKADDR (connect_addr->sa_family)
+ || tor_addr_compare(&listen_tor_addr, &connect_tor_addr, CMP_SEMANTIC)
+ || listen_port != connect_port) {
+ goto abort_tidy_up_and_fail;
+ }
+ tor_close_socket(listener);
+ fd[0] = connector;
+ fd[1] = acceptor;
+
+ return 0;
+
+ abort_tidy_up_and_fail:
+#ifdef _WIN32
+ saved_errno = WSAECONNABORTED;
+#else
+ saved_errno = ECONNABORTED; /* I hope this is portable and appropriate. */
+#endif
+ tidy_up_and_fail:
+ if (saved_errno < 0)
+ saved_errno = errno;
+ if (SOCKET_OK(listener))
+ tor_close_socket(listener);
+ if (SOCKET_OK(connector))
+ tor_close_socket(connector);
+ if (SOCKET_OK(acceptor))
+ tor_close_socket(acceptor);
+ return -saved_errno;
+}
+
+#endif /* defined(NEED_ERSATZ_SOCKETPAIR) */
diff --git a/src/lib/net/socketpair.h b/src/lib/net/socketpair.h
new file mode 100644
index 000000000..3efa65a67
--- /dev/null
+++ b/src/lib/net/socketpair.h
@@ -0,0 +1,19 @@
+/* Copyright (c) 2003-2004, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2018, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_SOCKETPAIR_H
+#define TOR_SOCKETPAIR_H
+
+#include "orconfig.h"
+#include "lib/testsupport/testsupport.h"
+#include "lib/net/nettypes.h"
+
+#if !defined(HAVE_SOCKETPAIR) || defined(_WIN32) || defined(TOR_UNIT_TESTS)
+#define NEED_ERSATZ_SOCKETPAIR
+STATIC int tor_ersatz_socketpair(int family, int type, int protocol,
+ tor_socket_t fd[2]);
+#endif
+
+#endif
diff --git a/src/test/test_util.c b/src/test/test_util.c
index 99fee4c5a..7afe83c69 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -38,6 +38,7 @@
#include "lib/meminfo/meminfo.h"
#include "lib/time/tvdiff.h"
#include "lib/encoding/confline.h"
+#include "lib/net/socketpair.h"
#ifdef HAVE_PWD_H
#include <pwd.h>
[View Less]
1
0