psss / rpms / libselinux

Forked from rpms/libselinux 5 years ago
Clone
bebb529
diff --exclude-from=exclude -N -u -r nsalibselinux/include/selinux/selinux.h libselinux-1.27.1/include/selinux/selinux.h
017ea0e
--- nsalibselinux/include/selinux/selinux.h	2005-09-01 11:17:40.000000000 -0400
4dc4d10
+++ libselinux-1.27.1/include/selinux/selinux.h	2005-09-29 14:46:48.000000000 -0400
4dc4d10
@@ -323,6 +323,7 @@
4dc4d10
 extern const char *selinux_booleans_path(void);
4dc4d10
 extern const char *selinux_customizable_types_path(void);
4dc4d10
 extern const char *selinux_users_path(void);
4dc4d10
+extern const char *selinux_usersconf_path(void);
4dc4d10
 
4dc4d10
 /* Check a permission in the passwd class.
4dc4d10
    Return 0 if granted or -1 otherwise. */
4dc4d10
@@ -354,6 +355,12 @@
bebb529
 extern int selinux_raw_to_trans_context(security_context_t raw, 
bebb529
 					security_context_t *transp);
017ea0e
 
bebb529
+
bebb529
+/* the following functions are used to retrieve the SELinux user and their 
bebb529
+   security level via the  Linux usernames selinux */
bebb529
+
4dc4d10
+extern int getseuserbyname(const char *name, char **seuser, char **level);
bebb529
+
bebb529
 #ifdef __cplusplus
e8346fc
 }
bebb529
 #endif
