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