On 08/06/12 22:56, Christiano F. Haesbaert wrote:
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 */

- Is this safe for urls like "http://some.host/path/e:mail@me/"; ?
- Should it be?
- Should it maybe be done on the host part after the
  host/path separation?

Not sure what the rfc's says on this. Chrome seems to accept the path I wrote above though.

+       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)

Why not malloc?

Also, if you allocate it at runtime, why fixed at 64? Why not make it sth like

        malloc((strlen(host) + 2) * 4 / 3)

(well, or)

        calloc(4, (strlen(host) + 2) / 3)

?

+                               err(1, "Can't allocate memory for 
authorization");
+                       if (b64_ntop(host, strlen(host), auth, 64) == -1)
(with appropriate fixing here                                  ^^)

+                               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

The above leaves the pretty useless residue of:

#endif /* !SMALL */
#ifndef SMALL

Is this intentional?

-                       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 "



Man page synopsis and usage() is getting a bit messy... :-d

Don't know if that's something to solve with this diff though.

/Alexander

Reply via email to