|
Packit Service |
466431 |
/* Copyright (C) 2017 mod_auth_gssapi contributors - See COPYING for (C) terms */
|
|
Packit Service |
466431 |
|
|
Packit Service |
466431 |
#include "mod_auth_gssapi.h"
|
|
Packit Service |
466431 |
|
|
Packit Service |
466431 |
#define NSS_BUF_MIN 1024
|
|
Packit Service |
466431 |
#define NSS_BUF_MAX 1024*1024
|
|
Packit Service |
466431 |
static char *get_buf(char *cur, size_t *len)
|
|
Packit Service |
466431 |
{
|
|
Packit Service |
466431 |
if (*len == 0) {
|
|
Packit Service |
466431 |
*len = NSS_BUF_MIN;
|
|
Packit Service |
466431 |
} else {
|
|
Packit Service |
466431 |
*len *= 2;
|
|
Packit Service |
466431 |
}
|
|
Packit Service |
466431 |
if (*len > NSS_BUF_MAX) {
|
|
Packit Service |
466431 |
*len = 0; /* will free the buf and return NULL */
|
|
Packit Service |
466431 |
}
|
|
Packit Service |
466431 |
return realloc(cur, *len);
|
|
Packit Service |
466431 |
}
|
|
Packit Service |
466431 |
|
|
Packit Service |
466431 |
int mag_get_user_uid(const char *name, uid_t *uid)
|
|
Packit Service |
466431 |
{
|
|
Packit Service |
466431 |
struct passwd pwd, *user;
|
|
Packit Service |
466431 |
size_t buflen = 0;
|
|
Packit Service |
466431 |
char *buf = NULL;
|
|
Packit Service |
466431 |
int ret;
|
|
Packit Service |
466431 |
|
|
Packit Service |
466431 |
do {
|
|
Packit Service |
466431 |
buf = get_buf(buf, &buflen);
|
|
Packit Service |
466431 |
if (buf == NULL || buflen == 0) {
|
|
Packit Service |
466431 |
ret = ENOMEM;
|
|
Packit Service |
466431 |
break;
|
|
Packit Service |
466431 |
}
|
|
Packit Service |
466431 |
ret = getpwnam_r(name, &pwd, buf, buflen, &user);
|
|
Packit Service |
466431 |
} while (ret == ERANGE);
|
|
Packit Service |
466431 |
if (ret != 0 || user != &pwd) {
|
|
Packit Service |
466431 |
ret = (ret == 0) ? EINVAL : ret;
|
|
Packit Service |
466431 |
} else {
|
|
Packit Service |
466431 |
*uid = user->pw_uid;
|
|
Packit Service |
466431 |
}
|
|
Packit Service |
466431 |
free(buf);
|
|
Packit Service |
466431 |
return ret;
|
|
Packit Service |
466431 |
}
|
|
Packit Service |
466431 |
|
|
Packit Service |
466431 |
int mag_get_group_gid(const char *name, gid_t *gid)
|
|
Packit Service |
466431 |
{
|
|
Packit Service |
466431 |
struct group grp, *group;
|
|
Packit Service |
466431 |
size_t buflen = 0;
|
|
Packit Service |
466431 |
char *buf = NULL;
|
|
Packit Service |
466431 |
int ret;
|
|
Packit Service |
466431 |
|
|
Packit Service |
466431 |
do {
|
|
Packit Service |
466431 |
buf = get_buf(buf, &buflen);
|
|
Packit Service |
466431 |
if (buf == NULL || buflen == 0) {
|
|
Packit Service |
466431 |
ret = ENOMEM;
|
|
Packit Service |
466431 |
break;
|
|
Packit Service |
466431 |
}
|
|
Packit Service |
466431 |
ret = getgrnam_r(name, &grp, buf, buflen, &group);
|
|
Packit Service |
466431 |
} while (ret == ERANGE);
|
|
Packit Service |
466431 |
if (ret != 0 || group != &grp) {
|
|
Packit Service |
466431 |
ret = (ret == 0) ? EINVAL : ret;
|
|
Packit Service |
466431 |
} else {
|
|
Packit Service |
466431 |
*gid = group->gr_gid;
|
|
Packit Service |
466431 |
}
|
|
Packit Service |
466431 |
free(buf);
|
|
Packit Service |
466431 |
return ret;
|
|
Packit Service |
466431 |
}
|
|
Packit Service |
466431 |
|
|
Packit Service |
466431 |
bool mag_strbuf_equal(const char *str, gss_buffer_t buf)
|
|
Packit Service |
466431 |
{
|
|
Packit Service |
466431 |
if (strncmp(str, buf->value, buf->length) != 0) return false;
|
|
Packit Service |
466431 |
return buf->length == strlen(str);
|
|
Packit Service |
466431 |
}
|