Blame src/user_record.c

Packit 366192
/* Copyright (C) 2005 Red Hat, Inc. */
Packit 366192
Packit 366192
/* Object: semanage_user_t (SELinux User/Class)
Packit 366192
 * Object: semanage_user_key_t (SELinux User/Class Key)
Packit 366192
 * Implements: record_t (Database Record)
Packit 366192
 * Implements: record_key_t (Database Record Key)
Packit 366192
 */
Packit 366192
Packit 366192
#include <sepol/user_record.h>
Packit 366192
Packit 366192
typedef sepol_user_key_t semanage_user_key_t;
Packit 366192
#define _SEMANAGE_USER_KEY_DEFINED_
Packit 366192
Packit 366192
struct semanage_user;
Packit 366192
typedef struct semanage_user record_t;
Packit 366192
typedef semanage_user_key_t record_key_t;
Packit 366192
#define DBASE_RECORD_DEFINED
Packit 366192
Packit 366192
#include <stdlib.h>
Packit 366192
#include <string.h>
Packit 366192
#include "user_internal.h"
Packit 366192
#include "handle.h"
Packit 366192
#include "database.h"
Packit 366192
#include "debug.h"
Packit 366192
Packit 366192
struct semanage_user {
Packit 366192
	char *name;
Packit 366192
	semanage_user_base_t *base;
Packit 366192
	semanage_user_extra_t *extra;
Packit 366192
};
Packit 366192
Packit 366192
/* Key */
Packit 366192
int semanage_user_key_create(semanage_handle_t * handle,
Packit 366192
			     const char *name, semanage_user_key_t ** key)
Packit 366192
{
Packit 366192
Packit 366192
	return sepol_user_key_create(handle->sepolh, name, key);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_key_create)
Packit 366192
Packit 366192
int semanage_user_key_extract(semanage_handle_t * handle,
Packit 366192
			      const semanage_user_t * user,
Packit 366192
			      semanage_user_key_t ** key)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_base_key_extract(handle, user->base, key);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_key_extract)
Packit 366192
Packit 366192
void semanage_user_key_free(semanage_user_key_t * key)
Packit 366192
{
Packit 366192
Packit 366192
	sepol_user_key_free(key);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_key_free)
Packit 366192
Packit 366192
hidden void semanage_user_key_unpack(const semanage_user_key_t * key,
Packit 366192
				     const char **name)
Packit 366192
{
Packit 366192
Packit 366192
	sepol_user_key_unpack(key, name);
Packit 366192
}
Packit 366192
Packit 366192
int semanage_user_compare(const semanage_user_t * user,
Packit 366192
			  const semanage_user_key_t * key)
Packit 366192
{
Packit 366192
Packit 366192
	const char *name;
Packit 366192
	sepol_user_key_unpack(key, &name);
Packit 366192
	return strcmp(user->name, name);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_compare)
Packit 366192
Packit 366192
int semanage_user_compare2(const semanage_user_t * user,
Packit 366192
			   const semanage_user_t * user2)
Packit 366192
{
Packit 366192
Packit 366192
	return strcmp(user->name, user2->name);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_compare2)
Packit 366192
Packit 366192
static int semanage_user_compare2_qsort(const semanage_user_t ** user,
Packit 366192
					const semanage_user_t ** user2)
Packit 366192
{
Packit 366192
Packit 366192
	return strcmp((*user)->name, (*user2)->name);
Packit 366192
}
Packit 366192
Packit 366192
/* Name */
Packit 366192
const char *semanage_user_get_name(const semanage_user_t * user)
Packit 366192
{
Packit 366192
	return user->name;
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_get_name)
Packit 366192
Packit 366192
int semanage_user_set_name(semanage_handle_t * handle,
Packit 366192
			   semanage_user_t * user, const char *name)
