Skip to content

Commit

Permalink
auth:creds: Add python bindings for (get|set)_smb_signing
Browse files Browse the repository at this point in the history
Signed-off-by: Andreas Schneider <[email protected]>
Reviewed-by: Stefan Metzmacher <[email protected]>
  • Loading branch information
cryptomilk committed Aug 19, 2020
1 parent 58e0abc commit 098774b
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
63 changes: 63 additions & 0 deletions auth/credentials/pycredentials.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "auth/credentials/credentials_internal.h"
#include "system/kerberos.h"
#include "auth/kerberos/kerberos.h"
#include "libcli/smb/smb_constants.h"

void initcredentials(void);

Expand Down Expand Up @@ -929,6 +930,52 @@ static PyObject *py_creds_encrypt_netr_crypt_password(PyObject *self,
Py_RETURN_NONE;
}

static PyObject *py_creds_get_smb_signing(PyObject *self, PyObject *unused)
{
enum smb_signing_setting signing_state;
struct cli_credentials *creds = NULL;

creds = PyCredentials_AsCliCredentials(self);
if (creds == NULL) {
PyErr_Format(PyExc_TypeError, "Credentials expected");
return NULL;
}

signing_state = cli_credentials_get_smb_signing(creds);
return PyLong_FromLong(signing_state);
}

static PyObject *py_creds_set_smb_signing(PyObject *self, PyObject *args)
{
enum smb_signing_setting signing_state;
struct cli_credentials *creds = NULL;
enum credentials_obtained obt = CRED_SPECIFIED;

creds = PyCredentials_AsCliCredentials(self);
if (creds == NULL) {
PyErr_Format(PyExc_TypeError, "Credentials expected");
return NULL;
}
if (!PyArg_ParseTuple(args, "i|i", &signing_state, &obt)) {
return NULL;
}

switch (signing_state) {
case SMB_SIGNING_DEFAULT:
case SMB_SIGNING_OFF:
case SMB_SIGNING_IF_REQUIRED:
case SMB_SIGNING_DESIRED:
case SMB_SIGNING_REQUIRED:
break;
default:
PyErr_Format(PyExc_TypeError, "Invalid signing state value");
return NULL;
}

cli_credentials_set_smb_signing(creds, signing_state, obt);
Py_RETURN_NONE;
}

static PyMethodDef py_creds_methods[] = {
{
.ml_name = "get_username",
Expand Down Expand Up @@ -1209,6 +1256,16 @@ static PyMethodDef py_creds_methods[] = {
"Encrypt the supplied password using the session key and\n"
"the negotiated encryption algorithm in place\n"
"i.e. it overwrites the original data"},
{
.ml_name = "get_smb_signing",
.ml_meth = py_creds_get_smb_signing,
.ml_flags = METH_NOARGS,
},
{
.ml_name = "set_smb_signing",
.ml_meth = py_creds_set_smb_signing,
.ml_flags = METH_VARARGS,
},
{ .ml_name = NULL }
};

Expand Down Expand Up @@ -1295,6 +1352,12 @@ MODULE_INIT_FUNC(credentials)
PyModule_AddObject(m, "CLI_CRED_NTLM_AUTH", PyLong_FromLong(CLI_CRED_NTLM_AUTH));
PyModule_AddObject(m, "CLI_CRED_CLEAR_AUTH", PyLong_FromLong(CLI_CRED_CLEAR_AUTH));

PyModule_AddObject(m, "SMB_SIGNING_DEFAULT", PyLong_FromLong(SMB_SIGNING_DEFAULT));
PyModule_AddObject(m, "SMB_SIGNING_OFF", PyLong_FromLong(SMB_SIGNING_OFF));
PyModule_AddObject(m, "SMB_SIGNING_IF_REQUIRED", PyLong_FromLong(SMB_SIGNING_IF_REQUIRED));
PyModule_AddObject(m, "SMB_SIGNING_DESIRED", PyLong_FromLong(SMB_SIGNING_DESIRED));
PyModule_AddObject(m, "SMB_SIGNING_REQUIRED", PyLong_FromLong(SMB_SIGNING_REQUIRED));

Py_INCREF(&PyCredentials);
PyModule_AddObject(m, "Credentials", (PyObject *)&PyCredentials);
Py_INCREF(&PyCredentialCacheContainer);
Expand Down
6 changes: 6 additions & 0 deletions python/samba/tests/credentials.py
Original file line number Diff line number Diff line change
Expand Up @@ -448,3 +448,9 @@ def test_parse_username_with_realm_pw(self):
self.assertEqual(creds.get_principal(), "[email protected]")
self.assertEqual(creds.is_anonymous(), False)
self.assertEqual(creds.authentication_requested(), True)

def test_smb_signing(self):
creds = credentials.Credentials()
self.assertEqual(creds.get_smb_signing(), credentials.SMB_SIGNING_DEFAULT)
creds.set_smb_signing(credentials.SMB_SIGNING_REQUIRED)
self.assertEqual(creds.get_smb_signing(), credentials.SMB_SIGNING_REQUIRED)

0 comments on commit 098774b

Please sign in to comment.