xref: /illumos-gate/usr/src/lib/pysolaris/common/misc.c (revision 77c0a660417a046bfab6c8ef58d00c181c0264b3)
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 *
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 *
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 *
95  py_isglobalzone(PyObject *self, PyObject *args)
96  {
97  	return (Py_BuildValue("i", getzoneid() == GLOBAL_ZONEID));
98  }
99  
100  static PyObject *
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 *
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
148  PyInit_misc(void)
149  {
150  	return (moduleinit());
151  }
152  #else
153  PyMODINIT_FUNC
154  initmisc(void)
155  {
156  	(void) moduleinit();
157  }
158  #endif
159