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 */
25
26 #include <Python.h>
27 #include <zone.h>
28 #include <libintl.h>
29 #include <idmap.h>
30 #include <directory.h>
31
32 #ifdef __lint
33 #define dgettext(x, y) y
34 #endif
35
36 #define _(s) dgettext(TEXT_DOMAIN, s)
37
38 extern int sid_to_id(char *sid, boolean_t user, uid_t *id);
39
40 static PyObject *
py_sid_to_id(PyObject * self,PyObject * args)41 py_sid_to_id(PyObject *self, PyObject *args)
42 {
43 char *sid;
44 int err, isuser;
45 uid_t id;
46
47 if (!PyArg_ParseTuple(args, "si", &sid, &isuser))
48 return (NULL);
49
50 err = sid_to_id(sid, isuser, &id);
51 if (err) {
52 PyErr_SetString(PyExc_KeyError, sid);
53 return (NULL);
54 }
55
56 return (Py_BuildValue("I", id));
57 }
58
59 /*
60 * Translate the sid string ("S-1-...") to the user@domain name, if
61 * possible.
62 */
63 static PyObject *
py_sid_to_name(PyObject * self,PyObject * args)64 py_sid_to_name(PyObject *self, PyObject *args)
65 {
66 int isuser, err, flag = IDMAP_REQ_FLG_USE_CACHE;
67 char *name, *sid;
68 idmap_stat stat;
69 uid_t pid;
70 PyObject *ret;
71
72 if (!PyArg_ParseTuple(args, "si", &sid, &isuser))
73 return (NULL);
74
75 err = sid_to_id(sid, isuser, &pid);
76 if (err) {
77 PyErr_SetString(PyExc_KeyError, sid);
78 return (NULL);
79 }
80 if (isuser)
81 stat = idmap_getwinnamebyuid(pid, flag, &name, NULL);
82 else
83 stat = idmap_getwinnamebygid(pid, flag, &name, NULL);
84 if (stat < 0) {
85 PyErr_SetString(PyExc_KeyError, sid);
86 return (NULL);
87 }
88
89 if (name == NULL) {
90 PyErr_SetString(PyExc_KeyError, sid);
91 return (NULL);
92 }
93
94 ret = PyString_FromString(name);
95 free(name);
96 return (ret);
97 }
98
99 static PyObject *
py_isglobalzone(PyObject * self,PyObject * args)100 py_isglobalzone(PyObject *self, PyObject *args)
101 {
102 return (Py_BuildValue("i", getzoneid() == GLOBAL_ZONEID));
103 }
104
105 static PyObject *
py_gettext(PyObject * self,PyObject * args)106 py_gettext(PyObject *self, PyObject *args)
107 {
108 char *message, *result;
109 PyObject *ret = NULL;
110
111 if (!PyArg_ParseTuple(args, "s", &message))
112 return (NULL);
113
114 result = dgettext(TEXT_DOMAIN, message);
115
116 ret = Py_BuildValue("s", result);
117 return (ret);
118 }
119
120 static PyMethodDef solarismethods[] = {
121 {"sid_to_id", py_sid_to_id, METH_VARARGS, "Map SID to UID/GID."},
122 {"sid_to_name", py_sid_to_name, METH_VARARGS,
123 "Map SID to name@domain."},
124 {"isglobalzone", py_isglobalzone, METH_NOARGS,
125 "Determine if this is the global zone."},
126 {"gettext", py_gettext, METH_VARARGS, "Native call to gettext(3C)"},
127 {NULL, NULL, 0, NULL}
128 };
129
130 void
initmisc(void)131 initmisc(void)
132 {
133 char *noop;
134
135 noop = _("noop");
136 PyObject *solaris_misc = Py_InitModule("solaris.misc", solarismethods);
137 }
138