xref: /aosp_15_r20/external/selinux/libsemanage/src/seuser_record.c (revision 2d543d20722ada2425b5bdab9d0d1d29470e7bba)
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 
9 struct semanage_seuser;
10 struct semanage_seuser_key;
11 typedef struct semanage_seuser record_t;
12 typedef 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 
22 struct 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 
34 struct semanage_seuser_key {
35 	/* This user's name */
36 	char *name;
37 };
38 
semanage_seuser_key_create(semanage_handle_t * handle,const char * name,semanage_seuser_key_t ** key_ptr)39 int 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 
62 
semanage_seuser_key_extract(semanage_handle_t * handle,const semanage_seuser_t * seuser,semanage_seuser_key_t ** key_ptr)63 int semanage_seuser_key_extract(semanage_handle_t * handle,
64 				const semanage_seuser_t * seuser,
65 				semanage_seuser_key_t ** key_ptr)
66 {
67 
68 	if (semanage_seuser_key_create(handle, seuser->name, key_ptr) < 0)
69 		goto err;
70 
71 	return STATUS_SUCCESS;
72 
73       err:
74 	ERR(handle, "could not extract seuser key from record");
75 	return STATUS_ERR;
76 }
77 
78 
semanage_seuser_key_free(semanage_seuser_key_t * key)79 void semanage_seuser_key_free(semanage_seuser_key_t * key)
80 {
81 	free(key->name);
82 	free(key);
83 }
84 
85 
semanage_seuser_compare(const semanage_seuser_t * seuser,const semanage_seuser_key_t * key)86 int semanage_seuser_compare(const semanage_seuser_t * seuser,
87 			    const semanage_seuser_key_t * key)
88 {
89 
90 	return strcmp(seuser->name, key->name);
91 }
92 
93 
semanage_seuser_compare2(const semanage_seuser_t * seuser,const semanage_seuser_t * seuser2)94 int semanage_seuser_compare2(const semanage_seuser_t * seuser,
95 			     const semanage_seuser_t * seuser2)
96 {
97 
98 	return strcmp(seuser->name, seuser2->name);
99 }
100 
101 
semanage_seuser_compare2_qsort(const semanage_seuser_t ** seuser,const semanage_seuser_t ** seuser2)102 static int semanage_seuser_compare2_qsort(const semanage_seuser_t ** seuser,
103 					  const semanage_seuser_t ** seuser2)
104 {
105 
106 	return strcmp((*seuser)->name, (*seuser2)->name);
107 }
108 
109 /* Name */
semanage_seuser_get_name(const semanage_seuser_t * seuser)110 const char *semanage_seuser_get_name(const semanage_seuser_t * seuser)
111 {
112 
113 	return seuser->name;
114 }
115 
116 
semanage_seuser_set_name(semanage_handle_t * handle,semanage_seuser_t * seuser,const char * name)117 int semanage_seuser_set_name(semanage_handle_t * handle,
118 			     semanage_seuser_t * seuser, const char *name)
119 {
120 
121 	char *tmp_name = strdup(name);
122 	if (!tmp_name) {
123 		ERR(handle, "out of memory, could not set seuser (Unix) name");
124 		return STATUS_ERR;
125 	}
126 	free(seuser->name);
127 	seuser->name = tmp_name;
128 	return STATUS_SUCCESS;
129 }
130 
131 
132 /* Selinux Name */
semanage_seuser_get_sename(const semanage_seuser_t * seuser)133 const char *semanage_seuser_get_sename(const semanage_seuser_t * seuser)
134 {
135 
136 	return seuser->sename;
137 }
138 
139 
semanage_seuser_set_sename(semanage_handle_t * handle,semanage_seuser_t * seuser,const char * sename)140 int semanage_seuser_set_sename(semanage_handle_t * handle,
141 			       semanage_seuser_t * seuser, const char *sename)
142 {
143 
144 	char *tmp_sename = strdup(sename);
145 	if (!tmp_sename) {
146 		ERR(handle,
147 		    "out of memory, could not set seuser (SELinux) name");
148 		return STATUS_ERR;
149 	}
150 	free(seuser->sename);
151 	seuser->sename = tmp_sename;
152 	return STATUS_SUCCESS;
153 }
154 
155 
156 /* MLS Range */
semanage_seuser_get_mlsrange(const semanage_seuser_t * seuser)157 const char *semanage_seuser_get_mlsrange(const semanage_seuser_t * seuser)
158 {
159 
160 	return seuser->mls_range;
161 }
162 
163 
semanage_seuser_set_mlsrange(semanage_handle_t * handle,semanage_seuser_t * seuser,const char * mls_range)164 int semanage_seuser_set_mlsrange(semanage_handle_t * handle,
165 				 semanage_seuser_t * seuser,
166 				 const char *mls_range)
167 {
168 
169 	char *tmp_mls_range = strdup(mls_range);
170 	if (!tmp_mls_range) {
171 		ERR(handle, "out of memory, could not set seuser MLS range");
172 		return STATUS_ERR;
173 	}
174 	free(seuser->mls_range);
175 	seuser->mls_range = tmp_mls_range;
176 	return STATUS_SUCCESS;
177 }
178 
179 
180 /* Create */
semanage_seuser_create(semanage_handle_t * handle,semanage_seuser_t ** seuser_ptr)181 int semanage_seuser_create(semanage_handle_t * handle,
182 			   semanage_seuser_t ** seuser_ptr)
183 {
184 
185 	semanage_seuser_t *seuser =
186 	    (semanage_seuser_t *) malloc(sizeof(semanage_seuser_t));
187 
188 	if (!seuser) {
189 		ERR(handle, "out of memory, could not create seuser");
190 		return STATUS_ERR;
191 	}
192 
193 	seuser->name = NULL;
194 	seuser->sename = NULL;
195 	seuser->mls_range = NULL;
196 
197 	*seuser_ptr = seuser;
198 	return STATUS_SUCCESS;
199 }
200 
201 
202 /* Deep copy clone */
semanage_seuser_clone(semanage_handle_t * handle,const semanage_seuser_t * seuser,semanage_seuser_t ** seuser_ptr)203 int semanage_seuser_clone(semanage_handle_t * handle,
204 			  const semanage_seuser_t * seuser,
205 			  semanage_seuser_t ** seuser_ptr)
206 {
207 
208 	semanage_seuser_t *new_seuser = NULL;
209 
210 	if (semanage_seuser_create(handle, &new_seuser) < 0)
211 		goto err;
212 
213 	if (semanage_seuser_set_name(handle, new_seuser, seuser->name) < 0)
214 		goto err;
215 
216 	if (semanage_seuser_set_sename(handle, new_seuser, seuser->sename) < 0)
217 		goto err;
218 
219 	if (seuser->mls_range &&
220 	    (semanage_seuser_set_mlsrange(handle, new_seuser, seuser->mls_range)
221 	     < 0))
222 		goto err;
223 
224 	*seuser_ptr = new_seuser;
225 	return STATUS_SUCCESS;
226 
227       err:
228 	ERR(handle, "could not clone seuser");
229 	semanage_seuser_free(new_seuser);
230 	return STATUS_ERR;
231 }
232 
233 
234 /* Destroy */
semanage_seuser_free(semanage_seuser_t * seuser)235 void semanage_seuser_free(semanage_seuser_t * seuser)
236 {
237 
238 	if (!seuser)
239 		return;
240 
241 	free(seuser->name);
242 	free(seuser->sename);
243 	free(seuser->mls_range);
244 	free(seuser);
245 }
246 
247 
248 /* Record base functions */
249 record_table_t SEMANAGE_SEUSER_RTABLE = {
250 	.create = semanage_seuser_create,
251 	.key_extract = semanage_seuser_key_extract,
252 	.key_free = semanage_seuser_key_free,
253 	.clone = semanage_seuser_clone,
254 	.compare = semanage_seuser_compare,
255 	.compare2 = semanage_seuser_compare2,
256 	.compare2_qsort = semanage_seuser_compare2_qsort,
257 	.free = semanage_seuser_free,
258 };
259