e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner/*
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * CDDL HEADER START
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner *
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * The contents of this file are subject to the terms of the
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * Common Development and Distribution License (the "License").
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * You may not use this file except in compliance with the License.
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner *
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * or http://www.opensolaris.org/os/licensing.
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * See the License for the specific language governing permissions
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * and limitations under the License.
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner *
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * When distributing Covered Code, include this CDDL HEADER in each
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * If applicable, add the following below this CDDL HEADER, with the
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * fields enclosed by brackets "[]" replaced with your own identifying
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * information: Portions Copyright [yyyy] [name of copyright owner]
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner *
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * CDDL HEADER END
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner */
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner/*
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * Use is subject to license terms.
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner */
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner#include <Python.h>
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner#include <zone.h>
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner#include <libintl.h>
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross#include <idmap.h>
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner#include <directory.h>
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerextern int sid_to_id(char *sid, boolean_t user, uid_t *id);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerstatic PyObject *
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerpy_sid_to_id(PyObject *self, PyObject *args)
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner{
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner char *sid;
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner int err, isuser;
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner uid_t id;
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner if (!PyArg_ParseTuple(args, "si", &sid, &isuser))
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner return (NULL);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner err = sid_to_id(sid, isuser, &id);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner if (err) {
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner PyErr_SetString(PyExc_KeyError, sid);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner return (NULL);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner }
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner return (Py_BuildValue("I", id));
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner}
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner/*
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * Translate the sid string ("S-1-...") to the user@domain name, if
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner * possible.
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner */
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerstatic PyObject *
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerpy_sid_to_name(PyObject *self, PyObject *args)
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner{
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross int isuser, err, flag = IDMAP_REQ_FLG_USE_CACHE;
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner char *name, *sid;
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross idmap_stat stat;
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross uid_t pid;
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner PyObject *ret;
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner if (!PyArg_ParseTuple(args, "si", &sid, &isuser))
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner return (NULL);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross err = sid_to_id(sid, isuser, &pid);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross if (err) {
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner PyErr_SetString(PyExc_KeyError, sid);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner return (NULL);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner }
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross if (isuser)
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross stat = idmap_getwinnamebyuid(pid, flag, &name, NULL);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross else
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross stat = idmap_getwinnamebygid(pid, flag, &name, NULL);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross if (stat < 0) {
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner PyErr_SetString(PyExc_KeyError, sid);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner return (NULL);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner }
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross if (name == NULL) {
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross PyErr_SetString(PyExc_KeyError, sid);
1ed6b69a5ca1ca3ee5e9a4931f74e2237c7e1c9fGordon Ross return (NULL);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner }
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner ret = PyString_FromString(name);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner free(name);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner return (ret);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner}
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerstatic PyObject *
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerpy_isglobalzone(PyObject *self, PyObject *args)
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner{
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner return (Py_BuildValue("i", getzoneid() == GLOBAL_ZONEID));
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner}
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerstatic PyObject *
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerpy_gettext(PyObject *self, PyObject *args)
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner{
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner char *message, *result;
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner PyObject *ret = NULL;
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner if (!PyArg_ParseTuple(args, "s", &message))
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner return (NULL);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner result = dgettext(TEXT_DOMAIN, message);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner ret = Py_BuildValue("s", result);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner return (ret);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner}
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerstatic PyMethodDef solarismethods[] = {
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner {"sid_to_id", py_sid_to_id, METH_VARARGS, "Map SID to UID/GID."},
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner {"sid_to_name", py_sid_to_name, METH_VARARGS,
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner "Map SID to name@domain."},
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner {"isglobalzone", py_isglobalzone, METH_NOARGS,
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner "Determine if this is the global zone."},
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner {"gettext", py_gettext, METH_VARARGS, "Native call to gettext(3C)"},
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner {NULL, NULL, 0, NULL}
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner};
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknervoid
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falknerinitmisc(void)
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner{
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner PyObject *solaris_misc = Py_InitModule("solaris.misc", solarismethods);
e4d060fb4c00d44cd578713eb9a921f594b733b8Sam Falkner}