Packit 366192
{
Packit 366192
Packit 366192
	char *tmp_name = strdup(name);
Packit 366192
	if (!tmp_name)
Packit 366192
		goto omem;
Packit 366192
Packit 366192
	if (semanage_user_base_set_name(handle, user->base, name) < 0)
Packit 366192
		goto err;
Packit 366192
Packit 366192
	if (semanage_user_extra_set_name(handle, user->extra, name) < 0)
Packit 366192
		goto err;
Packit 366192
Packit 366192
	free(user->name);
Packit 366192
	user->name = tmp_name;
Packit 366192
	return STATUS_SUCCESS;
Packit 366192
Packit 366192
      omem:
Packit 366192
	ERR(handle, "out of memory");
Packit 366192
Packit 366192
      err:
Packit 366192
	ERR(handle, "could not set user name to %s", name);
Packit 366192
	free(tmp_name);
Packit 366192
	return STATUS_ERR;
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_set_name)
Packit 366192
Packit 366192
/* Labeling prefix */
Packit 366192
const char *semanage_user_get_prefix(const semanage_user_t * user)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_extra_get_prefix(user->extra);
Packit 366192
}
Packit 366192
Packit 366192
int semanage_user_set_prefix(semanage_handle_t * handle,
Packit 366192
			     semanage_user_t * user, const char *name)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_extra_set_prefix(handle, user->extra, name);
Packit 366192
}
Packit 366192
Packit 366192
/* MLS */
Packit 366192
const char *semanage_user_get_mlslevel(const semanage_user_t * user)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_base_get_mlslevel(user->base);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_get_mlslevel)
Packit 366192
Packit 366192
int semanage_user_set_mlslevel(semanage_handle_t * handle,
Packit 366192
			       semanage_user_t * user, const char *mls_level)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_base_set_mlslevel(handle, user->base, mls_level);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_set_mlslevel)
Packit 366192
Packit 366192
const char *semanage_user_get_mlsrange(const semanage_user_t * user)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_base_get_mlsrange(user->base);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_get_mlsrange)
Packit 366192
Packit 366192
int semanage_user_set_mlsrange(semanage_handle_t * handle,
Packit 366192
			       semanage_user_t * user, const char *mls_range)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_base_set_mlsrange(handle, user->base, mls_range);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_set_mlsrange)
Packit 366192
Packit 366192
/* Role management */
Packit 366192
int semanage_user_get_num_roles(const semanage_user_t * user)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_base_get_num_roles(user->base);
Packit 366192
}
Packit 366192
Packit 366192
int semanage_user_add_role(semanage_handle_t * handle,
Packit 366192
			   semanage_user_t * user, const char *role)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_base_add_role(handle, user->base, role);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_add_role)
Packit 366192
Packit 366192
void semanage_user_del_role(semanage_user_t * user, const char *role)
Packit 366192
{
Packit 366192
Packit 366192
	semanage_user_base_del_role(user->base, role);
Packit 366192
}
Packit 366192
Packit 366192
int semanage_user_has_role(const semanage_user_t * user, const char *role)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_base_has_role(user->base, role);
Packit 366192
}
Packit 366192
Packit 366192
int semanage_user_get_roles(semanage_handle_t * handle,
Packit 366192
			    const semanage_user_t * user,
Packit 366192
			    const char ***roles_arr, unsigned int *num_roles)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_base_get_roles(handle, user->base, roles_arr,
Packit 366192
					    num_roles);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_get_roles)
Packit 366192
Packit 366192
int semanage_user_set_roles(semanage_handle_t * handle,
Packit 366192
			    semanage_user_t * user,
Packit 366192
			    const char **roles_arr, unsigned int num_roles)
Packit 366192
{
Packit 366192
Packit 366192
	return semanage_user_base_set_roles(handle, user->base, roles_arr,
Packit 366192
					    num_roles);
Packit 366192
}
Packit 366192
Packit 366192
/* Create/Clone/Destroy */
Packit 366192
int semanage_user_create(semanage_handle_t * handle,
Packit 366192
			 semanage_user_t ** user_ptr)
