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
};
225 SEC_DESC
*secdesc
= 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");
259 talloc_destroy(mem_ctx
);
265 static PyObject
*py_smb_set_secdesc(PyObject
*self
, PyObject
*args
,
268 cli_state_object
*cli
= (cli_state_object
*)self
;
269 static char *kwlist
[] = { "fnum", "security_descriptor", NULL
};
270 PyObject
*py_secdesc
;
272 TALLOC_CTX
*mem_ctx
= talloc_init("py_smb_set_secdesc");
276 /* Parse parameters */
278 if (!PyArg_ParseTupleAndKeywords(
279 args
, kw
, "iO", kwlist
, &fnum
, &py_secdesc
))
282 if (!py_to_SECDESC(&secdesc
, py_secdesc
, mem_ctx
)) {
283 PyErr_SetString(PyExc_TypeError
,
284 "Invalid security descriptor");
288 result
= cli_set_secdesc(cli
->cli
, fnum
, secdesc
);
290 if (cli_is_error(cli
->cli
)) {
291 PyErr_SetString(PyExc_RuntimeError
, "set_secdesc failed");
295 return PyInt_FromLong(result
);
298 static PyMethodDef smb_hnd_methods
[] = {
300 /* Session and connection handling */
302 { "session_request", (PyCFunction
)py_smb_session_request
,
303 METH_VARARGS
| METH_KEYWORDS
, "Request a session" },
305 { "negprot", (PyCFunction
)py_smb_negprot
,
306 METH_VARARGS
| METH_KEYWORDS
, "Protocol negotiation" },
308 { "session_setup", (PyCFunction
)py_smb_session_setup
,
309 METH_VARARGS
| METH_KEYWORDS
, "Session setup" },
311 { "tconx", (PyCFunction
)py_smb_tconx
,
312 METH_VARARGS
| METH_KEYWORDS
, "Tree connect" },
314 /* File operations */
316 { "nt_create_andx", (PyCFunction
)py_smb_nt_create_andx
,
317 METH_VARARGS
| METH_KEYWORDS
, "NT Create&X" },
319 { "close", (PyCFunction
)py_smb_close
,
320 METH_VARARGS
| METH_KEYWORDS
, "Close" },
322 { "unlink", (PyCFunction
)py_smb_unlink
,
323 METH_VARARGS
| METH_KEYWORDS
, "Unlink" },
325 /* Security descriptors */
327 { "query_secdesc", (PyCFunction
)py_smb_query_secdesc
,
328 METH_VARARGS
| METH_KEYWORDS
, "Query security descriptor" },
330 { "set_secdesc", (PyCFunction
)py_smb_set_secdesc
,
331 METH_VARARGS
| METH_KEYWORDS
, "Set security descriptor" },
337 * Method dispatch tables
340 static PyMethodDef smb_methods
[] = {
342 { "connect", (PyCFunction
)py_smb_connect
, METH_VARARGS
| METH_KEYWORDS
,
343 "Connect to a host" },
348 static void py_cli_state_dealloc(PyObject
* self
)
353 static PyObject
*py_cli_state_getattr(PyObject
*self
, char *attrname
)
355 return Py_FindMethod(smb_hnd_methods
, self
, attrname
);
358 PyTypeObject cli_state_type
= {
359 PyObject_HEAD_INIT(NULL
)
361 "SMB client connection",
362 sizeof(cli_state_object
),
364 py_cli_state_dealloc
, /*tp_dealloc*/
366 py_cli_state_getattr
, /*tp_getattr*/
371 0, /*tp_as_sequence*/
377 * Module initialisation
382 PyObject
*module
, *dict
;
384 /* Initialise module */
386 module
= Py_InitModule("smb", smb_methods
);
387 dict
= PyModule_GetDict(module
);
389 /* Initialise policy handle object */
391 cli_state_type
.ob_type
= &PyType_Type
;
393 /* Do samba initialisation */
397 setup_logging("smb", True
);