tbb-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
March 2015
- 4 participants
- 98 discussions

27 Mar '15
commit 123c74449aac2419d5968fd0c736996ee946c628
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Thu Mar 26 23:58:36 2015 -0700
4.5a5 changelog fixes.
---
Bundle-Data/Docs/ChangeLog.txt | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/Bundle-Data/Docs/ChangeLog.txt b/Bundle-Data/Docs/ChangeLog.txt
index ffea36a..40833da 100644
--- a/Bundle-Data/Docs/ChangeLog.txt
+++ b/Bundle-Data/Docs/ChangeLog.txt
@@ -25,11 +25,10 @@ Tor Browser 4.5a5 -- Mar 31 2015
* Bug 14937: Show meek and flashproxy bridges in tor circuit display
* Bugs 13891+15207: Fix exceptions/errors in circuit display with bridges
* Bug 13019: Change locale hiding pref to boolean
- * Bug 7255: Warn users about maximizing windows (off by default)
+ * Bug 7255: Warn users about maximizing windows
* Pluggable Transport Dependency Updates:
* Bug 15448: Use golang 1.4.2 for meek and obs4proxy
* Bug 15265: Switch go.net repo to golang.org/x/net
- * Bug 12535: Use a SOCKS5 listener instead of a SOCKS4a for goptlib
* Bug 14937: Hard-code meek and flashproxy node fingerprints
* Bug 13019: Prevent Javascript from leaking system locale
* Bug 10280: Improved fix to prevent loading plugins into address space
1
0

