]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
pyldb: Make ldb.Message containment testing consistent with indexing
authorJoseph Sutton <josephsutton@catalyst.net.nz>
Sat, 25 Sep 2021 02:39:59 +0000 (14:39 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 28 Sep 2021 09:44:35 +0000 (09:44 +0000)
Previously, containment testing using the 'in' operator was handled by
performing an equality comparison between the chosen object and each of
the message's keys in turn. This behaviour was prone to errors due to
not considering differences in case between otherwise equal elements, as
the indexing operations do.

Containment testing should now be more consistent with the indexing
operations and with the get() method of ldb.Message.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=14845

Signed-off-by: Joseph Sutton <josephsutton@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
lib/ldb/pyldb.c
selftest/knownfail.d/pyldb [deleted file]

index 7c0ab6f07d445bf1d67e56adefcc28a0e830d007..3f4b0c7a45cf37f3d4d83a0d4ef42ae03ae75d58 100644 (file)
@@ -3433,6 +3433,22 @@ static PyObject *py_ldb_msg_keys(PyLdbMessageObject *self,
        return obj;
 }
 
+static int py_ldb_msg_contains(PyLdbMessageObject *self, PyObject *py_name)
+{
+       struct ldb_message_element *el = NULL;
+       const char *name = NULL;
+       struct ldb_message *msg = pyldb_Message_AsMessage(self);
+       name = PyUnicode_AsUTF8(py_name);
+       if (name == NULL) {
+               return -1;
+       }
+       if (!ldb_attr_cmp(name, "dn")) {
+               return 1;
+       }
+       el = ldb_msg_find_element(msg, name);
+       return el != NULL ? 1 : 0;
+}
+
 static PyObject *py_ldb_msg_getitem(PyLdbMessageObject *self, PyObject *py_name)
 {
        struct ldb_message_element *el = NULL;
@@ -3661,6 +3677,10 @@ static Py_ssize_t py_ldb_msg_length(PyLdbMessageObject *self)
        return pyldb_Message_AsMessage(self)->num_elements;
 }
 
+static PySequenceMethods py_ldb_msg_sequence = {
+       .sq_contains = (objobjproc)py_ldb_msg_contains,
+};
+
 static PyMappingMethods py_ldb_msg_mapping = {
        .mp_length = (lenfunc)py_ldb_msg_length,
        .mp_subscript = (binaryfunc)py_ldb_msg_getitem,
@@ -3838,6 +3858,7 @@ static PyTypeObject PyLdbMessage = {
        .tp_name = "ldb.Message",
        .tp_methods = py_ldb_msg_methods,
        .tp_getset = py_ldb_msg_getset,
+       .tp_as_sequence = &py_ldb_msg_sequence,
        .tp_as_mapping = &py_ldb_msg_mapping,
        .tp_basicsize = sizeof(PyLdbMessageObject),
        .tp_dealloc = (destructor)py_ldb_msg_dealloc,
diff --git a/selftest/knownfail.d/pyldb b/selftest/knownfail.d/pyldb
deleted file mode 100644 (file)
index 34bdac4..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-^ldb.python.api.LdbMsgTests.test_contains_case
-^ldb.python.api.LdbMsgTests.test_contains_dn
-^ldb.python.api.LdbMsgTests.test_contains_dn_case
-^ldb.python.api.LdbMsgTests.test_contains_invalid