1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
25 */
26
27 #include <Python.h>
28 #include <zone.h>
29 #include <libintl.h>
30 #include <idmap.h>
31 #include <directory.h>
32
33 extern int sid_to_id(char *sid, boolean_t user, uid_t *id);
34
35 static PyObject *
py_sid_to_id(PyObject * self,PyObject * args)36 py_sid_to_id(PyObject *self, PyObject *args)
37 {
38 char *sid;
39 int err, isuser;
40 uid_t id;
41
42 if (!PyArg_ParseTuple(args, "si", &sid, &isuser))
43 return (NULL);
44
45 err = sid_to_id(sid, isuser, &id);
46 if (err) {
47 PyErr_SetString(PyExc_KeyError, sid);
48 return (NULL);
49 }
50
51 return (Py_BuildValue("I", id));
52 }
53
54 /*
55 * Translate the sid string ("S-1-...") to the user@domain name, if
56 * possible.
57 */
58 static PyObject *
py_sid_to_name(PyObject * self,PyObject * args)59 py_sid_to_name(PyObject *self, PyObject *args)
60 {
61 int isuser, err, flag = IDMAP_REQ_FLG_USE_CACHE;
62 char *name, *sid;
63 idmap_stat stat;
64 uid_t pid;
65 PyObject *ret;
66
67 if (!PyArg_ParseTuple(args, "si", &sid, &isuser))
68 return (NULL);
69
70 err = sid_to_id(sid, isuser, &pid);
71 if (err) {
72 PyErr_SetString(PyExc_KeyError, sid);
73 return (NULL);
74 }
75 if (isuser)
76 stat = idmap_getwinnamebyuid(pid, flag, &name, NULL);
77 else
78 stat = idmap_getwinnamebygid(pid, flag, &name, NULL);
79 if (stat < 0) {
80 PyErr_SetString(PyExc_KeyError, sid);
81 return (NULL);
82 }
83
84 if (name == NULL) {
85 PyErr_SetString(PyExc_KeyError, sid);
86 return (NULL);
87 }
88
89 ret = PyUnicode_FromString(name);
90 free(name);
91 return (ret);
92 }
93
94 static PyObject *
py_isglobalzone(PyObject * self,PyObject * args)95 py_isglobalzone(PyObject *self, PyObject *args)
96 {
97 return (Py_BuildValue("i", getzoneid() == GLOBAL_ZONEID));
98 }
99
100 static PyObject *
py_gettext(PyObject * self,PyObject * args)101 py_gettext(PyObject *self, PyObject *args)
102 {
103 char *message, *result;
104 PyObject *ret = NULL;
105
106 if (!PyArg_ParseTuple(args, "s", &message))
107 return (NULL);
108
109 result = dgettext(TEXT_DOMAIN, message);
110
111 ret = Py_BuildValue("s", result);
112 return (ret);
113 }
114
115 static PyMethodDef solarismethods[] = {
116 {"sid_to_id", py_sid_to_id, METH_VARARGS, "Map SID to UID/GID."},
117 {"sid_to_name", py_sid_to_name, METH_VARARGS,
118 "Map SID to name@domain."},
119 {"isglobalzone", py_isglobalzone, METH_NOARGS,
120 "Determine if this is the global zone."},
121 {"gettext", py_gettext, METH_VARARGS, "Native call to gettext(3C)"},
122 {NULL, NULL, 0, NULL}
123 };
124
125 #if PY_MAJOR_VERSION >= 3
126 static struct PyModuleDef solaris_module = {
127 PyModuleDef_HEAD_INIT,
128 "solaris.misc",
129 NULL,
130 -1,
131 solarismethods
132 };
133 #endif
134
135 static PyObject *
moduleinit()136 moduleinit()
137 {
138 #if PY_MAJOR_VERSION >= 3
139 return (PyModule_Create(&solaris_module));
140 #else
141 (void) Py_InitModule("solaris.misc", solarismethods);
142 return (NULL);
143 #endif
144 }
145
146 #if PY_MAJOR_VERSION >= 3
147 PyMODINIT_FUNC
PyInit_misc(void)148 PyInit_misc(void)
149 {
150 return (moduleinit());
151 }
152 #else
153 PyMODINIT_FUNC
initmisc(void)154 initmisc(void)
155 {
156 (void) moduleinit();
157 }
158 #endif
159