259 lines
5.3 KiB
C
259 lines
5.3 KiB
C
/* Copyright (C) 2005 Red Hat, Inc. */
|
|
|
|
/* Object: semanage_seuser_t (Unix User)
|
|
* Object: semanage_seuser_key_t (Unix User Key)
|
|
* Implements: record_t (Database Record)
|
|
* Implements: record_key_t (Database Record Key)
|
|
*/
|
|
|
|
struct semanage_seuser;
|
|
struct semanage_seuser_key;
|
|
typedef struct semanage_seuser record_t;
|
|
typedef struct semanage_seuser_key record_key_t;
|
|
#define DBASE_RECORD_DEFINED
|
|
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "seuser_internal.h"
|
|
#include "debug.h"
|
|
#include <semanage/handle.h>
|
|
#include "database.h"
|
|
|
|
struct semanage_seuser {
|
|
/* This user's name */
|
|
char *name;
|
|
|
|
/* This user's corresponding
|
|
* seuser ("role set") */
|
|
char *sename;
|
|
|
|
/* This user's mls range (only required for mls) */
|
|
char *mls_range;
|
|
};
|
|
|
|
struct semanage_seuser_key {
|
|
/* This user's name */
|
|
char *name;
|
|
};
|
|
|
|
int semanage_seuser_key_create(semanage_handle_t * handle,
|
|
const char *name,
|
|
semanage_seuser_key_t ** key_ptr)
|
|
{
|
|
|
|
semanage_seuser_key_t *tmp_key = (semanage_seuser_key_t *)
|
|
malloc(sizeof(semanage_seuser_key_t));
|
|
|
|
if (!tmp_key) {
|
|
ERR(handle, "out of memory, could not create seuser key");
|
|
return STATUS_ERR;
|
|
}
|
|
tmp_key->name = strdup(name);
|
|
if (!tmp_key->name) {
|
|
ERR(handle, "out of memory, could not create seuser key");
|
|
free(tmp_key);
|
|
return STATUS_ERR;
|
|
}
|
|
|
|
*key_ptr = tmp_key;
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
int semanage_seuser_key_extract(semanage_handle_t * handle,
|
|
const semanage_seuser_t * seuser,
|
|
semanage_seuser_key_t ** key_ptr)
|
|
{
|
|
|
|
if (semanage_seuser_key_create(handle, seuser->name, key_ptr) < 0)
|
|
goto err;
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
err:
|
|
ERR(handle, "could not extract seuser key from record");
|
|
return STATUS_ERR;
|
|
}
|
|
|
|
|
|
void semanage_seuser_key_free(semanage_seuser_key_t * key)
|
|
{
|
|
free(key->name);
|
|
free(key);
|
|
}
|
|
|
|
|
|
int semanage_seuser_compare(const semanage_seuser_t * seuser,
|
|
const semanage_seuser_key_t * key)
|
|
{
|
|
|
|
return strcmp(seuser->name, key->name);
|
|
}
|
|
|
|
|
|
int semanage_seuser_compare2(const semanage_seuser_t * seuser,
|
|
const semanage_seuser_t * seuser2)
|
|
{
|
|
|
|
return strcmp(seuser->name, seuser2->name);
|
|
}
|
|
|
|
|
|
static int semanage_seuser_compare2_qsort(const semanage_seuser_t ** seuser,
|
|
const semanage_seuser_t ** seuser2)
|
|
{
|
|
|
|
return strcmp((*seuser)->name, (*seuser2)->name);
|
|
}
|
|
|
|
/* Name */
|
|
const char *semanage_seuser_get_name(const semanage_seuser_t * seuser)
|
|
{
|
|
|
|
return seuser->name;
|
|
}
|
|
|
|
|
|
int semanage_seuser_set_name(semanage_handle_t * handle,
|
|
semanage_seuser_t * seuser, const char *name)
|
|
{
|
|
|
|
char *tmp_name = strdup(name);
|
|
if (!tmp_name) {
|
|
ERR(handle, "out of memory, could not set seuser (Unix) name");
|
|
return STATUS_ERR;
|
|
}
|
|
free(seuser->name);
|
|
seuser->name = tmp_name;
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
/* Selinux Name */
|
|
const char *semanage_seuser_get_sename(const semanage_seuser_t * seuser)
|
|
{
|
|
|
|
return seuser->sename;
|
|
}
|
|
|
|
|
|
int semanage_seuser_set_sename(semanage_handle_t * handle,
|
|
semanage_seuser_t * seuser, const char *sename)
|
|
{
|
|
|
|
char *tmp_sename = strdup(sename);
|
|
if (!tmp_sename) {
|
|
ERR(handle,
|
|
"out of memory, could not set seuser (SELinux) name");
|
|
return STATUS_ERR;
|
|
}
|
|
free(seuser->sename);
|
|
seuser->sename = tmp_sename;
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
/* MLS Range */
|
|
const char *semanage_seuser_get_mlsrange(const semanage_seuser_t * seuser)
|
|
{
|
|
|
|
return seuser->mls_range;
|
|
}
|
|
|
|
|
|
int semanage_seuser_set_mlsrange(semanage_handle_t * handle,
|
|
semanage_seuser_t * seuser,
|
|
const char *mls_range)
|
|
{
|
|
|
|
char *tmp_mls_range = strdup(mls_range);
|
|
if (!tmp_mls_range) {
|
|
ERR(handle, "out of memory, could not set seuser MLS range");
|
|
return STATUS_ERR;
|
|
}
|
|
free(seuser->mls_range);
|
|
seuser->mls_range = tmp_mls_range;
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
/* Create */
|
|
int semanage_seuser_create(semanage_handle_t * handle,
|
|
semanage_seuser_t ** seuser_ptr)
|
|
{
|
|
|
|
semanage_seuser_t *seuser =
|
|
(semanage_seuser_t *) malloc(sizeof(semanage_seuser_t));
|
|
|
|
if (!seuser) {
|
|
ERR(handle, "out of memory, could not create seuser");
|
|
return STATUS_ERR;
|
|
}
|
|
|
|
seuser->name = NULL;
|
|
seuser->sename = NULL;
|
|
seuser->mls_range = NULL;
|
|
|
|
*seuser_ptr = seuser;
|
|
return STATUS_SUCCESS;
|
|
}
|
|
|
|
|
|
/* Deep copy clone */
|
|
int semanage_seuser_clone(semanage_handle_t * handle,
|
|
const semanage_seuser_t * seuser,
|
|
semanage_seuser_t ** seuser_ptr)
|
|
{
|
|
|
|
semanage_seuser_t *new_seuser = NULL;
|
|
|
|
if (semanage_seuser_create(handle, &new_seuser) < 0)
|
|
goto err;
|
|
|
|
if (semanage_seuser_set_name(handle, new_seuser, seuser->name) < 0)
|
|
goto err;
|
|
|
|
if (semanage_seuser_set_sename(handle, new_seuser, seuser->sename) < 0)
|
|
goto err;
|
|
|
|
if (seuser->mls_range &&
|
|
(semanage_seuser_set_mlsrange(handle, new_seuser, seuser->mls_range)
|
|
< 0))
|
|
goto err;
|
|
|
|
*seuser_ptr = new_seuser;
|
|
return STATUS_SUCCESS;
|
|
|
|
err:
|
|
ERR(handle, "could not clone seuser");
|
|
semanage_seuser_free(new_seuser);
|
|
return STATUS_ERR;
|
|
}
|
|
|
|
|
|
/* Destroy */
|
|
void semanage_seuser_free(semanage_seuser_t * seuser)
|
|
{
|
|
|
|
if (!seuser)
|
|
return;
|
|
|
|
free(seuser->name);
|
|
free(seuser->sename);
|
|
free(seuser->mls_range);
|
|
free(seuser);
|
|
}
|
|
|
|
|
|
/* Record base functions */
|
|
record_table_t SEMANAGE_SEUSER_RTABLE = {
|
|
.create = semanage_seuser_create,
|
|
.key_extract = semanage_seuser_key_extract,
|
|
.key_free = semanage_seuser_key_free,
|
|
.clone = semanage_seuser_clone,
|
|
.compare = semanage_seuser_compare,
|
|
.compare2 = semanage_seuser_compare2,
|
|
.compare2_qsort = semanage_seuser_compare2_qsort,
|
|
.free = semanage_seuser_free,
|
|
};
|