Please ignore the other thread, it takes ages for me to open my sent box
over gprs, so I'm opening a new one.


Index: fetch.c
===================================================================
RCS file: /cvs/src/usr.bin/ftp/fetch.c,v
retrieving revision 1.105
diff -d -u -p -r1.105 fetch.c
--- fetch.c     30 Apr 2012 13:41:26 -0000      1.105
+++ fetch.c     6 Aug 2012 20:49:51 -0000
@@ -177,7 +177,7 @@ url_get(const char *origline, const char
 {
        char pbuf[NI_MAXSERV], hbuf[NI_MAXHOST], *cp, *portnum, *path, ststr[4];
        char *hosttail, *cause = "unknown", *newline, *host, *port, *buf = NULL;
-       char *epath, *redirurl, *loctail;
+       char *epath, *redirurl, *loctail, *h, *p;
        int error, i, isftpurl = 0, isfileurl = 0, isredirect = 0, rval = -1;
        struct addrinfo hints, *res0, *res, *ares = NULL;
        const char * volatile savefile;
@@ -191,7 +191,7 @@ url_get(const char *origline, const char
        size_t len, wlen;
 #ifndef SMALL
        char *sslpath = NULL, *sslhost = NULL;
-       char *locbase, *full_host = NULL;
+       char *locbase, *full_host = NULL, *auth = NULL;
        const char *scheme;
        int ishttpsurl = 0;
        SSL_CTX *ssl_ctx = NULL;
@@ -228,7 +228,20 @@ url_get(const char *origline, const char
 #endif /* !SMALL */
        } else
                errx(1, "url_get: Invalid URL '%s'", newline);
-
+#ifndef SMALL
+       /* Look for auth header */
+       if (proxyenv == NULL &&
+           (!strcmp(scheme, HTTP_URL) || !strcmp(scheme, HTTPS_URL))) {
+               if ((p = strchr(host, '@')) != NULL) {
+                       *p = 0; /* Kill @ */
+                       if ((auth = calloc(1, 64)) == NULL)
+                               err(1, "Can't allocate memory for 
authorization");
+                       if (b64_ntop(host, strlen(host), auth, 64) == -1)
+                               errx(1, "error in base64 encoding");
+                       host = p + 1;
+               }
+       }
+#endif /* SMALL */
        if (isfileurl) {
                path = host;
        } else {
@@ -639,14 +652,19 @@ again:
                                restart_point = 0;
                }
 #endif /* !SMALL */
-               ftp_printf(fin, ssl, "GET /%s %s\r\nHost: ", epath,
 #ifndef SMALL
-                       restart_point ? "HTTP/1.1\r\nConnection: close" :
-#endif /* !SMALL */
-                       "HTTP/1.0");
+               if (auth) {
+                       ftp_printf(fin, ssl,
+                           "GET /%s %s\r\nAuthorization: Basic %s\r\nHost: ",
+                           epath, restart_point ?
+                           "HTTP/1.1\r\nConnection: close" : "HTTP/1.0",
+                           auth);
+                       free(auth);
+               } else
+#endif /* SMALL */
+               ftp_printf(fin, ssl, "GET /%s %s\r\nHost: ", epath,
+                   "HTTP/1.0");
                if (strchr(host, ':')) {
-                       char *h, *p;
-
                        /*
                         * strip off scoped address portion, since it's
                         * local to node
Index: ftp.1
===================================================================
RCS file: /cvs/src/usr.bin/ftp/ftp.1,v
retrieving revision 1.82
diff -d -u -p -r1.82 ftp.1
--- ftp.1       30 Apr 2012 13:41:26 -0000      1.82
+++ ftp.1       6 Aug 2012 20:22:14 -0000
@@ -61,7 +61,8 @@
 .Op Fl o Ar output
 .Op Fl s Ar srcaddr
 .Sm off
-.No http:// Ar host Oo : Ar port
+.No http:// Oo Ar user : password No @
+.Oc Ar host Oo : Ar port
 .Oc No / Ar file
 .Sm on
 .Ar ...
@@ -71,7 +72,8 @@
 .Op Fl o Ar output
 .Op Fl s Ar srcaddr
 .Sm off
-.No https:// Ar host Oo : Ar port
+.No https:// Oo Ar user : password No @
+.Oc Ar host Oo : Ar port
 .Oc No / Ar file
 .Sm on
 .Ar ...
@@ -1278,12 +1280,12 @@ isn't defined, log in as
 .Ar user
 with a password of
 .Ar password .
-.It http://host[:port]/file
+.It http://[user:password@]host[:port]/file
 An HTTP URL, retrieved using the HTTP protocol.
 If
 .Ev http_proxy
 is defined, it is used as a URL to an HTTP proxy server.
-.It https://host[:port]/file
+.It https://[user:password@]host[:port]/file
 An HTTPS URL, retrieved using the HTTPS protocol.
 If
 .Ev http_proxy
Index: main.c
===================================================================
RCS file: /cvs/src/usr.bin/ftp/main.c,v
retrieving revision 1.83
diff -d -u -p -r1.83 main.c
--- main.c      19 May 2012 02:04:22 -0000      1.83
+++ main.c      6 Aug 2012 19:54:15 -0000
@@ -775,12 +775,14 @@ usage(void)
 #endif /* !SMALL */
            "[-o output] "
 #ifndef SMALL
-           "[-s srcaddr] "
+           "[-s srcaddr]\n"
+           "           "
 #endif /* !SMALL */
-           "http://host[:port]/file ...\n"
+           "http://[user:password@]host[:port]/file ...\n"
 #ifndef SMALL
-           "       %s [-C] [-c cookie] [-o output] [-s srcaddr] "
-           "https://host[:port]/file\n";
+           "       %s [-C] [-c cookie] [-o output] [-s srcaddr]\n"
+           "           "
+           "https://[user:password@]host[:port]/file\n";
            "           ...\n"
 #endif /* !SMALL */
            "       %s "

Reply via email to