[tor-browser-bundle/master] Bug 15482: Don't surprise users with new circuits while a page is in use
by mikeperry@torproject.org 27 Mar '15
by mikeperry@torproject.org 27 Mar '15
27 Mar '15
commit f73953b08c7df47dc47a9c9d4aa16e794a156acf
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Thu Mar 26 23:05:23 2015 -0700
Bug 15482: Don't surprise users with new circuits while a page is in use
This patch resets timestamp_dirty every time a new stream is attached to a
circuit.
---
gitian/descriptors/linux/gitian-tor.yml | 3 +++
gitian/descriptors/mac/gitian-tor.yml | 3 +++
gitian/descriptors/windows/gitian-tor.yml | 3 +++
gitian/patches/bug15482.patch | 32 +++++++++++++++++++++++++++++
4 files changed, 41 insertions(+)
diff --git a/gitian/descriptors/linux/gitian-tor.yml b/gitian/descriptors/linux/gitian-tor.yml
index 7338f2d..b218486 100644
--- a/gitian/descriptors/linux/gitian-tor.yml
+++ b/gitian/descriptors/linux/gitian-tor.yml
@@ -21,6 +21,7 @@ files:
- "versions"
- "bug8402-master.patch"
- "bug8405.patch"
+- "bug15482.patch"
- "dzip.sh"
- "openssl-linux32-utils.zip"
- "openssl-linux64-utils.zip"
@@ -80,6 +81,8 @@ script: |
then
git am ~/build/bug8405.patch
git am ~/build/bug8402-master.patch
+ else
+ git am ~/build/bug15482.patch
fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
diff --git a/gitian/descriptors/mac/gitian-tor.yml b/gitian/descriptors/mac/gitian-tor.yml
index 08408f8..3d0e0c6 100644
--- a/gitian/descriptors/mac/gitian-tor.yml
+++ b/gitian/descriptors/mac/gitian-tor.yml
@@ -17,6 +17,7 @@ files:
- "versions"
- "bug8402-master.patch"
- "bug8405.patch"
+- "bug15482.patch"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
- "dzip.sh"
@@ -58,6 +59,8 @@ script: |
then
git am ~/build/bug8405.patch
git am ~/build/bug8402-master.patch
+ else
+ git am ~/build/bug15482.patch
fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
diff --git a/gitian/descriptors/windows/gitian-tor.yml b/gitian/descriptors/windows/gitian-tor.yml
index 7db511b..87e1dc2 100644
--- a/gitian/descriptors/windows/gitian-tor.yml
+++ b/gitian/descriptors/windows/gitian-tor.yml
@@ -17,6 +17,7 @@ files:
- "versions"
- "bug8402-master.patch"
- "bug8405.patch"
+- "bug15482.patch"
- "binutils.tar.bz2"
- "dzip.sh"
- "mingw-w64-win32-utils.zip"
@@ -58,6 +59,8 @@ script: |
then
git am ~/build/bug8405.patch
git am ~/build/bug8402-master.patch
+ else
+ git am ~/build/bug15482.patch
fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
diff --git a/gitian/patches/bug15482.patch b/gitian/patches/bug15482.patch
new file mode 100644
index 0000000..5250fe4
--- /dev/null
+++ b/gitian/patches/bug15482.patch
@@ -0,0 +1,32 @@
+From a9c7e6dc3508e78f4b296e38603dd34174e2a14c Mon Sep 17 00:00:00 2001
+From: Mike Perry <mikeperry-git(a)torproject.org>
+Date: Thu, 26 Mar 2015 22:38:45 -0700
+Subject: [PATCH] Bug 15482: Don't abandon circuits that are still being used
+ by TBB.
+
+Reset timestamp_dirty every time we get a new stream request so that circuits
+are not abandoned while still in use.
+---
+ src/or/circuituse.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/src/or/circuituse.c b/src/or/circuituse.c
+index d0d31ad..fff46cd 100644
+--- a/src/or/circuituse.c
++++ b/src/or/circuituse.c
+@@ -2264,8 +2264,10 @@ connection_ap_handshake_attach_chosen_circuit(entry_connection_t *conn,
+
+ base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
+
+- if (!circ->base_.timestamp_dirty)
+- circ->base_.timestamp_dirty = time(NULL);
++ /* For Tor Browser, we want to avoid surprising the user by giving up on
++ * circuits while they are still being used, so we always reset the
++ * dirtiness timestamp. */
++ circ->base_.timestamp_dirty = time(NULL);
+
+ pathbias_count_use_attempt(circ);
+
+--
+1.9.1
+
1
0

[tor-browser-bundle/master] Revert "Bug 13766: Raise MaxCircuitDirtiness to 2 hours"
by mikeperry@torproject.org 27 Mar '15
by mikeperry@torproject.org 27 Mar '15
27 Mar '15
commit a6b594ee52905336419e8148a77f96cde6488c42
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Thu Mar 26 23:09:54 2015 -0700
Revert "Bug 13766: Raise MaxCircuitDirtiness to 2 hours"
This reverts commit 824116042a03683ae20fa6e7d0768d8fd6fd6f95.
---
Bundle-Data/linux/Data/Tor/torrc-defaults | 1 -
Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults | 1 -
Bundle-Data/windows/Data/Tor/torrc-defaults | 1 -
3 files changed, 3 deletions(-)
diff --git a/Bundle-Data/linux/Data/Tor/torrc-defaults b/Bundle-Data/linux/Data/Tor/torrc-defaults
index e502356..819b9e8 100644
--- a/Bundle-Data/linux/Data/Tor/torrc-defaults
+++ b/Bundle-Data/linux/Data/Tor/torrc-defaults
@@ -8,4 +8,3 @@ Log notice stdout
SocksPort 9150
ControlPort 9151
CookieAuthentication 1
-MaxCircuitDirtiness 7199
diff --git a/Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults b/Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults
index e502356..819b9e8 100644
--- a/Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults
+++ b/Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults
@@ -8,4 +8,3 @@ Log notice stdout
SocksPort 9150
ControlPort 9151
CookieAuthentication 1
-MaxCircuitDirtiness 7199
diff --git a/Bundle-Data/windows/Data/Tor/torrc-defaults b/Bundle-Data/windows/Data/Tor/torrc-defaults
index e502356..819b9e8 100644
--- a/Bundle-Data/windows/Data/Tor/torrc-defaults
+++ b/Bundle-Data/windows/Data/Tor/torrc-defaults
@@ -8,4 +8,3 @@ Log notice stdout
SocksPort 9150
ControlPort 9151
CookieAuthentication 1
-MaxCircuitDirtiness 7199
1
0

[tor-browser-bundle/master] Revert "Use a SOCKS5 listener instead of a SOCKS4a for goptlib."
by mikeperry@torproject.org 27 Mar '15
by mikeperry@torproject.org 27 Mar '15
27 Mar '15
commit b45bf02c7559eecebf0924e507a4b2137e7042e6
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Thu Mar 26 23:29:39 2015 -0700
Revert "Use a SOCKS5 listener instead of a SOCKS4a for goptlib."
This reverts commit 9d26e0009fc6a8e89a48db2a976097459f14f45e, which broke the
build.
---
.../linux/gitian-pluggable-transports.yml | 6 -
.../mac/gitian-pluggable-transports.yml | 6 -
.../windows/gitian-pluggable-transports.yml | 6 -
gitian/patches/bug12535.patch | 1032 --------------------
4 files changed, 1050 deletions(-)
diff --git a/gitian/descriptors/linux/gitian-pluggable-transports.yml b/gitian/descriptors/linux/gitian-pluggable-transports.yml
index 6adf16c..1ae9c0c 100644
--- a/gitian/descriptors/linux/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/linux/gitian-pluggable-transports.yml
@@ -57,7 +57,6 @@ files:
- "openssl-linux32-utils.zip"
- "openssl-linux64-utils.zip"
- "go.net.tar.bz2"
-- "bug12535.patch"
script: |
INSTDIR="$HOME/install"
PTDIR="$INSTDIR/Tor/PluggableTransports"
@@ -209,11 +208,6 @@ script: |
# Building goptlib
cd goptlib
- git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- git am ~/build/bug12535.patch
find -type f | xargs touch --date="$REFERENCE_DATETIME"
mkdir -p "$GOPATH/src/git.torproject.org/pluggable-transports"
ln -sf "$PWD" "$GOPATH/src/git.torproject.org/pluggable-transports/goptlib.git"
diff --git a/gitian/descriptors/mac/gitian-pluggable-transports.yml b/gitian/descriptors/mac/gitian-pluggable-transports.yml
index d72ab44..e2693e1 100644
--- a/gitian/descriptors/mac/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/mac/gitian-pluggable-transports.yml
@@ -53,7 +53,6 @@ files:
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
- "dzip.sh"
- "go.net.tar.bz2"
-- "bug12535.patch"
- "gmp-mac64-utils.zip"
- "openssl-mac64-utils.zip"
script: |
@@ -235,11 +234,6 @@ script: |
# Building goptlib
cd goptlib
- git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- git am ~/build/bug12535.patch
find -type f | xargs touch --date="$REFERENCE_DATETIME"
mkdir -p "$GOPATH/src/git.torproject.org/pluggable-transports"
ln -sf "$PWD" "$GOPATH/src/git.torproject.org/pluggable-transports/goptlib.git"
diff --git a/gitian/descriptors/windows/gitian-pluggable-transports.yml b/gitian/descriptors/windows/gitian-pluggable-transports.yml
index 0b0b5db..0f5ec84 100644
--- a/gitian/descriptors/windows/gitian-pluggable-transports.yml
+++ b/gitian/descriptors/windows/gitian-pluggable-transports.yml
@@ -60,7 +60,6 @@ files:
- "gmp-win32-utils.zip"
- "gcclibs-win32-utils.zip"
- "go.net.tar.bz2"
-- "bug12535.patch"
script: |
# Set the timestamp on every .pyc file in a zip file, and re-dzip the zip file.
function py2exe_zip_timestomp {
@@ -311,11 +310,6 @@ script: |
# Building goptlib
cd goptlib
- git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- git am ~/build/bug12535.patch
find -type f | xargs touch --date="$REFERENCE_DATETIME"
mkdir -p "$GOPATH/src/git.torproject.org/pluggable-transports"
ln -sf "$PWD" "$GOPATH/src/git.torproject.org/pluggable-transports/goptlib.git"
diff --git a/gitian/patches/bug12535.patch b/gitian/patches/bug12535.patch
deleted file mode 100644
index dae6818..0000000
--- a/gitian/patches/bug12535.patch
+++ /dev/null
@@ -1,1032 +0,0 @@
-From 743ae58b6c33dda837ffb1267867f564597dd59d Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Mon, 8 Sep 2014 18:24:08 +0000
-Subject: [PATCH] Replace the SOCKS4a listener with a SOCKS5 listener.
-
-The change is designed to be transparent to calling code and implements
-enough of RFC1928/RFC1929 such that pluggable transports can be written.
-
-Notable incompatibilities/limitations:
- * GSSAPI authentication is not supported.
- * BND.ADDR/BND.PORT in responses is always "0.0.0.0:0" instead of the
- bound address/port of the outgoing socket.
- * RFC1929 Username/Password authentication is setup exclusively for
- pluggable transport arguments.
- * The BIND and UDP ASSOCIATE commands are not supported.
----
- pt.go | 5 +-
- socks.go | 386 +++++++++++++++++++++++++++++++++++++-------
- socks_test.go | 510 +++++++++++++++++++++++++++++++++++++++++-----------------
- 3 files changed, 685 insertions(+), 216 deletions(-)
-
-diff --git a/pt.go b/pt.go
-index 62dfc38..47f8273 100644
---- a/pt.go
-+++ b/pt.go
-@@ -119,10 +119,11 @@
- // Extended ORPort Authentication:
- // https://gitweb.torproject.org/torspec.git/blob/HEAD:/proposals/217-ext-orpo….
- //
--// The package implements a SOCKS4a server sufficient for a Tor client transport
-+// The package implements a SOCKS5 server sufficient for a Tor client transport
- // plugin.
- //
--// http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol
-+// https://www.ietf.org/rfc/rfc1928.txt
-+// https://www.ietf.org/rfc/rfc1929.txt
- package pt
-
- import (
-diff --git a/socks.go b/socks.go
-index 6ad6542..e4488e8 100644
---- a/socks.go
-+++ b/socks.go
-@@ -9,11 +9,40 @@ import (
- )
-
- const (
-- socksVersion = 0x04
-- socksCmdConnect = 0x01
-- socksResponseVersion = 0x00
-- socksRequestGranted = 0x5a
-- socksRequestRejected = 0x5b
-+ socksVersion = 0x05
-+
-+ socksAuthNoneRequired = 0x00
-+ socksAuthUsernamePassword = 0x02
-+ socksAuthNoAcceptableMethods = 0xff
-+
-+ socksCmdConnect = 0x01
-+ socksRsv = 0x00
-+
-+ socksAtypeV4 = 0x01
-+ socksAtypeDomainName = 0x03
-+ socksAtypeV6 = 0x04
-+
-+ socksAuthRFC1929Ver = 0x01
-+ socksAuthRFC1929Success = 0x00
-+ socksAuthRFC1929Fail = 0x01
-+
-+ socksRepSucceeded = 0x00
-+ // "general SOCKS server failure"
-+ SocksRepGeneralFailure = 0x01
-+ // "connection not allowed by ruleset"
-+ SocksRepConnectionNotAllowed = 0x02
-+ // "Network unreachable"
-+ SocksRepNetworkUnreachable = 0x03
-+ // "Host unreachable"
-+ SocksRepHostUnreachable = 0x04
-+ // "Connection refused"
-+ SocksRepConnectionRefused = 0x05
-+ // "TTL expired"
-+ SocksRepTTLExpired = 0x06
-+ // "Command not supported"
-+ SocksRepCommandNotSupported = 0x07
-+ // "Address type not supported"
-+ SocksRepAddressNotSupported = 0x08
- )
-
- // Put a sanity timeout on how long we wait for a SOCKS request.
-@@ -25,6 +54,8 @@ type SocksRequest struct {
- Target string
- // The userid string sent by the client.
- Username string
-+ // The password string sent by the client.
-+ Password string
- // The parsed contents of Username as a key–value mapping.
- Args Args
- }
-@@ -36,15 +67,23 @@ type SocksConn struct {
- }
-
- // Send a message to the proxy client that access to the given address is
--// granted. If the IP field inside addr is not an IPv4 address, the IP portion
--// of the response will be four zero bytes.
-+// granted. Addr is ignored, and "0.0.0.0:0" is always sent back for
-+// BND.ADDR/BND.PORT in the SOCKS response.
- func (conn *SocksConn) Grant(addr *net.TCPAddr) error {
-- return sendSocks4aResponseGranted(conn, addr)
-+ return sendSocks5ResponseGranted(conn)
- }
-
--// Send a message to the proxy client that access was rejected or failed.
-+// Send a message to the proxy client that access was rejected or failed. This
-+// sends back a "General Failure" error code. RejectReason should be used if
-+// more specific error reporting is desired.
- func (conn *SocksConn) Reject() error {
-- return sendSocks4aResponseRejected(conn)
-+ return conn.RejectReason(SocksRepGeneralFailure)
-+}
-+
-+// Send a message to the proxy client that access was rejected, with the
-+// specific error code indicating the reason behind the rejection.
-+func (conn *SocksConn) RejectReason(reason byte) error {
-+ return sendSocks5ResponseRejected(conn, reason)
- }
-
- // SocksListener wraps a net.Listener in order to read a SOCKS request on Accept.
-@@ -138,7 +177,7 @@ func (ln *SocksListener) AcceptSocks() (*SocksConn, error) {
- if err != nil {
- return nil, err
- }
-- conn.Req, err = readSocks4aConnect(conn)
-+ conn.Req, err = socks5Handshake(conn)
- if err != nil {
- conn.Close()
- return nil, err
-@@ -150,58 +189,251 @@ func (ln *SocksListener) AcceptSocks() (*SocksConn, error) {
- return conn, nil
- }
-
--// Returns "socks4", suitable to be included in a call to Cmethod.
-+// Returns "socks5", suitable to be included in a call to Cmethod.
- func (ln *SocksListener) Version() string {
-- return "socks4"
-+ return "socks5"
- }
-
--// Read a SOCKS4a connect request. Returns a SocksRequest.
--func readSocks4aConnect(s io.Reader) (req SocksRequest, err error) {
-- r := bufio.NewReader(s)
-+// socks5handshake conducts the SOCKS5 handshake up to the point where the
-+// client command is read and the proxy must open the outgoing connection.
-+// Returns a SocksRequest.
-+func socks5Handshake(s io.ReadWriter) (req SocksRequest, err error) {
-+ rw := bufio.NewReadWriter(bufio.NewReader(s), bufio.NewWriter(s))
-
-- var h [8]byte
-- _, err = io.ReadFull(r, h[:])
-- if err != nil {
-+ // Negotiate the authentication method.
-+ var method byte
-+ if method, err = socksNegotiateAuth(rw); err != nil {
- return
- }
-- if h[0] != socksVersion {
-- err = fmt.Errorf("SOCKS header had version 0x%02x, not 0x%02x", h[0], socksVersion)
-+
-+ // Authenticate the client.
-+ if err = socksAuthenticate(rw, method, &req); err != nil {
- return
- }
-- if h[1] != socksCmdConnect {
-- err = fmt.Errorf("SOCKS header had command 0x%02x, not 0x%02x", h[1], socksCmdConnect)
-+
-+ // Read the command.
-+ err = socksReadCommand(rw, &req)
-+ return
-+}
-+
-+// socksNegotiateAuth negotiates the authentication method and returns the
-+// selected method as a byte. On negotiation failures an error is returned.
-+func socksNegotiateAuth(rw *bufio.ReadWriter) (method byte, err error) {
-+ // Validate the version.
-+ if err = socksReadByteVerify(rw, "version", socksVersion); err != nil {
- return
- }
-
-- var usernameBytes []byte
-- usernameBytes, err = r.ReadBytes('\x00')
-- if err != nil {
-+ // Read the number of methods.
-+ var nmethods byte
-+ if nmethods, err = socksReadByte(rw); err != nil {
- return
- }
-- req.Username = string(usernameBytes[:len(usernameBytes)-1])
-
-- req.Args, err = parseClientParameters(req.Username)
-- if err != nil {
-+ // Read the methods.
-+ var methods []byte
-+ if methods, err = socksReadBytes(rw, int(nmethods)); err != nil {
- return
- }
-
-- var port int
-- var host string
-+ // Pick the most "suitable" method.
-+ method = socksAuthNoAcceptableMethods
-+ for _, m := range methods {
-+ switch m {
-+ case socksAuthNoneRequired:
-+ // Pick Username/Password over None if the client happens to
-+ // send both.
-+ if method == socksAuthNoAcceptableMethods {
-+ method = m
-+ }
-+
-+ case socksAuthUsernamePassword:
-+ method = m
-+ }
-+ }
-+
-+ // Send the negotiated method.
-+ var msg [2]byte
-+ msg[0] = socksVersion
-+ msg[1] = method
-+ if _, err = rw.Writer.Write(msg[:]); err != nil {
-+ return
-+ }
-+
-+ if err = socksFlushBuffers(rw); err != nil {
-+ return
-+ }
-+ return
-+}
-+
-+// socksAuthenticate authenticates the client via the chosen authentication
-+// mechanism.
-+func socksAuthenticate(rw *bufio.ReadWriter, method byte, req *SocksRequest) (err error) {
-+ switch method {
-+ case socksAuthNoneRequired:
-+ // Straight into reading the connect.
-
-- port = int(h[2])<<8 | int(h[3])<<0
-- if h[4] == 0 && h[5] == 0 && h[6] == 0 && h[7] != 0 {
-- var hostBytes []byte
-- hostBytes, err = r.ReadBytes('\x00')
-- if err != nil {
-+ case socksAuthUsernamePassword:
-+ if err = socksAuthRFC1929(rw, req); err != nil {
- return
- }
-- host = string(hostBytes[:len(hostBytes)-1])
-+
-+ case socksAuthNoAcceptableMethods:
-+ err = fmt.Errorf("SOCKS method select had no compatible methods")
-+ return
-+
-+ default:
-+ err = fmt.Errorf("SOCKS method select picked a unsupported method 0x%02x", method)
-+ return
-+ }
-+
-+ if err = socksFlushBuffers(rw); err != nil {
-+ return
-+ }
-+ return
-+}
-+
-+// socksAuthRFC1929 authenticates the client via RFC 1929 username/password
-+// auth. As a design decision any valid username/password is accepted as this
-+// field is primarily used as an out-of-band argument passing mechanism for
-+// pluggable transports.
-+func socksAuthRFC1929(rw *bufio.ReadWriter, req *SocksRequest) (err error) {
-+ sendErrResp := func() {
-+ // Swallow the write/flush error here, we are going to close the
-+ // connection and the original failure is more useful.
-+ resp := []byte{socksAuthRFC1929Ver, socksAuthRFC1929Fail}
-+ rw.Write(resp[:])
-+ socksFlushBuffers(rw)
-+ }
-+
-+ // Validate the fixed parts of the command message.
-+ if err = socksReadByteVerify(rw, "auth version", socksAuthRFC1929Ver); err != nil {
-+ sendErrResp()
-+ return
-+ }
-+
-+ // Read the username.
-+ var ulen byte
-+ if ulen, err = socksReadByte(rw); err != nil {
-+ return
-+ }
-+ if ulen < 1 {
-+ sendErrResp()
-+ err = fmt.Errorf("RFC1929 username with 0 length")
-+ return
-+ }
-+ var uname []byte
-+ if uname, err = socksReadBytes(rw, int(ulen)); err != nil {
-+ return
-+ }
-+ req.Username = string(uname)
-+
-+ // Read the password.
-+ var plen byte
-+ if plen, err = socksReadByte(rw); err != nil {
-+ return
-+ }
-+ if plen < 1 {
-+ sendErrResp()
-+ err = fmt.Errorf("RFC1929 password with 0 length")
-+ return
-+ }
-+ var passwd []byte
-+ if passwd, err = socksReadBytes(rw, int(plen)); err != nil {
-+ return
-+ }
-+ if !(plen == 1 && passwd[0] == 0x00) {
-+ // tor will set the password to 'NUL' if there are no arguments.
-+ req.Password = string(passwd)
-+ }
-+
-+ // Mash the username/password together and parse it as a pluggable
-+ // transport argument string.
-+ if req.Args, err = parseClientParameters(req.Username + req.Password); err != nil {
-+ sendErrResp()
- } else {
-- host = net.IPv4(h[4], h[5], h[6], h[7]).String()
-+ resp := []byte{socksAuthRFC1929Ver, socksAuthRFC1929Success}
-+ _, err = rw.Write(resp[:])
-+ }
-+ return
-+}
-+
-+// socksReadCommand reads a SOCKS5 client command and parses out the relevant
-+// fields into a SocksRequest. Only CMD_CONNECT is supported.
-+func socksReadCommand(rw *bufio.ReadWriter, req *SocksRequest) (err error) {
-+ sendErrResp := func(reason byte) {
-+ // Swallow errors that occur when writing/flushing the response,
-+ // connection will be closed anyway.
-+ sendSocks5ResponseRejected(rw, reason)
-+ socksFlushBuffers(rw)
-+ }
-+
-+ // Validate the fixed parts of the command message.
-+ if err = socksReadByteVerify(rw, "version", socksVersion); err != nil {
-+ sendErrResp(SocksRepGeneralFailure)
-+ return
-+ }
-+ if err = socksReadByteVerify(rw, "command", socksCmdConnect); err != nil {
-+ sendErrResp(SocksRepCommandNotSupported)
-+ return
-+ }
-+ if err = socksReadByteVerify(rw, "reserved", socksRsv); err != nil {
-+ sendErrResp(SocksRepGeneralFailure)
-+ return
-+ }
-+
-+ // Read the destination address/port.
-+ // XXX: This should probably eventually send socks 5 error messages instead
-+ // of rudely closing connections on invalid addresses.
-+ var atype byte
-+ if atype, err = socksReadByte(rw); err != nil {
-+ return
-+ }
-+ var host string
-+ switch atype {
-+ case socksAtypeV4:
-+ var addr []byte
-+ if addr, err = socksReadBytes(rw, net.IPv4len); err != nil {
-+ return
-+ }
-+ host = net.IPv4(addr[0], addr[1], addr[2], addr[3]).String()
-+
-+ case socksAtypeDomainName:
-+ var alen byte
-+ if alen, err = socksReadByte(rw); err != nil {
-+ return
-+ }
-+ if alen == 0 {
-+ err = fmt.Errorf("SOCKS request had domain name with 0 length")
-+ return
-+ }
-+ var addr []byte
-+ if addr, err = socksReadBytes(rw, int(alen)); err != nil {
-+ return
-+ }
-+ host = string(addr)
-+
-+ case socksAtypeV6:
-+ var rawAddr []byte
-+ if rawAddr, err = socksReadBytes(rw, net.IPv6len); err != nil {
-+ return
-+ }
-+ addr := make(net.IP, net.IPv6len)
-+ copy(addr[:], rawAddr[:])
-+ host = fmt.Sprintf("[%s]", addr.String())
-+
-+ default:
-+ sendErrResp(SocksRepAddressNotSupported)
-+ err = fmt.Errorf("SOCKS request had unsupported address type 0x%02x", atype)
-+ return
- }
-+ var rawPort []byte
-+ if rawPort, err = socksReadBytes(rw, 2); err != nil {
-+ return
-+ }
-+ port := int(rawPort[0])<<8 | int(rawPort[1])<<0
-
-- if r.Buffered() != 0 {
-- err = fmt.Errorf("%d bytes left after SOCKS header", r.Buffered())
-+ if err = socksFlushBuffers(rw); err != nil {
- return
- }
-
-@@ -209,34 +441,64 @@ func readSocks4aConnect(s io.Reader) (req SocksRequest, err error) {
- return
- }
-
--// Send a SOCKS4a response with the given code and address. If the IP field
--// inside addr is not an IPv4 address, the IP portion of the response will be
--// four zero bytes.
--func sendSocks4aResponse(w io.Writer, code byte, addr *net.TCPAddr) error {
-- var resp [8]byte
-- resp[0] = socksResponseVersion
-+// Send a SOCKS5 response with the given code. BND.ADDR/BND.PORT is always the
-+// IPv4 address/port "0.0.0.0:0".
-+func sendSocks5Response(w io.Writer, code byte) error {
-+ resp := make([]byte, 4+4+2)
-+ resp[0] = socksVersion
- resp[1] = code
-- resp[2] = byte((addr.Port >> 8) & 0xff)
-- resp[3] = byte((addr.Port >> 0) & 0xff)
-- ipv4 := addr.IP.To4()
-- if ipv4 != nil {
-- resp[4] = ipv4[0]
-- resp[5] = ipv4[1]
-- resp[6] = ipv4[2]
-- resp[7] = ipv4[3]
-- }
-+ resp[2] = socksRsv
-+ resp[3] = socksAtypeV4
-+
-+ // BND.ADDR/BND.PORT should be the address and port that the outgoing
-+ // connection is bound to on the proxy, but Tor does not use this
-+ // information, so all zeroes are sent.
-+
- _, err := w.Write(resp[:])
- return err
- }
-
--var emptyAddr = net.TCPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 0}
-+// Send a SOCKS5 response code 0x00.
-+func sendSocks5ResponseGranted(w io.Writer) error {
-+ return sendSocks5Response(w, socksRepSucceeded)
-+}
-
--// Send a SOCKS4a response code 0x5a.
--func sendSocks4aResponseGranted(w io.Writer, addr *net.TCPAddr) error {
-- return sendSocks4aResponse(w, socksRequestGranted, addr)
-+// Send a SOCKS5 response with the provided failure reason.
-+func sendSocks5ResponseRejected(w io.Writer, reason byte) error {
-+ return sendSocks5Response(w, reason)
- }
-
--// Send a SOCKS4a response code 0x5b (with an all-zero address).
--func sendSocks4aResponseRejected(w io.Writer) error {
-- return sendSocks4aResponse(w, socksRequestRejected, &emptyAddr)
-+func socksFlushBuffers(rw *bufio.ReadWriter) error {
-+ if err := rw.Writer.Flush(); err != nil {
-+ return err
-+ }
-+ if rw.Reader.Buffered() > 0 {
-+ return fmt.Errorf("%d bytes left after SOCKS message", rw.Reader.Buffered())
-+ }
-+ return nil
-+}
-+
-+func socksReadByte(rw *bufio.ReadWriter) (byte, error) {
-+ return rw.Reader.ReadByte()
-+}
-+
-+func socksReadBytes(rw *bufio.ReadWriter, n int) ([]byte, error) {
-+ ret := make([]byte, n)
-+ if _, err := io.ReadFull(rw.Reader, ret); err != nil {
-+ return nil, err
-+ }
-+ return ret, nil
- }
-+
-+func socksReadByteVerify(rw *bufio.ReadWriter, descr string, expected byte) error {
-+ val, err := socksReadByte(rw)
-+ if err != nil {
-+ return err
-+ }
-+ if val != expected {
-+ return fmt.Errorf("SOCKS message field %s was 0x%02x, not 0x%02x", descr, val, expected)
-+ }
-+ return nil
-+}
-+
-+var _ net.Listener = (*SocksListener)(nil)
-diff --git a/socks_test.go b/socks_test.go
-index 18d141a..aa27d4c 100644
---- a/socks_test.go
-+++ b/socks_test.go
-@@ -1,162 +1,368 @@
- package pt
-
- import (
-+ "bufio"
- "bytes"
-+ "encoding/hex"
-+ "io"
- "net"
- "testing"
- )
-
--func TestReadSocks4aConnect(t *testing.T) {
-- badTests := [...][]byte{
-- []byte(""),
-- // missing userid
-- []byte("\x04\x01\x12\x34\x01\x02\x03\x04"),
-- // missing \x00 after userid
-- []byte("\x04\x01\x12\x34\x01\x02\x03\x04key=value"),
-- // missing hostname
-- []byte("\x04\x01\x12\x34\x00\x00\x00\x01key=value\x00"),
-- // missing \x00 after hostname
-- []byte("\x04\x01\x12\x34\x00\x00\x00\x01key=value\x00hostname"),
-- // bad name–value mapping
-- []byte("\x04\x01\x12\x34\x00\x00\x00\x01userid\x00hostname\x00"),
-- // bad version number
-- []byte("\x03\x01\x12\x34\x01\x02\x03\x04\x00"),
-- // BIND request
-- []byte("\x04\x02\x12\x34\x01\x02\x03\x04\x00"),
-- // SOCKS5
-- []byte("\x05\x01\x00"),
-- }
-- ipTests := [...]struct {
-- input []byte
-- addr net.TCPAddr
-- userid string
-- }{
-- {
-- []byte("\x04\x01\x12\x34\x01\x02\x03\x04key=value\x00"),
-- net.TCPAddr{IP: net.ParseIP("1.2.3.4"), Port: 0x1234},
-- "key=value",
-- },
-- {
-- []byte("\x04\x01\x12\x34\x01\x02\x03\x04\x00"),
-- net.TCPAddr{IP: net.ParseIP("1.2.3.4"), Port: 0x1234},
-- "",
-- },
-- }
-- hostnameTests := [...]struct {
-- input []byte
-- target string
-- userid string
-- }{
-- {
-- []byte("\x04\x01\x12\x34\x00\x00\x00\x01key=value\x00hostname\x00"),
-- "hostname:4660",
-- "key=value",
-- },
-- {
-- []byte("\x04\x01\x12\x34\x00\x00\x00\x01\x00hostname\x00"),
-- "hostname:4660",
-- "",
-- },
-- {
-- []byte("\x04\x01\x12\x34\x00\x00\x00\x01key=value\x00\x00"),
-- ":4660",
-- "key=value",
-- },
-- {
-- []byte("\x04\x01\x12\x34\x00\x00\x00\x01\x00\x00"),
-- ":4660",
-- "",
-- },
-- }
--
-- for _, input := range badTests {
-- var buf bytes.Buffer
-- buf.Write(input)
-- _, err := readSocks4aConnect(&buf)
-- if err == nil {
-- t.Errorf("%q unexpectedly succeeded", input)
-- }
-- }
--
-- for _, test := range ipTests {
-- var buf bytes.Buffer
-- buf.Write(test.input)
-- req, err := readSocks4aConnect(&buf)
-- if err != nil {
-- t.Errorf("%q unexpectedly returned an error: %s", test.input, err)
-- }
-- addr, err := net.ResolveTCPAddr("tcp", req.Target)
-- if err != nil {
-- t.Errorf("%q → target %q: cannot resolve: %s", test.input,
-- req.Target, err)
-- }
-- if !tcpAddrsEqual(addr, &test.addr) {
-- t.Errorf("%q → address %s (expected %s)", test.input,
-- req.Target, test.addr.String())
-- }
-- if req.Username != test.userid {
-- t.Errorf("%q → username %q (expected %q)", test.input,
-- req.Username, test.userid)
-- }
-- if req.Args == nil {
-- t.Errorf("%q → unexpected nil Args from username %q", test.input, req.Username)
-- }
-- }
--
-- for _, test := range hostnameTests {
-- var buf bytes.Buffer
-- buf.Write(test.input)
-- req, err := readSocks4aConnect(&buf)
-- if err != nil {
-- t.Errorf("%q unexpectedly returned an error: %s", test.input, err)
-- }
-- if req.Target != test.target {
-- t.Errorf("%q → target %q (expected %q)", test.input,
-- req.Target, test.target)
-- }
-- if req.Username != test.userid {
-- t.Errorf("%q → username %q (expected %q)", test.input,
-- req.Username, test.userid)
-- }
-- if req.Args == nil {
-- t.Errorf("%q → unexpected nil Args from username %q", test.input, req.Username)
-- }
-- }
--}
--
--func TestSendSocks4aResponse(t *testing.T) {
-- tests := [...]struct {
-- code byte
-- addr net.TCPAddr
-- expected []byte
-- }{
-- {
-- socksRequestGranted,
-- net.TCPAddr{IP: net.ParseIP("1.2.3.4"), Port: 0x1234},
-- []byte("\x00\x5a\x12\x34\x01\x02\x03\x04"),
-- },
-- {
-- socksRequestRejected,
-- net.TCPAddr{IP: net.ParseIP("1:2::3:4"), Port: 0x1234},
-- []byte("\x00\x5b\x12\x34\x00\x00\x00\x00"),
-- },
-- }
--
-- for _, test := range tests {
-- var buf bytes.Buffer
-- err := sendSocks4aResponse(&buf, test.code, &test.addr)
-- if err != nil {
-- t.Errorf("0x%02x %s unexpectedly returned an error: %s", test.code, &test.addr, err)
-- }
-- p := make([]byte, 1024)
-- n, err := buf.Read(p)
-- if err != nil {
-- t.Fatal(err)
-- }
-- output := p[:n]
-- if !bytes.Equal(output, test.expected) {
-- t.Errorf("0x%02x %s → %v (expected %v)",
-- test.code, &test.addr, output, test.expected)
-- }
-+// testReadWriter is a bytes.Buffer backed io.ReadWriter used for testing. The
-+// Read and Write routines are to be used by the component being tested. Data
-+// can be written to and read back via the writeHex and readHex routines.
-+type testReadWriter struct {
-+ readBuf bytes.Buffer
-+ writeBuf bytes.Buffer
-+}
-+
-+func (c *testReadWriter) Read(buf []byte) (n int, err error) {
-+ return c.readBuf.Read(buf)
-+}
-+
-+func (c *testReadWriter) Write(buf []byte) (n int, err error) {
-+ return c.writeBuf.Write(buf)
-+}
-+
-+func (c *testReadWriter) writeHex(str string) (n int, err error) {
-+ var buf []byte
-+ if buf, err = hex.DecodeString(str); err != nil {
-+ return
-+ }
-+ return c.readBuf.Write(buf)
-+}
-+
-+func (c *testReadWriter) readHex() string {
-+ return hex.EncodeToString(c.writeBuf.Bytes())
-+}
-+
-+func (c *testReadWriter) toBufio() *bufio.ReadWriter {
-+ return bufio.NewReadWriter(bufio.NewReader(c), bufio.NewWriter(c))
-+}
-+
-+func (c *testReadWriter) reset() {
-+ c.readBuf.Reset()
-+ c.writeBuf.Reset()
-+}
-+
-+// TestAuthInvalidVersion tests auth negotiation with an invalid version.
-+func TestAuthInvalidVersion(t *testing.T) {
-+ c := new(testReadWriter)
-+
-+ // VER = 03, NMETHODS = 01, METHODS = [00]
-+ c.writeHex("030100")
-+ if _, err := socksNegotiateAuth(c.toBufio()); err == nil {
-+ t.Error("socksNegotiateAuth(InvalidVersion) succeded")
-+ }
-+}
-+
-+// TestAuthInvalidNMethods tests auth negotiaton with no methods.
-+func TestAuthInvalidNMethods(t *testing.T) {
-+ c := new(testReadWriter)
-+ var err error
-+ var method byte
-+
-+ // VER = 05, NMETHODS = 00
-+ c.writeHex("0500")
-+ if method, err = socksNegotiateAuth(c.toBufio()); err != nil {
-+ t.Error("socksNegotiateAuth(No Methods) failed:", err)
-+ }
-+ if method != socksAuthNoAcceptableMethods {
-+ t.Error("socksNegotiateAuth(No Methods) picked unexpected method:", method)
-+ }
-+ if msg := c.readHex(); msg != "05ff" {
-+ t.Error("socksNegotiateAuth(No Methods) invalid response:", msg)
-+ }
-+}
-+
-+// TestAuthNoneRequired tests auth negotiaton with NO AUTHENTICATION REQUIRED.
-+func TestAuthNoneRequired(t *testing.T) {
-+ c := new(testReadWriter)
-+ var err error
-+ var method byte
-+
-+ // VER = 05, NMETHODS = 01, METHODS = [00]
-+ c.writeHex("050100")
-+ if method, err = socksNegotiateAuth(c.toBufio()); err != nil {
-+ t.Error("socksNegotiateAuth(None) failed:", err)
-+ }
-+ if method != socksAuthNoneRequired {
-+ t.Error("socksNegotiateAuth(None) unexpected method:", method)
-+ }
-+ if msg := c.readHex(); msg != "0500" {
-+ t.Error("socksNegotiateAuth(None) invalid response:", msg)
-+ }
-+}
-+
-+// TestAuthUsernamePassword tests auth negotiation with USERNAME/PASSWORD.
-+func TestAuthUsernamePassword(t *testing.T) {
-+ c := new(testReadWriter)
-+ var err error
-+ var method byte
-+
-+ // VER = 05, NMETHODS = 01, METHODS = [02]
-+ c.writeHex("050102")
-+ if method, err = socksNegotiateAuth(c.toBufio()); err != nil {
-+ t.Error("socksNegotiateAuth(UsernamePassword) failed:", err)
-+ }
-+ if method != socksAuthUsernamePassword {
-+ t.Error("socksNegotiateAuth(UsernamePassword) unexpected method:", method)
-+ }
-+ if msg := c.readHex(); msg != "0502" {
-+ t.Error("socksNegotiateAuth(UsernamePassword) invalid response:", msg)
- }
- }
-+
-+// TestAuthBoth tests auth negotiation containing both NO AUTHENTICATION
-+// REQUIRED and USERNAME/PASSWORD.
-+func TestAuthBoth(t *testing.T) {
-+ c := new(testReadWriter)
-+ var err error
-+ var method byte
-+
-+ // VER = 05, NMETHODS = 02, METHODS = [00, 02]
-+ c.writeHex("05020002")
-+ if method, err = socksNegotiateAuth(c.toBufio()); err != nil {
-+ t.Error("socksNegotiateAuth(Both) failed:", err)
-+ }
-+ if method != socksAuthUsernamePassword {
-+ t.Error("socksNegotiateAuth(Both) unexpected method:", method)
-+ }
-+ if msg := c.readHex(); msg != "0502" {
-+ t.Error("socksNegotiateAuth(Both) invalid response:", msg)
-+ }
-+}
-+
-+// TestAuthUnsupported tests auth negotiation with a unsupported method.
-+func TestAuthUnsupported(t *testing.T) {
-+ c := new(testReadWriter)
-+ var err error
-+ var method byte
-+
-+ // VER = 05, NMETHODS = 01, METHODS = [01] (GSSAPI)
-+ c.writeHex("050101")
-+ if method, err = socksNegotiateAuth(c.toBufio()); err != nil {
-+ t.Error("socksNegotiateAuth(Unknown) failed:", err)
-+ }
-+ if method != socksAuthNoAcceptableMethods {
-+ t.Error("socksNegotiateAuth(Unknown) picked unexpected method:", method)
-+ }
-+ if msg := c.readHex(); msg != "05ff" {
-+ t.Error("socksNegotiateAuth(Unknown) invalid response:", msg)
-+ }
-+}
-+
-+// TestAuthUnsupported2 tests auth negotiation with supported and unsupported
-+// methods.
-+func TestAuthUnsupported2(t *testing.T) {
-+ c := new(testReadWriter)
-+ var err error
-+ var method byte
-+
-+ // VER = 05, NMETHODS = 03, METHODS = [00,01,02]
-+ c.writeHex("0503000102")
-+ if method, err = socksNegotiateAuth(c.toBufio()); err != nil {
-+ t.Error("socksNegotiateAuth(Unknown2) failed:", err)
-+ }
-+ if method != socksAuthUsernamePassword {
-+ t.Error("socksNegotiateAuth(Unknown2) picked unexpected method:", method)
-+ }
-+ if msg := c.readHex(); msg != "0502" {
-+ t.Error("socksNegotiateAuth(Unknown2) invalid response:", msg)
-+ }
-+}
-+
-+// TestRFC1929InvalidVersion tests RFC1929 auth with an invalid version.
-+func TestRFC1929InvalidVersion(t *testing.T) {
-+ c := new(testReadWriter)
-+ var req SocksRequest
-+
-+ // VER = 03, ULEN = 5, UNAME = "ABCDE", PLEN = 5, PASSWD = "abcde"
-+ c.writeHex("03054142434445056162636465")
-+ if err := socksAuthenticate(c.toBufio(), socksAuthUsernamePassword, &req); err == nil {
-+ t.Error("socksAuthenticate(InvalidVersion) succeded")
-+ }
-+ if msg := c.readHex(); msg != "0101" {
-+ t.Error("socksAuthenticate(InvalidVersion) invalid response:", msg)
-+ }
-+}
-+
-+// TestRFC1929InvalidUlen tests RFC1929 auth with an invalid ULEN.
-+func TestRFC1929InvalidUlen(t *testing.T) {
-+ c := new(testReadWriter)
-+ var req SocksRequest
-+
-+ // VER = 01, ULEN = 0, UNAME = "", PLEN = 5, PASSWD = "abcde"
-+ c.writeHex("0100056162636465")
-+ if err := socksAuthenticate(c.toBufio(), socksAuthUsernamePassword, &req); err == nil {
-+ t.Error("socksAuthenticate(InvalidUlen) succeded")
-+ }
-+ if msg := c.readHex(); msg != "0101" {
-+ t.Error("socksAuthenticate(InvalidUlen) invalid response:", msg)
-+ }
-+}
-+
-+// TestRFC1929InvalidPlen tests RFC1929 auth with an invalid PLEN.
-+func TestRFC1929InvalidPlen(t *testing.T) {
-+ c := new(testReadWriter)
-+ var req SocksRequest
-+
-+ // VER = 01, ULEN = 5, UNAME = "ABCDE", PLEN = 0, PASSWD = ""
-+ c.writeHex("0105414243444500")
-+ if err := socksAuthenticate(c.toBufio(), socksAuthUsernamePassword, &req); err == nil {
-+ t.Error("socksAuthenticate(InvalidPlen) succeded")
-+ }
-+ if msg := c.readHex(); msg != "0101" {
-+ t.Error("socksAuthenticate(InvalidPlen) invalid response:", msg)
-+ }
-+}
-+
-+// TestRFC1929InvalidArgs tests RFC1929 auth with invalid pt args.
-+func TestRFC1929InvalidPTArgs(t *testing.T) {
-+ c := new(testReadWriter)
-+ var req SocksRequest
-+
-+ // VER = 01, ULEN = 5, UNAME = "ABCDE", PLEN = 5, PASSWD = "abcde"
-+ c.writeHex("01054142434445056162636465")
-+ if err := socksAuthenticate(c.toBufio(), socksAuthUsernamePassword, &req); err == nil {
-+ t.Error("socksAuthenticate(InvalidArgs) succeded")
-+ }
-+ if msg := c.readHex(); msg != "0101" {
-+ t.Error("socksAuthenticate(InvalidArgs) invalid response:", msg)
-+ }
-+}
-+
-+// TestRFC1929Success tests RFC1929 auth with valid pt args.
-+func TestRFC1929Success(t *testing.T) {
-+ c := new(testReadWriter)
-+ var req SocksRequest
-+
-+ // VER = 01, ULEN = 9, UNAME = "key=value", PLEN = 1, PASSWD = "\0"
-+ c.writeHex("01096b65793d76616c75650100")
-+ if err := socksAuthenticate(c.toBufio(), socksAuthUsernamePassword, &req); err != nil {
-+ t.Error("socksAuthenticate(Success) failed:", err)
-+ }
-+ if msg := c.readHex(); msg != "0100" {
-+ t.Error("socksAuthenticate(Success) invalid response:", msg)
-+ }
-+ v, ok := req.Args.Get("key")
-+ if v != "value" || !ok {
-+ t.Error("RFC1929 k,v parse failure:", v)
-+ }
-+}
-+
-+// TestRequestInvalidHdr tests SOCKS5 requests with invalid VER/CMD/RSV/ATYPE
-+func TestRequestInvalidHdr(t *testing.T) {
-+ c := new(testReadWriter)
-+ var req SocksRequest
-+
-+ // VER = 03, CMD = 01, RSV = 00, ATYPE = 01, DST.ADDR = 127.0.0.1, DST.PORT = 9050
-+ c.writeHex("030100017f000001235a")
-+ if err := socksReadCommand(c.toBufio(), &req); err == nil {
-+ t.Error("socksReadCommand(InvalidVer) succeded")
-+ }
-+ if msg := c.readHex(); msg != "05010001000000000000" {
-+ t.Error("socksReadCommand(InvalidVer) invalid response:", msg)
-+ }
-+ c.reset()
-+
-+ // VER = 05, CMD = 05, RSV = 00, ATYPE = 01, DST.ADDR = 127.0.0.1, DST.PORT = 9050
-+ c.writeHex("050500017f000001235a")
-+ if err := socksReadCommand(c.toBufio(), &req); err == nil {
-+ t.Error("socksReadCommand(InvalidCmd) succeded")
-+ }
-+ if msg := c.readHex(); msg != "05070001000000000000" {
-+ t.Error("socksReadCommand(InvalidCmd) invalid response:", msg)
-+ }
-+ c.reset()
-+
-+ // VER = 05, CMD = 01, RSV = 30, ATYPE = 01, DST.ADDR = 127.0.0.1, DST.PORT = 9050
-+ c.writeHex("050130017f000001235a")
-+ if err := socksReadCommand(c.toBufio(), &req); err == nil {
-+ t.Error("socksReadCommand(InvalidRsv) succeded")
-+ }
-+ if msg := c.readHex(); msg != "05010001000000000000" {
-+ t.Error("socksReadCommand(InvalidRsv) invalid response:", msg)
-+ }
-+ c.reset()
-+
-+ // VER = 05, CMD = 01, RSV = 01, ATYPE = 05, DST.ADDR = 127.0.0.1, DST.PORT = 9050
-+ c.writeHex("050100057f000001235a")
-+ if err := socksReadCommand(c.toBufio(), &req); err == nil {
-+ t.Error("socksReadCommand(InvalidAtype) succeded")
-+ }
-+ if msg := c.readHex(); msg != "05080001000000000000" {
-+ t.Error("socksAuthenticate(InvalidAtype) invalid response:", msg)
-+ }
-+ c.reset()
-+}
-+
-+// TestRequestIPv4 tests IPv4 SOCKS5 requests.
-+func TestRequestIPv4(t *testing.T) {
-+ c := new(testReadWriter)
-+ var req SocksRequest
-+
-+ // VER = 05, CMD = 01, RSV = 00, ATYPE = 01, DST.ADDR = 127.0.0.1, DST.PORT = 9050
-+ c.writeHex("050100017f000001235a")
-+ if err := socksReadCommand(c.toBufio(), &req); err != nil {
-+ t.Error("socksReadCommand(IPv4) failed:", err)
-+ }
-+ addr, err := net.ResolveTCPAddr("tcp", req.Target)
-+ if err != nil {
-+ t.Error("net.ResolveTCPAddr failed:", err)
-+ }
-+ if !tcpAddrsEqual(addr, &net.TCPAddr{IP: net.ParseIP("127.0.0.1"), Port: 9050}) {
-+ t.Error("Unexpected target:", addr)
-+ }
-+}
-+
-+// TestRequestIPv6 tests IPv4 SOCKS5 requests.
-+func TestRequestIPv6(t *testing.T) {
-+ c := new(testReadWriter)
-+ var req SocksRequest
-+
-+ // VER = 05, CMD = 01, RSV = 00, ATYPE = 04, DST.ADDR = 0102:0304:0506:0708:090a:0b0c:0d0e:0f10, DST.PORT = 9050
-+ c.writeHex("050100040102030405060708090a0b0c0d0e0f10235a")
-+ if err := socksReadCommand(c.toBufio(), &req); err != nil {
-+ t.Error("socksReadCommand(IPv6) failed:", err)
-+ }
-+ addr, err := net.ResolveTCPAddr("tcp", req.Target)
-+ if err != nil {
-+ t.Error("net.ResolveTCPAddr failed:", err)
-+ }
-+ if !tcpAddrsEqual(addr, &net.TCPAddr{IP: net.ParseIP("0102:0304:0506:0708:090a:0b0c:0d0e:0f10"), Port: 9050}) {
-+ t.Error("Unexpected target:", addr)
-+ }
-+}
-+
-+// TestRequestFQDN tests FQDN (DOMAINNAME) SOCKS5 requests.
-+func TestRequestFQDN(t *testing.T) {
-+ c := new(testReadWriter)
-+ var req SocksRequest
-+
-+ // VER = 05, CMD = 01, RSV = 00, ATYPE = 04, DST.ADDR = example.com, DST.PORT = 9050
-+ c.writeHex("050100030b6578616d706c652e636f6d235a")
-+ if err := socksReadCommand(c.toBufio(), &req); err != nil {
-+ t.Error("socksReadCommand(FQDN) failed:", err)
-+ }
-+ if req.Target != "example.com:9050" {
-+ t.Error("Unexpected target:", req.Target)
-+ }
-+}
-+
-+// TestResponseNil tests nil address SOCKS5 responses.
-+func TestResponseNil(t *testing.T) {
-+ c := new(testReadWriter)
-+
-+ b := c.toBufio()
-+ if err := sendSocks5ResponseGranted(b); err != nil {
-+ t.Error("sendSocks5ResponseGranted() failed:", err)
-+ }
-+ b.Flush()
-+ if msg := c.readHex(); msg != "05000001000000000000" {
-+ t.Error("sendSocks5ResponseGranted(nil) invalid response:", msg)
-+ }
-+}
-+
-+var _ io.ReadWriter = (*testReadWriter)(nil)
---
-2.3.3
-
1
0

27 Mar '15
commit 8a99ab949e082f8782b062b21e3fbaca3fa428db
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Thu Mar 26 23:09:08 2015 -0700
Update changelog for 15482.
---
Bundle-Data/Docs/ChangeLog.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Bundle-Data/Docs/ChangeLog.txt b/Bundle-Data/Docs/ChangeLog.txt
index f357766..ffea36a 100644
--- a/Bundle-Data/Docs/ChangeLog.txt
+++ b/Bundle-Data/Docs/ChangeLog.txt
@@ -38,7 +38,7 @@ Tor Browser 4.5a5 -- Mar 31 2015
* Bug 12827: Create preference to disable SVG images (for security slider)
* Bug 13548: Create preference to disable MathML (for security slider)
* Bug 14631: Improve startup error messages for filesystem permissions issues
- * Bug 13766: Keep content window Tor circuits open for 2 hours
+ * Bug 15482: Don't allow circuits to change while a site is in use
* Linux
* Bug 13375: Create a hybrid GUI/desktop/shell launcher wrapper
* Bug 12468: Only print/write log messages if launched with --debug
1
0

[tor-browser-bundle/master] Update update manifest config for 4.5a5.
by mikeperry@torproject.org 27 Mar '15
by mikeperry@torproject.org 27 Mar '15
27 Mar '15
commit d7473d644091e3c94eb494567d6a080d970e555d
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Thu Mar 26 19:54:14 2015 -0700
Update update manifest config for 4.5a5.
---
tools/update-responses/config.yml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/tools/update-responses/config.yml b/tools/update-responses/config.yml
index 403be5c..d06be81 100644
--- a/tools/update-responses/config.yml
+++ b/tools/update-responses/config.yml
@@ -9,14 +9,14 @@ build_targets:
osx32: Darwin_x86-gcc3
osx64: Darwin_x86_64-gcc3
channels:
- alpha: 4.5a4
+ alpha: 4.5a5
versions:
- 4.5a4:
- platformVersion: 31.5.0
+ 4.5a5:
+ platformVersion: 31.6.0
detailsURL: https://www.torproject.org/projects/torbrowser.html.en
- download_url: https://www.torproject.org/dist/torbrowser/4.5a4
+ download_url: https://www.torproject.org/dist/torbrowser/4.5a5
incremental_from:
- - 4.5a3
+ - 4.5a4
migrate_archs:
osx32: osx64
osx32:
1
0

27 Mar '15
commit 0a1a75b3c3a8142e285a0c2dc38a0746c65b67f9
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Thu Mar 26 19:49:39 2015 -0700
Bump Tor Launcher to 0.2.7.3.
---
Bundle-Data/Docs/ChangeLog.txt | 2 ++
gitian/versions.alpha | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/Bundle-Data/Docs/ChangeLog.txt b/Bundle-Data/Docs/ChangeLog.txt
index edbd748..f357766 100644
--- a/Bundle-Data/Docs/ChangeLog.txt
+++ b/Bundle-Data/Docs/ChangeLog.txt
@@ -5,6 +5,8 @@ Tor Browser 4.5a5 -- Mar 31 2015
* Update Tor to 0.2.6.6
* Update NoScript to 2.6.9.19
* Update meek to 0.16
+ * Update Tor Launcher to 0.2.7.3
+ * Bug 13983: Directory search path fix for Tor Messanger+TorBirdy
* Update Torbutton to 1.9.1.0
* Bug 9387: "Security Slider 1.0"
* Include descriptions and tooltip hints for security levels
diff --git a/gitian/versions.alpha b/gitian/versions.alpha
index 12c16cc..5c9ffb9 100755
--- a/gitian/versions.alpha
+++ b/gitian/versions.alpha
@@ -10,7 +10,7 @@ TORBROWSER_UPDATE_CHANNEL=alpha
TORBROWSER_TAG=tor-browser-${FIREFOX_VERSION}-4.5-1-build1
TOR_TAG=tor-0.2.6.6
-TORLAUNCHER_TAG=0.2.7.2
+TORLAUNCHER_TAG=0.2.7.3
TORBUTTON_TAG=1.9.1.0
HTTPSE_TAG=3.5.3 # XXX: HTTPSE_VER is used instead, pending #11630
NSIS_TAG=v0.3
1
0

[tor-launcher/master] Update translations and bump version for 0.2.7.3.
by mikeperry@torproject.org 27 Mar '15
by mikeperry@torproject.org 27 Mar '15
27 Mar '15
commit 7382cc7c462e39afa0ec320c63e10ab88db01630
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Thu Mar 26 19:45:24 2015 -0700
Update translations and bump version for 0.2.7.3.
---
src/chrome/locale/ar/network-settings.dtd | 6 +-
src/chrome/locale/bg/network-settings.dtd | 2 +-
src/chrome/locale/bn/network-settings.dtd | 6 +-
src/chrome/locale/bn/torlauncher.properties | 28 +++----
src/chrome/locale/ca/network-settings.dtd | 8 +-
src/chrome/locale/da/network-settings.dtd | 8 +-
src/chrome/locale/da/torlauncher.properties | 4 +-
src/chrome/locale/de/progress.dtd | 4 +-
src/chrome/locale/es/network-settings.dtd | 30 +++----
src/chrome/locale/es/torlauncher.properties | 10 +--
src/chrome/locale/fi/network-settings.dtd | 20 ++---
src/chrome/locale/fi/progress.dtd | 4 +-
src/chrome/locale/fi/torlauncher.properties | 20 ++---
src/chrome/locale/fr/network-settings.dtd | 8 +-
src/chrome/locale/fr/progress.dtd | 2 +-
src/chrome/locale/hi/progress.dtd | 8 +-
src/chrome/locale/hi/torlauncher.properties | 2 +-
src/chrome/locale/hu/network-settings.dtd | 8 +-
src/chrome/locale/id/network-settings.dtd | 8 +-
src/chrome/locale/it/network-settings.dtd | 6 +-
src/chrome/locale/lo/torlauncher.properties | 2 +-
src/chrome/locale/nb/network-settings.dtd | 8 +-
src/chrome/locale/pt/network-settings.dtd | 8 +-
src/chrome/locale/pt/torlauncher.properties | 38 ++++-----
src/chrome/locale/sq/network-settings.dtd | 80 +++++++++---------
src/chrome/locale/sq/progress.dtd | 8 +-
src/chrome/locale/sq/torlauncher.properties | 116 +++++++++++++-------------
src/chrome/locale/sv/network-settings.dtd | 6 +-
src/chrome/locale/uk/network-settings.dtd | 8 +-
src/chrome/locale/zh-CN/network-settings.dtd | 8 +-
src/chrome/locale/zh-TW/network-settings.dtd | 8 +-
src/install.rdf | 2 +-
32 files changed, 242 insertions(+), 242 deletions(-)
diff --git a/src/chrome/locale/ar/network-settings.dtd b/src/chrome/locale/ar/network-settings.dtd
index a4d92b1..81dc4e2 100644
--- a/src/chrome/locale/ar/network-settings.dtd
+++ b/src/chrome/locale/ar/network-settings.dtd
@@ -15,9 +15,9 @@
<!ENTITY torSettings.connectPrompt3 "سيصلح هذا في معظم الحالات.">
<!ENTITY torSettings.connect "اتصل">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "هل يحتاج هذا الكمبيوتر لاستخدام وكيل محلي للاتصال بالإنترنت؟">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "إذا كنت غير متأكد من كيفية الإجابة على هذا السؤال، أنظر الى إعدادات الإنترنت في متصفح آخر لمعرفة ما إذا تمت تهيئتة لاستخدام وكيل محلي.">
<!ENTITY torSettings.enterProxy "أدخل إعدادات البروكسي.">
<!ENTITY torSettings.bridgeQuestion "هل يقوم مقدم خدمة الإنترنت (ISP) الذي تتعامل معه بحجب الاتصالات بشبكة Tor أو مراقبتها بطريقة أخرى؟">
<!ENTITY torSettings.bridgeHelp "إذا لم تكن متأكدا من إجابة هذا السؤال، قم باختيار لا.   إذا قمت باختيار نعم، فسيطلب منك تكوين جسور Tor والتي هي منافذ ترحيل غير مدرجة تصعب عملية حظر الاتصالات بشبكة Tor.">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "اختياري">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "يحتاج هذا الكمبيوتر لاستخدام وكيل محلي للاتصال بالإنترنت">
<!ENTITY torsettings.useProxy.type "نوع البروكسي:">
<!ENTITY torsettings.useProxy.address "العنوان:">
<!ENTITY torsettings.useProxy.address.placeholder "عنوان الإنترنت IP أو اسم المضيف">
diff --git a/src/chrome/locale/bg/network-settings.dtd b/src/chrome/locale/bg/network-settings.dtd
index 56f17d4..3813505 100644
--- a/src/chrome/locale/bg/network-settings.dtd
+++ b/src/chrome/locale/bg/network-settings.dtd
@@ -15,7 +15,7 @@
<!ENTITY torSettings.connectPrompt3 "Това ще работи при повечето ситуации.">
<!ENTITY torSettings.connect "Свържи се">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Този компютър използва ли локално прокси за достъп до Интернет?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
<!ENTITY torSettings.enterProxy "Въведете настройките за прокси.">
diff --git a/src/chrome/locale/bn/network-settings.dtd b/src/chrome/locale/bn/network-settings.dtd
index e8ccb67..5cb5821 100644
--- a/src/chrome/locale/bn/network-settings.dtd
+++ b/src/chrome/locale/bn/network-settings.dtd
@@ -4,8 +4,8 @@
<!ENTITY torsettings.prompt "Before you connect to the Tor network, you need to provide information about this computer's Internet connection.">
-<!ENTITY torSettings.yes "Yes">
-<!ENTITY torSettings.no "No">
+<!ENTITY torSettings.yes "হ্যা">
+<!ENTITY torSettings.no "না">
<!ENTITY torSettings.firstQuestion "Which of the following best describes your situation?">
<!ENTITY torSettings.configurePrompt1 "This computer's Internet connection is censored or proxied.">
@@ -13,7 +13,7 @@
<!ENTITY torSettings.configure "Configure">
<!ENTITY torSettings.connectPrompt2 "I would like to connect directly to the Tor network.">
<!ENTITY torSettings.connectPrompt3 "This will work in most situations.">
-<!ENTITY torSettings.connect "Connect">
+<!ENTITY torSettings.connect "সংযোগ করুন">
<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
diff --git a/src/chrome/locale/bn/torlauncher.properties b/src/chrome/locale/bn/torlauncher.properties
index c745e20..fd9face 100644
--- a/src/chrome/locale/bn/torlauncher.properties
+++ b/src/chrome/locale/bn/torlauncher.properties
@@ -6,14 +6,14 @@ torlauncher.error_title=Tor Launcher
torlauncher.tor_exited=Tor unexpectedly exited. This might be due to a bug in Tor itself, another program on your system, or faulty hardware. Until you restart Tor, the Tor Browser will not able to reach any websites. If the problem persists, please send a copy of your Tor Log to the support team.
torlauncher.tor_exited2=Restarting Tor will not close your browser tabs.
torlauncher.tor_controlconn_failed=Could not connect to Tor control port.
-torlauncher.tor_failed_to_start=Tor failed to start.
+torlauncher.tor_failed_to_start=টর শুরু হতে ব্যর্থ হয়েছে
torlauncher.tor_control_failed=Failed to take control of Tor.
-torlauncher.tor_bootstrap_failed=Tor failed to establish a Tor network connection.
-torlauncher.tor_bootstrap_failed_details=%1$S failed (%2$S).
+torlauncher.tor_bootstrap_failed=টর নেটওয়ার্ক সংযোগ সৃষ্টি করতে হতে ব্যর্থ হয়েছে।
+torlauncher.tor_bootstrap_failed_details=%1$S ব্যর্থ হয়েছে (%2$S).
-torlauncher.unable_to_start_tor=Unable to start Tor.\n\n%S
-torlauncher.tor_missing=The Tor executable is missing.
-torlauncher.torrc_missing=The torrc file is missing.
+torlauncher.unable_to_start_tor=টর শুরু করা সম্ভব নয়।\n\n%S
+torlauncher.tor_missing= Tor executable নথিটি পাওয়া যাচ্ছে না।
+torlauncher.torrc_missing=torrc নথিটি পাওয়া যাচ্ছে না।
torlauncher.datadir_missing=The Tor data directory does not exist.
torlauncher.password_hash_missing=Failed to get hashed password.
@@ -27,15 +27,15 @@ torlauncher.error_bridges_missing=You must specify one or more bridges.
torlauncher.error_default_bridges_type_missing=You must select a transport type for the provided bridges.
torlauncher.error_bridge_bad_default_type=No provided bridges that have the transport type %S are available. Please adjust your settings.
-torlauncher.recommended_bridge=(recommended)
+torlauncher.recommended_bridge=( সুপারিশকৃত )
-torlauncher.connect=Connect
+torlauncher.connect=সংযোগ করুন
torlauncher.restart_tor=Restart Tor
-torlauncher.quit=Quit
-torlauncher.quit_win=Exit
-torlauncher.done=Done
+torlauncher.quit=বেরিয়ে যান
+torlauncher.quit_win=বেরিয়ে যান
+torlauncher.done=সমাপ্ত
-torlauncher.forAssistance=For assistance, contact %S
+torlauncher.forAssistance=সাহায্যের জন্য , যোগাযোগ করুনঃ %S
torlauncher.copiedNLogMessages=Copy complete. %S Tor log messages are ready to be pasted into a text editor or an email message.
@@ -48,9 +48,9 @@ torlauncher.bootstrapStatus.requesting_descriptors=Requesting relay information
torlauncher.bootstrapStatus.loading_descriptors=Loading relay information
torlauncher.bootstrapStatus.conn_or=টর নেটওয়ার্কের সাথে সংযুক্ত হচ্ছে
torlauncher.bootstrapStatus.handshake_or=Establishing a Tor circuit
-torlauncher.bootstrapStatus.done=Connected to the Tor network!
+torlauncher.bootstrapStatus.done=টর নেটওয়ার্কের সাথে সংযুক্ত হয়েছে!
-torlauncher.bootstrapWarning.done=done
+torlauncher.bootstrapWarning.done=সম্পূর্ণ
torlauncher.bootstrapWarning.connectrefused=connection refused
torlauncher.bootstrapWarning.misc=miscellaneous
torlauncher.bootstrapWarning.resourcelimit=insufficient resources
diff --git a/src/chrome/locale/ca/network-settings.dtd b/src/chrome/locale/ca/network-settings.dtd
index 15025b4..a8996f7 100644
--- a/src/chrome/locale/ca/network-settings.dtd
+++ b/src/chrome/locale/ca/network-settings.dtd
@@ -9,15 +9,15 @@
<!ENTITY torSettings.firstQuestion "Quina de les següuens descriula teva situació?">
<!ENTITY torSettings.configurePrompt1 "La connexió a internet d'aquest ordinador està censurada o configurada amb un proxy. ">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
+<!ENTITY torSettings.configurePrompt2 "He de configurar preferències de ponts o de proxy local.">
<!ENTITY torSettings.configure "Configura">
<!ENTITY torSettings.connectPrompt2 "M'agradaria conectar-me directament a la xarxa Tor.">
<!ENTITY torSettings.connectPrompt3 "Això funciona en la majoria dels casos.">
<!ENTITY torSettings.connect "Conectar">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Aquest ordinador ha de fer servir un proxy local per accedir a internet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Si no esteu segurs de com respondre aquesta pregunta, mireu les preferències d'internet d'un altre navegador per veure si està configurat per usar un proxy local. ">
<!ENTITY torSettings.enterProxy "Introdueix les opcions del proxy.">
<!ENTITY torSettings.bridgeQuestion "El vostre proveïdor d'Internet (ISP) bloqueja o censura les connexions a la Xarxa Tor?">
<!ENTITY torSettings.bridgeHelp "Si no esteu segurs de com respondre a aquesta pregunta, escolliu No.  Si escolliu Sí, se us demanarà que configureu Ponts Tor, que són relés no llistats que fan més dificil de bloquejar les connexions a la Xarxa Tor">
@@ -31,7 +31,7 @@
<!ENTITY torsettings.optional "Opcional
">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Aquest ordinador ha de fer servir un proxy local per accedir a internet. ">
<!ENTITY torsettings.useProxy.type "Tipus de Proxy:">
<!ENTITY torsettings.useProxy.address "Adreça:">
<!ENTITY torsettings.useProxy.address.placeholder "Direcció IP o nom del host">
diff --git a/src/chrome/locale/da/network-settings.dtd b/src/chrome/locale/da/network-settings.dtd
index b7ca021..4eff2c2 100644
--- a/src/chrome/locale/da/network-settings.dtd
+++ b/src/chrome/locale/da/network-settings.dtd
@@ -9,15 +9,15 @@
<!ENTITY torSettings.firstQuestion "Hvilke af de følgende beskriver bedst din situation?">
<!ENTITY torSettings.configurePrompt1 "Denne computers internetforbindelse er censureret eller er etableret gennem en proxy.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
+<!ENTITY torSettings.configurePrompt2 "Jeg har brug for at konfigurere bro eller lokale proxy indstillinger.">
<!ENTITY torSettings.configure "Indstil">
<!ENTITY torSettings.connectPrompt2 "Jeg vil forbinde direkte til Tor netværket.">
<!ENTITY torSettings.connectPrompt3 "Dette vil virker i de fleste situationer">
<!ENTITY torSettings.connect "Tilslut">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Behøver denne computer bruge en lokal proxy for at tilgå Internettet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Hvis du ikke er sikker på svaret på dette spørgsmål, så kig på Internetindstillingerne i en anden browser for at se om den er konfigureret til at bruge en lokal proxy. ">
<!ENTITY torSettings.enterProxy "Indtast proxy-indstillinger.">
<!ENTITY torSettings.bridgeQuestion "Blokerer eller censurerer din internetudbyder (ISP) forbindelser til Tor netværket?">
<!ENTITY torSettings.bridgeHelp "Hvis du er usikker på svaret til dette spørgsmål, vælg No.  Hvis du vælger Ja, vil du blive bedt om at konfigurere Tor Broer, der er ulistede relays, som gør det sværere at blokere forbindelser til Tor Netværket.">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "Valgfri">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Denne computer skal bruge en lokal proxy for at tilgå Internettet">
<!ENTITY torsettings.useProxy.type "Proxy type:">
<!ENTITY torsettings.useProxy.address "Adresse:">
<!ENTITY torsettings.useProxy.address.placeholder "IP adresse eller værtsnavn">
diff --git a/src/chrome/locale/da/torlauncher.properties b/src/chrome/locale/da/torlauncher.properties
index 8d2d084..2c7c9ca 100644
--- a/src/chrome/locale/da/torlauncher.properties
+++ b/src/chrome/locale/da/torlauncher.properties
@@ -4,7 +4,7 @@
torlauncher.error_title=Tor starter
torlauncher.tor_exited=Tor lukkede uventet. Dette kan skyldes en fejl i selve Tor, et andet program i dit system eller en hardware-fejl. Tor-browseren vil ikke være i stand til at forbinde til noget som helst website før du genstarter Tor. Send en kopi af din Tor-log til support-teamet hvis problemet fortsætter.
-torlauncher.tor_exited2=Fanebladene i din browser vil ikke blive lukket af at du genstarter Tor.
+torlauncher.tor_exited2=Fanebladene i din browser vil ikke blive lukket ved af at du genstarter Tor.
torlauncher.tor_controlconn_failed=Kunne ikke forbinde til Tor kontrol-porten.
torlauncher.tor_failed_to_start=Tor kunne ikke starte.
torlauncher.tor_control_failed=Det lykkedes ikke at tage kontrol over Tor.
@@ -57,5 +57,5 @@ torlauncher.bootstrapWarning.resourcelimit=utilstrækkelige ressourcer
torlauncher.bootstrapWarning.identity=identitet matcher ikke
torlauncher.bootstrapWarning.timeout=forbindelse timeout
torlauncher.bootstrapWarning.noroute=ingen rute til vært
-torlauncher.bootstrapWarning.ioerror=læs/skriv fejl
+torlauncher.bootstrapWarning.ioerror=læse/skrive fejl
torlauncher.bootstrapWarning.pt_missing=mangler udskiftelig transport
diff --git a/src/chrome/locale/de/progress.dtd b/src/chrome/locale/de/progress.dtd
index 3386f46..9433d6f 100644
--- a/src/chrome/locale/de/progress.dtd
+++ b/src/chrome/locale/de/progress.dtd
@@ -1,4 +1,4 @@
<!ENTITY torprogress.dialog.title "Tor-Status">
<!ENTITY torprogress.openSettings "Einstellungen öffnen">
-<!ENTITY torprogress.heading "Mit dem Tor-Netzwerk wird verbinden">
-<!ENTITY torprogress.pleaseWait "Bitte warten, während die Verbindung zum Tor-Netzwerk hergestellt wird.">
+<!ENTITY torprogress.heading "Verbindung mit dem Tor-Netzwerk wird hergestellt">
+<!ENTITY torprogress.pleaseWait "Bitte warten Sie, während eine Verbindung zum Tor-Netzwerk hergestellt wird">
diff --git a/src/chrome/locale/es/network-settings.dtd b/src/chrome/locale/es/network-settings.dtd
index 246fe19..6aa47b2 100644
--- a/src/chrome/locale/es/network-settings.dtd
+++ b/src/chrome/locale/es/network-settings.dtd
@@ -1,4 +1,4 @@
-<!ENTITY torsettings.dialog.title "Configuración de red de Tor">
+<!ENTITY torsettings.dialog.title "Configuración de la red Tor">
<!-- For "first run" wizard: -->
@@ -7,11 +7,11 @@
<!ENTITY torSettings.yes "Si">
<!ENTITY torSettings.no "No">
-<!ENTITY torSettings.firstQuestion "¿Cuál de las siguientes describe mejor su situación?">
-<!ENTITY torSettings.configurePrompt1 "La conexión a Internet de este equipo está censurada o proxyficada.">
-<!ENTITY torSettings.configurePrompt2 "Necesito ajustar la configuración de repetidor puente (bridge) o de proxy local.">
+<!ENTITY torSettings.firstQuestion "¿Cuál de las siguientes opciones describe mejor su situación?">
+<!ENTITY torSettings.configurePrompt1 "La conexión a Internet de este equipo está censurada o proxificada.">
+<!ENTITY torSettings.configurePrompt2 "Necesito ajustar la configuración del repetidor puente(bridge) o del proxy local.">
<!ENTITY torSettings.configure "Configurar">
-<!ENTITY torSettings.connectPrompt2 "Me gustaría conectar directamente a la red Tor.">
+<!ENTITY torSettings.connectPrompt2 "Me gustaría conectarme directamente a la red Tor.">
<!ENTITY torSettings.connectPrompt3 "Esto funcionará en la mayoría de las situaciones.">
<!ENTITY torSettings.connect "Conectar">
@@ -20,8 +20,8 @@
<!ENTITY torSettings.proxyHelp "Si no está seguro de cómo responder a esta pregunta, mire la configuración de Internet en otro navegador para ver si está configurado para utilizar un proxy (interpuesto) local.">
<!ENTITY torSettings.enterProxy "Introduzca los ajustes del proxy.">
<!ENTITY torSettings.bridgeQuestion "Su proveedor de servicios de Internet (ISP) bloquea o censura de alguna forma las conexiones hacia la red Tor?">
-<!ENTITY torSettings.bridgeHelp "Si no está seguro como responder a esta pregunta, elija No.  Si usted elige Sí, se le pedirá configurar puentes Tor, los cuales son repetidores no listados que hacen más difícil el bloqueo de conexiones hacia la red Tor.">
-<!ENTITY torSettings.bridgeSettingsPrompt "Puede usar el juego de repetidores puente ('bridge') proporcionado, o puede obtener e introducir un juego de puentes personalizado.">
+<!ENTITY torSettings.bridgeHelp "Si no está seguro de como responder a esta pregunta, elija No.  Si usted elige Sí, se le pedirá configurar puentes Tor, los cuales son repetidores no listados que hacen más difícil el bloqueo de las conexiones hacia la red Tor.">
+<!ENTITY torSettings.bridgeSettingsPrompt "Puede utilizar el conjunto de repetidores puente (bridge) proporcionado, o puede obtener e introducir un juego de puentes personalizado.">
<!-- Other: -->
@@ -40,24 +40,24 @@
<!ENTITY torsettings.useProxy.type.socks4 "SOCKS 4">
<!ENTITY torsettings.useProxy.type.socks5 "SOCKS 5">
<!ENTITY torsettings.useProxy.type.http "HTTP / HTTPS">
-<!ENTITY torsettings.firewall.checkbox "Esta computadora va a través de un cortafuegos ('firewall') que sólo permite conexiones a ciertos puertos">
+<!ENTITY torsettings.firewall.checkbox "Esta computadora va a través de un cortafuegos(firewall) que sólo permite conexiones a ciertos puertos">
<!ENTITY torsettings.firewall.allowedPorts "Puertos permitidos:">
<!ENTITY torsettings.useBridges.checkbox "Mi Proveedor de Servicios de Internet (ISP) bloquea las conexiones a la red Tor">
<!ENTITY torsettings.useBridges.default "Conectar con los puentes proporcionados">
<!ENTITY torsettings.useBridges.type "Tipo de transporte:">
<!ENTITY torsettings.useBridges.custom "Introducir puentes personalizados">
-<!ENTITY torsettings.useBridges.label "Introduzca uno o más repetidores puente ('bridge', uno por línea).">
+<!ENTITY torsettings.useBridges.label "Introduzca uno o más repetidores puente(uno por línea).">
<!ENTITY torsettings.useBridges.placeholder "introduzca dirección:puerto">
-<!ENTITY torsettings.copyLog "Copiar el registro de mensajes ('log') de Tor al portapapeles">
+<!ENTITY torsettings.copyLog "Copiar el registro de mensajes(log) de Tor al portapapeles">
<!ENTITY torsettings.bridgeHelpTitle "Ayuda de repetidores puente ('bridge relays')">
-<!ENTITY torsettings.bridgeHelp1 "Si no puede conectar a la red Tor, podría ser que su proveedor de servicios de Internet (ISP) u otra agencia, esté bloqueando Tor.  A menudo, puede evitar este problema usando puentes ('bridges') de Tor, que son repetidores ('relays') de salida de la red Tor que no son publicitados, y es más difícil que sean bloqueados.">
-<!ENTITY torsettings.bridgeHelp1B "Puede usar el juego de direcciones de repetidores puente ('bridge') preconfigurado proporcionado, o puede obtener un juego de direcciones personalizado usando uno de estos tres métodos:">
+<!ENTITY torsettings.bridgeHelp1 "Si no puede conectarse a la red Tor, podría ser que su proveedor de servicios de Internet (ISP) u otra agencia, esté bloqueando Tor.  A menudo, puede evitar este problema usando puentes ('bridges') de Tor, que son repetidores ('relays') de salida de la red Tor que no son públicos, y es más difícil que sean bloqueados.">
+<!ENTITY torsettings.bridgeHelp1B "Puede usar el conjunto de direcciones de repetidores puente ('bridge') preconfigurado proporcionado, o puede obtener un conjunto de direcciones personalizado usando uno de estos tres métodos:">
<!ENTITY torsettings.bridgeHelp2Heading "Mediante la web">
<!ENTITY torsettings.bridgeHelp2 "Use un navegador web para visitar https://bridges.torproject.org">
<!ENTITY torsettings.bridgeHelp3Heading "Mediante el correo electrónico automático">
-<!ENTITY torsettings.bridgeHelp3.emailDesc "Envíe un correo electrónico a bridges(a)torproject.org únicamente con la línea 'get bridges' en el cuerpo del mensaje.  Sin embargo, para ponerle más difícil a un atacante adquirir muchas direcciones de puentes, tiene que enviar esta petición desde uno de los siguientes proveedores de correo electrónico (listados en orden de preferencia):">
+<!ENTITY torsettings.bridgeHelp3.emailDesc "Envíe un correo electrónico a bridges(a)torproject.org únicamente con la línea 'get bridges' en el cuerpo del mensaje.  Sin embargo, para ponerle más difícil a un atacante el poder adquirir muchas direcciones de puentes, tiene que enviar esta petición desde uno de los siguientes proveedores de correo electrónico (listados en orden de preferencia):">
<!ENTITY torsettings.bridgeHelp3.emailList "https://www.riseup.net, https://mail.google.com o https://mail.yahoo.com">
-<!ENTITY torsettings.bridgeHelp4Heading "Mediante el gabinete de ayuda">
+<!ENTITY torsettings.bridgeHelp4Heading "Mediante el soporte de usuario">
<!ENTITY torsettings.bridgeHelp4 "Como último recurso, puede pedir direcciones de repetidores puente enviando un cortés mensaje de correo a help(a)rt.torproject.org . 
-Por favor observe que es una persona la que tendrá que responder a cada petición.">
+Por favor tenga en cuenta que es una persona la que tendrá que responder a cada petición.">
diff --git a/src/chrome/locale/es/torlauncher.properties b/src/chrome/locale/es/torlauncher.properties
index 6f1c18a..42780e5 100644
--- a/src/chrome/locale/es/torlauncher.properties
+++ b/src/chrome/locale/es/torlauncher.properties
@@ -3,8 +3,8 @@
torlauncher.error_title=Arranque de Tor
-torlauncher.tor_exited=Tor se cerró inesperadamente. Esto podría deberse a un fallo con el propio Tor, con otro programa de su sistema, o a hardware defectuoso. Hasta que reinicie Tor, el Navegador Tor no podrá alcanzar ningún sitio web. Si el problema persiste, por favor envíe una copia de su Registro de Tor (log) al equipo de soporte.
-torlauncher.tor_exited2=Al reiniciar Tor no cerrará las pestañas de su navegador.
+torlauncher.tor_exited=Tor se cerró inesperadamente. Esto podría deberse a un fallo con el propio Tor, con otro programa de su sistema, o por hardware defectuoso. Hasta que reinicie Tor, el Navegador Tor no podrá abrir ningún sitio web. Si el problema persiste, por favor envíe una copia de su Registro de Tor (log) al equipo de soporte.
+torlauncher.tor_exited2=Al reiniciar Tor no se cerrarán las pestañas de su navegador.
torlauncher.tor_controlconn_failed=No se pudo conectar al puerto de control de Tor
torlauncher.tor_failed_to_start=Tor no pudo iniciarse.
torlauncher.tor_control_failed=Fallo al tomar control de Tor.
@@ -21,7 +21,7 @@ torlauncher.failed_to_get_settings=No se pudo recuperar las preferencias de Tor.
torlauncher.failed_to_save_settings=No fue posible guardar los ajustes de Tor.\n\n%S
torlauncher.ensure_tor_is_running=Por favor, asegúrese de que Tor se está ejecutando.
-torlauncher.error_proxy_addr_missing=Debe especificar tanto una dirección IP o nombre de máquina ('hostname') como un número de puerto para configurar Tor para que utilice un 'proxy' para acceder a la Internet.
+torlauncher.error_proxy_addr_missing=Tiene que especificar tanto una dirección IP o nombre de máquina ('hostname') como un número de puerto para configurar Tor para que utilice un 'proxy' para acceder a la Internet.
torlauncher.error_proxy_type_missing=Debe seleccionar el tipo de 'proxy'.
torlauncher.error_bridges_missing=Debe especificar uno o más puentes ('bridges').
torlauncher.error_default_bridges_type_missing=Debe seleccionar un tipo de transporte para los repetidores puente ('bridges') proporcionados.
@@ -37,7 +37,7 @@ torlauncher.done=Listo
torlauncher.forAssistance=Para obtener ayuda, contacte con %S
-torlauncher.copiedNLogMessages=Copia completada. %S mensajes de registro ('log') de Tor están listos para ser pegados en un editor de texto o un mensaje de correo electrónico.
+torlauncher.copiedNLogMessages=Copia completada. %S mensajes de registro ('log') de Tor están listos para ser pegados en un editor de texto o en un mensaje de correo electrónico.
torlauncher.bootstrapStatus.conn_dir=Conectando a un repositorio ('Directory') de repetidores ('relays')
torlauncher.bootstrapStatus.handshake_dir=Estableciendo una conexión cifrada con el repositorio de repetidores
@@ -58,4 +58,4 @@ torlauncher.bootstrapWarning.identity=las identidades no coinciden
torlauncher.bootstrapWarning.timeout=tiempo de espera de conexión agotado
torlauncher.bootstrapWarning.noroute=no hay ruta hacia el servidor ('host')
torlauncher.bootstrapWarning.ioerror=error de lectura/escritura
-torlauncher.bootstrapWarning.pt_missing=transporte enchufable desaparecido
+torlauncher.bootstrapWarning.pt_missing=transporte plugable no encontrado
diff --git a/src/chrome/locale/fi/network-settings.dtd b/src/chrome/locale/fi/network-settings.dtd
index 92d2dfe..3b70e7f 100644
--- a/src/chrome/locale/fi/network-settings.dtd
+++ b/src/chrome/locale/fi/network-settings.dtd
@@ -2,35 +2,35 @@
<!-- For "first run" wizard: -->
-<!ENTITY torsettings.prompt "Ennen kuin voit yhdistää Tor verkkoon, sinun pitää antaa tietoa tietokoneesi internet yhteydestä.">
+<!ENTITY torsettings.prompt "Ennen kuin voit yhdistää Tor-verkkoon, sinun on annettava tietoja tietokoneesi internet-yhteydestä.">
<!ENTITY torSettings.yes "Kyllä">
<!ENTITY torSettings.no "Ei">
<!ENTITY torSettings.firstQuestion "Mikä seuraavista kuvailee parhaiten tilannettasi?">
<!ENTITY torSettings.configurePrompt1 "Tämän tietokoneen internet-yhteys on sensuroitu tai kulkee välityspalvelimen kautta.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
+<!ENTITY torSettings.configurePrompt2 "Minun on asetettava sillan tai paikallisen välityspalvelimen asetukset">
<!ENTITY torSettings.configure "Määritä">
<!ENTITY torSettings.connectPrompt2 "Haluan yhdistää suoraan Tor-verkkoon.">
<!ENTITY torSettings.connectPrompt3 "Tämä toimii useimmissa tilanteissa.">
<!ENTITY torSettings.connect "Yhdistä">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Tarvitseeko tämän tietokoneen käyttää paikallista välityspalvelinta Internet-pääsyyn?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Jos et ole varma, kuinka vastata tähän kysymykseen, katso toisen selaimen Internet-asetuksista, onko se asetettu käyttämään paikallista välityspalvelinta.">
<!ENTITY torSettings.enterProxy "Kirjoita välityspalvelinasetukset.">
<!ENTITY torSettings.bridgeQuestion "Sensuroiko tai estääkö sinun operaattorisi (ISP) yhteydet Tor-verkkoon?">
-<!ENTITY torSettings.bridgeHelp "Ellet ole varma kuinka vastata tähän kysymykseen, valitse No.  Jos valitset Kyllä, sinua pyydetään määrittämään Torin Sillat, jotka ovat listaamattomia releitä, jotta yhteyksiä olisi vaikeampi estää Torin verkkoon yhdistettäessä.">
+<!ENTITY torSettings.bridgeHelp "Ellet ole varma kuinka vastata tähän kysymykseen, valitse Ei.  Jos valitset Kyllä, sinua pyydetään määrittämään Tor-sillat, jotka ovat listaamattomia välityspalvelimia, jotta yhteyksiä olisi vaikeampi estää Tor-verkkoon yhdistettäessä.">
<!ENTITY torSettings.bridgeSettingsPrompt "Voit käyttää tarjottua siltajoukkoa tai voit hankkia ja kirjoittaa oman siltojen joukon.">
<!-- Other: -->
-<!ENTITY torsettings.startingTor "Odotetaan Torin käynnistymistä...">
+<!ENTITY torsettings.startingTor "Odotetaan Tor-sovelluksen käynnistymistä...">
<!ENTITY torsettings.restartTor "Käynnistä Tor uudelleen">
<!ENTITY torsettings.optional "Vaihtoehtoinen">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Tämä tietokone tarvitsee paikallisen välityspalvelimen Internet-pääsyyn">
<!ENTITY torsettings.useProxy.type "Välityspalvelintyyppi:">
<!ENTITY torsettings.useProxy.address "Osoite:">
<!ENTITY torsettings.useProxy.address.placeholder "IP-osoite tai palvelinnimi">
@@ -46,12 +46,12 @@
<!ENTITY torsettings.useBridges.default "Yhdistä tarjotuilla silloilla">
<!ENTITY torsettings.useBridges.type "Siirtotyyppi:">
<!ENTITY torsettings.useBridges.custom "Kirjoita omat sillat">
-<!ENTITY torsettings.useBridges.label "Kirjoita yksi tai useampi siltarele (yksi per rivi).">
+<!ENTITY torsettings.useBridges.label "Kirjoita yksi tai useampi siltavälityspalvelin (yksi per rivi).">
<!ENTITY torsettings.useBridges.placeholder "kirjoita osoite:portti">
<!ENTITY torsettings.copyLog "Kopioi Tor-loki leikepöydälle">
-<!ENTITY torsettings.bridgeHelpTitle "Siltareleopaste">
-<!ENTITY torsettings.bridgeHelp1 "Jos et pysty yhdistämään Tor-verkkoon, syy voi olla, että Internet palveluntarjoajasi (ISP) tai muu taho estää Torin.  Usein voit kiertää tämän ongelman käyttämällä Tor-siltoja, jotka ovat listaamattomia releitä, joita on vaikeampi estää.">
+<!ENTITY torsettings.bridgeHelpTitle "Siltavälityspalvelinopaste">
+<!ENTITY torsettings.bridgeHelp1 "Jos et pysty yhdistämään Tor-verkkoon, syy voi olla, että Internet palveluntarjoajasi (ISP) tai muu taho estää Tor-sovelluksen.  Usein voit kiertää tämän ongelman käyttämällä Tor-siltoja, jotka ovat listaamattomia välityspalvelimia, joita on vaikeampi estää.">
<!ENTITY torsettings.bridgeHelp1B "Voit käyttää esiasetettuja, tarjottuja siltaosoitejoukkoja tai voit hankkia oman osoitejoukon käyttämällä yhtä näistä kolmesta menetelmästä:">
<!ENTITY torsettings.bridgeHelp2Heading "Verkon yli">
<!ENTITY torsettings.bridgeHelp2 "Käytä internet-selainta vieraillaksesi osoitteessa: https://bridges.torproject.org">
diff --git a/src/chrome/locale/fi/progress.dtd b/src/chrome/locale/fi/progress.dtd
index 957640e..1ddad9b 100644
--- a/src/chrome/locale/fi/progress.dtd
+++ b/src/chrome/locale/fi/progress.dtd
@@ -1,4 +1,4 @@
-<!ENTITY torprogress.dialog.title "Torin tila">
-<!ENTITY torprogress.openSettings "Avaa Asetukset">
+<!ENTITY torprogress.dialog.title "Tor-tila">
+<!ENTITY torprogress.openSettings "Avaa asetukset">
<!ENTITY torprogress.heading "Yhdistetään Tor-verkkoon">
<!ENTITY torprogress.pleaseWait "Odota hetki yhteyden muodostamista Tor-verkkoon.">
diff --git a/src/chrome/locale/fi/torlauncher.properties b/src/chrome/locale/fi/torlauncher.properties
index b5bb23c..533f596 100644
--- a/src/chrome/locale/fi/torlauncher.properties
+++ b/src/chrome/locale/fi/torlauncher.properties
@@ -3,15 +3,15 @@
torlauncher.error_title=Tor-käynnistin
-torlauncher.tor_exited=Tor sammui odottamatta. Tämä voi olla virhe Torissa itsessään, tai toisen ohjelman järjestelmässäsi aiheuttama, tai laitteistovirhe. Tor ei kykene tavoittamaan yhtään verkkosivua, jos et käynnistä Toria uudelleen. Jos tämä ongelma jatkuu, lähetä kopio Torin lokitiedostosta tukiryhmälle.
-torlauncher.tor_exited2=Torin käynnistäminen uudestaan ei sulje selaimesi välilehtiä.
-torlauncher.tor_controlconn_failed=Yhteydenotto Torin hallintaporttiin epäonnistui.
-torlauncher.tor_failed_to_start=Torin käynnistys epäonnistui.
-torlauncher.tor_control_failed=Torin haltuun ottaminen epäonnistui.
+torlauncher.tor_exited=Tor sammui odottamatta. Tämä voi olla virhe Tor-sovelluksessa itsessään, tai toisen ohjelman järjestelmässäsi aiheuttama, tai laitteistovirhe. Tor ei kykene tavoittamaan yhtään verkkosivua, jos et käynnistä Tor-sovellusta uudelleen. Jos tämä ongelma jatkuu, lähetä kopio Tor-lokitiedostosta tukiryhmälle.
+torlauncher.tor_exited2=Tor-sovelluksen käynnistäminen uudestaan ei sulje selaimesi välilehtiä.
+torlauncher.tor_controlconn_failed=Yhteydenotto Tor-sovelluksen hallintaporttiin epäonnistui.
+torlauncher.tor_failed_to_start=Tor-sovelluksen käynnistys epäonnistui.
+torlauncher.tor_control_failed=Tor-sovelluksen haltuun ottaminen epäonnistui.
torlauncher.tor_bootstrap_failed=Yhteyden muodostaminen Tor-verkkoon epäonnistui.
torlauncher.tor_bootstrap_failed_details=%1$S epäonnistui (%2$S).
-torlauncher.unable_to_start_tor=Torin käynnistys epäonnistui.\n\n%S
+torlauncher.unable_to_start_tor=Tor-sovelluksen käynnistys epäonnistui.\n\n%S
torlauncher.tor_missing=Suoritettava Tor-tiedosto puuttuu.
torlauncher.torrc_missing=Tiedosto torrc puuttuu.
torlauncher.datadir_missing=Tor-tietohakemistoa ei ole.
@@ -21,7 +21,7 @@ torlauncher.failed_to_get_settings=Tor-asetusten noutaminen epäonnistui.\n\n%S
torlauncher.failed_to_save_settings=Tor-asetusten tallentaminen epäonnistui.\n\n%S
torlauncher.ensure_tor_is_running=Varmista, että Tor on käynnissä.
-torlauncher.error_proxy_addr_missing=Sinun on määriteltävä sekä IP-osoite että porttinumero tai sekä verkkonimi että porttinumero, jotta Tor voi yhdistää välityspalvelimen kautta Internetiin.
+torlauncher.error_proxy_addr_missing=Sinun on määriteltävä sekä IP-osoite että porttinumero tai sekä verkkonimi että porttinumero, jotta Tor-sovelluksen voi yhdistää välityspalvelimen kautta Internetiin.
torlauncher.error_proxy_type_missing=Sinun on valittava välityspalvelimen tyyppi.
torlauncher.error_bridges_missing=Määrittele yksi tai useampi silta.
torlauncher.error_default_bridges_type_missing=Sinun täytyy valita siirtotyyppi tarjotuille silloille.
@@ -35,9 +35,9 @@ torlauncher.quit=Lopeta
torlauncher.quit_win=Lopeta
torlauncher.done=Valmis
-torlauncher.forAssistance=Tukea saat ottamalla yhteyttä %S
+torlauncher.forAssistance=Tukea saat ottamalla yhteyttä osoitteeseen %S
-torlauncher.copiedNLogMessages=Kopionti suoritettu. %S Tor loki viesti on valmis kopiotavaksi textieditoriin tai sähköposti viestiin.
+torlauncher.copiedNLogMessages=Kopionti suoritettu. %S Tor-lokiviestiä on valmiina kopiotavaksi tekstimuokkaimeen tai sähköpostiviestiin.
torlauncher.bootstrapStatus.conn_dir=Yhdistetään reititinhakemistoon
torlauncher.bootstrapStatus.handshake_dir=Muodostetaan suojattu yhteys hakemistoon
@@ -47,7 +47,7 @@ torlauncher.bootstrapStatus.loading_keys=Ladataan juurivarmenteita
torlauncher.bootstrapStatus.requesting_descriptors=Pyydetään reititintietoja
torlauncher.bootstrapStatus.loading_descriptors=Ladataan reititintietoja
torlauncher.bootstrapStatus.conn_or=Yhdistetään Tor-verkkoon
-torlauncher.bootstrapStatus.handshake_or=Muodostetaan Tor-reitti
+torlauncher.bootstrapStatus.handshake_or=Muodostetaan Tor-kiertotie
torlauncher.bootstrapStatus.done=Yhdistetty Tor-verkkoon!
torlauncher.bootstrapWarning.done=valmis
diff --git a/src/chrome/locale/fr/network-settings.dtd b/src/chrome/locale/fr/network-settings.dtd
index b9c5b7d..877dc1a 100644
--- a/src/chrome/locale/fr/network-settings.dtd
+++ b/src/chrome/locale/fr/network-settings.dtd
@@ -9,15 +9,15 @@
<!ENTITY torSettings.firstQuestion "Laquelle des phrases suivantes décrit le mieux votre situation ?">
<!ENTITY torSettings.configurePrompt1 "Le connexion internet de cet ordinateur est bloqué ou utilise un proxy.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
+<!ENTITY torSettings.configurePrompt2 "Je dois configurer le pont réseau ou les paramètres du proxy.">
<!ENTITY torSettings.configure "Configurer">
<!ENTITY torSettings.connectPrompt2 "Je souhaite me connecter directement au réseau Tor.">
<!ENTITY torSettings.connectPrompt3 "Cela fonctionnera dans la plupart des situations.">
<!ENTITY torSettings.connect "Se connecter">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Est-ce que cet ordinateur a besoin d'utiliser un proxy pour accéder à internet ?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Si vous n'êtes pas sure de la réponse à cette question, regardez les paramètres internet dans un autre navigateur pour voir si il est configuré pour l'utilisation d'un proxy.">
<!ENTITY torSettings.enterProxy "Entrez les paramètres de votre proxy.">
<!ENTITY torSettings.bridgeQuestion "Est-ce que votre Fournisseur d'Accès Internet (FAI) bloque les connexions au réseau Tor ?">
<!ENTITY torSettings.bridgeHelp "Si vous ne savez pas comment répondre à cette question, choisissez Non.  Si vous choisissez Oui, il vous sera demandé de configurer les bridges Tor qui sont des relais non listés et qui rendent plus difficile le blocage du réseau Tor.">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "Optionnel">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Cet ordinateur a besoin d'utiliser un proxy pour accéder à internet.">
<!ENTITY torsettings.useProxy.type "Type de proxy :">
<!ENTITY torsettings.useProxy.address "Adresse :">
<!ENTITY torsettings.useProxy.address.placeholder "Adresse IP ou nom d'hôte">
diff --git a/src/chrome/locale/fr/progress.dtd b/src/chrome/locale/fr/progress.dtd
index 936d220..d028d4c 100644
--- a/src/chrome/locale/fr/progress.dtd
+++ b/src/chrome/locale/fr/progress.dtd
@@ -1,4 +1,4 @@
<!ENTITY torprogress.dialog.title "État de Tor">
<!ENTITY torprogress.openSettings "Ouvrir les paramètres">
<!ENTITY torprogress.heading "Connexion au réseau Tor">
-<!ENTITY torprogress.pleaseWait "Veuillez patienter pendant que la connexion au réseau Tor est établie.">
+<!ENTITY torprogress.pleaseWait "Veuillez patienter pendant que la connexion au réseau Tor s'établit.">
diff --git a/src/chrome/locale/hi/progress.dtd b/src/chrome/locale/hi/progress.dtd
index ebd9cef..87f2f41 100644
--- a/src/chrome/locale/hi/progress.dtd
+++ b/src/chrome/locale/hi/progress.dtd
@@ -1,4 +1,4 @@
-<!ENTITY torprogress.dialog.title "Tor Status">
-<!ENTITY torprogress.openSettings "Open Settings">
-<!ENTITY torprogress.heading "Connecting to the Tor network">
-<!ENTITY torprogress.pleaseWait "Please wait while we establish a connection to the Tor network.">
+<!ENTITY torprogress.dialog.title "टोर स्थिति">
+<!ENTITY torprogress.openSettings "व्यवस्था खोलें">
+<!ENTITY torprogress.heading "टोर संजाल से जुड़ रहा है">
+<!ENTITY torprogress.pleaseWait "टोर संजाल से संचार स्थापित होने तक प्रतीक्षा करें।">
diff --git a/src/chrome/locale/hi/torlauncher.properties b/src/chrome/locale/hi/torlauncher.properties
index 2bea597..f093ec6 100644
--- a/src/chrome/locale/hi/torlauncher.properties
+++ b/src/chrome/locale/hi/torlauncher.properties
@@ -46,7 +46,7 @@ torlauncher.bootstrapStatus.loading_status=Loading network status
torlauncher.bootstrapStatus.loading_keys=Loading authority certificates
torlauncher.bootstrapStatus.requesting_descriptors=Requesting relay information
torlauncher.bootstrapStatus.loading_descriptors=Loading relay information
-torlauncher.bootstrapStatus.conn_or=Connecting to the Tor network
+torlauncher.bootstrapStatus.conn_or=टोर संजाल से जुड़ रहा है
torlauncher.bootstrapStatus.handshake_or=Establishing a Tor circuit
torlauncher.bootstrapStatus.done=Connected to the Tor network!
diff --git a/src/chrome/locale/hu/network-settings.dtd b/src/chrome/locale/hu/network-settings.dtd
index 2f95130..5d9c56a 100644
--- a/src/chrome/locale/hu/network-settings.dtd
+++ b/src/chrome/locale/hu/network-settings.dtd
@@ -9,15 +9,15 @@
<!ENTITY torSettings.firstQuestion "A következők közül melyik illik jobban a szituációhoz?">
<!ENTITY torSettings.configurePrompt1 "Ennek a számítógépnek a forgalma cenzorált vagy proxizott.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
+<!ENTITY torSettings.configurePrompt2 "Szükségem van híd vagy helyi proxy beállítására.">
<!ENTITY torSettings.configure "Beállít">
<!ENTITY torSettings.connectPrompt2 "Szeretnék közvetlenül kapcsolódni a Tor hálózathoz.">
<!ENTITY torSettings.connectPrompt3 "A legtöbb esetben ez működni fog.">
<!ENTITY torSettings.connect "Csatlakozás">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Ez a számítgép helyi proxyn keresztül éri el az Internetet? ">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Ha nem biztos ennek a kérdésnek a megválaszolásában, kattintson az Internet beállításokra a másik böngészőjében, és tekintse meg, hog van-e benne beállítva helyiproxy.">
<!ENTITY torSettings.enterProxy "Adja meg a proxy beállításokat.">
<!ENTITY torSettings.bridgeQuestion "Az internet szolgáltatód (ISP) blokkolja vagy cenzúrázza a kapcsolatot a Tor hálózathoz?">
<!ENTITY torSettings.bridgeHelp "Ha nem vagy biztos a válaszban, válaszd a Nem-et.  Ha az Igen-t választod neked kell konfigurálni a Tor bridges amik nem listázott átjátszók és nehezebbé teszik a Tor hálózat kapcsolódásának a blokkolását.">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "Opcionális">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Ez a számítógép helyi proxyn keresztül kell éri el az Internetet">
<!ENTITY torsettings.useProxy.type "Proxy Típus:">
<!ENTITY torsettings.useProxy.address "Cím:">
<!ENTITY torsettings.useProxy.address.placeholder "IP cím vagy gépnév">
diff --git a/src/chrome/locale/id/network-settings.dtd b/src/chrome/locale/id/network-settings.dtd
index 1acf78d..428626b 100644
--- a/src/chrome/locale/id/network-settings.dtd
+++ b/src/chrome/locale/id/network-settings.dtd
@@ -9,15 +9,15 @@
<!ENTITY torSettings.firstQuestion "Yang mana dari di bawah ini cocok dengan situasi anda?">
<!ENTITY torSettings.configurePrompt1 "Koneksi internet komputer ini disensor atau terproksi.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
+<!ENTITY torSettings.configurePrompt2 "Saya membutuhkan konfigurasi jembatan atau seting proksi lokal">
<!ENTITY torSettings.configure "Konfigur">
<!ENTITY torSettings.connectPrompt2 "Saya ingin menghubungkan secara langsung ke jaringan Tor.">
<!ENTITY torSettings.connectPrompt3 "Hal ini akan bekerja dalam kebanyakan situasi.">
<!ENTITY torSettings.connect "Hubungi">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Apakah komputer ini membutuhkan proksi lokal untuk dapat mengakses internet ?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Jika anda tidak yakin untuk menjawab pertanyaan ini, llihatlah pada setelan jaringan di browser lain apakah terkonfigurasi dengan proksi lokal.">
<!ENTITY torSettings.enterProxy "Masukkan pengaturan proxy.">
<!ENTITY torSettings.bridgeQuestion "Apakah Internet Service Provider (ISP) blok atau sensor koneksi lain ke Tor Jaringan?">
<!ENTITY torSettings.bridgeHelp "Jika Anda tidak yakin bagaimana untuk menjawab pertanyaan ini, pilih No.  Jika Anda memilih Ya, Anda akan diminta untuk mengkonfigurasi Tor Bridges, yang relai terdaftar yang membuat lebih sulit untuk memblokir koneksi ke jaringan Tor.">
@@ -53,7 +53,7 @@
<!ENTITY torsettings.bridgeHelpTitle "Bantuan Bridge Relay">
<!ENTITY torsettings.bridgeHelp1 "Jika Anda tidak dapat terhubung ke jaringan Tor, bisa jadi Provider Layanan Internet (ISP) atau lembaga lain yang menghalangi Tor.   Sering kali, Anda dapat mengatasi masalah ini dengan menggunakan Tor Bridges, yang relai terdaftar yang lebih sulit untuk memblokir.">
<!ENTITY torsettings.bridgeHelp1B "Anda dapat menggunakan prekonfigurasi, disediakan alamat set bridge atau Anda mungkin mendapatkan satu set kebiasaan alamat dengan menggunakan salah satu dari tiga metode ini:">
-<!ENTITY torsettings.bridgeHelp2Heading "Through the Web">
+<!ENTITY torsettings.bridgeHelp2Heading "Lewat web">
<!ENTITY torsettings.bridgeHelp2 "Use a web browser to visit https://bridges.torproject.org">
<!ENTITY torsettings.bridgeHelp3Heading "Through the Email Autoresponder">
<!ENTITY torsettings.bridgeHelp3.emailDesc "Send email to bridges(a)torproject.org with the line 'get bridges' by itself in the body of the message.  However, to make it harder for an attacker to learn a lot of bridge addresses, you must send this request from one of the following email providers (listed in order of preference):">
diff --git a/src/chrome/locale/it/network-settings.dtd b/src/chrome/locale/it/network-settings.dtd
index 3343dec..4d866db 100644
--- a/src/chrome/locale/it/network-settings.dtd
+++ b/src/chrome/locale/it/network-settings.dtd
@@ -15,9 +15,9 @@
<!ENTITY torSettings.connectPrompt3 "Questo funzionerà nella maggior parte delle situazioni.">
<!ENTITY torSettings.connect "Connetti">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Questo computer richiede l'uso di un proxy locale per accedere ad Internet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Se non sei sicuro su come rispondere a questa domanda, guarda alle impostazioni Internet in un altro browser per vedere come è configurato per l'uso di un proxy locale.">
<!ENTITY torSettings.enterProxy "Inserisci le impostazioni del proxy.">
<!ENTITY torSettings.bridgeQuestion "Il tuo fornitore di servizi internet (ISP) blocca o censura la connessione alla rete Tor?">
<!ENTITY torSettings.bridgeHelp "Se non sei sicuro di come rispondere alla domanda, scegli No.  Se scegli Sì, ti verrà chiesto di configurare Tor Bridges, che consiste in relay non elencati che rendono più difficile bloccare le connessioni alla Rete Tor.">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "Facoltativo">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Questo computer richiede l'uso di un proxy locale per accedere a Internet">
<!ENTITY torsettings.useProxy.type "Tipo di proxy:">
<!ENTITY torsettings.useProxy.address "Indirizzo:">
<!ENTITY torsettings.useProxy.address.placeholder "Indirizzo IP oppure hostname">
diff --git a/src/chrome/locale/lo/torlauncher.properties b/src/chrome/locale/lo/torlauncher.properties
index a849dfe..10e34b0 100644
--- a/src/chrome/locale/lo/torlauncher.properties
+++ b/src/chrome/locale/lo/torlauncher.properties
@@ -27,7 +27,7 @@ torlauncher.error_bridges_missing=You must specify one or more bridges.
torlauncher.error_default_bridges_type_missing=You must select a transport type for the provided bridges.
torlauncher.error_bridge_bad_default_type=No provided bridges that have the transport type %S are available. Please adjust your settings.
-torlauncher.recommended_bridge=(recommended)
+torlauncher.recommended_bridge=(ແນະນໍາ)
torlauncher.connect=ເຊື່ອມຕໍ່
torlauncher.restart_tor=Restart Tor
diff --git a/src/chrome/locale/nb/network-settings.dtd b/src/chrome/locale/nb/network-settings.dtd
index 1371170..94b7875 100644
--- a/src/chrome/locale/nb/network-settings.dtd
+++ b/src/chrome/locale/nb/network-settings.dtd
@@ -9,15 +9,15 @@
<!ENTITY torSettings.firstQuestion "Hvilket av følgende beskriver best din situasjon?">
<!ENTITY torSettings.configurePrompt1 "Computeren's internett tilkobling er sensurert eller under proxy.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
+<!ENTITY torSettings.configurePrompt2 "Jeg trenger å konfigurere en bro eller lokale mellomtjener innstillinger.">
<!ENTITY torSettings.configure "Konfigurer">
<!ENTITY torSettings.connectPrompt2 "Jeg vil koble direkte til Tor-nettverket.">
<!ENTITY torSettings.connectPrompt3 "Dette vil fungere i de fleste situasjoner.">
<!ENTITY torSettings.connect "Koble til">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Trenger denne maskinen å bruke en lokal mellomtjener for å nå Internett?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Dersom du er usikker på hvordan du skal svare på dette spørsmålet, sjekk Internett innstillingene i en annen nettleser for å se om den er konfigurert til å bruke en lokal mellomtjener.">
<!ENTITY torSettings.enterProxy "Skriv inn proxy-innstillingene.">
<!ENTITY torSettings.bridgeQuestion "Blokkerer eller sensurerer internettleverandøren (ISP) din tilkoblinger til Tor-nettverket?">
<!ENTITY torSettings.bridgeHelp "Hvis du er usikker på hva du skal svare på dette spørsmålet, velg Nei.  Hvis du velger Ja, vil du bli bedt om å konfigurere Tor-broer, som er ulistede reléer som gjør det vanskeligere å blokkere tilkoblinger til Tor-nettverket.">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "Valgfritt">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Denne maskinen trenger å bruke en mellomtjener for å nå Internett">
<!ENTITY torsettings.useProxy.type "Proxytype:">
<!ENTITY torsettings.useProxy.address "Adresse:">
<!ENTITY torsettings.useProxy.address.placeholder "IP-adresse, eller vertsnavn">
diff --git a/src/chrome/locale/pt/network-settings.dtd b/src/chrome/locale/pt/network-settings.dtd
index 68cf442..d8093f2 100644
--- a/src/chrome/locale/pt/network-settings.dtd
+++ b/src/chrome/locale/pt/network-settings.dtd
@@ -9,15 +9,15 @@
<!ENTITY torSettings.firstQuestion "Qual das seguintes frases melhor descreve a sua situação?">
<!ENTITY torSettings.configurePrompt1 "Esta ligação à Internet deste computador está censurada ou é efetuada via proxy.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
+<!ENTITY torSettings.configurePrompt2 "Preciso de configurar a ponte ou as definições locais de proxy.">
<!ENTITY torSettings.configure "Configurar">
<!ENTITY torSettings.connectPrompt2 "Eu gostaria de me ligar diretamente à rede Tor.">
<!ENTITY torSettings.connectPrompt3 "Isto funciona na maior parte das situações.">
<!ENTITY torSettings.connect "Ligar">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Este computador precisa de usar um acesso proxy à Intrnet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Se não tem a certeza da resposta, veja as definições de Internet noutro navegador para confirmar se está configurado para usar um proxy local.">
<!ENTITY torSettings.enterProxy "Insira as definições do proxy.">
<!ENTITY torSettings.bridgeQuestion "O seu fornecedor de serviços de internet bloqueia ou censura ligações à rede Tor ?">
<!ENTITY torSettings.bridgeHelp "Se não tem a certeza de como responder a esta questão, escolha o Nº.  Se escolher Sim, vai-lhe ser pedido para configurar as Tor Bridges, que são pontos de passagem não listados mais difíceis de bloquear ligações à rede Tor.">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "Opcional">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Este computador precisa de usar um proxy local para aceder à Internet.">
<!ENTITY torsettings.useProxy.type "Tipo de Proxy:">
<!ENTITY torsettings.useProxy.address "Endereço:">
<!ENTITY torsettings.useProxy.address.placeholder "Endereço de IP ou nome do anfitrião">
diff --git a/src/chrome/locale/pt/torlauncher.properties b/src/chrome/locale/pt/torlauncher.properties
index 78b4729..45b7a61 100644
--- a/src/chrome/locale/pt/torlauncher.properties
+++ b/src/chrome/locale/pt/torlauncher.properties
@@ -1,14 +1,14 @@
### Copyright (c) 2014, The Tor Project, Inc.
### See LICENSE for licensing information.
-torlauncher.error_title=Iniciador Tor
-
-torlauncher.tor_exited=O tor encerrou inesperadamente. Pode ser devido a erro dentro o Tor, noutro programa no seu sistema ou falha no equipamento. Até reiniciar, o Tor não será capaz de aceder a nenhum website. Se o problema persistir, por favor envie uma cópia do diário do seu Tor à equipa de assistência.
-torlauncher.tor_exited2=Reiniciar o Tor não fecha os seus separadores.
-torlauncher.tor_controlconn_failed=Não foi possível ligar ao porto de controlo do Tor.
-torlauncher.tor_failed_to_start=O Tor falhou a inicialização.
-torlauncher.tor_control_failed=Falha ao tentar controlar o Tor
-torlauncher.tor_bootstrap_failed=O Tor falhou ao estabelecer uma ligação de rede Tor.
+torlauncher.error_title=Executor Tor
+
+torlauncher.tor_exited=O Tor encerrou inesperadamente. Isto pode ter acontecido devido a erro dentro do Tor, outro programa no seu sistema ou falha de hardware. Até que reinicie o Tor, o Navegador Tor não irá poder aceder a quaisquer sítios da Web. Se o problema persistir, por favor, envie uma cópia do Registo de Eventos do seu Tor para a equipa de suporte.
+torlauncher.tor_exited2=Ao reiniciar o Tor não irá fechar os separadores do seu navegador.
+torlauncher.tor_controlconn_failed=Não foi possível conetar à porta de controlo do Tor.
+torlauncher.tor_failed_to_start=O Tor não foi iniciado.
+torlauncher.tor_control_failed=Não foi possível obter o controlo do Tor
+torlauncher.tor_bootstrap_failed=O Tor não conseguiu estabelecer uma ligação de rede Tor.
torlauncher.tor_bootstrap_failed_details=%1$S falhou (%2$S).
torlauncher.unable_to_start_tor=Não é possível iniciar o Tor.\n\n %S
@@ -19,13 +19,13 @@ torlauncher.password_hash_missing=Não foi possível obter a senha "hashed".
torlauncher.failed_to_get_settings=Não é possível obter as definições do Tor\n\n %S
torlauncher.failed_to_save_settings=Não é possível guardar as definições do Tor\n\n %S
-torlauncher.ensure_tor_is_running=Por favor, verifique se o Tor está em execução.
+torlauncher.ensure_tor_is_running=Por favor, assegure que o Tor está em execução.
-torlauncher.error_proxy_addr_missing=Deve especificar tanto um endereço IP ou nome do hospedeiro como um número de porto, para configurar o Tor para utilizar um proxy para aceder à Internet.
+torlauncher.error_proxy_addr_missing=Deve especificar ambos, um endereço de IP ou o nome de hospedeiro e um número de porta para configurar o Tor, para utilizar um proxy para aceder à Internet.
torlauncher.error_proxy_type_missing=Deve selecionar o tipo de proxy.
torlauncher.error_bridges_missing=Deve especificar uma ou mais pontes.
torlauncher.error_default_bridges_type_missing=Deve selecionar o tipo de transporte para as pontes fornecidas
-torlauncher.error_bridge_bad_default_type=Não há pontes disponíveis que tenham o tipo de transport %S. Por favor ajuste as configurações.
+torlauncher.error_bridge_bad_default_type=Não estão disponíveis as pontes fornecidas que têm o tipo de transporte %S. Por favor, ajuste as suas configurações.
torlauncher.recommended_bridge=(recomendado)
@@ -33,19 +33,19 @@ torlauncher.connect=Ligar
torlauncher.restart_tor=Reiniciar o Tor
torlauncher.quit=Sair
torlauncher.quit_win=Sair
-torlauncher.done=Completo
+torlauncher.done=Concluído
torlauncher.forAssistance=Para assistência, contacte %S
-torlauncher.copiedNLogMessages=Cópia completa. %S mensagens de diário estão prontas para ser coladas num editor de texto ou numa mensagem de correio eletrónico.
+torlauncher.copiedNLogMessages=Cópia completa. Estão prontas %S mensagens do registo de eventos do Tor para serem coladas num editor de texto ou numa mensagem de correio eletrónico.
torlauncher.bootstrapStatus.conn_dir=A ligar ao diretório do retransmissor
-torlauncher.bootstrapStatus.handshake_dir=A estabelecer uma ligação de diretório encriptada
+torlauncher.bootstrapStatus.handshake_dir=A estabelecer uma ligação de diretoria encriptada
torlauncher.bootstrapStatus.requesting_status=A obter o estado da rede
torlauncher.bootstrapStatus.loading_status=A carregar o estado da rede
torlauncher.bootstrapStatus.loading_keys=A carregar os certificados de autoridade
-torlauncher.bootstrapStatus.requesting_descriptors=A pedir informação do retransmissor
-torlauncher.bootstrapStatus.loading_descriptors=A carregar informações do retransmissor
+torlauncher.bootstrapStatus.requesting_descriptors=A solicitar a informação do retransmissor
+torlauncher.bootstrapStatus.loading_descriptors=A carregar a informação do retransmissor
torlauncher.bootstrapStatus.conn_or=A ligar à rede Tor
torlauncher.bootstrapStatus.handshake_or=A estabelecer um circuito Tor
torlauncher.bootstrapStatus.done=Ligado à rede Tor
@@ -55,7 +55,7 @@ torlauncher.bootstrapWarning.connectrefused=ligação recusada
torlauncher.bootstrapWarning.misc=diversos
torlauncher.bootstrapWarning.resourcelimit=recursos insuficientes
torlauncher.bootstrapWarning.identity=identidade não correspondente
-torlauncher.bootstrapWarning.timeout=Tempo de ligação expirado
+torlauncher.bootstrapWarning.timeout=ligação expirada
torlauncher.bootstrapWarning.noroute=sem rota para o hospedeiro
-torlauncher.bootstrapWarning.ioerror=Erro de leitura/escrita
-torlauncher.bootstrapWarning.pt_missing=Transporte de ligacao ausente
+torlauncher.bootstrapWarning.ioerror=Erro de leitura/gravação
+torlauncher.bootstrapWarning.pt_missing=transporte de ligação em falta
diff --git a/src/chrome/locale/sq/network-settings.dtd b/src/chrome/locale/sq/network-settings.dtd
index d8eafe3..85b0cae 100644
--- a/src/chrome/locale/sq/network-settings.dtd
+++ b/src/chrome/locale/sq/network-settings.dtd
@@ -1,62 +1,62 @@
-<!ENTITY torsettings.dialog.title "Parametrat e rrjetit Tor">
+<!ENTITY torsettings.dialog.title "Konfigurimi i Rrjetit të Tor">
<!-- For "first run" wizard: -->
-<!ENTITY torsettings.prompt "Before you connect to the Tor network, you need to provide information about this computer's Internet connection.">
+<!ENTITY torsettings.prompt "Përpara se të lidheni me rrjetin e Tor, ju nevojitet të ofroni informacion rreth lidhjes së Internetit të këtij kompjuteri.">
<!ENTITY torSettings.yes "Po">
<!ENTITY torSettings.no "Jo">
-<!ENTITY torSettings.firstQuestion "Cila nga këto i përshtatet më shumë situatës tuaj aktuale?">
-<!ENTITY torSettings.configurePrompt1 "This computer's Internet connection is censored or proxied.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
-<!ENTITY torSettings.configure "Konfiguro">
-<!ENTITY torSettings.connectPrompt2 "Do të dëshiroja të lidhesha direkt me rrjetin Tor.">
-<!ENTITY torSettings.connectPrompt3 "This will work in most situations.">
-<!ENTITY torSettings.connect "Lidhu">
+<!ENTITY torSettings.firstQuestion "Cila nga këto e përshkruan më mirë situatën tuaj të tanishme?">
+<!ENTITY torSettings.configurePrompt1 "Lidhja e Internetit të këtij kompjuteri është e censuruar ose me proxy">
+<!ENTITY torSettings.configurePrompt2 "Më duhet të konfiguroj urën ose parametrat e proxy-t.">
+<!ENTITY torSettings.configure "Konfiguroni">
+<!ENTITY torSettings.connectPrompt2 "Do të dëshiroja të lidhesha drejtpërdrejt me rrjetin e Tor.">
+<!ENTITY torSettings.connectPrompt3 "Kjo do të funksionojë në shumë situata.">
+<!ENTITY torSettings.connect "Lidhuni">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "A i nevojitet këtij kompjuteri që të përdorë një proxy lokal, për t'u qasur në Internet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
-<!ENTITY torSettings.enterProxy "Jepni parametrat e përfaqësimit 'proxy'.">
-<!ENTITY torSettings.bridgeQuestion "Does your Internet Service Provider (ISP) block or otherwise censor connections to the Tor Network?">
-<!ENTITY torSettings.bridgeHelp "If you are not sure how to answer this question, choose No.  If you choose Yes, you will be asked to configure Tor Bridges, which are unlisted relays that make it more difficult to block connections to the Tor Network.">
-<!ENTITY torSettings.bridgeSettingsPrompt "You may use the provided set of bridges or you may obtain and enter a custom set of bridges.">
+<!ENTITY torSettings.proxyHelp "Nëse s'jeni i sigurt sesi t'i përgjigjeni kësaj pyetje, shikoni tek konfigurimi i Internetit në një tjetër shfletues, për të parë nëse ai është i konfiguruar për të përdorur një proxy lokal.">
+<!ENTITY torSettings.enterProxy "Futni konfigurimin e proxy-t.">
+<!ENTITY torSettings.bridgeQuestion "A i pengon ose censuron lidhjet për tek Rrjeti Tor, Ofruesi juaj i Shërbimit Internet (ISP)?">
+<!ENTITY torSettings.bridgeHelp "Nëse s'jeni i sigurt sesi t'i përgjigjeni kësaj pyetje, përzgjidhni "Jo".  Nëse përzgjidhni "Po", do t'ju kërkohet të konfiguroni Tor bridges, të cilat janë rele të palistuara, që e bëjnë më të vështirë pengimin e lidhjeve për tek Rrjeti Tor.">
+<!ENTITY torSettings.bridgeSettingsPrompt "Ju mund të përdorni grupin e dhënë të urave, ose mund të përftoni dhe futni një sasi të personalizuar urash.">
<!-- Other: -->
<!ENTITY torsettings.startingTor "Duke pritur që Tor të nisë...">
-<!ENTITY torsettings.restartTor "Restart Tor">
+<!ENTITY torsettings.restartTor "Riniseni Tor-in">
-<!ENTITY torsettings.optional "Fakultativ">
+<!ENTITY torsettings.optional "Me zgjedhje">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
-<!ENTITY torsettings.useProxy.type "Tipi i përfaqësuesit:">
+<!ENTITY torsettings.useProxy.checkbox "Ky kompjuter nevojitet që të përdorë një proxy lokal, që të ketë qasje në Internet">
+<!ENTITY torsettings.useProxy.type "Lloji i Proxy-t:">
<!ENTITY torsettings.useProxy.address "Adresa:">
<!ENTITY torsettings.useProxy.address.placeholder "Adresa IP ose emri i pritësit">
<!ENTITY torsettings.useProxy.port "Porta:">
-<!ENTITY torsettings.useProxy.username "Përdoruesi:">
-<!ENTITY torsettings.useProxy.password "Password:">
+<!ENTITY torsettings.useProxy.username "Emri i përdoruesit:">
+<!ENTITY torsettings.useProxy.password "Fjalëkalimi:">
<!ENTITY torsettings.useProxy.type.socks4 "SOCKS 4">
<!ENTITY torsettings.useProxy.type.socks5 "SOCKS 5">
<!ENTITY torsettings.useProxy.type.http "HTTP / HTTPS">
-<!ENTITY torsettings.firewall.checkbox "Ky kompjuter kalon nëpërmjet një mbrojtësi 'firewall' i cili lejon lidhje vetëm në disa porta.">
-<!ENTITY torsettings.firewall.allowedPorts "Portat e lejuara:">
-<!ENTITY torsettings.useBridges.checkbox "Ofruesi im i shërbimit të internetit (ISP) bllokon lidhjet drejt rrjetit Tor">
-<!ENTITY torsettings.useBridges.default "Connect with provided bridges">
-<!ENTITY torsettings.useBridges.type "Transport type:">
-<!ENTITY torsettings.useBridges.custom "Enter custom bridges">
-<!ENTITY torsettings.useBridges.label "Jepni një ose më shumë rele urash (një për çdo rresht)">
-<!ENTITY torsettings.useBridges.placeholder "type address:port">
-
-<!ENTITY torsettings.copyLog "Kopjo ditarin e Tor në Clipboard">
-<!ENTITY torsettings.bridgeHelpTitle "Ndihmë mbi relenë e urës">
-<!ENTITY torsettings.bridgeHelp1 "If you are unable to connect to the Tor network, it could be that your Internet Service Provider (ISP) or another agency is blocking Tor.  Often, you can work around this problem by using Tor Bridges, which are unlisted relays that are more difficult to block.">
-<!ENTITY torsettings.bridgeHelp1B "You may use the preconfigured, provided set of bridge addresses or you may obtain a custom set of addresses by using one of these three methods:">
-<!ENTITY torsettings.bridgeHelp2Heading "Through the Web">
-<!ENTITY torsettings.bridgeHelp2 "Use a web browser to visit https://bridges.torproject.org">
-<!ENTITY torsettings.bridgeHelp3Heading "Through the Email Autoresponder">
-<!ENTITY torsettings.bridgeHelp3.emailDesc "Send email to bridges(a)torproject.org with the line 'get bridges' by itself in the body of the message.  However, to make it harder for an attacker to learn a lot of bridge addresses, you must send this request from one of the following email providers (listed in order of preference):">
+<!ENTITY torsettings.firewall.checkbox "Ky kompjuter kalon përmes një muri mbrojtës, që i lejon lidhje vetëm me disa porta.">
+<!ENTITY torsettings.firewall.allowedPorts "Portat e Lejuara:">
+<!ENTITY torsettings.useBridges.checkbox "Ofruesi im i Shërbimit të Internetit (ISP) pengon lidhjet drejt rrjetit Tor">
+<!ENTITY torsettings.useBridges.default "Lidhuni me urat e ofruara">
+<!ENTITY torsettings.useBridges.type "Lloji i Transportit:">
+<!ENTITY torsettings.useBridges.custom "Futini urat e përshtatura">
+<!ENTITY torsettings.useBridges.label "Futni një ose më shumë rele urë (një për rresht)">
+<!ENTITY torsettings.useBridges.placeholder "lloji i adresës:portë">
+
+<!ENTITY torsettings.copyLog "Kopjojeni Regjistrin e Tor në Kujtesën e fragmenteve">
+<!ENTITY torsettings.bridgeHelpTitle "Ndihma mbi Relenë e Urë">
+<!ENTITY torsettings.bridgeHelp1 "Nëse s'mundeni të lidheni me rrjetin Tor, mund të jetë sepse Ofruesi juaj i Shërbimit të Internetit (ISP), ose ndonjë agjenci tjetër po pengojnë Tor.  Shpesh, ju mund ta shmangni këtë problem, duke përdorur urat e Tor, të cilat janë rele të palistuara, që janë shumë më të vështira për t'u penguar.">
+<!ENTITY torsettings.bridgeHelp1B "Ju mund të përdorni grupin e ofruar e të parakonfiguruar të adresave ura, ose mund të përftoni një grup adresash të përshtatura, duke përdorur një nga këto tre metoda:">
+<!ENTITY torsettings.bridgeHelp2Heading "Përmes Web-it">
+<!ENTITY torsettings.bridgeHelp2 "Përdorni një shfletues web-i që të vizitoni https://bridges.torproject.org">
+<!ENTITY torsettings.bridgeHelp3Heading "Përmes Vetëpërgjigjes se E-postës">
+<!ENTITY torsettings.bridgeHelp3.emailDesc "Dërgoni e-postë tek bridges(a)torproject.org me reshtin 'get bridges' të veçuar në trupin e mesazhit.  Megjithatë, për ta bërë më të vështirë që një sulmues të mësojë shumë adresa ura, ju duhet ta dërgoni këtë kërkesë nga njëri prej ofruesve të e-postës (listuar sipas rendit të parapëlqimit):">
<!ENTITY torsettings.bridgeHelp3.emailList "https://www.riseup.net, https://mail.google.com, or https://mail.yahoo.com">
-<!ENTITY torsettings.bridgeHelp4Heading "Through the Help Desk">
-<!ENTITY torsettings.bridgeHelp4 "As a last resort, you can request bridge addresses by sending a polite email message to help(a)rt.torproject.org.  Please note that a person will need to respond to each request.">
+<!ENTITY torsettings.bridgeHelp4Heading "Përmes Help Desk-ut">
+<!ENTITY torsettings.bridgeHelp4 "Si mjet të fundit, ju mund të kërkoni adresat urë, duke dërguar një mesazh e-poste me politesë tek help(a)rt.torproject.org.  Ju lutemi vini re se një person do të duhet t'i përgjigjet çdo kërkese.">
diff --git a/src/chrome/locale/sq/progress.dtd b/src/chrome/locale/sq/progress.dtd
index b127352..8138a00 100644
--- a/src/chrome/locale/sq/progress.dtd
+++ b/src/chrome/locale/sq/progress.dtd
@@ -1,4 +1,4 @@
-<!ENTITY torprogress.dialog.title "Statusi i Tor">
-<!ENTITY torprogress.openSettings "Hap parametrat">
-<!ENTITY torprogress.heading "Duke u lidhur me rrjetin e Tor">
-<!ENTITY torprogress.pleaseWait "Ju lutem prisni deri sa të vendoset nje lidhje me rrjetin e Tor">
+<!ENTITY torprogress.dialog.title "Gjendja e Tor">
+<!ENTITY torprogress.openSettings "Hapeni Konfigurimin">
+<!ENTITY torprogress.heading "Duke u lidhur me rrjetin Tor">
+<!ENTITY torprogress.pleaseWait "Ju lutemi prisni derisa të vendoset një lidhje me rrjetin Tor">
diff --git a/src/chrome/locale/sq/torlauncher.properties b/src/chrome/locale/sq/torlauncher.properties
index 0b3ae2d..b32ee99 100644
--- a/src/chrome/locale/sq/torlauncher.properties
+++ b/src/chrome/locale/sq/torlauncher.properties
@@ -1,61 +1,61 @@
### Copyright (c) 2014, The Tor Project, Inc.
### See LICENSE for licensing information.
-torlauncher.error_title=Tor Launcher
-
-torlauncher.tor_exited=Tor unexpectedly exited. This might be due to a bug in Tor itself, another program on your system, or faulty hardware. Until you restart Tor, the Tor Browser will not able to reach any websites. If the problem persists, please send a copy of your Tor Log to the support team.
-torlauncher.tor_exited2=Restarting Tor will not close your browser tabs.
-torlauncher.tor_controlconn_failed=Could not connect to Tor control port.
-torlauncher.tor_failed_to_start=Tor failed to start.
-torlauncher.tor_control_failed=Failed to take control of Tor.
-torlauncher.tor_bootstrap_failed=Tor failed to establish a Tor network connection.
-torlauncher.tor_bootstrap_failed_details=%1$S failed (%2$S).
-
-torlauncher.unable_to_start_tor=Unable to start Tor.\n\n%S
-torlauncher.tor_missing=The Tor executable is missing.
-torlauncher.torrc_missing=The torrc file is missing.
-torlauncher.datadir_missing=The Tor data directory does not exist.
-torlauncher.password_hash_missing=Failed to get hashed password.
-
-torlauncher.failed_to_get_settings=Unable to retrieve Tor settings.\n\n%S
-torlauncher.failed_to_save_settings=Unable to save Tor settings.\n\n%S
-torlauncher.ensure_tor_is_running=Please ensure that Tor is running.
-
-torlauncher.error_proxy_addr_missing=Ju duhet të përcaktoni si adresën IP ose emrin e serverit edhe numrin e portës për të konfiguruar Torin të përdori një proxy për tu lidhur në Internet.
-torlauncher.error_proxy_type_missing=You must select the proxy type.
-torlauncher.error_bridges_missing=You must specify one or more bridges.
-torlauncher.error_default_bridges_type_missing=You must select a transport type for the provided bridges.
-torlauncher.error_bridge_bad_default_type=No provided bridges that have the transport type %S are available. Please adjust your settings.
-
-torlauncher.recommended_bridge=(recommended)
-
-torlauncher.connect=Lidhu
-torlauncher.restart_tor=Restart Tor
-torlauncher.quit=Dil
-torlauncher.quit_win=Dil
-torlauncher.done=Done
-
-torlauncher.forAssistance=For assistance, contact %S
-
-torlauncher.copiedNLogMessages=Copy complete. %S Tor log messages are ready to be pasted into a text editor or an email message.
-
-torlauncher.bootstrapStatus.conn_dir=Connecting to a relay directory
-torlauncher.bootstrapStatus.handshake_dir=Establishing an encrypted directory connection
-torlauncher.bootstrapStatus.requesting_status=Retrieving network status
-torlauncher.bootstrapStatus.loading_status=Loading network status
-torlauncher.bootstrapStatus.loading_keys=Loading authority certificates
-torlauncher.bootstrapStatus.requesting_descriptors=Requesting relay information
-torlauncher.bootstrapStatus.loading_descriptors=Loading relay information
-torlauncher.bootstrapStatus.conn_or=Duke u lidhur me rrjetin Tor
-torlauncher.bootstrapStatus.handshake_or=Establishing a Tor circuit
-torlauncher.bootstrapStatus.done=Connected to the Tor network!
-
-torlauncher.bootstrapWarning.done=done
-torlauncher.bootstrapWarning.connectrefused=connection refused
-torlauncher.bootstrapWarning.misc=miscellaneous
-torlauncher.bootstrapWarning.resourcelimit=insufficient resources
-torlauncher.bootstrapWarning.identity=identity mismatch
-torlauncher.bootstrapWarning.timeout=connection timeout
-torlauncher.bootstrapWarning.noroute=no route to host
-torlauncher.bootstrapWarning.ioerror=read/write error
-torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
+torlauncher.error_title=Lëshuesi Tor
+
+torlauncher.tor_exited=Tor doli papritmas. Kjo mund të jetë për shkak të një gabimi të vetë Tor, të një tjetër programi në sistemin tuaj, ose të të metave të diskut të ngurtë. Derisa ta rinisni Tor, Tor Browser nuk do mund të arrijë asnjë webfaqe. Nëse problemi vijon, ju lutemi dërgoni një kopje të Regjistrit tuaj të Tor, tek ekipi i mbështetjes.
+torlauncher.tor_exited2=Rinisja e Tor s'do t'i mbyllë skedat e shfletuesit tuaj.
+torlauncher.tor_controlconn_failed=E pamundur lidhja me portin e kontrollit të Tor.
+torlauncher.tor_failed_to_start=Tor dështoi të nisë.
+torlauncher.tor_control_failed=Dështim në marrjen në kontroll të Tor.
+torlauncher.tor_bootstrap_failed=Tor dështoi që të vendoste një lidhje me rrjetin e Tor.
+torlauncher.tor_bootstrap_failed_details=%1$S dështoi (%2$S).
+
+torlauncher.unable_to_start_tor=E pamundur që të niset Tor.\n\n%S
+torlauncher.tor_missing=Skedari i ekzekutueshëm Tor, mungon.
+torlauncher.torrc_missing=Skedari torrc mungon.
+torlauncher.datadir_missing=Direktoria e të dhënave të Tor nuk ekziston.
+torlauncher.password_hash_missing=Dështuam të përftonim fjalëkalimin me thurje.
+
+torlauncher.failed_to_get_settings=Dështuam të gjenim konfigurimin e Tor.\n\n%S
+torlauncher.failed_to_save_settings=Dështuam të ruanim konfigurimin e Tor.\n\n%S
+torlauncher.ensure_tor_is_running=Ju lutemi sigurohuni që Tor është në ekzekutim.
+
+torlauncher.error_proxy_addr_missing=Ju duhet të përcaktoni një adresë IP ose emër pritësi, si edhe një numër porte, për të konfiguruar Tor në mënyrë që të përdorë një proxy për t'u qasur në Internet.
+torlauncher.error_proxy_type_missing=Duhet të përzgjidhni tipin proxy.
+torlauncher.error_bridges_missing=Duhet të specifikoni një ose më shumë ura.
+torlauncher.error_default_bridges_type_missing=Duhet të përzgjidhni një lloj transport për urat e parashikuara
+torlauncher.error_bridge_bad_default_type=S'ka ura të parashikuara, që kanë transport të llojit %S, të disponueshme. Ju lutemi ndreqni parametrat tuaj.
+
+torlauncher.recommended_bridge=(rekomandohet)
+
+torlauncher.connect=Lidhuni
+torlauncher.restart_tor=Riniseni Tor
+torlauncher.quit=Ndërpriteni
+torlauncher.quit_win=Dilni
+torlauncher.done=Kryer
+
+torlauncher.forAssistance=Për ndihmë, kontaktoni %S
+
+torlauncher.copiedNLogMessages=Kopjimi u krye. Mesazhet e regjistrit të Tor për %S, janë gati për t'u ngjitur në një redaktues teksti, ose në një mesazh e-poste.
+
+torlauncher.bootstrapStatus.conn_dir=Lidhja me një direktori releje
+torlauncher.bootstrapStatus.handshake_dir=Krijimi i një lidhje me direktori të shifruar
+torlauncher.bootstrapStatus.requesting_status=Rigjetja e statusit të rrjetit
+torlauncher.bootstrapStatus.loading_status=Ngarkimi i statusit të rrjetit
+torlauncher.bootstrapStatus.loading_keys=Ngarkimi i certifikatave të autoritetit
+torlauncher.bootstrapStatus.requesting_descriptors=Kërkimi i informacionit të relesë
+torlauncher.bootstrapStatus.loading_descriptors=Ngarkimi i informacionit të relesë
+torlauncher.bootstrapStatus.conn_or=Të lidhesh me rrjetin Tor
+torlauncher.bootstrapStatus.handshake_or=Krijimi i një cirkuiti të Tor
+torlauncher.bootstrapStatus.done=I lidhur me rrjetin e Tor!
+
+torlauncher.bootstrapWarning.done=kryer
+torlauncher.bootstrapWarning.connectrefused=lidhja u refuzua
+torlauncher.bootstrapWarning.misc=i përzier
+torlauncher.bootstrapWarning.resourcelimit=burime të pamjaftueshme
+torlauncher.bootstrapWarning.identity=mospërputhje identiteti
+torlauncher.bootstrapWarning.timeout=pezullim i lidhjes
+torlauncher.bootstrapWarning.noroute=asnjë rrugë për tek pritësi
+torlauncher.bootstrapWarning.ioerror=gabim leximi/shkrimi
+torlauncher.bootstrapWarning.pt_missing=mungon transporti me ngulje
diff --git a/src/chrome/locale/sv/network-settings.dtd b/src/chrome/locale/sv/network-settings.dtd
index 311f336..52e22a6 100644
--- a/src/chrome/locale/sv/network-settings.dtd
+++ b/src/chrome/locale/sv/network-settings.dtd
@@ -15,9 +15,9 @@
<!ENTITY torSettings.connectPrompt3 "Detta fungerar i de flesta situationer.">
<!ENTITY torSettings.connect "Anslut">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Behöver den här datorn använda en lokal proxy för att ansluta till Internet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Om du är osäker på svaret på frågan, titta på Internetinställningarna i en annan webbläsare för att se om den är konfigurerad att använda en lokal proxy.">
<!ENTITY torSettings.enterProxy "Ange proxyinställningarna.">
<!ENTITY torSettings.bridgeQuestion "Blockerar eller censurerar din internetleverantör anslutningar till Tor-nätverket?">
<!ENTITY torSettings.bridgeHelp "Om du är osäker på hur du ska svara på den här frågan, välj Nej.  Om du väljer Ja kommer du ombes att konfigurera Tor-bryggor, vilka är olistade reläer som gör det svårare att blockera anslutningar till Tor-nätverket.">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "Valfri">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Den här datorn behöver använda en lokal proxy för att ansluta till Internet">
<!ENTITY torsettings.useProxy.type "Typ av proxy:">
<!ENTITY torsettings.useProxy.address "Adress:">
<!ENTITY torsettings.useProxy.address.placeholder "IP-adress eller värdnamn">
diff --git a/src/chrome/locale/uk/network-settings.dtd b/src/chrome/locale/uk/network-settings.dtd
index a4c0644..0e62106 100644
--- a/src/chrome/locale/uk/network-settings.dtd
+++ b/src/chrome/locale/uk/network-settings.dtd
@@ -9,15 +9,15 @@
<!ENTITY torSettings.firstQuestion "Яке з наступних тверджень найкраще описує Вашу ситуацію?">
<!ENTITY torSettings.configurePrompt1 "Мережеве з'єднання цього комп'ютера цензурується або йде через проксі-сервер.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
+<!ENTITY torSettings.configurePrompt2 "Мені потрібно налаштувати міст або локальний проксі.">
<!ENTITY torSettings.configure "Налаштування">
<!ENTITY torSettings.connectPrompt2 "Я бажаю підключатися до Tor напряму ">
<!ENTITY torSettings.connectPrompt3 "Це має працювати у більшості ситуацій.">
<!ENTITY torSettings.connect "З'єднатися">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "Чи потрібно цьому комп'ютеру використовувати локальний проксі для доступу в Інтернет?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "Якщо ви не знаєте, як відповісти на це питання, перевірте налаштування Інтернету в іншому браузері, щоб побачити чи він налаштований на використання локального проксі.">
<!ENTITY torSettings.enterProxy "Задати параметри проксі">
<!ENTITY torSettings.bridgeQuestion "Ваш Інтернет-провайдер (ISP) блокує чи яким-небудь чином цензурує підключення до Tor мережі?">
<!ENTITY torSettings.bridgeHelp "Якщо Ви не знаєте, як відповісти на це питання, виберіть Ні.  Якщо Ви виберете Так, Вам буде запропоновано налаштувати мости Tor, що є приватними трансляторами, які роблять більш важким блокування з'єднань з Tor мережі.">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "Додатково">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "Цей комп'ютер повинен використовувати локальний проксі для доступу в Інтернет">
<!ENTITY torsettings.useProxy.type "Тип проксі:">
<!ENTITY torsettings.useProxy.address "Адреса:">
<!ENTITY torsettings.useProxy.address.placeholder "ІР адреса або ім'я хосту">
diff --git a/src/chrome/locale/zh-CN/network-settings.dtd b/src/chrome/locale/zh-CN/network-settings.dtd
index 29a5f00..4e6d5e1 100644
--- a/src/chrome/locale/zh-CN/network-settings.dtd
+++ b/src/chrome/locale/zh-CN/network-settings.dtd
@@ -9,15 +9,15 @@
<!ENTITY torSettings.firstQuestion "以下哪个描述与你的情况最为匹配?">
<!ENTITY torSettings.configurePrompt1 "网络连接受到审查或需要代理。">
-<!ENTITY torSettings.configurePrompt2 "我需要添加网桥或对本地代理进行配置。">
+<!ENTITY torSettings.configurePrompt2 "需要添加网桥或对本地代理进行配置。">
<!ENTITY torSettings.configure "配置">
<!ENTITY torSettings.connectPrompt2 "我想要直接连接 Tor 网络。">
<!ENTITY torSettings.connectPrompt3 "通常这种方式是有效的。">
<!ENTITY torSettings.connect "连接">
-<!ENTITY torSettings.proxyQuestion "请问这台计算机需要使用一个本地代理来访问互联网吗?">
+<!ENTITY torSettings.proxyQuestion "是否需要本地代理访问互联网?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "如果您不知道如何回答这个问题,看看其他浏览器中的 Internet 设置,看它是否有配置为使用一个本地代理。">
+<!ENTITY torSettings.proxyHelp "如果不知道如何回答该问题,请检查其他浏览器中的互联网设置,查看是否使用本地代理。">
<!ENTITY torSettings.enterProxy "输入代理设置。">
<!ENTITY torSettings.bridgeQuestion "互联网服务提供商 (ISP) 是否对 Tor 网络连接进行了封锁或审查?">
<!ENTITY torSettings.bridgeHelp "如果不理解该问题,请选择“否”。如果选择“是”,那么需要对 Tor 网桥进行配置。网桥指用于连接 Tor 网络的非公开网络中继,更难于封锁。">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "可选">
-<!ENTITY torsettings.useProxy.checkbox "这台计算机需要使用一个本地代理来访问互联网">
+<!ENTITY torsettings.useProxy.checkbox "需要本地代理来访问互联网">
<!ENTITY torsettings.useProxy.type "代理类型:">
<!ENTITY torsettings.useProxy.address "地址:">
<!ENTITY torsettings.useProxy.address.placeholder "IP 地址或主机名">
diff --git a/src/chrome/locale/zh-TW/network-settings.dtd b/src/chrome/locale/zh-TW/network-settings.dtd
index 65a5d51..7abb064 100644
--- a/src/chrome/locale/zh-TW/network-settings.dtd
+++ b/src/chrome/locale/zh-TW/network-settings.dtd
@@ -9,15 +9,15 @@
<!ENTITY torSettings.firstQuestion "下列哪一項最符合您的情況?">
<!ENTITY torSettings.configurePrompt1 "這部電腦的網路連線是被審查或是有代理的。">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings.">
+<!ENTITY torSettings.configurePrompt2 "我需要設定橋接或本地代理設定">
<!ENTITY torSettings.configure "設定">
<!ENTITY torSettings.connectPrompt2 "我想直接連接到 Tor 網路。">
<!ENTITY torSettings.connectPrompt3 "這將在大多數情況下生效。">
<!ENTITY torSettings.connect "連接">
-<!ENTITY torSettings.proxyQuestion "Does this computer need to use a local proxy to access the Internet?">
+<!ENTITY torSettings.proxyQuestion "這台電腦需要使用本地代理伺服器來存取網路嗎?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyHelp "If you are not sure how to answer this question, look at the Internet settings in another browser to see whether it is configured to use a local proxy.">
+<!ENTITY torSettings.proxyHelp "若您無法確定如何回答這個問題,請查看其他瀏覽器的網路設定,看它是否設定為透過代理伺服器連線。">
<!ENTITY torSettings.enterProxy "輸入代理伺服器設定。">
<!ENTITY torSettings.bridgeQuestion "您的網際網路服務提供者(ISP)阻擋或審查員連接到 Tor 網路?">
<!ENTITY torSettings.bridgeHelp "如果您不確定如何回答此問題,請選擇「否」。  如果您選擇「是」,您將被要求設定Tor 橋接,這讓阻止連接到 Tor 網路更加困難。">
@@ -30,7 +30,7 @@
<!ENTITY torsettings.optional "選用">
-<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
+<!ENTITY torsettings.useProxy.checkbox "這台電腦需要使用代理伺服器存取網際網路">
<!ENTITY torsettings.useProxy.type "代理伺服器類型:">
<!ENTITY torsettings.useProxy.address "位址:">
<!ENTITY torsettings.useProxy.address.placeholder "IP 位址或主機名稱">
diff --git a/src/install.rdf b/src/install.rdf
index 8825190..c27be00 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -7,7 +7,7 @@
<em:creator>The Tor Project, Inc.</em:creator>
<em:contributor>Pearl Crescent, LLC</em:contributor>
<em:id>tor-launcher(a)torproject.org</em:id>
- <em:version>0.2.7.2</em:version>
+ <em:version>0.2.7.3</em:version>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html</em:homepageURL>
<em:updateURL>https://127.0.0.1/</em:updateURL>
<!--
1
0

[torbutton/master] Bug #14429: Quantize content window inner width, height
by mikeperry@torproject.org 27 Mar '15
by mikeperry@torproject.org 27 Mar '15
27 Mar '15
commit ddd8a6a78c56feeba2c8d5493edb6970ec148588
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Sun Feb 8 00:13:36 2015 -0800
Bug #14429: Quantize content window inner width, height
---
src/chrome/content/content-sizer.js | 286 +++++++++++++++++++++++++++++
src/chrome/content/tor-circuit-display.js | 35 +---
src/chrome/content/torbutton.js | 2 +
src/chrome/content/torbutton.xul | 1 +
src/defaults/preferences/preferences.js | 1 +
src/modules/utils.js | 43 +++++
6 files changed, 336 insertions(+), 32 deletions(-)
diff --git a/src/chrome/content/content-sizer.js b/src/chrome/content/content-sizer.js
new file mode 100644
index 0000000..af6bc80
--- /dev/null
+++ b/src/chrome/content/content-sizer.js
@@ -0,0 +1,286 @@
+// The purpose of this file is to ensure that window.innerWidth and window.innerHeight
+// always return rounded values.
+
+// This file is formatted for docco.js. Later functions call earlier ones.
+
+/* jshint esnext: true */
+
+// __quantizeBrowserSizeOnLoad(window, xStep, yStep)__.
+// Once a window is fully loaded, ensures that gBrowser width and height are multiples of
+// xStep and yStep.
+let quantizeBrowserSizeOnLoad = function (window, xStep, yStep) {
+
+// Use Task.jsm to avoid callback hell.
+Cu.import("resource://gre/modules/Task.jsm");
+
+// Make the TorButton logger available.
+let logger = Cc["@torproject.org/torbutton-logger;1"]
+ .getService(Components.interfaces.nsISupports).wrappedJSObject;
+
+// Utility function
+let { bindPrefAndInit } = Cu.import("resource://torbutton/modules/utils.js");
+
+// __largestMultipleLessThan(factor, max)__.
+// Returns the largest number that is a multiple of factor
+// and is less or equal to max.
+let largestMultipleLessThan = function (factor, max) {
+ return Math.max(1, Math.floor((1 + max) / factor, 1)) * factor;
+};
+
+// __listen(target, eventType, useCapture, timeoutMs)__.
+// Listens for a single event of eventType on target.
+// Returns a Promise that resolves to an Event object, if the event fires.
+// If a timeout occurs, then Promise is rejected with a "Timed out" error.
+let listen = function (target, eventType, useCapture, timeoutMs) {
+ return new Promise(function (resolve, reject) {
+ let listenFunction = function (event) {
+ target.removeEventListener(eventType, listenFunction, useCapture);
+ resolve(event);
+ };
+ target.addEventListener(eventType, listenFunction, useCapture);
+ if (timeoutMs !== undefined && timeoutMs !== null) {
+ window.setTimeout(function () {
+ target.removeEventListener(eventType, listenFunction, useCapture);
+ resolve(new Event("timeout"));
+ }, timeoutMs);
+ }
+ });
+};
+
+// __sleep(time_ms)__.
+// Returns a Promise that sleeps for the specified time interval,
+// and returns an Event object of type "wake".
+let sleep = function (timeoutMs) {
+ return new Promise(function (resolve, reject) {
+ window.setTimeout(function () {
+ resolve(new Event("wake"));
+ }, timeoutMs);
+ });
+};
+
+// __isNumber(value)__.
+// Returns true iff the value is a number.
+let isNumber = x => typeof x === "number";
+
+// __reshape(window, {left, top, width, height}, timeoutMs)__.
+// Reshapes the window to rectangle {left, top, width, height} and yields
+// until the window reaches its target size, or the timeout occurs.
+let reshape = function* (window, {left, top, width, height}, timeoutMs) {
+ let finishTime = Date.now() + timeoutMs,
+ x = isNumber(left) ? left : window.screenX,
+ y = isNumber(top) ? top : window.screenY,
+ w = isNumber(width) ? width : window.outerWidth,
+ h = isNumber(height) ? height : window.outerHeight;
+ // Make sure we are in a new event.
+ yield sleep(0);
+ if (w !== window.outerWidth || h !== window.outerWidth) {
+ window.resizeTo(w, h);
+ }
+ if (x !== window.screenX || y !== window.screenY) {
+ window.moveTo(x, y);
+ }
+ // Yield until we have the correct screen position and size, or
+ // we timeout. Multiple resize events often fire in a resize.
+ while (x !== window.screenX ||
+ y !== window.screenY ||
+ w !== window.outerWidth ||
+ h !== window.outerHeight) {
+ let timeLeft = finishTime - Date.now();
+ if (timeLeft <= 0) break;
+ yield listen(window, "resize", true, timeLeft);
+ }
+};
+
+// __rebuild(window)__.
+// Jog the size of the window slightly, to remind the window manager
+// to redraw the window.
+let rebuild = function* (window) {
+ let h = window.outerHeight;
+ yield reshape(window, {height : (h + 1)}, 300);
+ yield reshape(window, {height : h}, 300);
+};
+
+// __gaps(window)__.
+// Deltas between gBrowser and its container. Returns null if there is no gap.
+let gaps = function (window) {
+ let gBrowser = window.gBrowser,
+ container = gBrowser.parentElement,
+ deltaWidth = Math.max(0, container.clientWidth - gBrowser.clientWidth - 1),
+ deltaHeight = Math.max(0, container.clientHeight - gBrowser.clientHeight - 1);
+ //logger.eclog(3, "gaps " + deltaWidth + "," + deltaHeight);
+ return (deltaWidth === 0 && deltaHeight === 0) ? null
+ : { deltaWidth : deltaWidth, deltaHeight : deltaHeight };
+};
+
+// __shrinkwrap(window)__.
+// Shrinks the window so that it encloses the gBrowser with no gaps.
+let shrinkwrap = function* (window) {
+ // Maximized windows in Linux and Windows need to be demaximized first.
+ if (gaps(window) &&
+ window.windowState === 1 && /* maximized */
+ Services.appinfo.OS !== "Darwin") {
+ if (Services.appinfo.OS !== "WINNT") {
+ // Linux windows need an extra jolt out of maximized mode.
+ window.moveBy(1,1);
+ }
+ // If window has been maximized, demaximize by shrinking it to
+ // fit within the available screen area.
+ yield reshape(window,
+ {left : window.screen.availLeft + 1,
+ top : window.screen.availTop + 1,
+ width : window.screen.availWidth - 2,
+ height : window.screen.availHeight - 2},
+ 500);
+ }
+ // Figure out what size change we need.
+ let currentGaps = gaps(window);
+ if (currentGaps) {
+ // Now resize to close the gaps.
+ yield reshape(window,
+ {width : (window.outerWidth - currentGaps.deltaWidth),
+ height : (window.outerHeight - currentGaps.deltaHeight)},
+ 500);
+ }
+};
+
+// __updateContainerAppearance(container, on)__.
+// Get the color and position of margins right.
+let updateContainerAppearance = function (container, on) {
+ // Align the browser at top left, so any gray margin will be visible
+ // at right and bottom. Except in fullscreen, where we have black
+ // margins and gBrowser in top center.
+ container.align = on ? (window.fullScreen ? "center" : "start")
+ : "";
+ container.pack = on ? "start" : "";
+ container.style.backgroundColor = on ? (window.fullScreen ? "Black"
+ : "DimGray")
+ : "";
+};
+
+// __fixWindow(window)__.
+// An async function for Task.jsm. Makes sure the window looks okay
+// given the quantized browser element.
+let fixWindow = function* (window) {
+ updateContainerAppearance(window.gBrowser.parentElement, true);
+ if (!window.fullScreen) {
+ yield shrinkwrap(window);
+ if (Services.appinfo.OS !== "Darwin" && Services.appinfo.OS !== "WINNT") {
+ // Linux tends to require us to rebuild the window, or we might be
+ // left with a large useless white area on the screen.
+ yield rebuild(window);
+ }
+ }
+};
+
+// __autoresize(window, stepMs)__.
+// Do what it takes to eliminate the gray margin around the gBrowser inside
+// window. Periodically (stepMs) attempt to shrink the window. Runs
+// as a Task.jsm coroutine.
+let autoresize = function (window, stepMs) {
+ let stop = false;
+ Task.spawn(function* () {
+ while (!stop) {
+ // Do nothing until the user starts to resize window.
+ let event = yield listen(window, "resize", true);
+ // Here we wrestle with the window size. If the user has released the
+ // mouse cursor on the window's drag/resize handle, then fixWindow
+ // will resize the window on its first call. Unfortunately, on some
+ // OSs, the window resize fails if the user is still holding on
+ // to the drag-resize handle. Even more unfortunately, the
+ // only way to know that the user no longer has the mouse down
+ // on the window's drag/resize handle is if we detect the mouse
+ // cursor inside the window. So until the window fires a mousemove
+ // event, we repeatedly call fixWindow every stepMs.
+ while (event.type !== "mousemove") {
+ event = yield Promise.race(
+ [listen(window, "resize", true, stepMs),
+ listen(window, "mousemove", true, stepMs)]);
+ // If the user has stopped resizing the window after `stepMs`, then we can resize
+ // the window so no gray margin is visible.
+ if (event.type === "timeout" || event.type === "mousemove") {
+ yield fixWindow(window);
+ }
+ }
+ }
+ });
+ return () => { stop = true; };
+};
+
+// __updateDimensions(gBrowser, xStep, yStep)__.
+// Changes the width and height of the gBrowser XUL element to be a multiple of x/yStep.
+let updateDimensions = function (gBrowser, xStep, yStep) {
+ // TODO: Get zooming to work such that it doesn't cause the window
+ // to continuously shrink.
+ // We'll use something like:
+ // let winUtils = gBrowser.contentWindow
+ // .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
+ // .getInterface(Components.interfaces.nsIDOMWindowUtils),
+ // zoom = winUtils.screenPixelsPerCSSPixel,
+ let zoom = 1,
+ parentWidth = gBrowser.parentElement.clientWidth,
+ parentHeight = gBrowser.parentElement.clientHeight,
+ targetContentWidth = largestMultipleLessThan(xStep, parentWidth / zoom),
+ targetContentHeight = largestMultipleLessThan(yStep, parentHeight / zoom),
+ targetBrowserWidth = targetContentWidth * zoom,
+ targetBrowserHeight = targetContentHeight * zoom;
+ // Because gBrowser is inside a vbox, width and height behave differently. It turns
+ // out we need to set `gBrowser.width` and `gBrowser.maxHeight`.
+ gBrowser.width = targetBrowserWidth;
+ gBrowser.maxHeight = targetBrowserHeight;
+ // If the content window's innerWidth/innerHeight failed to updated correctly,
+ // then jog the gBrowser width/height. (With zoom there may also be a rounding
+ // error, but we can't do much about that.)
+ if (gBrowser.contentWindow.innerWidth !== targetContentWidth ||
+ gBrowser.contentWindow.innerHeight !== targetContentHeight) {
+ gBrowser.width = targetBrowserWidth + 1;
+ gBrowser.maxHeight = gBrowser.targetBrowserHeight + 1;
+ gBrowser.width = targetBrowserWidth;
+ gBrowser.maxHeight = targetBrowserHeight;
+ }
+ logger.eclog(3, "zoom " + zoom + "X" +
+ " chromeWin " + window.outerWidth + "x" + window.outerHeight +
+ " container " + parentWidth + "x" + parentHeight +
+ " gBrowser " + gBrowser.clientWidth + "x" + gBrowser.clientHeight +
+ " content " + gBrowser.contentWindow.innerWidth + "x" + gBrowser.contentWindow.innerHeight);
+};
+
+// __quantizeBrowserSizeNow(window, xStep, yStep)__.
+// Ensures that gBrowser width and height are multiples of xStep and yStep, and always as
+// large as possible inside the chrome window.
+let quantizeBrowserSizeNow = function (window, xStep, yStep) {
+ let gBrowser = window.gBrowser,
+ container = window.gBrowser.parentElement,
+ updater = event => updateDimensions(gBrowser, xStep, yStep),
+ originalMinWidth = gBrowser.minWidth,
+ originalMinHeight = gBrowser.minHeight,
+ stopAutoresizing,
+ activate = function (on) {
+ // Don't let the browser shrink below a single xStep x yStep size.
+ gBrowser.minWidth = on ? xStep : originalMinWidth;
+ gBrowser.minHeight = on ? yStep : originalMinHeight;
+ updateContainerAppearance(container, on);
+ if (on) {
+ // Quantize browser size on activation.
+ updateDimensions(gBrowser, xStep, yStep);
+ shrinkwrap(window);
+ // Quantize browser size at subsequent resize events.
+ window.addEventListener("resize", updater, false);
+ stopAutoresizing = autoresize(window, 250);
+ } else {
+ if (stopAutoresizing) stopAutoresizing();
+ // Ignore future resize events.
+ window.removeEventListener("resize", updater, false);
+ // Let gBrowser expand with its parent vbox.
+ gBrowser.width = "";
+ gBrowser.maxHeight = "";
+ }
+ };
+ bindPrefAndInit("extensions.torbutton.resize_windows", activate);
+};
+
+let onLoad = () => quantizeBrowserSizeNow(window, xStep, yStep);
+window.gBrowser.addEventListener("load", onLoad, true);
+return () => window.gBrowser.removeEventListener("load", onLoad, true);
+
+// quantizeBrowserSizeOnLoad
+};
diff --git a/src/chrome/content/tor-circuit-display.js b/src/chrome/content/tor-circuit-display.js
index 8997757..917f1f0 100644
--- a/src/chrome/content/tor-circuit-display.js
+++ b/src/chrome/content/tor-circuit-display.js
@@ -32,6 +32,9 @@ Cu.import("resource://gre/modules/Task.jsm");
// Import the controller code.
let { controller } = Cu.import("resource://torbutton/modules/tor-control-port.js");
+// Utility functions
+let { bindPrefAndInit } = Cu.import("resource://torbutton/modules/utils.js");
+
// Make the TorButton logger available.
let logger = Cc["@torproject.org/torbutton-logger;1"]
.getService(Components.interfaces.nsISupports).wrappedJSObject;
@@ -303,38 +306,6 @@ let syncDisplayWithSelectedTab = (function() {
};
})();
-// ## Pref utils
-
-// __prefs__. A shortcut to Mozilla Services.prefs.
-let prefs = Services.prefs;
-
-// __getPrefValue(prefName)__
-// Returns the current value of a preference, regardless of its type.
-let getPrefValue = function (prefName) {
- switch(prefs.getPrefType(prefName)) {
- case prefs.PREF_BOOL: return prefs.getBoolPref(prefName);
- case prefs.PREF_INT: return prefs.getIntPref(prefName);
- case prefs.PREF_STRING: return prefs.getCharPref(prefName);
- default: return null;
- }
-};
-
-// __bindPrefAndInit(prefName, prefHandler)__
-// Applies prefHandler to the current value of pref specified by prefName.
-// Re-applies prefHandler whenever the value of the pref changes.
-// Returns a zero-arg function that unbinds the pref.
-let bindPrefAndInit = function (prefName, prefHandler) {
- let update = () => { prefHandler(getPrefValue(prefName)); },
- observer = { observe : function (subject, topic, data) {
- if (data === prefName) {
- update();
- }
- } };
- prefs.addObserver(prefName, observer, false);
- update();
- return () => { prefs.removeObserver(prefName, observer); };
-};
-
// ## Main function
// setupDisplay(host, port, password, enablePrefName)__.
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js
index 83ea395..44f62aa 100644
--- a/src/chrome/content/torbutton.js
+++ b/src/chrome/content/torbutton.js
@@ -636,6 +636,8 @@ function torbutton_init() {
createTorCircuitDisplay(m_tb_control_host, m_tb_control_port, m_tb_control_pass,
"extensions.torbutton.display_circuit");
+ quantizeBrowserSizeOnLoad(window, 200, 100);
+
torbutton_log(3, 'init completed');
}
diff --git a/src/chrome/content/torbutton.xul b/src/chrome/content/torbutton.xul
index 5da3439..a9d60f6 100644
--- a/src/chrome/content/torbutton.xul
+++ b/src/chrome/content/torbutton.xul
@@ -9,6 +9,7 @@
<script type="application/x-javascript" src="chrome://torbutton/content/torbutton_util.js" />
<script type="application/x-javascript" src="chrome://torbutton/content/tor-circuit-display.js" />
+ <script type="application/x-javascript" src="chrome://torbutton/content/content-sizer.js" />
<script type="application/x-javascript" src="chrome://torbutton/content/torbutton.js" />
<script language="JavaScript">
//onLoad Hander
diff --git a/src/defaults/preferences/preferences.js b/src/defaults/preferences/preferences.js
index 2c109ee..85fd953 100644
--- a/src/defaults/preferences/preferences.js
+++ b/src/defaults/preferences/preferences.js
@@ -159,6 +159,7 @@ pref("extensions.torbutton.close_newnym",true);
pref("extensions.torbutton.block_js_history",true);
pref("extensions.torbutton.resize_on_toggle",true);
pref("extensions.torbutton.resize_new_windows",true);
+pref("extensions.torbutton.resize_windows",true);
pref("extensions.torbutton.banned_ports","9050,9051,9150,9151");
pref("extensions.torbutton.block_tor_file_net",true);
pref("extensions.torbutton.block_nontor_file_net",false);
diff --git a/src/modules/utils.js b/src/modules/utils.js
new file mode 100644
index 0000000..7a27326
--- /dev/null
+++ b/src/modules/utils.js
@@ -0,0 +1,43 @@
+// # Utils.js
+// Various helpful utility functions.
+
+// ### Shortcut
+const Cu = Components.utils;
+
+// ### Import Mozilla Services
+Cu.import("resource://gre/modules/Services.jsm");
+
+// ## Pref utils
+
+// __prefs__. A shortcut to Mozilla Services.prefs.
+let prefs = Services.prefs;
+
+// __getPrefValue(prefName)__
+// Returns the current value of a preference, regardless of its type.
+let getPrefValue = function (prefName) {
+ switch(prefs.getPrefType(prefName)) {
+ case prefs.PREF_BOOL: return prefs.getBoolPref(prefName);
+ case prefs.PREF_INT: return prefs.getIntPref(prefName);
+ case prefs.PREF_STRING: return prefs.getCharPref(prefName);
+ default: return null;
+ }
+};
+
+// __bindPrefAndInit(prefName, prefHandler)__
+// Applies prefHandler to the current value of pref specified by prefName.
+// Re-applies prefHandler whenever the value of the pref changes.
+// Returns a zero-arg function that unbinds the pref.
+let bindPrefAndInit = function (prefName, prefHandler) {
+ let update = () => { prefHandler(getPrefValue(prefName)); },
+ observer = { observe : function (subject, topic, data) {
+ if (data === prefName) {
+ update();
+ }
+ } };
+ prefs.addObserver(prefName, observer, false);
+ update();
+ return () => { prefs.removeObserver(prefName, observer); };
+};
+
+// Export utility functions for external use.
+let EXPORTED_SYMBOLS = ["bindPrefAndInit", "getPrefValue"];
1
0

[torbutton/master] Bump version to 1.9.1.0 and add Changelog entries.
by mikeperry@torproject.org 27 Mar '15
by mikeperry@torproject.org 27 Mar '15
27 Mar '15
commit 96b56ba026b19269c08251aa0e7e2887a10c68c2
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Thu Mar 26 19:35:10 2015 -0700
Bump version to 1.9.1.0 and add Changelog entries.
---
src/CHANGELOG | 20 ++++++++++++++++++++
src/install.rdf | 2 +-
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/src/CHANGELOG b/src/CHANGELOG
index 97db954..e9b5c6b 100644
--- a/src/CHANGELOG
+++ b/src/CHANGELOG
@@ -1,3 +1,23 @@
+1.9.1.0:
+ * Bug 9387: "Security Slider 1.0"
+ * Include descriptions and tooltip hints for security levels
+ * Notify users that the security slider exists
+ * Flip slider so that "low" is on the bottom
+ * Make use of new SVG and MathML prefs
+ * Bug 13766: Set a 10 minute circuit lifespan for non-content requests
+ * Bug 15460: Ensure FTP urls use content-window circuit isolation
+ * Bug 13650: Clip initial window height to 1000px
+ * Bug 14429: Ensure windows can only be resized to 200x100px multiples
+ * Bug 15334: Display Cookie Protections menu if disk records are enabled
+ * Bug 14324: Show HS circuit in Tor circuit display
+ * Bug 15086: Handle RTL text in Tor circuit display
+ * Bug 15085: Fix about:tor RTL text alignment problems
+ * Bug 10216: Add a pref to disable the local tor control port test
+ * Bug 14937: Show meek and flashproxy bridges in tor circuit display
+ * Bugs 13891+15207: Fix exceptions/errors in circuit display with bridges
+ * Bug 13019: Change locale hiding pref to boolean
+ * Bug 7255: Warn users about maximizing windows (off by default)
+
1.9.0.0
* Bug 13882: Fix display of bridges after bridge settings have been changed
* Bug 5698: Use "Tor Browser" branding in "About Tor Browser" dialog
diff --git a/src/install.rdf b/src/install.rdf
index b5a8e88..94245a0 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -6,7 +6,7 @@
<em:name>Torbutton</em:name>
<em:creator>Mike Perry</em:creator>
<em:id>torbutton(a)torproject.org</em:id>
- <em:version>1.9.0.0</em:version>
+ <em:version>1.9.1.0</em:version>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html.en</em:homepageURL>
<em:optionsURL>chrome://torbutton/content/preferences.xul</em:optionsURL>
<em:iconURL>chrome://torbutton/skin/tor.png</em:iconURL>
1
0