Packit 366192
{
Packit 366192
Packit 366192
	semanage_user_t *tmp_user = calloc(1, sizeof(semanage_user_t));
Packit 366192
	if (!tmp_user)
Packit 366192
		goto omem;
Packit 366192
Packit 366192
	if (semanage_user_base_create(handle, &tmp_user->base) < 0)
Packit 366192
		goto err;
Packit 366192
	if (semanage_user_extra_create(handle, &tmp_user->extra) < 0)
Packit 366192
		goto err;
Packit 366192
Packit 366192
	/* Initialize the prefix for migration purposes */
Packit 366192
	if (semanage_user_extra_set_prefix(handle, tmp_user->extra, "user") < 0)
Packit 366192
		goto err;
Packit 366192
Packit 366192
	*user_ptr = tmp_user;
Packit 366192
	return STATUS_SUCCESS;
Packit 366192
Packit 366192
      omem:
Packit 366192
	ERR(handle, "out of memory");
Packit 366192
Packit 366192
      err:
Packit 366192
	ERR(handle, "could not create user record");
Packit 366192
	semanage_user_free(tmp_user);
Packit 366192
	return STATUS_ERR;
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_create)
Packit 366192
Packit 366192
int semanage_user_clone(semanage_handle_t * handle,
Packit 366192
			const semanage_user_t * user,
Packit 366192
			semanage_user_t ** user_ptr)
Packit 366192
{
Packit 366192
Packit 366192
	semanage_user_t *tmp_user = calloc(1, sizeof(semanage_user_t));
Packit 366192
	if (!tmp_user)
Packit 366192
		goto omem;
Packit 366192
Packit 366192
	/* Clone base and extra records */
Packit 366192
	if (semanage_user_base_clone(handle, user->base, &tmp_user->base) < 0)
Packit 366192
		goto err;
Packit 366192
	if (semanage_user_extra_clone(handle, user->extra, &tmp_user->extra) <
Packit 366192
	    0)
Packit 366192
		goto err;
Packit 366192
Packit 366192
	/* Set the shared name */
Packit 366192
	if (semanage_user_set_name(handle, tmp_user, user->name) < 0)
Packit 366192
		goto err;
Packit 366192
Packit 366192
	*user_ptr = tmp_user;
Packit 366192
	return STATUS_SUCCESS;
Packit 366192
Packit 366192
      omem:
Packit 366192
	ERR(handle, "out of memory");
Packit 366192
Packit 366192
      err:
Packit 366192
	ERR(handle, "could not clone user record");
Packit 366192
	semanage_user_free(tmp_user);
Packit 366192
	return STATUS_ERR;
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_clone)
Packit 366192
Packit 366192
void semanage_user_free(semanage_user_t * user)
Packit 366192
{
Packit 366192
Packit 366192
	if (!user)
Packit 366192
		return;
Packit 366192
Packit 366192
	semanage_user_base_free(user->base);
Packit 366192
	semanage_user_extra_free(user->extra);
Packit 366192
	free(user->name);
Packit 366192
	free(user);
Packit 366192
}
Packit 366192
Packit 366192
hidden_def(semanage_user_free)
Packit 366192
Packit 366192
/* Join properties */
Packit 366192
hidden int semanage_user_join(semanage_handle_t * handle,
Packit 366192
			      const semanage_user_base_t * record1,
Packit 366192
			      const semanage_user_extra_t * record2,
Packit 366192
			      semanage_user_t ** result)
