Feature #2327 » 0001-mod_auth-ignore-comments-trailing-blanks-and-empty-l.patch
src/http_auth.c | ||
---|---|---|
return result;
|
||
}
|
||
static char *parse_line(char *s, size_t *c) {
|
||
char *e, *comment;
|
||
size_t len = *c;
|
||
if (NULL != (e = memchr(s, '\n', len)))
|
||
len = e++ - s;
|
||
/* ignore comments */
|
||
if (NULL != (comment = memchr(s, '#', len)))
|
||
len = comment - s;
|
||
/* ignore trailing blanks */
|
||
while (len && isblank(s[len-1]))
|
||
len--;
|
||
*c = len;
|
||
return e;
|
||
}
|
||
static int http_auth_get_password(server *srv, mod_auth_plugin_data *p, buffer *username, buffer *realm, buffer *password) {
|
||
int ret = -1;
|
||
... | ... | |
if (p->conf.auth_backend == AUTH_BACKEND_HTDIGEST) {
|
||
stream f;
|
||
char * f_line;
|
||
size_t line_len;
|
||
if (buffer_is_empty(p->conf.auth_htdigest_userfile)) return -1;
|
||
... | ... | |
f_line = f.start;
|
||
while (f_line - f.start != f.size) {
|
||
char *f_user, *f_pwd, *e, *f_realm;
|
||
size_t u_len, pwd_len, r_len;
|
||
while (f_line && (line_len = f.size - (f_line - f.start))) {
|
||
char *f_user, *f_pwd, *f_realm;
|
||
size_t u_len, r_len;
|
||
f_user = f_line;
|
||
... | ... | |
* user:realm:md5(user:realm:password)
|
||
*/
|
||
if (NULL == (f_realm = memchr(f_user, ':', f.size - (f_user - f.start) ))) {
|
||
f_line = parse_line(f_user, &line_len);
|
||
if (!line_len)
|
||
continue;
|
||
if (NULL == (f_realm = memchr(f_user, ':', line_len))) {
|
||
log_error_write(srv, __FILE__, __LINE__, "sbs",
|
||
"parsed error in", p->conf.auth_htdigest_userfile,
|
||
"expected 'username:realm:hashed password'");
|
||
... | ... | |
return -1;
|
||
}
|
||
u_len = f_realm - f_user;
|
||
f_realm++;
|
||
if (NULL == (f_pwd = memchr(f_realm + 1, ':', f.size - (f_realm + 1 - f.start)))) {
|
||
if (NULL == (f_pwd = memchr(f_realm, ':', line_len - u_len - 1))) {
|
||
log_error_write(srv, __FILE__, __LINE__, "sbs",
|
||
"parsed error in", p->conf.auth_plain_userfile,
|
||
"expected 'username:realm:hashed password'");
|
||
... | ... | |
return -1;
|
||
}
|
||
/* get pointers to the fields */
|
||
u_len = f_realm - f_user;
|
||
f_realm++;
|
||
r_len = f_pwd - f_realm;
|
||
f_pwd++;
|
||
if (NULL != (e = memchr(f_pwd, '\n', f.size - (f_pwd - f.start)))) {
|
||
pwd_len = e - f_pwd;
|
||
} else {
|
||
pwd_len = f.size - (f_pwd - f.start);
|
||
}
|
||
if (username->used - 1 == u_len &&
|
||
(realm->used - 1 == r_len) &&
|
||
(0 == strncmp(username->ptr, f_user, u_len)) &&
|
||
(0 == strncmp(realm->ptr, f_realm, r_len))) {
|
||
/* found */
|
||
buffer_copy_string_len(password, f_pwd, pwd_len);
|
||
buffer_copy_string_len(password, f_pwd, line_len - (f_pwd - f_user));
|
||
ret = 0;
|
||
break;
|
||
}
|
||
/* EOL */
|
||
if (!e) break;
|
||
f_line = e + 1;
|
||
}
|
||
stream_close(&f);
|
||
... | ... | |
stream f;
|
||
char * f_line;
|
||
buffer *auth_fn;
|
||
size_t line_len;
|
||
auth_fn = (p->conf.auth_backend == AUTH_BACKEND_HTPASSWD) ? p->conf.auth_htpasswd_userfile : p->conf.auth_plain_userfile;
|
||
... | ... | |
f_line = f.start;
|
||
while (f_line - f.start != f.size) {
|
||
char *f_user, *f_pwd, *e;
|
||
size_t u_len, pwd_len;
|
||
while (f_line && (line_len = f.size - (f_line - f.start))) {
|
||
char *f_user, *f_pwd;
|
||
size_t u_len;
|
||
f_user = f_line;
|
||
... | ... | |
* user:crypted passwd
|
||
*/
|
||
if (NULL == (f_pwd = memchr(f_user, ':', f.size - (f_user - f.start) ))) {
|
||
f_line = parse_line(f_user, &line_len);
|
||
if (!line_len)
|
||
continue;
|
||
if (NULL == (f_pwd = memchr(f_user, ':', line_len))) {
|
||
log_error_write(srv, __FILE__, __LINE__, "sbs",
|
||
"parsed error in", auth_fn,
|
||
"expected 'username:hashed password'");
|
||
... | ... | |
u_len = f_pwd - f_user;
|
||
f_pwd++;
|
||
if (NULL != (e = memchr(f_pwd, '\n', f.size - (f_pwd - f.start)))) {
|
||
pwd_len = e - f_pwd;
|
||
} else {
|
||
pwd_len = f.size - (f_pwd - f.start);
|
||
}
|
||
if (username->used - 1 == u_len &&
|
||
(0 == strncmp(username->ptr, f_user, u_len))) {
|
||
/* found */
|
||
buffer_copy_string_len(password, f_pwd, pwd_len);
|
||
buffer_copy_string_len(password, f_pwd, line_len - (f_pwd - f_user));
|
||
ret = 0;
|
||
break;
|
||
}
|
||
/* EOL */
|
||
if (!e) break;
|
||
f_line = e + 1;
|
||
}
|
||
stream_close(&f);
|
tests/lighttpd.htpasswd | ||
---|---|---|
# some comment
|
||
des:12tMnfw882VDQ
|
||
md5:$1$md5$kIa7Juuiv8zja0ILQPR36/
|
||
md5:$1$md5$kIa7Juuiv8zja0ILQPR36/ # another one
|