version 1.58, 2005/03/14 11:44:42 |
version 1.58.2.1, 2005/09/04 18:39:52 |
|
|
struct stat st; |
struct stat st; |
const char *hostname = NULL, *ipaddr = NULL; |
const char *hostname = NULL, *ipaddr = NULL; |
char *shell; |
char *shell; |
int i; |
u_int i; |
|
|
/* Shouldn't be called if pw is NULL, but better safe than sorry... */ |
/* Shouldn't be called if pw is NULL, but better safe than sorry... */ |
if (!pw || !pw->pw_name) |
if (!pw || !pw->pw_name) |
|
|
* |
* |
* This returns a buffer allocated by xmalloc. |
* This returns a buffer allocated by xmalloc. |
*/ |
*/ |
char * |
static char * |
expand_filename(const char *filename, struct passwd *pw) |
expand_authorized_keys(const char *filename, struct passwd *pw) |
{ |
{ |
Buffer buffer; |
char *file, *ret; |
char *file; |
|
const char *cp; |
|
|
|
/* |
file = percent_expand(filename, "h", pw->pw_dir, |
* Build the filename string in the buffer by making the appropriate |
"u", pw->pw_name, (char *)NULL); |
* substitutions to the given file name. |
|
*/ |
|
buffer_init(&buffer); |
|
for (cp = filename; *cp; cp++) { |
|
if (cp[0] == '%' && cp[1] == '%') { |
|
buffer_append(&buffer, "%", 1); |
|
cp++; |
|
continue; |
|
} |
|
if (cp[0] == '%' && cp[1] == 'h') { |
|
buffer_append(&buffer, pw->pw_dir, strlen(pw->pw_dir)); |
|
cp++; |
|
continue; |
|
} |
|
if (cp[0] == '%' && cp[1] == 'u') { |
|
buffer_append(&buffer, pw->pw_name, |
|
strlen(pw->pw_name)); |
|
cp++; |
|
continue; |
|
} |
|
buffer_append(&buffer, cp, 1); |
|
} |
|
buffer_append(&buffer, "\0", 1); |
|
|
|
/* |
/* |
* Ensure that filename starts anchored. If not, be backward |
* Ensure that filename starts anchored. If not, be backward |
* compatible and prepend the '%h/' |
* compatible and prepend the '%h/' |
*/ |
*/ |
file = xmalloc(MAXPATHLEN); |
if (*file == '/') |
cp = buffer_ptr(&buffer); |
return (file); |
if (*cp != '/') |
|
snprintf(file, MAXPATHLEN, "%s/%s", pw->pw_dir, cp); |
|
else |
|
strlcpy(file, cp, MAXPATHLEN); |
|
|
|
buffer_free(&buffer); |
ret = xmalloc(MAXPATHLEN); |
return file; |
if (strlcpy(ret, pw->pw_dir, MAXPATHLEN) >= MAXPATHLEN || |
|
strlcat(ret, "/", MAXPATHLEN) >= MAXPATHLEN || |
|
strlcat(ret, file, MAXPATHLEN) >= MAXPATHLEN) |
|
fatal("expand_authorized_keys: path too long"); |
|
|
|
xfree(file); |
|
return (ret); |
} |
} |
|
|
char * |
char * |
authorized_keys_file(struct passwd *pw) |
authorized_keys_file(struct passwd *pw) |
{ |
{ |
return expand_filename(options.authorized_keys_file, pw); |
return expand_authorized_keys(options.authorized_keys_file, pw); |
} |
} |
|
|
char * |
char * |
authorized_keys_file2(struct passwd *pw) |
authorized_keys_file2(struct passwd *pw) |
{ |
{ |
return expand_filename(options.authorized_keys_file2, pw); |
return expand_authorized_keys(options.authorized_keys_file2, pw); |
} |
} |
|
|
/* return ok if key exists in sysfile or userfile */ |
/* return ok if key exists in sysfile or userfile */ |