w3m

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/w3m.git/
Log | Files | Refs | README

commit 650116cc62d86a9019dd83668b65659bdbe4c90a
parent 6ab5c441f6b1a7c939214c2bb75183f277a8248b
Author: ukai <ukai>
Date:   Tue, 10 Sep 2002 17:27:39 +0000

[w3m-dev 03307] add password_file support
* file.c (find_auth_user_passwd): added
* fm.h (passwd_file): added
* rc.c (CMT_PASSWDFILE): added
	(passwdfile): added
From: Fumitoshi UKAI  <ukai@debian.or.jp>

Diffstat:
MChangeLog | 8++++++++
MNEWS | 1+
Mfile.c | 171++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
Mfm.h | 1+
Mrc.c | 4++++
5 files changed, 145 insertions(+), 40 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -1,3 +1,11 @@ +2002-09-11 Fumitoshi UKAI <ukai@debian.or.jp> + + * [w3m-dev 03307] add password_file support + * file.c (find_auth_user_passwd): added + * fm.h (passwd_file): added + * rc.c (CMT_PASSWDFILE): added + (passwdfile): added + 2002-09-09 Hiroyuki Ito <hito@crl.go.jp> * [w3m-dev 03300] framebuffer: 8bit color support diff --git a/NEWS b/NEWS @@ -1,5 +1,6 @@ w3m 0.4? +* rc: passwd_file: passwd file for HTTP auth * func: MARK_WORD * rc: imgsize: obsoleted * w3m-img for framebuffer merged diff --git a/file.c b/file.c @@ -1342,6 +1342,89 @@ findAuthentication(struct http_auth *hauth, Buffer *buf, char *auth_field) return hauth->scheme ? hauth : NULL; } +/* passwd */ +/* + * machine <name> + * port <port> + * path <file> + * realm <realm> + * login <login> + * passwd <passwd> + */ +static int +find_auth_user_passwd(char *host, int port, char *file, char *realm, + Str *uname, Str *pwd) +{ + struct stat st; + FILE *fp; + Str line; + char *d, *tok; + int matched = 0; + + *uname = NULL; + *pwd = NULL; + if (stat(expandName(passwd_file), &st) < 0) + return 0; + + /* check permissions, if group or others readable or writable, + * refuse it, because it's insecure. + */ + if ((st.st_mode & (S_IRWXG | S_IRWXO)) != 0) + return 0; + + fp = fopen(expandName(passwd_file), "r"); + if (fp == NULL) + return 0; /* never? */ + + while ((line = Strfgets(fp))->length > 0) { + d = line->ptr; + if (d[0] == '#') + continue; + tok = strtok(d, " \t\n\r"); + if (tok == NULL) + continue; + d = strtok(NULL, "\n\r"); + if (d == NULL) + continue; + if (strcmp(tok, "machine") == 0) { + if (matched && *uname && *pwd) + return 1; + *uname = NULL; + *pwd = NULL; + if (strcmp(d, host) == 0) + matched = 1; + continue; + } + else if (strcmp(tok, "port") == 0) { + if (matched && (atoi(d) != port)) + matched = 0; + } + else if (strcmp(tok, "path") == 0) { + if (matched && file && (strcmp(d, file) != 0)) + matched = 0; + } + else if (strcmp(tok, "realm") == 0) { + if (matched && realm && (strcmp(d, realm) != 0)) + matched = 0; + } + else if (strcmp(tok, "login") == 0) { + if (matched) + *uname = Strnew_charp(d); + } + else if (strcmp(tok, "password") == 0 || strcmp(tok, "passwd") == 0) { + if (matched) + *pwd = Strnew_charp(d); + } + else { + /* ignore? */ ; + } + } + if (matched && *uname && *pwd) + return 1; + + return 0; +} + static Str getAuthCookie(struct http_auth *hauth, char *auth_header, TextList *extra_header, ParsedURL *pu, HRequest *hr, @@ -1386,53 +1469,61 @@ getAuthCookie(struct http_auth *hauth, char *auth_header, else ss = find_auth_cookie(pu->host, pu->port, pu->file, realm); if (realm && ss == NULL) { - if (QuietMessage) - return ss; - /* input username and password */ - sleep(2); - if (fmInitialized) { - char *pp; - term_raw(); - if ((pp = - inputStr(Sprintf("Username for %s: ", realm)->ptr, - NULL)) == NULL) - return NULL; - uname = Str_conv_to_system(Strnew_charp(pp)); - if ((pp = - inputLine(Sprintf("Password for %s: ", realm)->ptr, NULL, - IN_PASSWORD)) == NULL) - return NULL; - pwd = Str_conv_to_system(Strnew_charp(pp)); + if (find_auth_user_passwd(pu->host, pu->port, pu->file, realm, + &uname, &pwd)) { + /* found username & password in passwd file */ ; } else { - int proxy = !strncasecmp("Proxy-Authorization:", auth_header, - auth_header_len); - - /* - * If post file is specified as '-', stdin is closed at this point. - * In this case, w3m cannot read username from stdin. - * So exit with error message. - * (This is same behavior as lwp-request.) - */ - if (feof(stdin) || ferror(stdin)) { - fprintf(stderr, "w3m: Authorization required for %s\n", realm); - exit(1); + if (QuietMessage) + return ss; + /* input username and password */ + sleep(2); + if (fmInitialized) { + char *pp; + term_raw(); + if ((pp = + inputStr(Sprintf("Username for %s: ", realm)->ptr, + NULL)) == NULL) + return NULL; + uname = Str_conv_to_system(Strnew_charp(pp)); + if ((pp = + inputLine(Sprintf("Password for %s: ", realm)->ptr, NULL, + IN_PASSWORD)) == NULL) + return NULL; + pwd = Str_conv_to_system(Strnew_charp(pp)); } + else { + int proxy = !strncasecmp("Proxy-Authorization:", auth_header, + auth_header_len); + + /* + * If post file is specified as '-', stdin is closed at this + * point. + * In this case, w3m cannot read username from stdin. + * So exit with error message. + * (This is same behavior as lwp-request.) + */ + if (feof(stdin) || ferror(stdin)) { + fprintf(stderr, "w3m: Authorization required for %s\n", + realm); + exit(1); + } - printf(proxy ? "Proxy Username for %s: " : "Username for %s: ", - realm); - fflush(stdout); - uname = Strfgets(stdin); - Strchop(uname); + printf(proxy ? "Proxy Username for %s: " : "Username for %s: ", + realm); + fflush(stdout); + uname = Strfgets(stdin); + Strchop(uname); #ifdef HAVE_GETPASSPHRASE - pwd = Strnew_charp((char *) - getpassphrase(proxy ? "Proxy Password: " : - "Password: ")); + pwd = Strnew_charp((char *) + getpassphrase(proxy ? "Proxy Password: " : + "Password: ")); #else - pwd = Strnew_charp((char *) - getpass(proxy ? "Proxy Password: " : - "Password: ")); + pwd = Strnew_charp((char *) + getpass(proxy ? "Proxy Password: " : + "Password: ")); #endif + } } ss = hauth->cred(hauth, uname, pwd, pu, hr, request); } diff --git a/fm.h b/fm.h @@ -838,6 +838,7 @@ global char *ExtBrowser init(DEF_EXT_BROWSER); global char *ExtBrowser2 init(NULL); global char *ExtBrowser3 init(NULL); global int BackgroundExtViewer init(TRUE); +global char *passwd_file init(NULL); global char *ftppasswd init(NULL); #ifdef FTPPASS_HOSTNAMEGEN global int ftppass_hostnamegen init(TRUE); diff --git a/rc.c b/rc.c @@ -127,6 +127,7 @@ static char *config_file = NULL; #define CMT_EXTBRZ "外部ブラウザ" #define CMT_EXTBRZ2 "外部ブラウザその2" #define CMT_EXTBRZ3 "外部ブラウザその3" +#define CMT_PASSWDFILE "パスワードファイル" #define CMT_FTPPASS "FTPのパスワード(普通は自分のmail addressを使う)" #ifdef FTPPASS_HOSTNAMEGEN #define CMT_FTPPASS_HOSTNAMEGEN "FTPのパスワードのドメイン名を自動生成する" @@ -268,6 +269,7 @@ static char *config_file = NULL; #define CMT_EXTBRZ "External Browser" #define CMT_EXTBRZ2 "Second External Browser" #define CMT_EXTBRZ3 "Third External Browser" +#define CMT_PASSWDFILE "Password file" #define CMT_FTPPASS "Password for anonymous FTP (your mail address)" #ifdef FTPPASS_HOSTNAMEGEN #define CMT_FTPPASS_HOSTNAMEGEN "Generate domain part of password for FTP" @@ -665,6 +667,8 @@ struct param_ptr params8[] = { }; #endif struct param_ptr params9[] = { + {"passwd_file", P_STRING, PI_TEXT, (void *)&passwd_file, CMT_PASSWDFILE, + NULL}, {"ftppasswd", P_STRING, PI_TEXT, (void *)&ftppasswd, CMT_FTPPASS, NULL}, #ifdef FTPPASS_HOSTNAMEGEN {"ftppass_hostnamegen", P_INT, PI_ONOFF, (void *)&ftppass_hostnamegen,