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.
21 #include "python/py_smb.h"
23 /* Create a new cli_state python object */
25 PyObject
*new_cli_state_object(struct cli_state
*cli
)
29 o
= PyObject_New(cli_state_object
, &cli_state_type
);
36 static PyObject
*py_smb_connect(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
38 static char *kwlist
[] = { "server", NULL
};
39 struct cli_state
*cli
;
43 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "s", kwlist
, &server
))
46 if (!(cli
= cli_initialise(NULL
)))
51 if (!cli_connect(cli
, server
, &ip
))
54 return new_cli_state_object(cli
);
57 static PyObject
*py_smb_session_request(PyObject
*self
, PyObject
*args
,
60 cli_state_object
*cli
= (cli_state_object
*)self
;
61 static char *kwlist
[] = { "called", "calling", NULL
};
62 char *calling_name
= NULL
, *called_name
;
63 struct nmb_name calling
, called
;
66 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "s|s", kwlist
, &called_name
,
71 calling_name
= global_myname();
73 make_nmb_name(&calling
, calling_name
, 0x00);
74 make_nmb_name(&called
, called_name
, 0x20);
76 result
= cli_session_request(cli
->cli
, &calling
, &called
);
78 return Py_BuildValue("i", result
);
81 static PyObject
*py_smb_negprot(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
83 cli_state_object
*cli
= (cli_state_object
*)self
;
84 static char *kwlist
[] = { NULL
};
87 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "", kwlist
))
90 result
= cli_negprot(cli
->cli
);
92 return Py_BuildValue("i", result
);
95 static PyObject
*py_smb_session_setup(PyObject
*self
, PyObject
*args
,
98 cli_state_object
*cli
= (cli_state_object
*)self
;
99 static char *kwlist
[] = { "creds", NULL
};
101 char *username
, *domain
, *password
, *errstr
;
104 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "|O", kwlist
, &creds
))
107 if (!py_parse_creds(creds
, &username
, &domain
, &password
, &errstr
)) {
112 result
= cli_session_setup(
113 cli
->cli
, username
, password
, strlen(password
) + 1,
114 password
, strlen(password
) + 1, domain
);
116 if (cli_is_error(cli
->cli
)) {
117 PyErr_SetString(PyExc_RuntimeError
, "session setup failed");
121 return Py_BuildValue("i", result
);
124 static PyObject
*py_smb_tconx(PyObject
*self
, PyObject
*args
, PyObject
*kw
)
126 cli_state_object
*cli
= (cli_state_object
*)self
;
127 static char *kwlist
[] = { "service", NULL
};
131 if (!PyArg_ParseTupleAndKeywords(args
, kw
, "s", kwlist
, &service
))
134 result
= cli_send_tconX(
135 cli
->cli
, service
, strequal(service
, "IPC$") ? "IPC" :
138 if (cli_is_error(cli
->cli
)) {
139 PyErr_SetString(PyExc_RuntimeError
, "tconx failed");
143 return Py_BuildValue("i", result
);
146 static PyObject
*py_smb_nt_create_andx(PyObject
*self
, PyObject
*args
,
149 cli_state_object
*cli
= (cli_state_object
*)self
;
150 static char *kwlist
[] = { "filename", "desired_access",
151 "file_attributes", "share_access",
152 "create_disposition", NULL
};
154 uint32 desired_access
, file_attributes
= 0,
155 share_access
= FILE_SHARE_READ
| FILE_SHARE_WRITE
,
156 create_disposition
= FILE_EXISTS_OPEN
, create_options
= 0;
159 /* Parse parameters */
161 if (!PyArg_ParseTupleAndKeywords(
162 args
, kw
, "si|iii", kwlist
, &filename
, &desired_access
,
163 &file_attributes
, &share_access
, &create_disposition
,
167 result
= cli_nt_create_full(
168 cli
->cli
, filename
, 0, desired_access
, file_attributes
,
169 share_access
, create_disposition
, create_options
, 0);
171 if (cli_is_error(cli
->cli
)) {
172 PyErr_SetString(PyExc_RuntimeError
, "nt_create_andx failed");
178 return PyInt_FromLong(result
);
181 static PyObject
*py_smb_close(PyObject
*self
, PyObject
*args
,
184 cli_state_object
*cli
= (cli_state_object
*)self
;
185 static char *kwlist
[] = { "fnum", NULL
};
189 /* Parse parameters */
191 if (!PyArg_ParseTupleAndKeywords(
192 args
, kw
, "i", kwlist
, &fnum
))
195 result
= cli_close(cli
->cli
, fnum
);
197 return PyInt_FromLong(result
);
200 static PyObject
*py_smb_unlink(PyObject
*self
, PyObject
*args
,
203 cli_state_object
*cli
= (cli_state_object
*)self
;
204 static char *kwlist
[] = { "filename", NULL
};
208 /* Parse parameters */
210 if (!PyArg_ParseTupleAndKeywords(
211 args
, kw
, "s", kwlist
, &filename
))
214 result
= cli_unlink(cli
->cli
, filename
);
216 return PyInt_FromLong(result
);
219 static PyObject
*py_smb_query_secdesc(PyObject
*self
, PyObject
*args
,
222 cli_state_object
*cli
= (cli_state_object
*)self
;
223 static char *kwlist
[] = { "fnum", NULL
};
224 PyObject
*result
= NULL
;
225 SEC_DESC
*secdesc
= NULL
;
227 TALLOC_CTX
*mem_ctx
= NULL
;
229 /* Parse parameters */
231 if (!PyArg_ParseTupleAndKeywords(
232 args
, kw
, "i", kwlist
, &fnum
))
235 mem_ctx
= talloc_init("py_smb_query_secdesc");
237 secdesc
= cli_query_secdesc(cli
->cli
, fnum
, mem_ctx
);
239 if (cli_is_error(cli
->cli
)) {
240 PyErr_SetString(PyExc_RuntimeError
, "query_secdesc failed");
250 if (!py_from_SECDESC(&result
, secdesc
)) {
253 "Invalid security descriptor returned");
258 talloc_destroy(mem_ctx
);
264 static PyObject
*py_smb_set_secdesc(PyObject
*self
, PyObject
*args
,
267 cli_state_object
*cli
= (cli_state_object
*)self
;
268 static char *kwlist
[] = { "fnum", "security_descriptor", NULL
};
269 PyObject
*result
= NULL
;
270 PyObject
*py_secdesc
;
272 TALLOC_CTX
*mem_ctx
= NULL
;
276 /* Parse parameters */
278 if (!PyArg_ParseTupleAndKeywords(
279 args
, kw
, "iO", kwlist
, &fnum
, &py_secdesc
))
282 mem_ctx
= talloc_init("py_smb_set_secdesc");
284 if (!py_to_SECDESC(&secdesc
, py_secdesc
, mem_ctx
)) {
285 PyErr_SetString(PyExc_TypeError
,
286 "Invalid security descriptor");
290 err
= cli_set_secdesc(cli
->cli
, fnum
, secdesc
);
292 if (cli_is_error(cli
->cli
)) {
293 PyErr_SetString(PyExc_RuntimeError
, "set_secdesc failed");
297 result
= PyInt_FromLong(err
);
299 talloc_destroy(mem_ctx
);
304 static PyMethodDef smb_hnd_methods
[] = {
306 /* Session and connection handling */
308 { "session_request", (PyCFunction
)py_smb_session_request
,
309 METH_VARARGS
| METH_KEYWORDS
, "Request a session" },
311 { "negprot", (PyCFunction
)py_smb_negprot
,
312 METH_VARARGS
| METH_KEYWORDS
, "Protocol negotiation" },
314 { "session_setup", (PyCFunction
)py_smb_session_setup
,
315 METH_VARARGS
| METH_KEYWORDS
, "Session setup" },
317 { "tconx", (PyCFunction
)py_smb_tconx
,
318 METH_VARARGS
| METH_KEYWORDS
, "Tree connect" },
320 /* File operations */
322 { "nt_create_andx", (PyCFunction
)py_smb_nt_create_andx
,
323 METH_VARARGS
| METH_KEYWORDS
, "NT Create&X" },
325 { "close", (PyCFunction
)py_smb_close
,
326 METH_VARARGS
| METH_KEYWORDS
, "Close" },
328 { "unlink", (PyCFunction
)py_smb_unlink
,
329 METH_VARARGS
| METH_KEYWORDS
, "Unlink" },
331 /* Security descriptors */
333 { "query_secdesc", (PyCFunction
)py_smb_query_secdesc
,
334 METH_VARARGS
| METH_KEYWORDS
, "Query security descriptor" },
336 { "set_secdesc", (PyCFunction
)py_smb_set_secdesc
,
337 METH_VARARGS
| METH_KEYWORDS
, "Set security descriptor" },
343 * Method dispatch tables
346 static PyMethodDef smb_methods
[] = {
348 { "connect", (PyCFunction
)py_smb_connect
, METH_VARARGS
| METH_KEYWORDS
,
349 "Connect to a host" },
351 /* Other stuff - this should really go into a samba config module
352 but for the moment let's leave it here. */
354 { "setup_logging", (PyCFunction
)py_setup_logging
,
355 METH_VARARGS
| METH_KEYWORDS
,
356 "Set up debug logging.\n"
358 "Initialises Samba's debug logging system. One argument is expected which\n"
359 "is a boolean specifying whether debugging is interactive and sent to stdout\n"
360 "or logged to a file.\n"
364 ">>> smb.setup_logging(interactive = 1)" },
366 { "get_debuglevel", (PyCFunction
)get_debuglevel
,
368 "Set the current debug level.\n"
372 ">>> smb.get_debuglevel()\n"
375 { "set_debuglevel", (PyCFunction
)set_debuglevel
,
377 "Get the current debug level.\n"
381 ">>> smb.set_debuglevel(10)" },
386 static void py_cli_state_dealloc(PyObject
* self
)
388 cli_state_object
*cli
= (cli_state_object
*)self
;
391 cli_shutdown(cli
->cli
);
396 static PyObject
*py_cli_state_getattr(PyObject
*self
, char *attrname
)
398 return Py_FindMethod(smb_hnd_methods
, self
, attrname
);
401 PyTypeObject cli_state_type
= {
402 PyObject_HEAD_INIT(NULL
)
404 "SMB client connection",
405 sizeof(cli_state_object
),
407 py_cli_state_dealloc
, /*tp_dealloc*/
409 py_cli_state_getattr
, /*tp_getattr*/
414 0, /*tp_as_sequence*/
420 * Module initialisation
425 PyObject
*module
, *dict
;
427 /* Initialise module */
429 module
= Py_InitModule("smb", smb_methods
);
430 dict
= PyModule_GetDict(module
);
432 /* Initialise policy handle object */
434 cli_state_type
.ob_type
= &PyType_Type
;
436 /* Do samba initialisation */
440 setup_logging("smb", True
);