2 Python wrappers for DCERPC/SMB client routines.
4 Copyright (C) Tim Potter, 2002
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 #include "python/py_common_proto.h"
26 /* Return a tuple of (error code, error string) from a WERROR */
28 PyObject
*py_werror_tuple(WERROR werror
)
30 return Py_BuildValue("[is]", W_ERROR_V(werror
),
34 /* Return a tuple of (error code, error string) from a WERROR */
36 PyObject
*py_ntstatus_tuple(NTSTATUS ntstatus
)
38 return Py_BuildValue("[is]", NT_STATUS_V(ntstatus
),
42 /* Initialise samba client routines */
44 static BOOL initialised
;
46 void py_samba_init(void)
48 extern pstring global_myname
;
54 /* Load configuration file */
56 if (!lp_load(dyn_CONFIGFILE
, True
, False
, False
))
57 fprintf(stderr
, "Can't load %s\n", dyn_CONFIGFILE
);
59 /* Misc other stuff */
63 fstrcpy(global_myname
, myhostname());
64 p
= strchr(global_myname
, '.');
71 /* Debuglevel routines */
73 PyObject
*get_debuglevel(PyObject
*self
, PyObject
*args
)
77 if (!PyArg_ParseTuple(args
, ""))
80 debuglevel
= PyInt_FromLong(DEBUGLEVEL
);
85 PyObject
*set_debuglevel(PyObject
*self
, PyObject
*args
)
89 if (!PyArg_ParseTuple(args
, "i", &debuglevel
))
92 DEBUGLEVEL
= debuglevel
;
98 /* Initialise logging */
100 PyObject
*py_setup_logging(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
102 BOOL interactive
= False
;
103 char *logfilename
= NULL
;
104 static char *kwlist
[] = {"interactive", "logfilename", NULL
};
106 if (!PyArg_ParseTupleAndKeywords(
107 args
, kw
, "|is", kwlist
, &interactive
, &logfilename
))
110 if (interactive
&& logfilename
) {
111 PyErr_SetString(PyExc_RuntimeError
,
112 "can't be interactive and set log file name");
117 setup_logging("spoolss", True
);
120 lp_set_logfile(logfilename
);
121 setup_logging(logfilename
, False
);
129 /* Parse credentials from a python dictionary. The dictionary can
130 only have the keys "username", "domain" and "password". Return
131 True for valid credentials in which case the username, domain and
132 password are set to pointers to their values from the dicationary.
133 If returns False, the errstr is set to point at some mallocated
134 memory describing the error. */
136 BOOL
py_parse_creds(PyObject
*creds
, char **username
, char **domain
,
137 char **password
, char **errstr
)
139 /* Initialise anonymous credentials */
145 if (creds
&& PyDict_Size(creds
) > 0) {
146 PyObject
*username_obj
, *password_obj
, *domain_obj
;
147 PyObject
*key
, *value
;
150 /* Check for presence of required fields */
152 username_obj
= PyDict_GetItemString(creds
, "username");
153 domain_obj
= PyDict_GetItemString(creds
, "domain");
154 password_obj
= PyDict_GetItemString(creds
, "password");
157 *errstr
= strdup("no username field in credential");
162 *errstr
= strdup("no domain field in credential");
167 *errstr
= strdup("no password field in credential");
171 /* Check type of required fields */
173 if (!PyString_Check(username_obj
)) {
174 *errstr
= strdup("username field is not string type");
178 if (!PyString_Check(domain_obj
)) {
179 *errstr
= strdup("domain field is not string type");
183 if (!PyString_Check(password_obj
)) {
184 *errstr
= strdup("password field is not string type");
188 /* Look for any extra fields */
192 while (PyDict_Next(creds
, &i
, &key
, &value
)) {
193 if (strcmp(PyString_AsString(key
), "domain") != 0 &&
194 strcmp(PyString_AsString(key
), "username") != 0 &&
195 strcmp(PyString_AsString(key
), "password") != 0) {
197 "creds contain extra field '%s'",
198 PyString_AsString(key
));
205 *username
= PyString_AsString(username_obj
);
206 *domain
= PyString_AsString(domain_obj
);
207 *password
= PyString_AsString(password_obj
);
215 /* Return a cli_state to a RPC pipe on the given server. Use the
216 credentials passed if not NULL. If an error occurs errstr is set to a
217 string describing the error and NULL is returned. If set, errstr must
218 be freed by calling free(). */
220 struct cli_state
*open_pipe_creds(char *server
, PyObject
*creds
,
221 int pipe_idx
, char **errstr
)
223 char *username
, *password
, *domain
;
224 struct cli_state
*cli
;
227 /* Extract credentials from the python dictionary */
229 if (!py_parse_creds(creds
, &username
, &domain
, &password
, errstr
))
232 /* Now try to connect */
234 result
= cli_full_connection(
235 &cli
, NULL
, server
, NULL
, 0, "IPC$", "IPC",
236 username
, domain
, password
, 0, NULL
);
238 if (!NT_STATUS_IS_OK(result
)) {
239 *errstr
= strdup("error connecting to IPC$ pipe");
243 if (!cli_nt_session_open(cli
, pipe_idx
)) {
245 asprintf(errstr
, "error opening pipe index %d", pipe_idx
);
254 /* Return true if a dictionary contains a "level" key with an integer
255 value. Set the value if so. */
257 BOOL
get_level_value(PyObject
*dict
, uint32
*level
)
261 if (!(obj
= PyDict_GetItemString(dict
, "level")) ||
266 *level
= PyInt_AsLong(obj
);