Packit 366192
{
Packit 366192
Packit 366192
	const char *name;
Packit 366192
	semanage_user_t *tmp_user = calloc(1, sizeof(semanage_user_t));
Packit 366192
	if (!tmp_user)
Packit 366192
		goto omem;
Packit 366192
Packit 366192
	/* Set the shared name from one of the records 
Packit 366192
	 * (at least one is available) */
Packit 366192
	if (record1 == NULL)
Packit 366192
		name = semanage_user_extra_get_name(record2);
Packit 366192
	else
Packit 366192
		name = semanage_user_base_get_name(record1);
Packit 366192
Packit 366192
	/* Join base record if it exists, create a blank one otherwise */
Packit 366192
	if (record1) {
Packit 366192
		if (semanage_user_base_clone(handle, record1, &tmp_user->base) <
Packit 366192
		    0)
Packit 366192
			goto err;
Packit 366192
	} else {
Packit 366192
		if (semanage_user_base_create(handle, &tmp_user->base) < 0)
Packit 366192
			goto err;
Packit 366192
		if (semanage_user_base_set_name(handle, tmp_user->base, name) <
Packit 366192
		    0)
Packit 366192
			goto err;
Packit 366192
	}
Packit 366192
Packit 366192
	/* Join extra record if it exists, create a blank one otherwise */
Packit 366192
	if (record2) {
Packit 366192
		if (semanage_user_extra_clone(handle, record2, &tmp_user->extra)
Packit 366192
		    < 0)
Packit 366192
			goto err;
Packit 366192
	} else {
Packit 366192
		if (semanage_user_extra_create(handle, &tmp_user->extra) < 0)
Packit 366192
			goto err;
Packit 366192
		if (semanage_user_extra_set_name(handle, tmp_user->extra, name)
Packit 366192
		    < 0)
Packit 366192
			goto err;
Packit 366192
		if (semanage_user_extra_set_prefix
Packit 366192
		    (handle, tmp_user->extra, "user") < 0)
Packit 366192
			goto err;
Packit 366192
	}
Packit 366192
Packit 366192
	if (semanage_user_set_name(handle, tmp_user, name) < 0)
Packit 366192
		goto err;
Packit 366192
Packit 366192
	*result = tmp_user;
Packit 366192
	return STATUS_SUCCESS;
Packit 366192
Packit 366192
      omem:
Packit 366192
	ERR(handle, "out of memory");
Packit 366192
Packit 366192
      err:
Packit 366192
	ERR(handle, "could not join data records for user %s",
Packit 366192
	    semanage_user_base_get_name(record1));
Packit 366192
	semanage_user_free(tmp_user);
Packit 366192
	return STATUS_ERR;
Packit 366192
}
Packit 366192
Packit 366192
hidden int semanage_user_split(semanage_handle_t * handle,
Packit 366192
			       const semanage_user_t * record,
Packit 366192
			       semanage_user_base_t ** split1,
Packit 366192
			       semanage_user_extra_t ** split2)
Packit 366192
{
Packit 366192
Packit 366192
	semanage_user_base_t *tmp_base_user = NULL;
Packit 366192
	semanage_user_extra_t *tmp_extra_user = NULL;
Packit 366192
Packit 366192
	if (semanage_user_base_clone(handle, record->base, &tmp_base_user) < 0)
Packit 366192
		goto err;
Packit 366192
Packit 366192
	if (semanage_user_extra_clone(handle, record->extra, &tmp_extra_user) <
Packit 366192
	    0)
Packit 366192
		goto err;
Packit 366192
Packit 366192
	*split1 = tmp_base_user;
Packit 366192
	*split2 = tmp_extra_user;
Packit 366192
	return STATUS_SUCCESS;
Packit 366192
Packit 366192
      err:
Packit 366192
	ERR(handle, "could not split data records for user %s",
Packit 366192
	    semanage_user_get_name(record));
Packit 366192
	semanage_user_base_free(tmp_base_user);
Packit 366192
	semanage_user_extra_free(tmp_extra_user);
Packit 366192
	return STATUS_ERR;
Packit 366192
}
Packit 366192
Packit 366192
/* Record base functions */
Packit 366192
record_table_t SEMANAGE_USER_RTABLE = {
Packit 366192
	.create = semanage_user_create,
Packit 366192
	.key_extract = semanage_user_key_extract,
Packit 366192
	.key_free = semanage_user_key_free,
Packit 366192
	.clone = semanage_user_clone,
Packit 366192
	.compare = semanage_user_compare,
Packit 366192
	.compare2 = semanage_user_compare2,
Packit 366192
	.compare2_qsort = semanage_user_compare2_qsort,
Packit 366192
	.free = semanage_user_free,
Packit 366192
};