Re: [Bug-wget] [PATCH v3] bug #48811: netrc password wins over interactive --ask-password
Thanks Piotr, just one question for my understanding... In the current code, 'user' and 'password' selection matches: > - user = u->user; > - passwd = u->passwd; > - search_netrc (u->host, (const char **), (const char **), 1); > - user = user ? user : (opt.ftp_user ? opt.ftp_user : opt.user); > - if (!user) user = "anonymous"; > - passwd = passwd ? passwd : (opt.ftp_passwd ? opt.ftp_passwd : > opt.passwd); - if (!passwd) passwd = "-wget@"; In the new code, the expressions for the selection do not match: > + cred->user = cred->user ? cred->user : (protocol_specific_user ? > protocol_specific_user : opt.user); > + cred->passwd = opt_passwd ? opt_passwd : (u->passwd ? u->passwd : > protocol_specific_passwd); Is this by purpose and if so, please explain / add a explanatory comment. Regards, Tim On Tuesday, November 22, 2016 10:32:18 PM CET Piotr Wajda wrote: > * utils.h: New struct net_credentials and pick_credentials function > * utils.c: pick_credentials for selecting FTP/HTTP user/passwd according to > importance * retr.c: define net_cred structure to hold user/passwd pair > * ftp.c: call pick_credentials before getftp > * http.c: call pick_credentials before gethttp > > --- > src/ftp.c | 25 ++--- > src/http.c | 26 +++--- > src/retr.c | 3 +++ > src/utils.c | 20 > src/utils.h | 11 +++ > 5 files changed, 55 insertions(+), 30 deletions(-) > > diff --git a/src/ftp.c b/src/ftp.c > index 947d8f2..42c84ad 100644 > --- a/src/ftp.c > +++ b/src/ftp.c > @@ -81,6 +81,7 @@ typedef struct >struct url *proxy;/* FTWK-style proxy */ > } ccon; > > +extern struct net_credentials net_cred; > > /* Look for regexp "( *[0-9]+ *byte" (literal parenthesis) anywhere in > the string S, and return the number converted to wgint, if found, 0 > @@ -321,13 +322,13 @@ static uerr_t > getftp (struct url *u, struct url *original_url, > wgint passed_expected_bytes, wgint *qtyread, > wgint restval, ccon *con, int count, wgint *last_expected_bytes, > -FILE *warc_tmp) > +FILE *warc_tmp, struct net_credentials *ftp_cred) > { >int csock, dtsock, local_sock, res; >uerr_t err = RETROK; /* appease the compiler */ >FILE *fp = NULL; >char *respline, *tms; > - const char *user, *passwd, *tmrate; > + const char *tmrate; >int cmd = con->cmd; >wgint expected_bytes = 0; >bool got_expected_bytes = false; > @@ -359,14 +360,6 @@ getftp (struct url *u, struct url *original_url, > >*qtyread = restval; > > - user = u->user; > - passwd = u->passwd; > - search_netrc (u->host, (const char **), (const char **), 1); > - user = user ? user : (opt.ftp_user ? opt.ftp_user : opt.user); > - if (!user) user = "anonymous"; > - passwd = passwd ? passwd : (opt.ftp_passwd ? opt.ftp_passwd : > opt.passwd); - if (!passwd) passwd = "-wget@"; > - >dtsock = -1; >local_sock = -1; >con->dltime = 0; > @@ -461,18 +454,18 @@ getftp (struct url *u, struct url *original_url, > >/* Second: Login with proper USER/PASS sequence. */ >logprintf (LOG_VERBOSE, _("Logging in as %s ... "), > - quotearg_style (escape_quoting_style, user)); > + quotearg_style (escape_quoting_style, ftp_cred->user)); >if (opt.server_response) > logputs (LOG_ALWAYS, "\n"); >if (con->proxy) > { >/* If proxy is in use, log in as username@target-site. */ > - char *logname = concat_strings (user, "@", u->host, (char *) 0); > - err = ftp_login (csock, logname, passwd); > + char *logname = concat_strings (ftp_cred->user, "@", u->host, > (char *) 0); + err = ftp_login (csock, logname, ftp_cred->passwd); >xfree (logname); > } >else > -err = ftp_login (csock, user, passwd); > +err = ftp_login (csock, ftp_cred->user, ftp_cred->passwd); > >/* FTPRERR, FTPSRVERR, WRITEFAILED, FTPLOGREFUSED, FTPLOGINC */ >switch (err) > @@ -1937,10 +1930,12 @@ ftp_loop_internal (struct url *u, struct url > *original_url, struct fileinfo *f, else > len = 0; > > + pick_credentials (u, opt.ftp_user, opt.ftp_passwd, opt.user, > opt.passwd, 1, _cred); + >/* If we are working on a WARC record, getftp should also write > to the warc_tmp file. */ >err = getftp (u, original_url, len, , restval, con, count, > -_expected_bytes, warc_tmp); > +_expected_bytes, warc_tmp, _cred); > >if (con->csock == -1) > con->st &= ~DONE_CWD; > diff --git a/src/http.c b/src/http.c > index 67b3686..fbd10dd 100644 > --- a/src/http.c > +++ b/src/http.c > @@ -79,6 +79,7 @@ as that of the covered work. */ > # include "vms.h" > #endif /* def __VMS */ > > +extern struct net_credentials net_cred; > > /* Forward decls. */ > struct http_stat; > @@ -1813,7 +1814,7 @@
[Bug-wget] [PATCH v3] bug #48811: netrc password wins over interactive --ask-password
* utils.h: New struct net_credentials and pick_credentials function * utils.c: pick_credentials for selecting FTP/HTTP user/passwd according to importance * retr.c: define net_cred structure to hold user/passwd pair * ftp.c: call pick_credentials before getftp * http.c: call pick_credentials before gethttp --- src/ftp.c | 25 ++--- src/http.c | 26 +++--- src/retr.c | 3 +++ src/utils.c | 20 src/utils.h | 11 +++ 5 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/ftp.c b/src/ftp.c index 947d8f2..42c84ad 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -81,6 +81,7 @@ typedef struct struct url *proxy;/* FTWK-style proxy */ } ccon; +extern struct net_credentials net_cred; /* Look for regexp "( *[0-9]+ *byte" (literal parenthesis) anywhere in the string S, and return the number converted to wgint, if found, 0 @@ -321,13 +322,13 @@ static uerr_t getftp (struct url *u, struct url *original_url, wgint passed_expected_bytes, wgint *qtyread, wgint restval, ccon *con, int count, wgint *last_expected_bytes, -FILE *warc_tmp) +FILE *warc_tmp, struct net_credentials *ftp_cred) { int csock, dtsock, local_sock, res; uerr_t err = RETROK; /* appease the compiler */ FILE *fp = NULL; char *respline, *tms; - const char *user, *passwd, *tmrate; + const char *tmrate; int cmd = con->cmd; wgint expected_bytes = 0; bool got_expected_bytes = false; @@ -359,14 +360,6 @@ getftp (struct url *u, struct url *original_url, *qtyread = restval; - user = u->user; - passwd = u->passwd; - search_netrc (u->host, (const char **), (const char **), 1); - user = user ? user : (opt.ftp_user ? opt.ftp_user : opt.user); - if (!user) user = "anonymous"; - passwd = passwd ? passwd : (opt.ftp_passwd ? opt.ftp_passwd : opt.passwd); - if (!passwd) passwd = "-wget@"; - dtsock = -1; local_sock = -1; con->dltime = 0; @@ -461,18 +454,18 @@ getftp (struct url *u, struct url *original_url, /* Second: Login with proper USER/PASS sequence. */ logprintf (LOG_VERBOSE, _("Logging in as %s ... "), - quotearg_style (escape_quoting_style, user)); + quotearg_style (escape_quoting_style, ftp_cred->user)); if (opt.server_response) logputs (LOG_ALWAYS, "\n"); if (con->proxy) { /* If proxy is in use, log in as username@target-site. */ - char *logname = concat_strings (user, "@", u->host, (char *) 0); - err = ftp_login (csock, logname, passwd); + char *logname = concat_strings (ftp_cred->user, "@", u->host, (char *) 0); + err = ftp_login (csock, logname, ftp_cred->passwd); xfree (logname); } else -err = ftp_login (csock, user, passwd); +err = ftp_login (csock, ftp_cred->user, ftp_cred->passwd); /* FTPRERR, FTPSRVERR, WRITEFAILED, FTPLOGREFUSED, FTPLOGINC */ switch (err) @@ -1937,10 +1930,12 @@ ftp_loop_internal (struct url *u, struct url *original_url, struct fileinfo *f, else len = 0; + pick_credentials (u, opt.ftp_user, opt.ftp_passwd, opt.user, opt.passwd, 1, _cred); + /* If we are working on a WARC record, getftp should also write to the warc_tmp file. */ err = getftp (u, original_url, len, , restval, con, count, -_expected_bytes, warc_tmp); +_expected_bytes, warc_tmp, _cred); if (con->csock == -1) con->st &= ~DONE_CWD; diff --git a/src/http.c b/src/http.c index 67b3686..fbd10dd 100644 --- a/src/http.c +++ b/src/http.c @@ -79,6 +79,7 @@ as that of the covered work. */ # include "vms.h" #endif /* def __VMS */ +extern struct net_credentials net_cred; /* Forward decls. */ struct http_stat; @@ -1813,7 +1814,7 @@ time_to_rfc1123 (time_t time, char *buf, size_t bufsize) static struct request * initialize_request (const struct url *u, struct http_stat *hs, int *dt, struct url *proxy, bool inhibit_keep_alive, bool *basic_auth_finished, -wgint *body_data_size, char **user, char **passwd, uerr_t *ret) +wgint *body_data_size, struct net_credentials **http_cred, uerr_t *ret) { bool head_only = !!(*dt & HEAD_ONLY); struct request *req; @@ -1875,21 +1876,14 @@ initialize_request (const struct url *u, struct http_stat *hs, int *dt, struct u request_set_header (req, "Accept", "*/*", rel_none); request_set_header (req, "Accept-Encoding", "identity", rel_none); - /* Find the username and password for authentication. */ - *user = u->user; - *passwd = u->passwd; - search_netrc (u->host, (const char **)user, (const char **)passwd, 0); - *user = *user ? *user : (opt.http_user ? opt.http_user : opt.user); - *passwd = *passwd ? *passwd : (opt.http_passwd ? opt.http_passwd : opt.passwd); - /* We only do