Exemplo n.º 1
0
Arquivo: pdb.c Projeto: chutzimir/coda
void PDB_createGroup(char *name, int32_t owner, int32_t *newGroupId)
{
	PDB_HANDLE h;
	int32_t maxId, minGroupId;
	PDB_profile r, p;
   
	/* sanity check arguments */
	CODA_ASSERT(name && (name[0] != '\0') && newGroupId
		    && PDB_ISUSER(owner));
   
	/* MAKE SURE NO GROUP WITH THAT NAME ALREADY EXISTS */
	CODA_ASSERT(PDB_nameInUse(name) == 0);

	h=PDB_db_open(O_RDWR);

	PDB_readProfile(h, owner, &p);
	CODA_ASSERT(p.id != 0);
	
	/* subtract one from the lowest group id -- that's new group's id */
	PDB_db_maxids(h, &maxId, &minGroupId);
	r.id = minGroupId - 1;
	*newGroupId = r.id;
	PDB_db_update_maxids(h, maxId, r.id, PDB_MAXID_SET);
   
   	/* CREATE A NEW GROUP WITH SPECIFIED NAME AND OWNER */
	
	/* create the new group's profile */
	r.name = strdup(name);
	r.owner_id = owner;
	r.owner_name = strdup(p.name);
	pdb_array_init(&(r.member_of));
	pdb_array_init(&(r.cps));
	pdb_array_add(&(r.cps),r.id);
	pdb_array_init(&(r.groups_or_members));
	pdb_array_add(&(r.groups_or_members),owner);
	/* write the new group's information to the databases */
	PDB_writeProfile(h, &r);
   
	/* add the new group's id to owner's groups_or_members list */
	pdb_array_add(&(p.groups_or_members), r.id);
	pdb_array_add(&(p.member_of), r.id);
	pdb_array_add(&(p.cps), r.id);
	PDB_writeProfile(h, &p);

	PDB_freeProfile(&r);
	PDB_freeProfile(&p);
	PDB_db_close(h);
}
Exemplo n.º 2
0
Arquivo: pdb.c Projeto: chutzimir/coda
void PDB_cloneUser(char *name, int32_t cloneid, int32_t *newId)
{
	PDB_HANDLE h;
	int32_t nextid, maxId, minGroupId;
	PDB_profile r, p;
	pdb_array_off off;

	/* sanity check arguments */
	CODA_ASSERT(name && (name[0] != '\0') && newId && (cloneid != 0));
   
	/* MAKE SURE NO USER WITH THAT NAME ALREADY EXISTS */
	CODA_ASSERT(PDB_nameInUse(name) == 0);

	h=PDB_db_open(O_RDWR);

	/* Read the profile we are cloning */
	PDB_readProfile(h, cloneid, &r);
	CODA_ASSERT(r.id != 0);
	
	/* add one to the highest user id -- that's our new user's id */
	PDB_db_maxids(h, &maxId, &minGroupId);
	r.id = maxId + 1;
	PDB_db_update_maxids(h, r.id, minGroupId, PDB_MAXID_SET);
   
	/* CREATE A NEW USER WITH SPECIFIED NAME, ALL OTHER FIELDS EMPTY */
   
	/* create the new user's profile */
	free(r.name);
	r.name = strdup(name);

	/* MAKE THE NEW USER A MEMBER OF THE SAME GROUPS AS THE OLD USER */
	nextid = pdb_array_head(&(r.member_of), &off);
	while(nextid != 0){
		PDB_readProfile(h, nextid, &p);
		CODA_ASSERT(r.id != 0);
		pdb_array_add(&(p.groups_or_members), r.id);
		PDB_writeProfile(h, &p);
		PDB_freeProfile(&p);
		nextid = pdb_array_next(&(r.member_of), &off);
	}
   
	/* updateCps also writes the new user's information to the databases */
	PDB_updateCps(h, &r);
	PDB_db_close(h);

	*newId = r.id;
	PDB_freeProfile(&r);
}
Exemplo n.º 3
0
Arquivo: pdb.c Projeto: chutzimir/coda
void PDB_createUser(char *name, int32_t *newId)
{
	PDB_HANDLE h;
	int32_t maxId, minGroupId;
	PDB_profile r;
   
	/* sanity check arguments */
	CODA_ASSERT(name && (name[0] != '\0') && newId);
   
	/* MAKE SURE NO USER WITH THAT NAME ALREADY EXISTS */
	CODA_ASSERT(PDB_nameInUse(name) == 0);

	h=PDB_db_open(O_RDWR);
	
	/* add one to the highest user id -- that's our new user's id */
	PDB_db_maxids(h, &maxId, &minGroupId);
	r.id = maxId + 1;
	PDB_db_update_maxids(h, r.id, minGroupId, PDB_MAXID_SET);
   
	/* CREATE A NEW USER WITH SPECIFIED NAME, ALL OTHER FIELDS EMPTY */
   
	/* create the new user's profile */
	r.name = strdup(name);
	r.owner_id = 0;
	r.owner_name = NULL;
	pdb_array_init(&(r.member_of));
	pdb_array_init(&(r.cps));
	pdb_array_add(&(r.cps),r.id);
	pdb_array_init(&(r.groups_or_members));
   
	/* write the new user's information to the databases */
	PDB_writeProfile(h, &r);
	PDB_db_close(h);

	*newId = r.id;
	PDB_freeProfile(&r);
}
Exemplo n.º 4
0
/* SET MAXIDS */
void tool_maxids(int argc, char *argv[])
{
    PDB_HANDLE h;
    long arg1, arg2;
    char *end;

    if (check_args_num(argc, 3)) {
        printf("Usage: maxids usermax groupmin\n");
        return;
    }
    arg1 = strtol(argv[1], &end, 10);
    if (argv[1] == end || arg1 < 0) {
        printf("User max should be a positive numerical value.\n");
        return;
    }
    arg2 = strtol(argv[2], &end, 10);
    if (argv[2] == end || arg2 > 0) {
        printf("Group min should be a negative numerical value.\n");
        return;
    }
    h = PDB_db_open(O_RDWR);
    PDB_db_update_maxids(h, arg1, arg2, PDB_MAXID_FORCE);
    PDB_db_close(h);
}
Exemplo n.º 5
0
Arquivo: pdb.c Projeto: chutzimir/coda
void PDB_changeId(int32_t oldId, int32_t newId)
{
	PDB_HANDLE h;
	PDB_profile r,p;
	void  *tmp;
	size_t size;
	int32_t nextid;
	pdb_array_off off;

	if (oldId == newId) return;

	h = PDB_db_open(O_RDWR);

	PDB_db_read(h, newId, NULL, &tmp, &size);
	pdb_unpack(&r, tmp, size);
	CODA_ASSERT(r.id == 0);

	PDB_readProfile(h, oldId, &r);
	CODA_ASSERT(r.id != 0);

	/* Delete the old id */
	PDB_deleteProfile(h, &r);
	
	/* Change the id */
	r.id = newId;
	PDB_updateCps(h, &r);

	if(PDB_ISGROUP(oldId)){
		/* Need to change owner info */
		PDB_readProfile(h, r.owner_id, &p);
		CODA_ASSERT(p.id != 0);
		pdb_array_del(&(p.groups_or_members), oldId);
		pdb_array_add(&(p.groups_or_members), newId);
		PDB_writeProfile(h, &p);
		PDB_db_update_maxids(h, 0, newId, PDB_MAXID_SET);
		PDB_freeProfile(&p);
	}
	else
		PDB_db_update_maxids(h, newId, 0, PDB_MAXID_SET);

	/* update groups we are a member of */
	nextid = pdb_array_head(&(r.member_of), &off);
	while(nextid != 0){
		PDB_readProfile(h, nextid, &p);
		CODA_ASSERT(p.id != 0);
		pdb_array_del(&(p.groups_or_members), oldId);
		pdb_array_add(&(p.groups_or_members), newId);

		/* Don't need CPS updates */
		PDB_writeProfile(h, &p);
		PDB_freeProfile(&p);
		nextid = pdb_array_next(&(r.member_of), &off);
	}

	/* update members or ownership */
	nextid = pdb_array_head(&(r.groups_or_members), &off);
	while(nextid != 0) {
	    PDB_readProfile(h, nextid, &p);
	    CODA_ASSERT(p.id != 0);

	    if (PDB_ISGROUP(oldId)) {
		pdb_array_del(&(p.member_of), oldId);
		pdb_array_add(&(p.member_of), newId);
	    } else {
		if (PDB_ISGROUP(p.id)) {
		    if(p.owner_id == oldId)
			p.owner_id = newId;
		}
	    }

	    PDB_updateCps(h, &p);
	    PDB_freeProfile(&p);
	    nextid = pdb_array_next(&(r.groups_or_members), &off);
	}

	PDB_db_close(h);
	PDB_freeProfile(&r);
}