version 1.6, 2000/06/19 20:35:47 |
version 1.7, 2000/06/19 22:42:28 |
|
|
#define PERM_SECURE (S_IRUSR|S_IWUSR) |
#define PERM_SECURE (S_IRUSR|S_IWUSR) |
|
|
int |
int |
tcfspwdbr_new (tcfspwdb **new) |
tcfspwdbr_new(tcfspwdb **new) |
{ |
{ |
*new = (tcfspwdb *)calloc(1, sizeof(tcfspwdb)); |
*new = (tcfspwdb *)calloc(1, sizeof(tcfspwdb)); |
|
|
|
|
} |
} |
|
|
int |
int |
tcfsgpwdbr_new (tcfsgpwdb **new) |
tcfsgpwdbr_new(tcfsgpwdb **new) |
{ |
{ |
*new = (tcfsgpwdb *)calloc(1, sizeof(tcfsgpwdb)); |
*new = (tcfsgpwdb *)calloc(1, sizeof(tcfsgpwdb)); |
|
|
|
|
} |
} |
|
|
int |
int |
tcfspwdbr_edit (tcfspwdb **tmp, int flags,...) |
tcfspwdbr_edit (tcfspwdb **tmp, int flags, ...) |
{ |
{ |
va_list argv; |
va_list argv; |
char *d; |
char *d; |
|
|
if (!*tmp) |
if (!*tmp) |
if (!tcfspwdbr_new (tmp)) |
if (!tcfspwdbr_new(tmp)) |
return 0; |
return (0); |
|
|
va_start (argv, flags); |
va_start(argv, flags); |
|
|
if (flags & F_USR) { |
if (flags & F_USR) { |
d = va_arg (argv, char *); |
d = va_arg(argv, char *); |
strcpy ((*tmp)->user, d); |
strcpy((*tmp)->user, d); |
} |
} |
|
|
if (flags & F_PWD) { |
if (flags & F_PWD) { |
d = va_arg (argv, char *); |
d = va_arg(argv, char *); |
strcpy ((*tmp)->upw, d); |
strcpy((*tmp)->upw, d); |
} |
} |
|
|
va_end (argv); |
va_end(argv); |
return 1; |
return (1); |
} |
} |
|
|
int |
int |
tcfsgpwdbr_edit (tcfsgpwdb **tmp, int flags,...) |
tcfsgpwdbr_edit(tcfsgpwdb **tmp, int flags, ...) |
{ |
{ |
va_list argv; |
va_list argv; |
char *d; |
char *d; |
|
|
if (!*tmp) |
if (!*tmp) |
if (!tcfsgpwdbr_new (tmp)) |
if (!tcfsgpwdbr_new(tmp)) |
return 0; |
return (0); |
|
|
va_start (argv, flags); |
va_start(argv, flags); |
|
|
if (flags & F_USR) { |
if (flags & F_USR) { |
d = va_arg (argv, char *); |
d = va_arg(argv, char *); |
strcpy ((*tmp)->user, d); |
strcpy((*tmp)->user, d); |
} |
} |
|
|
if (flags & F_GKEY) { |
if (flags & F_GKEY) { |
d = va_arg (argv, char *); |
d = va_arg(argv, char *); |
strcpy ((*tmp)->gkey, d); |
strcpy((*tmp)->gkey, d); |
} |
} |
|
|
if (flags & F_GID) { |
if (flags & F_GID) { |
gid_t d; |
gid_t d; |
d = va_arg (argv, gid_t); |
d = va_arg(argv, gid_t); |
(*tmp)->gid = d; |
(*tmp)->gid = d; |
} |
} |
|
|
if (flags & F_MEMBERS) { |
if (flags & F_MEMBERS) { |
int d; |
int d; |
d = va_arg (argv, int); |
d = va_arg(argv, int); |
(*tmp)->n = d; |
(*tmp)->n = d; |
} |
} |
|
|
if (flags & F_THRESHOLD) { |
if (flags & F_THRESHOLD) { |
int d; |
int d; |
d = va_arg (argv, int); |
d = va_arg(argv, int); |
(*tmp)->soglia = d; |
(*tmp)->soglia = d; |
} |
} |
|
|
va_end (argv); |
va_end(argv); |
return (1); |
return (1); |
} |
} |
|
|
int |
int |
tcfspwdbr_read (tcfspwdb *t, int flags,...) |
tcfspwdbr_read(tcfspwdb *t, int flags, ...) |
{ |
{ |
va_list argv; |
va_list argv; |
char *d; |
char *d; |
|
|
va_start (argv, flags); |
va_start(argv, flags); |
|
|
if (flags & F_USR) { |
if (flags & F_USR) { |
d = va_arg (argv, char *); |
d = va_arg(argv, char *); |
memset (d, 0, UserLen); |
memset(d, 0, UserLen); |
strcpy (d, t->user); |
strcpy(d, t->user); |
} |
} |
|
|
if (flags & F_PWD) { |
if (flags & F_PWD) { |
d = va_arg (argv, char *); |
d = va_arg(argv, char *); |
memset (d, 0, PassLen); |
memset(d, 0, PassLen); |
strcpy (d, t->upw); |
strcpy(d, t->upw); |
} |
} |
|
|
va_end (argv); |
va_end(argv); |
return 0; |
return (0); |
} |
} |
|
|
int |
int |
tcfsgpwdbr_read (tcfsgpwdb *t, int flags,...) |
tcfsgpwdbr_read(tcfsgpwdb *t, int flags, ...) |
{ |
{ |
va_list argv; |
va_list argv; |
char *d; |
char *d; |
|
|
va_start (argv, flags); |
va_start(argv, flags); |
|
|
if (flags & F_USR) { |
if (flags & F_USR) { |
d = va_arg (argv, char *); |
d = va_arg(argv, char *); |
strcpy (d, t->user); |
strcpy(d, t->user); |
} |
} |
|
|
if (flags & F_GKEY) { |
if (flags & F_GKEY) { |
d = va_arg (argv, char *); |
d = va_arg(argv, char *); |
strcpy (d, t->gkey); |
strcpy(d, t->gkey); |
} |
} |
|
|
if (flags & F_GID) { |
if (flags & F_GID) { |
gid_t *d; |
gid_t *d; |
|
|
d = va_arg (argv, gid_t *); |
d = va_arg(argv, gid_t *); |
memcpy (d, &t->gid, sizeof (gid_t)); |
memcpy(d, &t->gid, sizeof (gid_t)); |
} |
} |
/* Incomplete... */ |
/* Incomplete... */ |
|
|
va_end (argv); |
va_end(argv); |
return 0; |
return (0); |
} |
} |
|
|
void |
void |
tcfspwdbr_dispose (tcfspwdb *t) |
tcfspwdbr_dispose(tcfspwdb *t) |
{ |
{ |
free ((void *)t); |
free((void *)t); |
} |
} |
|
|
void |
void |
tcfsgpwdbr_dispose (tcfsgpwdb *t) |
tcfsgpwdbr_dispose(tcfsgpwdb *t) |
{ |
{ |
free ((void *)t); |
free((void *)t); |
} |
} |
|
|
tcfspwdb * |
tcfspwdb * |
tcfs_getpwnam (char *user, tcfspwdb **dest) |
tcfs_getpwnam(char *user, tcfspwdb **dest) |
{ |
{ |
DB *pdb; |
DB *pdb; |
DBT srchkey, r; |
DBT srchkey, r; |
|
|
if (!*dest) |
if (!*dest) |
if (!tcfspwdbr_new (dest)) |
if (!tcfspwdbr_new(dest)) |
return NULL; |
return (NULL); |
|
|
pdb = dbopen (TCFSPWDB, O_RDONLY, 0, DB_HASH, NULL); |
pdb = dbopen(TCFSPWDB, O_RDONLY, 0, DB_HASH, NULL); |
if (!pdb) |
if (!pdb) |
return NULL; |
return (NULL); |
|
|
srchkey.data = user; |
srchkey.data = user; |
srchkey.size = (int) strlen (user); |
srchkey.size = (int)strlen(user); |
|
|
if (pdb->get(pdb, &srchkey, &r, 0)) { |
if (pdb->get(pdb, &srchkey, &r, 0)) { |
pdb->close(pdb); |
pdb->close(pdb); |
return 0; |
return (0); |
} |
} |
|
|
if (r.size != sizeof(tcfspwdb)) { |
if (r.size != sizeof(tcfspwdb)) { |
fprintf(stderr, "db: incorrect record size: %d != %d\n", |
fprintf(stderr, "db: incorrect record size: %d != %d\n", |
r.size, sizeof(tcfspwdb)); |
r.size, sizeof(tcfspwdb)); |
pdb->close(pdb); |
pdb->close(pdb); |
return 0; |
return (0); |
} |
} |
|
|
memcpy (*dest, r.data, sizeof (tcfspwdb)); |
memcpy(*dest, r.data, sizeof(tcfspwdb)); |
|
|
pdb->close (pdb); |
pdb->close(pdb); |
|
|
return (tcfspwdb *)*dest; |
return ((tcfspwdb *)*dest); |
} |
} |
|
|
tcfsgpwdb * |
tcfsgpwdb * |
tcfs_ggetpwnam (char *user, gid_t gid, tcfsgpwdb **dest) |
tcfs_ggetpwnam(char *user, gid_t gid, tcfsgpwdb **dest) |
{ |
{ |
DB *pdb; |
DB *pdb; |
DBT srchkey, r; |
DBT srchkey, r; |
|
|
int res; |
int res; |
|
|
if (!*dest) |
if (!*dest) |
if (!tcfsgpwdbr_new (dest)) |
if (!tcfsgpwdbr_new(dest)) |
return NULL; |
return (NULL); |
|
|
pdb = dbopen (TCFSGPWDB, O_RDONLY, 0, DB_HASH, NULL); |
pdb = dbopen(TCFSGPWDB, O_RDONLY, 0, DB_HASH, NULL); |
if (!pdb) |
if (!pdb) |
return NULL; |
return (NULL); |
|
|
key = (char*)calloc(strlen(user)+4/*gid lenght*/+1/*null*/,sizeof(char)); |
key = (char*)calloc(strlen(user)+4/*gid lenght*/+1/*null*/,sizeof(char)); |
if (!key) |
if (!key) |
return NULL; |
return (NULL); |
|
|
sprintf (key, "%s\33%d\0", user, (int)gid); |
sprintf(key, "%s\33%d\0", user, (int)gid); |
srchkey.data = key; |
srchkey.data = key; |
srchkey.size = (int)strlen (key); |
srchkey.size = (int)strlen(key); |
|
|
if ((res = pdb->get(pdb, &srchkey, &r, 0))) { |
if ((res = pdb->get(pdb, &srchkey, &r, 0))) { |
if (res == -1) |
if (res == -1) |
perror("dbget"); |
perror("dbget"); |
pdb->close (pdb); |
pdb->close(pdb); |
return (NULL); |
return (NULL); |
} |
} |
|
|
memcpy (*dest, r.data, sizeof (tcfsgpwdb)); |
memcpy(*dest, r.data, sizeof(tcfsgpwdb)); |
|
|
pdb->close (pdb); |
pdb->close(pdb); |
|
|
return (*dest); |
return (*dest); |
} |
} |
|
|
int |
int |
tcfs_putpwnam (char *user, tcfspwdb *src, int flags) |
tcfs_putpwnam(char *user, tcfspwdb *src, int flags) |
{ |
{ |
DB *pdb; |
DB *pdb; |
static DBT srchkey, d; |
static DBT srchkey, d; |
int open_flag = 0, res; |
int open_flag = 0, res; |
|
|
open_flag = O_RDWR|O_EXCL; |
open_flag = O_RDWR|O_EXCL; |
if (access (TCFSPWDB, F_OK) < 0) |
if (access(TCFSPWDB, F_OK) < 0) |
open_flag |= O_CREAT; |
open_flag |= O_CREAT; |
|
|
pdb = dbopen (TCFSPWDB, open_flag, PERM_SECURE, DB_HASH, NULL); |
pdb = dbopen(TCFSPWDB, open_flag, PERM_SECURE, DB_HASH, NULL); |
if (!pdb) |
if (!pdb) |
return 0; |
return (0); |
|
|
srchkey.data = user; |
srchkey.data = user; |
srchkey.size = (int)strlen (user); |
srchkey.size = (int)strlen(user); |
|
|
if (flags != U_DEL) { |
if (flags != U_DEL) { |
d.data = (char *)src; |
d.data = (char *)src; |
|
|
|
|
if (pdb->put(pdb, &srchkey, &d, 0) == -1) { |
if (pdb->put(pdb, &srchkey, &d, 0) == -1) { |
fprintf(stderr, "db: put failed\n"); |
fprintf(stderr, "db: put failed\n"); |
pdb->close (pdb); |
pdb->close(pdb); |
return 0; |
return (0); |
} |
} |
} else if ((res = pdb->del (pdb, &srchkey, 0))) { |
} else if ((res = pdb->del(pdb, &srchkey, 0))) { |
fprintf(stderr, "db: del failed: %s\n", |
fprintf(stderr, "db: del failed: %s\n", |
res == -1 ? "error" : "not found"); |
res == -1 ? "error" : "not found"); |
pdb->close (pdb); |
pdb->close(pdb); |
return 0; |
return (0); |
} |
} |
|
|
pdb->close (pdb); |
pdb->close(pdb); |
return 1; |
return (1); |
} |
} |
|
|
int |
int |
tcfs_gputpwnam (char *user, tcfsgpwdb *src, int flags) |
tcfs_gputpwnam(char *user, tcfsgpwdb *src, int flags) |
{ |
{ |
DB *pdb; |
DB *pdb; |
static DBT srchkey, d; |
static DBT srchkey, d; |
|
|
char *key; |
char *key; |
|
|
open_flag = O_RDWR|O_EXCL; |
open_flag = O_RDWR|O_EXCL; |
if (access (TCFSGPWDB, F_OK) < 0) |
if (access(TCFSGPWDB, F_OK) < 0) |
open_flag |= O_CREAT; |
open_flag |= O_CREAT; |
|
|
pdb = dbopen (TCFSGPWDB, open_flag, PERM_SECURE, DB_HASH, NULL); |
pdb = dbopen(TCFSGPWDB, open_flag, PERM_SECURE, DB_HASH, NULL); |
if (!pdb) { |
if (!pdb) { |
perror("dbopen"); |
perror("dbopen"); |
return 0; |
return (0); |
} |
} |
|
|
key = (char *) calloc (strlen(src->user) + 4 + 1, sizeof(char)); |
key = (char *)calloc(strlen(src->user) + 4 + 1, sizeof(char)); |
sprintf (key, "%s\33%d\0", src->user, src->gid); |
sprintf(key, "%s\33%d\0", src->user, src->gid); |
|
|
srchkey.data = key; |
srchkey.data = key; |
srchkey.size = strlen (key); |
srchkey.size = strlen(key); |
|
|
if (flags != U_DEL) { |
if (flags != U_DEL) { |
d.data = (char *)src; |
d.data = (char *)src; |
d.size = sizeof(tcfsgpwdb); |
d.size = sizeof(tcfsgpwdb); |
|
|
if (pdb->put (pdb, &srchkey, &d, 0) == -1) { |
if (pdb->put(pdb, &srchkey, &d, 0) == -1) { |
fprintf(stderr, "db: put failed\n"); |
fprintf(stderr, "db: put failed\n"); |
pdb->close (pdb); |
pdb->close(pdb); |
return 0; |
return (0); |
} |
} |
} else if (pdb->del (pdb, &srchkey, 0)) { |
} else if (pdb->del(pdb, &srchkey, 0)) { |
fprintf(stderr, "db: del failed\n"); |
fprintf(stderr, "db: del failed\n"); |
pdb->close (pdb); |
pdb->close(pdb); |
return 0; |
return (0); |
} |
} |
|
|
pdb->close (pdb); |
pdb->close(pdb); |
return 1; |
return (1); |
} |
} |
|
|
int |
int |
tcfs_rmgroup (gid_t gid) |
tcfs_rmgroup(gid_t gid) |
{ |
{ |
DB *gdb; |
DB *gdb; |
DBT dbkey; |
DBT dbkey; |
|
|
gdb = dbopen(TCFSGPWDB, O_RDWR|O_EXCL, PERM_SECURE, DB_HASH, NULL); |
gdb = dbopen(TCFSGPWDB, O_RDWR|O_EXCL, PERM_SECURE, DB_HASH, NULL); |
if (!gdb) |
if (!gdb) |
return 0; |
return (0); |
|
|
if (gdb->seq(gdb, &dbkey, NULL, R_FIRST)) |
if (gdb->seq(gdb, &dbkey, NULL, R_FIRST)) |
dbkey.data = NULL; |
dbkey.data = NULL; |
|
|
tmp = (char*)calloc(1024, sizeof(char)); |
tmp = (char*)calloc(1024, sizeof(char)); |
|
|
sprintf(tmp, "\33%d\0", gid); |
sprintf(tmp, "\33%d\0", gid); |
if (strstr (dbkey.data, tmp)) { |
if (strstr(dbkey.data, tmp)) { |
if (gdb->del(gdb, &dbkey, 0)) { |
if (gdb->del(gdb, &dbkey, 0)) { |
gdb->close (gdb); |
gdb->close(gdb); |
|
free(tmp); |
free (tmp); |
return (0); |
return 0; |
|
} |
} |
} |
} |
free (tmp); |
free(tmp); |
|
|
if (gdb->seq(gdb, &dbkey, NULL, R_NEXT)) { |
if (gdb->seq(gdb, &dbkey, NULL, R_NEXT)) { |
gdb->close(gdb); |
gdb->close(gdb); |
|
|
} |
} |
} |
} |
|
|
gdb->close (gdb); |
gdb->close(gdb); |
return (1); |
return (1); |
} |
} |
|
|
|
|
int |
int |
tcfs_group_chgpwd (char *user, gid_t gid, char *old, char *new) |
tcfs_group_chgpwd(char *user, gid_t gid, char *old, char *new) |
{ |
{ |
tcfsgpwdb *group_info = NULL; |
tcfsgpwdb *group_info = NULL; |
unsigned char *key; |
unsigned char *key; |
|
|
key = (unsigned char *)calloc(UUGKEYSIZE + 1, sizeof (char)); |
key = (unsigned char *)calloc(UUGKEYSIZE + 1, sizeof (char)); |
if (!key) |
if (!key) |
return 0; |
return (0); |
|
|
if (!tcfs_decrypt_key (old, group_info->gkey, key, GKEYSIZE)) |
if (!tcfs_decrypt_key(old, group_info->gkey, key, GKEYSIZE)) |
return 0; |
return (0); |
|
|
if (!tcfs_encrypt_key (new, key, GKEYSIZE, group_info->gkey, |
if (!tcfs_encrypt_key(new, key, GKEYSIZE, group_info->gkey, |
UUGKEYSIZE + 1)) |
UUGKEYSIZE + 1)) |
return 0; |
return (0); |
|
|
if (!tcfs_gputpwnam (user, group_info, U_CHG)) |
if (!tcfs_gputpwnam(user, group_info, U_CHG)) |
return 0; |
return (0); |
|
|
free (group_info); |
free(group_info); |
free (key); |
free(key); |
|
|
return 1; |
return (1); |
} |
} |
|
|
int |
int |
tcfs_chgpwd (char *user, char *old, char *new) |
tcfs_chgpwd(char *user, char *old, char *new) |
{ |
{ |
tcfspwdb *user_info=NULL; |
tcfspwdb *user_info = NULL; |
unsigned char *key; |
unsigned char *key; |
|
|
key = (unsigned char*)calloc(UUKEYSIZE + 1, sizeof(char)); |
key = (unsigned char*)calloc(UUKEYSIZE + 1, sizeof(char)); |
|
|
if (!tcfs_getpwnam (user, &user_info)) |
if (!tcfs_getpwnam(user, &user_info)) |
return 0; |
return (0); |
|
|
if (!tcfs_decrypt_key (old, user_info->upw, key, KEYSIZE)) |
if (!tcfs_decrypt_key(old, user_info->upw, key, KEYSIZE)) |
return 0; |
return (0); |
|
|
if (!tcfs_encrypt_key (new, key, KEYSIZE, user_info->upw, UUKEYSIZE + 1)) |
if (!tcfs_encrypt_key(new, key, KEYSIZE, user_info->upw, UUKEYSIZE + 1)) |
return 0; |
return (0); |
|
|
if (!tcfs_putpwnam (user, user_info, U_CHG)) |
if (!tcfs_putpwnam(user, user_info, U_CHG)) |
return 0; |
return (0); |
|
|
free (user_info); |
free(user_info); |
free (key); |
free(key); |
|
|
return 1; |
return (1); |
} |
} |
|
|
int |
int |
tcfs_chgpassword (char *user, char *old, char *new) |
tcfs_chgpassword(char *user, char *old, char *new) |
{ |
{ |
int error1=0; |
int error1=0; |
DB *gpdb; |
DB *gpdb; |
|
|
|
|
ckey = (unsigned char*)calloc(UUGKEYSIZE + 1, sizeof(char)); |
ckey = (unsigned char*)calloc(UUGKEYSIZE + 1, sizeof(char)); |
if (!ckey) |
if (!ckey) |
return 0; |
return (0); |
|
|
gpdb = dbopen (TCFSGPWDB, O_RDWR|O_EXCL, PERM_SECURE, DB_HASH, NULL); |
gpdb = dbopen(TCFSGPWDB, O_RDWR|O_EXCL, PERM_SECURE, DB_HASH, NULL); |
if (!gpdb) |
if (!gpdb) |
return 0; |
return (0); |
|
|
error1 = tcfs_chgpwd (user, old, new); |
error1 = tcfs_chgpwd(user, old, new); |
if (!error1) |
if (!error1) |
return 0; |
return (0); |
|
|
/* Reencrypt group shares */ |
/* Reencrypt group shares */ |
if (gpdb->seq(gpdb, &key, NULL, R_FIRST)) |
if (gpdb->seq(gpdb, &key, NULL, R_FIRST)) |
key.data = NULL; |
key.data = NULL; |
|
|
while (key.data) { |
while (key.data) { |
if (strncmp (user, key.data, strlen(user))) { |
if (strncmp(user, key.data, strlen(user))) { |
if (gpdb->seq(gpdb, &key, NULL, R_NEXT)) |
if (gpdb->seq(gpdb, &key, NULL, R_NEXT)) |
key.data = NULL; |
key.data = NULL; |
continue; |
continue; |
|
|
|
|
gpdb->get(gpdb, &key, &found, 0); |
gpdb->get(gpdb, &key, &found, 0); |
|
|
if (!tcfs_decrypt_key (old, ((tcfsgpwdb *)found.data)->gkey, ckey, GKEYSIZE)) |
if (!tcfs_decrypt_key(old, ((tcfsgpwdb *)found.data)->gkey, ckey, GKEYSIZE)) |
return 0; |
return (0); |
|
|
if (!tcfs_encrypt_key (new, ckey, GKEYSIZE, ((tcfsgpwdb *)found.data)->gkey, UUGKEYSIZE + 1)) |
if (!tcfs_encrypt_key(new, ckey, GKEYSIZE, ((tcfsgpwdb *)found.data)->gkey, UUGKEYSIZE + 1)) |
return 0; |
return (0); |
|
|
if (gpdb->put (gpdb, &key, &found, 0)) { |
if (gpdb->put(gpdb, &key, &found, 0)) { |
free (ckey); |
free(ckey); |
|
gpdb->close(gpdb); |
gpdb->close (gpdb); |
|
return (0); |
return (0); |
} |
} |
|
|
free (ckey); |
free(ckey); |
|
|
if (gpdb->seq(gpdb, &key, NULL, R_NEXT)) |
if (gpdb->seq(gpdb, &key, NULL, R_NEXT)) |
key.data = NULL; |
key.data = NULL; |
} |
} |
|
|
return 1; |
return (1); |
} |
} |