1/* Copyright (C) 2005 Red Hat, Inc. */
2
3/* Object: semanage_seuser_t (Unix User)
4 * Object: semanage_seuser_key_t (Unix User Key)
5 * Implements: record_t (Database Record)
6 * Implements: record_key_t (Database Record Key)
7 */
8
9struct semanage_seuser;
10struct semanage_seuser_key;
11typedef struct semanage_seuser record_t;
12typedef struct semanage_seuser_key record_key_t;
13#define DBASE_RECORD_DEFINED
14
15#include <stdlib.h>
16#include <string.h>
17#include "seuser_internal.h"
18#include "debug.h"
19#include <semanage/handle.h>
20#include "database.h"
21
22struct semanage_seuser {
23	/* This user's name */
24	char *name;
25
26	/* This user's corresponding
27	 * seuser ("role set") */
28	char *sename;
29
30	/* This user's mls range (only required for mls) */
31	char *mls_range;
32};
33
34struct semanage_seuser_key {
35	/* This user's name */
36	char *name;
37};
38
39int semanage_seuser_key_create(semanage_handle_t * handle,
40			       const char *name,
41			       semanage_seuser_key_t ** key_ptr)
42{
43
44	semanage_seuser_key_t *tmp_key = (semanage_seuser_key_t *)
45	    malloc(sizeof(semanage_seuser_key_t));
46
47	if (!tmp_key) {
48		ERR(handle, "out of memory, could not create seuser key");
49		return STATUS_ERR;
50	}
51	tmp_key->name = strdup(name);
52	if (!tmp_key->name) {
53		ERR(handle, "out of memory, could not create seuser key");
54		free(tmp_key);
55		return STATUS_ERR;
56	}
57
58	*key_ptr = tmp_key;
59	return STATUS_SUCCESS;
60}
61
62hidden_def(semanage_seuser_key_create)
63
64int semanage_seuser_key_extract(semanage_handle_t * handle,
65				const semanage_seuser_t * seuser,
66				semanage_seuser_key_t ** key_ptr)
67{
68
69	if (semanage_seuser_key_create(handle, seuser->name, key_ptr) < 0)
70		goto err;
71
72	return STATUS_SUCCESS;
73
74      err:
75	ERR(handle, "could not extract seuser key from record");
76	return STATUS_ERR;
77}
78
79hidden_def(semanage_seuser_key_extract)
80
81void semanage_seuser_key_free(semanage_seuser_key_t * key)
82{
83	free(key->name);
84	free(key);
85}
86
87hidden_def(semanage_seuser_key_free)
88
89int semanage_seuser_compare(const semanage_seuser_t * seuser,
90			    const semanage_seuser_key_t * key)
91{
92
93	return strcmp(seuser->name, key->name);
94}
95
96hidden_def(semanage_seuser_compare)
97
98int semanage_seuser_compare2(const semanage_seuser_t * seuser,
99			     const semanage_seuser_t * seuser2)
100{
101
102	return strcmp(seuser->name, seuser2->name);
103}
104
105hidden_def(semanage_seuser_compare2)
106
107static int semanage_seuser_compare2_qsort(const semanage_seuser_t ** seuser,
108					  const semanage_seuser_t ** seuser2)
109{
110
111	return strcmp((*seuser)->name, (*seuser2)->name);
112}
113
114/* Name */
115const char *semanage_seuser_get_name(const semanage_seuser_t * seuser)
116{
117
118	return seuser->name;
119}
120
121hidden_def(semanage_seuser_get_name)
122
123int semanage_seuser_set_name(semanage_handle_t * handle,
124			     semanage_seuser_t * seuser, const char *name)
125{
126
127	char *tmp_name = strdup(name);
128	if (!tmp_name) {
129		ERR(handle, "out of memory, could not set seuser (Unix) name");
130		return STATUS_ERR;
131	}
132	free(seuser->name);
133	seuser->name = tmp_name;
134	return STATUS_SUCCESS;
135}
136
137hidden_def(semanage_seuser_set_name)
138
139/* Selinux Name */
140const char *semanage_seuser_get_sename(const semanage_seuser_t * seuser)
141{
142
143	return seuser->sename;
144}
145
146hidden_def(semanage_seuser_get_sename)
147
148int semanage_seuser_set_sename(semanage_handle_t * handle,
149			       semanage_seuser_t * seuser, const char *sename)
150{
151
152	char *tmp_sename = strdup(sename);
153	if (!tmp_sename) {
154		ERR(handle,
155		    "out of memory, could not set seuser (SELinux) name");
156		return STATUS_ERR;
157	}
158	free(seuser->sename);
159	seuser->sename = tmp_sename;
160	return STATUS_SUCCESS;
161}
162
163hidden_def(semanage_seuser_set_sename)
164
165/* MLS Range */
166const char *semanage_seuser_get_mlsrange(const semanage_seuser_t * seuser)
167{
168
169	return seuser->mls_range;
170}
171
172hidden_def(semanage_seuser_get_mlsrange)
173
174int semanage_seuser_set_mlsrange(semanage_handle_t * handle,
175				 semanage_seuser_t * seuser,
176				 const char *mls_range)
177{
178
179	char *tmp_mls_range = strdup(mls_range);
180	if (!tmp_mls_range) {
181		ERR(handle, "out of memory, could not set seuser MLS range");
182		return STATUS_ERR;
183	}
184	free(seuser->mls_range);
185	seuser->mls_range = tmp_mls_range;
186	return STATUS_SUCCESS;
187}
188
189hidden_def(semanage_seuser_set_mlsrange)
190
191/* Create */
192int semanage_seuser_create(semanage_handle_t * handle,
193			   semanage_seuser_t ** seuser_ptr)
194{
195
196	semanage_seuser_t *seuser =
197	    (semanage_seuser_t *) malloc(sizeof(semanage_seuser_t));
198
199	if (!seuser) {
200		ERR(handle, "out of memory, could not create seuser");
201		return STATUS_ERR;
202	}
203
204	seuser->name = NULL;
205	seuser->sename = NULL;
206	seuser->mls_range = NULL;
207
208	*seuser_ptr = seuser;
209	return STATUS_SUCCESS;
210}
211
212hidden_def(semanage_seuser_create)
213
214/* Deep copy clone */
215int semanage_seuser_clone(semanage_handle_t * handle,
216			  const semanage_seuser_t * seuser,
217			  semanage_seuser_t ** seuser_ptr)
218{
219
220	semanage_seuser_t *new_seuser = NULL;
221
222	if (semanage_seuser_create(handle, &new_seuser) < 0)
223		goto err;
224
225	if (semanage_seuser_set_name(handle, new_seuser, seuser->name) < 0)
226		goto err;
227
228	if (semanage_seuser_set_sename(handle, new_seuser, seuser->sename) < 0)
229		goto err;
230
231	if (seuser->mls_range &&
232	    (semanage_seuser_set_mlsrange(handle, new_seuser, seuser->mls_range)
233	     < 0))
234		goto err;
235
236	*seuser_ptr = new_seuser;
237	return STATUS_SUCCESS;
238
239      err:
240	ERR(handle, "could not clone seuser");
241	semanage_seuser_free(new_seuser);
242	return STATUS_ERR;
243}
244
245hidden_def(semanage_seuser_clone)
246
247/* Destroy */
248void semanage_seuser_free(semanage_seuser_t * seuser)
249{
250
251	if (!seuser)
252		return;
253
254	free(seuser->name);
255	free(seuser->sename);
256	free(seuser->mls_range);
257	free(seuser);
258}
259
260hidden_def(semanage_seuser_free)
261
262/* Record base functions */
263record_table_t SEMANAGE_SEUSER_RTABLE = {
264	.create = semanage_seuser_create,
265	.key_extract = semanage_seuser_key_extract,
266	.key_free = semanage_seuser_key_free,
267	.clone = semanage_seuser_clone,
268	.compare = semanage_seuser_compare,
269	.compare2 = semanage_seuser_compare2,
270	.compare2_qsort = semanage_seuser_compare2_qsort,
271	.free = semanage_seuser_free,
272};
273