• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Author: James Athey
2  */
3 
4 /* Never build rpm_execcon interface */
5 #ifndef DISABLE_RPM
6 #define DISABLE_RPM
7 #endif
8 
9 %module selinux
10 %{
11 	#include "selinux/selinux.h"
12 %}
13 
14 %pythoncode %{
15 
16 import shutil
17 import os
18 
19 DISABLED = -1
20 PERMISSIVE = 0
21 ENFORCING = 1
22 
23 def restorecon(path, recursive=False, verbose=False, force=False):
24     """ Restore SELinux context on a given path
25 
26     Arguments:
27     path -- The pathname for the file or directory to be relabeled.
28 
29     Keyword arguments:
30     recursive -- Change files and directories file labels recursively (default False)
31     verbose -- Show changes in file labels (default False)
32     force -- Force reset of context to match file_context for customizable files,
33     and the default file context, changing the user, role, range portion  as well
34     as the type (default False)
35     """
36 
37     restorecon_flags = SELINUX_RESTORECON_IGNORE_DIGEST | SELINUX_RESTORECON_REALPATH
38     if recursive:
39         restorecon_flags |= SELINUX_RESTORECON_RECURSE
40     if verbose:
41         restorecon_flags |= SELINUX_RESTORECON_VERBOSE
42     if force:
43         restorecon_flags |= SELINUX_RESTORECON_SET_SPECFILE_CTX
44     selinux_restorecon(os.path.expanduser(path), restorecon_flags)
45 
46 def chcon(path, context, recursive=False):
47     """ Set the SELinux context on a given path """
48     lsetfilecon(path, context)
49     if recursive:
50         for root, dirs, files in os.walk(path):
51             for name in files + dirs:
52                 lsetfilecon(os.path.join(root, name), context)
53 
54 def copytree(src, dest):
55     """ An SELinux-friendly shutil.copytree method """
56     shutil.copytree(src, dest)
57     restorecon(dest, recursive=True)
58 
59 def install(src, dest):
60     """ An SELinux-friendly shutil.move method """
61     shutil.move(src, dest)
62     restorecon(dest, recursive=True)
63 %}
64 
65 /* security_get_boolean_names() typemap */
66 %typemap(argout) (char ***names, int *len) {
67 	PyObject* list = PyList_New(*$2);
68 	int i;
69 	for (i = 0; i < *$2; i++) {
70 		PyList_SetItem(list, i, PyString_FromString((*$1)[i]));
71 	}
72 	$result = SWIG_Python_AppendOutput($result, list);
73 }
74 
75 /* return a sid along with the result */
76 %typemap(argout) (security_id_t * sid) {
77 	if (*$1) {
78                 %append_output(SWIG_NewPointerObj(*$1, $descriptor(security_id_t), 0));
79 	} else {
80 		Py_INCREF(Py_None);
81 		%append_output(Py_None);
82 	}
83 }
84 
85 %typemap(in,numinputs=0) security_id_t *(security_id_t temp) {
86   $1 = &temp;
87 }
88 
89 %typemap(in, numinputs=0) void *(char *temp=NULL) {
90 	$1 = temp;
91 }
92 
93 /* Makes security_compute_user() return a Python list of contexts */
94 %typemap(argout) (char ***con) {
95 	PyObject* plist;
96 	int i, len = 0;
97 
98 	if (*$1) {
99 		while((*$1)[len])
100 			len++;
101 		plist = PyList_New(len);
102 		for (i = 0; i < len; i++) {
103 			PyList_SetItem(plist, i, PyString_FromString((*$1)[i]));
104 		}
105 	} else {
106 		plist = PyList_New(0);
107 	}
108 
109 	$result = SWIG_Python_AppendOutput($result, plist);
110 }
111 
112 /* Makes functions in get_context_list.h return a Python list of contexts */
113 %typemap(argout) (char ***list) {
114 	PyObject* plist;
115 	int i;
116 
117 	if (*$1) {
118 		plist = PyList_New(result);
119 		for (i = 0; i < result; i++) {
120 			PyList_SetItem(plist, i, PyString_FromString((*$1)[i]));
121 		}
122 	} else {
123 		plist = PyList_New(0);
124 	}
125 	/* Only return the Python list, don't need to return the length anymore */
126 	$result = plist;
127 }
128 
129 %typemap(in,noblock=1,numinputs=0) char ** (char * temp = 0) {
130 	$1 = &temp;
131 }
132 %typemap(freearg,match="in") char ** "";
133 %typemap(argout,noblock=1) char ** {
134 	if (*$1) {
135 		%append_output(SWIG_FromCharPtr(*$1));
136 		freecon(*$1);
137 	}
138 	else {
139 		Py_INCREF(Py_None);
140 		%append_output(Py_None);
141 	}
142 }
143 
144 %typemap(in,noblock=1,numinputs=0) char ** (char * temp = 0) {
145 	$1 = &temp;
146 }
147 %typemap(freearg,match="in") char ** "";
148 %typemap(argout,noblock=1) char ** {
149 	if (*$1) {
150 		%append_output(SWIG_FromCharPtr(*$1));
151 		free(*$1);
152 	}
153 	else {
154 		Py_INCREF(Py_None);
155 		%append_output(Py_None);
156 	}
157 }
158 
159 %include "selinuxswig_python_exception.i"
160 %include "selinuxswig.i"
161