bebb529
diff --exclude-from=exclude -N -u -r nsalibselinux/man/Makefile libselinux-1.27.1/man/Makefile
bebb529
--- nsalibselinux/man/Makefile	2004-10-20 16:31:36.000000000 -0400
bebb529
+++ libselinux-1.27.1/man/Makefile	2005-09-28 14:32:16.000000000 -0400
bebb529
@@ -8,3 +8,6 @@
bebb529
 	install -m 644 man3/*.3 $(MAN3DIR)
bebb529
 	install -m 644 man8/*.8 $(MAN8DIR)
b86cfc3
 
bebb529
+clean:
bebb529
+	-rm -f *~ \#*
bebb529
+	-rm -f man8/*~ man8/\#*
4dc4d10
diff --exclude-from=exclude -N -u -r nsalibselinux/man/man3/getseuserbyname.3 libselinux-1.27.1/man/man3/getseuserbyname.3
4dc4d10
--- nsalibselinux/man/man3/getseuserbyname.3	1969-12-31 19:00:00.000000000 -0500
4dc4d10
+++ libselinux-1.27.1/man/man3/getseuserbyname.3	2005-09-29 15:09:57.000000000 -0400
4dc4d10
@@ -0,0 +1,21 @@
4dc4d10
+.TH "getseuserbyname" "3" "29 September 2005" "dwalsh@redhat.com" "SE Linux API documentation"
4dc4d10
+.SH "NAME"
4dc4d10
+getseuserbyname \- get SELinux user and level via Linux username
4dc4d10
+.SH "SYNOPSIS"
4dc4d10
+.B #include <selinux/selinux.h>
4dc4d10
+.sp
4dc4d10
+.BI "int getseuserbyname(const char *" username ", char **" selinuxuser ", char **" level ");
4dc4d10
+.SH "DESCRIPTION"
4dc4d10
+.B getseuserbyname
4dc4d10
+retrieves the SELinux Username and security level associated with username.
4dc4d10
+
4dc4d10
+.br
4dc4d10
+
4dc4d10
+The returned SELinux username and level should be free with free if non-NULL.  
4dc4d10
+.SH "RETURN VALUE"
4dc4d10
+On success, 0 is returned indicating.
4dc4d10
+On failure, \-1 is returned and errno is set appropriately.
4dc4d10
+
4dc4d10
+The errors documented for the stat(2) system call are also applicable
4dc4d10
+here.
4dc4d10
+
4dc4d10
diff --exclude-from=exclude -N -u -r nsalibselinux/src/selinux_config.c libselinux-1.27.1/src/selinux_config.c
4dc4d10
--- nsalibselinux/src/selinux_config.c	2005-03-17 14:56:21.000000000 -0500
4dc4d10
+++ libselinux-1.27.1/src/selinux_config.c	2005-09-29 11:28:55.000000000 -0400
4dc4d10
@@ -11,6 +11,7 @@
4dc4d10
 
4dc4d10
 #define SELINUXDIR "/etc/selinux/"
4dc4d10
 #define SELINUXCONFIG SELINUXDIR "config"
4dc4d10
+#define SELINUXUSERS SELINUXDIR "seusers.conf"
4dc4d10
 #define SELINUXDEFAULT "targeted"
4dc4d10
 #define SELINUXTYPETAG "SELINUXTYPE="
4dc4d10
 #define SELINUXTAG "SELINUX="
4dc4d10
@@ -252,5 +253,9 @@
4dc4d10
 const char *selinux_users_path() {
4dc4d10
   return get_path(USERS_DIR);
4dc4d10
 }
4dc4d10
+const char *selinux_usersconf_path() {
4dc4d10
+  return SELINUXUSERS;
4dc4d10
+}
4dc4d10
+
4dc4d10
 hidden_def(selinux_users_path)
4dc4d10
 
4dc4d10
diff --exclude-from=exclude -N -u -r nsalibselinux/src/selinux_internal.h libselinux-1.27.1/src/selinux_internal.h
4dc4d10
--- nsalibselinux/src/selinux_internal.h	2005-08-25 16:18:01.000000000 -0400
4dc4d10
+++ libselinux-1.27.1/src/selinux_internal.h	2005-09-29 14:49:43.000000000 -0400
4dc4d10
@@ -49,6 +49,7 @@
4dc4d10
 hidden_proto(selinux_check_passwd_access)
4dc4d10
 hidden_proto(matchpathcon_init)
4dc4d10
 hidden_proto(selinux_users_path)
4dc4d10
+hidden_proto(selinux_usersconf_path);
4dc4d10
 
4dc4d10
 extern int context_translations hidden;
4dc4d10
 extern int hidden trans_to_raw_context(char *trans, char **rawp);
bebb529
diff --exclude-from=exclude -N -u -r nsalibselinux/src/seusers.c libselinux-1.27.1/src/seusers.c
bebb529
--- nsalibselinux/src/seusers.c	1969-12-31 19:00:00.000000000 -0500
4dc4d10
+++ libselinux-1.27.1/src/seusers.c	2005-09-29 14:51:47.000000000 -0400
4dc4d10
@@ -0,0 +1,138 @@
bebb529
+#include <unistd.h>
bebb529
+#include <fcntl.h>
bebb529
+#include <stdlib.h>
bebb529
+#include <string.h>
bebb529
+#include <stdio.h>
bebb529
+#include <ctype.h>
bebb529
+#include <selinux/selinux.h>
bebb529
+#include <selinux/context.h>
bebb529
+#include "selinux_internal.h"
bc0a935
+
4dc4d10
+/* Process line from seusers.conf. 
bebb529
+   Remove white space and set name do data before the "=" and sename to data
bebb529
+   after it */
4dc4d10
+static int process_seusers(const char *buffer, char **r_username, char **r_seuser, char **r_level) {
4dc4d10
+	char *username=NULL;
4dc4d10
+	char *seuser=NULL;
4dc4d10
+	char *level=NULL;
bebb529
+	char *ptr;
bebb529
+	int rc=-1;
bebb529
+	char *tok;
bebb529
+	char *newbuf=strdup(buffer);
bebb529
+	if (!newbuf) return -1;
bebb529
+
bebb529
+	tok=strtok_r(newbuf,":",&ptr);
bebb529
+	if (!tok) goto err;
bebb529
+	if ( tok[0]=='#' ) goto err;
4dc4d10
+	username=strdup(tok);
4dc4d10
+	if (!username) {
bebb529
+		rc=-1; 
bebb529
+		goto err;
bebb529
+	}
bebb529
+
bebb529
+	tok=strtok_r(NULL,":",&ptr);
bebb529
+	if (!tok) goto err;
bebb529
+	while (isspace(*tok)) tok++;
bebb529
+	if(strlen(tok))
4dc4d10
+	   seuser=strdup(tok);
4dc4d10
+	if (!seuser) {
4dc4d10
+		free(username);
bebb529
+		rc=-1; 
bebb529
+		goto err;
bebb529
+	}
bebb529
+
bebb529
+	tok=strtok_r(NULL,":",&ptr);
bebb529
+	if (!tok) goto err;
bebb529
+	while (isspace(*tok)) tok++;
bebb529
+	if(strlen(tok))
4dc4d10
+		level=strdup(tok);
4dc4d10
+	if (!level) {
4dc4d10
+		free(username);
4dc4d10
+		free(seuser);
bebb529
+		rc=-1; 
bebb529
+		goto err;
bebb529
+	}
bebb529
+
bebb529
+	tok=strtok_r(NULL,":",&ptr);
bebb529
+	if (tok) {
bebb529
+		int len;
bebb529
+		while (isspace(*tok)) tok++;
bebb529
+		len=strlen(tok);
bebb529
+		if(len) {
4dc4d10
+			char *ptr=realloc(level, strlen(level) + len + 2);
bebb529
+			if (ptr==NULL) {
4dc4d10
+				free(username);
4dc4d10
+				free(seuser);
4dc4d10
+				free(level);
bebb529
+				rc=-1; 
bebb529
+				goto err;
017ea0e
+			}
4dc4d10
+			level=ptr;
4dc4d10
+			strcat(level,":");
4dc4d10
+			strcat(level,tok);
017ea0e
+		}
017ea0e
+	}
bebb529
+
4dc4d10
+	*r_username=username;
4dc4d10
+	*r_seuser=seuser;
4dc4d10
+	*r_level=level;
bebb529
+	rc=0;
bebb529
+err:		
bebb529
+	free(newbuf);
bebb529
+	return rc;
bebb529
+}
bebb529
+
4dc4d10
+int getseuserbyname(const char *name, char **r_seuser, char **r_level) {
bebb529
+	FILE *cfg=NULL;
bebb529
+	size_t size=0;
bebb529
+	char *buffer=NULL;
bebb529
+
4dc4d10
+	char *username=NULL;
4dc4d10
+        char *seuser=NULL;
4dc4d10
+        char *level=NULL;
4dc4d10
+        char *defaultseuser=NULL;
4dc4d10
+        char *defaultlevel=NULL;
bebb529
+
4dc4d10
+	cfg = fopen(selinux_usersconf_path(),"r");
bebb529
+	if (!cfg) return -1;
bebb529
+
bebb529
+	while (getline(&buffer, &size, cfg) > 0) {
4dc4d10
+		if(process_seusers(buffer, &username, &seuser, &level) == 0) {
4dc4d10
+			if (strcmp(username, name)==0) 
bebb529
+			    break;
bebb529
+
4dc4d10
+			if (strcmp(username,"default")==0) {
4dc4d10
+				free(username);
4dc4d10
+				if (defaultseuser) 
4dc4d10
+					free(defaultseuser);
4dc4d10
+				if (defaultlevel) 
4dc4d10
+					free(defaultlevel);
bebb529
+				defaultseuser=seuser;
4dc4d10
+				defaultlevel=level;
bebb529
+			} 
4dc4d10
+			else {
4dc4d10
+				free(username);
4dc4d10
+				free(seuser);
4dc4d10
+				free(level);
4dc4d10
+			}
bebb529
+			seuser=NULL;
bebb529
+		}
bebb529
+	}
bebb529
+	if (buffer) free(buffer);
bebb529
+	fclose(cfg);
bebb529
+	if (seuser) {
4dc4d10
+		free(username);
4dc4d10
+		free(defaultseuser);
4dc4d10
+		free(defaultlevel);
bebb529
+		*r_seuser=seuser;
4dc4d10
+		*r_level=level;
bebb529
+		return 0;
bebb529
+	}
bebb529
+	if (defaultseuser) {
bebb529
+		*r_seuser=defaultseuser;
4dc4d10
+		*r_level=defaultlevel;
bebb529
+		return 0;
bebb529
+	}
bebb529
+		
bebb529
+	return -1;
bebb529
+}
bebb529
diff --exclude-from=exclude -N -u -r nsalibselinux/utils/getseuser.c libselinux-1.27.1/utils/getseuser.c
bebb529
--- nsalibselinux/utils/getseuser.c	1969-12-31 19:00:00.000000000 -0500
4dc4d10
+++ libselinux-1.27.1/utils/getseuser.c	2005-09-29 14:46:06.000000000 -0400
bebb529
@@ -0,0 +1,27 @@
bebb529
+#include <unistd.h>
bebb529
+#include <stdlib.h>
bebb529
+#include <stdio.h>
bebb529
+#include <getopt.h>
bebb529
+#include <errno.h>
bebb529
+#include <string.h>
bebb529
+#include <selinux/selinux.h>
bebb529
+
bebb529
+void usage(const char *progname) 
bebb529
+{
bebb529
+	fprintf(stderr, "usage:  %s\n", progname);
bebb529
+	exit(1);
bebb529
+}
bebb529
+int main(int argc, char **argv) {
4dc4d10
+	char *seuser;
4dc4d10
+	char *level;
bebb529
+	if ( argc != 2 ) usage(argv[0]);
4dc4d10
+	if (getseuserbyname(argv[1], &seuser, &level) == 0 ) {
4dc4d10
+		printf("%s\n", argv[1]);
4dc4d10
+		printf("%s\n", seuser);
4dc4d10
+		printf("%s", level);
bebb529
+		return 0;
bebb529
+	} else {
bebb529
+		printf("%s not found\n", argv[1]);
bebb529
+		return -1;
017ea0e
+	}
017ea0e
+}