From fb73af35d69d998a75eefc946a8452e56c4ff99c Mon Sep 17 00:00:00 2001
From: David Kalnischkies <david@kalnischkies.de>
Date: Tue, 26 Sep 2017 19:27:30 +0200
Subject: proper error reporting for v3 onion services

APT connects just fine to any .onion address given, only if the connect
fails somehow it will perform checks on the sanity of which in this case
is checking the length as they are well defined and as the strings are
arbitrary a user typing them easily mistypes which apt should can be
slightly more helpful in figuring out by saying the onion hasn't the
required length.

(cherry picked from commit f3e34838d95132e5f318e85525326decbfb19e36)
---
 methods/connect.cc | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

(limited to 'methods')

diff --git a/methods/connect.cc b/methods/connect.cc
index 949cd3f99..6a7b71c0b 100644
--- a/methods/connect.cc
+++ b/methods/connect.cc
@@ -523,13 +523,13 @@ bool UnwrapSocks(std::string Host, int Port, URI Proxy, std::unique_ptr<MethodFd
 	 else if (errcode == 0x01)
 	 {
 	    auto const prevdot = Host.rfind('.', lastdot - 1);
-	    if (lastdot == 16 && prevdot == std::string::npos)
+	    if (prevdot == std::string::npos && (lastdot == 16 || lastdot == 56))
 	       ; // valid .onion address
-	    else if (prevdot != std::string::npos && (lastdot - prevdot) == 17)
+	    else if (prevdot != std::string::npos && ((lastdot - prevdot) == 17 || (lastdot - prevdot) == 57))
 	       ; // valid .onion address with subdomain(s)
 	    else
 	    {
-	       errstr = "Invalid hostname: onion service name must be 16 characters long";
+	       errstr = "Invalid hostname: onion service name must be either 16 or 56 characters long";
 	       Owner->SetFailReason("SOCKS");
 	    }
 	 }
-- 
cgit v1.2.3