]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
auth:creds: Add python bindings for (get|set)_smb_signing
authorAndreas Schneider <asn@samba.org>
Wed, 3 Jun 2020 09:56:01 +0000 (11:56 +0200)
committerAndreas Schneider <asn@cryptomilk.org>
Wed, 19 Aug 2020 16:22:40 +0000 (16:22 +0000)
Signed-off-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
auth/credentials/pycredentials.c
python/samba/tests/credentials.py

index 68edc2827411452480ed35ecab0569cbe70d27be..846c418419fcc9155be47f4fbe1a26772e399838 100644 (file)
@@ -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);
 
@@ -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",
@@ -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 }
 };
 
@@ -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);
index 3dac57651a3aea30b3801e8ded1cda9bb90ca241..0ddb0867a8187eb010e29bf7883399cab8448474 100644 (file)
@@ -448,3 +448,9 @@ class CredentialsTests(samba.tests.TestCaseInTempDir):
         self.assertEqual(creds.get_principal(), "user@samba.org")
         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)