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