auth/credentials: Add set_nt_hash()
authorJoseph Sutton <josephsutton@catalyst.net.nz>
Fri, 28 Apr 2023 04:22:32 +0000 (16:22 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 5 May 2023 02:54:31 +0000 (02:54 +0000)
This method allows setting the NT hash directly. This is useful in cases
where we don’t know the password, such as with a computer or server
account.

Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
auth/credentials/pycredentials.c

index ac9ccd4ae27ed1eecc7e1bd19775bd73a59b3145..b87cdc06a932427b70309558a1c38c6c8097335e 100644 (file)
@@ -546,6 +546,32 @@ static PyObject *py_creds_get_nt_hash(PyObject *self, PyObject *unused)
        return ret;
 }
 
+static PyObject *py_creds_set_nt_hash(PyObject *self, PyObject *args)
+{
+       PyObject *py_cp = Py_None;
+       const struct samr_Password *pwd = NULL;
+       enum credentials_obtained obt = CRED_SPECIFIED;
+       int _obt = obt;
+       struct cli_credentials *creds = PyCredentials_AsCliCredentials(self);
+       if (creds == NULL) {
+               PyErr_Format(PyExc_TypeError, "Credentials expected");
+               return NULL;
+       }
+
+       if (!PyArg_ParseTuple(args, "O|i", &py_cp, &_obt)) {
+               return NULL;
+       }
+       obt = _obt;
+
+       pwd = pytalloc_get_type(py_cp, struct samr_Password);
+       if (pwd == NULL) {
+               /* pytalloc_get_type sets TypeError */
+               return NULL;
+       }
+
+       return PyBool_FromLong(cli_credentials_set_nt_hash(creds, pwd, obt));
+}
+
 static PyObject *py_creds_get_kerberos_state(PyObject *self, PyObject *unused)
 {
        int state;
@@ -1389,6 +1415,13 @@ static PyMethodDef py_creds_methods[] = {
                .ml_meth  = py_creds_get_nt_hash,
                .ml_flags = METH_NOARGS,
        },
+       {
+               .ml_name  = "set_nt_hash",
+               .ml_meth  = py_creds_set_nt_hash,
+               .ml_flags = METH_VARARGS,
+               .ml_doc = "S.set_net_sh(samr_Password[, credentials.SPECIFIED]) -> bool\n"
+                       "Change NT hash.",
+       },
        {
                .ml_name  = "get_kerberos_state",
                .ml_meth  = py_creds_get_kerberos_state,