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