From 592b78001c381f9cca6f20d8d1d47696bb98c0d1 Mon Sep 17 00:00:00 2001 From: Michael Vogt <michael.vogt@ubuntu.com> Date: Fri, 16 Oct 2009 15:36:28 +0200 Subject: port netrc support from maemon --- methods/http.cc | 7 +++++-- methods/https.cc | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'methods') diff --git a/methods/http.cc b/methods/http.cc index 1eba0f279..6bfe80baf 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -29,6 +29,7 @@ #include <apt-pkg/acquire-method.h> #include <apt-pkg/error.h> #include <apt-pkg/hashes.h> +#include <apt-pkg/netrc.h> #include <sys/stat.h> #include <sys/time.h> @@ -42,6 +43,7 @@ #include <map> #include <apti18n.h> + // Internet stuff #include <netdb.h> @@ -49,7 +51,6 @@ #include "connect.h" #include "rfc2553emu.h" #include "http.h" - /*}}}*/ using namespace std; @@ -725,9 +726,11 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out) Base64Encode(Proxy.User + ":" + Proxy.Password) + "\r\n"; if (Uri.User.empty() == false || Uri.Password.empty() == false) + { + maybe_add_auth (Uri, _config->FindFile("Dir::Etc::netrc")); Req += string("Authorization: Basic ") + Base64Encode(Uri.User + ":" + Uri.Password) + "\r\n"; - + } Req += "User-Agent: Debian APT-HTTP/1.3 ("VERSION")\r\n\r\n"; if (Debug == true) diff --git a/methods/https.cc b/methods/https.cc index 37d93e308..a86c78029 100644 --- a/methods/https.cc +++ b/methods/https.cc @@ -14,6 +14,7 @@ #include <apt-pkg/acquire-method.h> #include <apt-pkg/error.h> #include <apt-pkg/hashes.h> +#include <apt-pkg/netrc.h> #include <sys/stat.h> #include <sys/time.h> @@ -126,6 +127,8 @@ bool HttpsMethod::Fetch(FetchItem *Itm) curl_easy_reset(curl); SetupProxy(); + maybe_add_auth (Uri, _config->FindFile("Dir::ETc::netrc")); + // callbacks curl_easy_setopt(curl, CURLOPT_URL, Itm->Uri.c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); -- cgit v1.2.3 From 1de1f70383ea2d44147ccaceff280fd70faf4c81 Mon Sep 17 00:00:00 2001 From: Michael Vogt <michael.vogt@ubuntu.com> Date: Fri, 16 Oct 2009 15:42:05 +0200 Subject: add maybe_add_auth for ftp as well --- methods/ftp.cc | 4 +++- methods/http.cc | 2 +- methods/https.cc | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) (limited to 'methods') diff --git a/methods/ftp.cc b/methods/ftp.cc index c91600ad5..eb398666f 100644 --- a/methods/ftp.cc +++ b/methods/ftp.cc @@ -982,7 +982,9 @@ bool FtpMethod::Fetch(FetchItem *Itm) FetchResult Res; Res.Filename = Itm->DestFile; Res.IMSHit = false; - + + maybe_add_auth (Get, _config->FindFile("Dir::Etc::netrc")); + // Connect to the server if (Server == 0 || Server->Comp(Get) == false) { diff --git a/methods/http.cc b/methods/http.cc index 6bfe80baf..50478b44c 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -725,9 +725,9 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out) Req += string("Proxy-Authorization: Basic ") + Base64Encode(Proxy.User + ":" + Proxy.Password) + "\r\n"; + maybe_add_auth (Uri, _config->FindFile("Dir::Etc::netrc")); if (Uri.User.empty() == false || Uri.Password.empty() == false) { - maybe_add_auth (Uri, _config->FindFile("Dir::Etc::netrc")); Req += string("Authorization: Basic ") + Base64Encode(Uri.User + ":" + Uri.Password) + "\r\n"; } diff --git a/methods/https.cc b/methods/https.cc index a86c78029..075d655b7 100644 --- a/methods/https.cc +++ b/methods/https.cc @@ -127,7 +127,7 @@ bool HttpsMethod::Fetch(FetchItem *Itm) curl_easy_reset(curl); SetupProxy(); - maybe_add_auth (Uri, _config->FindFile("Dir::ETc::netrc")); + maybe_add_auth (Uri, _config->FindFile("Dir::Etc::netrc")); // callbacks curl_easy_setopt(curl, CURLOPT_URL, Itm->Uri.c_str()); -- cgit v1.2.3 From f1c081b6ad0c5925e9668fd159f1ac6d8ab672bc Mon Sep 17 00:00:00 2001 From: Michael Vogt <michael.vogt@ubuntu.com> Date: Fri, 16 Oct 2009 16:04:41 +0200 Subject: add ftp support, basic debugging --- apt-pkg/contrib/netrc.cc | 5 +++- doc/examples/configure-index | 1 + methods/ftp.cc | 1 + po/apt-all.pot | 68 ++++++++++++++++++++++---------------------- 4 files changed, 40 insertions(+), 35 deletions(-) (limited to 'methods') diff --git a/apt-pkg/contrib/netrc.cc b/apt-pkg/contrib/netrc.cc index 851b661a4..186527306 100644 --- a/apt-pkg/contrib/netrc.cc +++ b/apt-pkg/contrib/netrc.cc @@ -12,6 +12,7 @@ ##################################################################### */ /*}}}*/ +#include <apt-pkg/configuration.h> #include <iostream> #include <stdio.h> #include <stdlib.h> @@ -146,7 +147,9 @@ int parsenetrc (char *host, char *login, char *password, char *netrcfile = NULL) void maybe_add_auth (URI &Uri, string NetRCFile) { - if (Uri.Password.empty () == true && Uri.User.empty () == true) + if (_config->FindB("Debug::Acquire::netrc", false) == true) + std::clog << "maybe_add_auth: " << NetRCFile << std::endl; + if (Uri.Password.empty () == true || Uri.User.empty () == true) { if (NetRCFile.empty () == false) { diff --git a/doc/examples/configure-index b/doc/examples/configure-index index 3c236d7d9..fc2bede4e 100644 --- a/doc/examples/configure-index +++ b/doc/examples/configure-index @@ -365,6 +365,7 @@ Debug Acquire::gpgv "false"; // Show the gpgv traffic aptcdrom "false"; // Show found package files IdentCdrom "false"; + acquire::netrc "false"; // netrc parser } diff --git a/methods/ftp.cc b/methods/ftp.cc index eb398666f..3e1725823 100644 --- a/methods/ftp.cc +++ b/methods/ftp.cc @@ -19,6 +19,7 @@ #include <apt-pkg/acquire-method.h> #include <apt-pkg/error.h> #include <apt-pkg/hashes.h> +#include <apt-pkg/netrc.h> #include <sys/stat.h> #include <sys/time.h> diff --git a/po/apt-all.pot b/po/apt-all.pot index ec2e73a13..b05e180c1 100644 --- a/po/apt-all.pot +++ b/po/apt-all.pot @@ -989,7 +989,7 @@ msgstr "" msgid "Calculating upgrade... " msgstr "" -#: cmdline/apt-get.cc:1897 methods/ftp.cc:707 methods/connect.cc:112 +#: cmdline/apt-get.cc:1897 methods/ftp.cc:708 methods/connect.cc:112 msgid "Failed" msgstr "" @@ -1566,147 +1566,147 @@ msgid "Invalid URI, local URIS must not start with //" msgstr "" #. Login must be before getpeername otherwise dante won't work. -#: methods/ftp.cc:167 +#: methods/ftp.cc:168 msgid "Logging in" msgstr "" -#: methods/ftp.cc:173 +#: methods/ftp.cc:174 msgid "Unable to determine the peer name" msgstr "" -#: methods/ftp.cc:178 +#: methods/ftp.cc:179 msgid "Unable to determine the local name" msgstr "" -#: methods/ftp.cc:209 methods/ftp.cc:237 +#: methods/ftp.cc:210 methods/ftp.cc:238 #, c-format msgid "The server refused the connection and said: %s" msgstr "" -#: methods/ftp.cc:215 +#: methods/ftp.cc:216 #, c-format msgid "USER failed, server said: %s" msgstr "" -#: methods/ftp.cc:222 +#: methods/ftp.cc:223 #, c-format msgid "PASS failed, server said: %s" msgstr "" -#: methods/ftp.cc:242 +#: methods/ftp.cc:243 msgid "" "A proxy server was specified but no login script, Acquire::ftp::ProxyLogin " "is empty." msgstr "" -#: methods/ftp.cc:270 +#: methods/ftp.cc:271 #, c-format msgid "Login script command '%s' failed, server said: %s" msgstr "" -#: methods/ftp.cc:296 +#: methods/ftp.cc:297 #, c-format msgid "TYPE failed, server said: %s" msgstr "" -#: methods/ftp.cc:334 methods/ftp.cc:445 methods/rsh.cc:183 methods/rsh.cc:226 +#: methods/ftp.cc:335 methods/ftp.cc:446 methods/rsh.cc:183 methods/rsh.cc:226 msgid "Connection timeout" msgstr "" -#: methods/ftp.cc:340 +#: methods/ftp.cc:341 msgid "Server closed the connection" msgstr "" -#: methods/ftp.cc:343 apt-pkg/contrib/fileutl.cc:541 methods/rsh.cc:190 +#: methods/ftp.cc:344 apt-pkg/contrib/fileutl.cc:541 methods/rsh.cc:190 msgid "Read error" msgstr "" -#: methods/ftp.cc:350 methods/rsh.cc:197 +#: methods/ftp.cc:351 methods/rsh.cc:197 msgid "A response overflowed the buffer." msgstr "" -#: methods/ftp.cc:367 methods/ftp.cc:379 +#: methods/ftp.cc:368 methods/ftp.cc:380 msgid "Protocol corruption" msgstr "" -#: methods/ftp.cc:451 apt-pkg/contrib/fileutl.cc:580 methods/rsh.cc:232 +#: methods/ftp.cc:452 apt-pkg/contrib/fileutl.cc:580 methods/rsh.cc:232 msgid "Write error" msgstr "" -#: methods/ftp.cc:692 methods/ftp.cc:698 methods/ftp.cc:734 +#: methods/ftp.cc:693 methods/ftp.cc:699 methods/ftp.cc:735 msgid "Could not create a socket" msgstr "" -#: methods/ftp.cc:703 +#: methods/ftp.cc:704 msgid "Could not connect data socket, connection timed out" msgstr "" -#: methods/ftp.cc:709 +#: methods/ftp.cc:710 msgid "Could not connect passive socket." msgstr "" -#: methods/ftp.cc:727 +#: methods/ftp.cc:728 msgid "getaddrinfo was unable to get a listening socket" msgstr "" -#: methods/ftp.cc:741 +#: methods/ftp.cc:742 msgid "Could not bind a socket" msgstr "" -#: methods/ftp.cc:745 +#: methods/ftp.cc:746 msgid "Could not listen on the socket" msgstr "" -#: methods/ftp.cc:752 +#: methods/ftp.cc:753 msgid "Could not determine the socket's name" msgstr "" -#: methods/ftp.cc:784 +#: methods/ftp.cc:785 msgid "Unable to send PORT command" msgstr "" -#: methods/ftp.cc:794 +#: methods/ftp.cc:795 #, c-format msgid "Unknown address family %u (AF_*)" msgstr "" -#: methods/ftp.cc:803 +#: methods/ftp.cc:804 #, c-format msgid "EPRT failed, server said: %s" msgstr "" -#: methods/ftp.cc:823 +#: methods/ftp.cc:824 msgid "Data socket connect timed out" msgstr "" -#: methods/ftp.cc:830 +#: methods/ftp.cc:831 msgid "Unable to accept connection" msgstr "" -#: methods/ftp.cc:869 methods/http.cc:999 methods/rsh.cc:303 +#: methods/ftp.cc:870 methods/http.cc:999 methods/rsh.cc:303 msgid "Problem hashing file" msgstr "" -#: methods/ftp.cc:882 +#: methods/ftp.cc:883 #, c-format msgid "Unable to fetch file, server said '%s'" msgstr "" -#: methods/ftp.cc:897 methods/rsh.cc:322 +#: methods/ftp.cc:898 methods/rsh.cc:322 msgid "Data socket timed out" msgstr "" -#: methods/ftp.cc:927 +#: methods/ftp.cc:928 #, c-format msgid "Data transfer failed, server said '%s'" msgstr "" #. Get the files information -#: methods/ftp.cc:1002 +#: methods/ftp.cc:1005 msgid "Query" msgstr "" -#: methods/ftp.cc:1114 +#: methods/ftp.cc:1117 msgid "Unable to invoke " msgstr "" -- cgit v1.2.3 From 01fc89305c7b5fc52d719c6898a9fdf03abf3ce6 Mon Sep 17 00:00:00 2001 From: Michael Vogt <michael.vogt@ubuntu.com> Date: Fri, 4 Dec 2009 10:22:56 +0100 Subject: * apt-pkg/contrib/netrc.cc: - check for hostname and then host+path - better debug output * methods/https.cc: - fix bug in netrc integration --- apt-pkg/contrib/netrc.cc | 34 +++++++++++++++++++++++++++------- methods/https.cc | 2 +- 2 files changed, 28 insertions(+), 8 deletions(-) (limited to 'methods') diff --git a/apt-pkg/contrib/netrc.cc b/apt-pkg/contrib/netrc.cc index 186527306..91fc7dfd7 100644 --- a/apt-pkg/contrib/netrc.cc +++ b/apt-pkg/contrib/netrc.cc @@ -13,6 +13,7 @@ /*}}}*/ #include <apt-pkg/configuration.h> +#include <apt-pkg/fileutl.h> #include <iostream> #include <stdio.h> #include <stdlib.h> @@ -148,25 +149,44 @@ int parsenetrc (char *host, char *login, char *password, char *netrcfile = NULL) void maybe_add_auth (URI &Uri, string NetRCFile) { if (_config->FindB("Debug::Acquire::netrc", false) == true) - std::clog << "maybe_add_auth: " << NetRCFile << std::endl; + std::clog << "maybe_add_auth: " << (string)Uri + << " " << NetRCFile << std::endl; if (Uri.Password.empty () == true || Uri.User.empty () == true) { if (NetRCFile.empty () == false) { char login[64] = ""; char password[64] = ""; - char *netrcfile = strdup (NetRCFile.c_str ()); - char *host = strdup (Uri.Host.c_str ()); + char *netrcfile = strdupa (NetRCFile.c_str ()); - if (host && 0 == parsenetrc (host, login, password, netrcfile)) + // first check for a generic host based netrc entry + char *host = strdupa (Uri.Host.c_str ()); + if (host && parsenetrc (host, login, password, netrcfile) == 0) { + if (_config->FindB("Debug::Acquire::netrc", false) == true) + std::clog << "host: " << host + << " user: " << login + << " pass-size: " << strlen(password) + << std::endl; Uri.User = string (login); Uri.Password = string (password); + return; } - if (host) - free (host); - free (netrcfile); + // if host did not work, try Host+Path next + // FIXME: with host+path we need to match url.startswith(host+path) + char *hostpath = strdupa (flNotFile(Uri.Host+Uri.Path).c_str ()); + if (hostpath && parsenetrc (hostpath, login, password, netrcfile) == 0) + { + if (_config->FindB("Debug::Acquire::netrc", false) == true) + std::clog << "hostpath: " << hostpath + << " user: " << login + << " pass-size: " << strlen(password) + << std::endl; + Uri.User = string (login); + Uri.Password = string (password); + return; + } } } } diff --git a/methods/https.cc b/methods/https.cc index 075d655b7..585e13848 100644 --- a/methods/https.cc +++ b/methods/https.cc @@ -130,7 +130,7 @@ bool HttpsMethod::Fetch(FetchItem *Itm) maybe_add_auth (Uri, _config->FindFile("Dir::Etc::netrc")); // callbacks - curl_easy_setopt(curl, CURLOPT_URL, Itm->Uri.c_str()); + curl_easy_setopt(curl, CURLOPT_URL, static_cast<string>(Uri).c_str()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); curl_easy_setopt(curl, CURLOPT_WRITEDATA, this); curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback); -- cgit v1.2.3