The branch, master has been updated via dc2f910 s4:dsdb/tests: add test_timevalues1() to verify timestamp values via c7af8ae ldb: version 1.1.20 via d1b5155 lib/ldb: fix logic in ldb_val_to_time() from 6a56bdf Update the tevent_data.dox tutrial stuff to fix some errors, including white space problems.
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit dc2f91020e3b52942f8aab60fd1db70d2afadd51 Author: Stefan Metzmacher <me...@samba.org> Date: Fri Jan 9 08:56:59 2015 +0100 s4:dsdb/tests: add test_timevalues1() to verify timestamp values Bug: https://bugzilla.samba.org/show_bug.cgi?id=9810 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Günther Deschner <g...@samba.org> Autobuild-User(master): Stefan Metzmacher <me...@samba.org> Autobuild-Date(master): Sat Jan 24 20:17:20 CET 2015 on sn-devel-104 commit c7af8ae9d2aa19db2533e69b8a4d7c1b6f8e2d9f Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 19 17:17:13 2015 +0100 ldb: version 1.1.20 - Bug 9810 - validate_ldb of String(Generalized-Time) does not accept millisecond format ".000Z" Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Günther Deschner <g...@samba.org> commit d1b515535da46591d3a646a848c7427b6ff951a7 Author: Stefan Metzmacher <me...@samba.org> Date: Mon Jan 19 15:47:58 2015 +0100 lib/ldb: fix logic in ldb_val_to_time() 040408072012Z should represent 20040408072012.0Z as well as 20040408072012.000Z or 20040408072012.RandomIgnoredCharaters...Z Bug: https://bugzilla.samba.org/show_bug.cgi?id=9810 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Reviewed-by: Günther Deschner <g...@samba.org> ----------------------------------------------------------------------- Summary of changes: lib/ldb/ABI/{ldb-1.1.19.sigs => ldb-1.1.20.sigs} | 0 ...ldb-util-1.1.10.sigs => pyldb-util-1.1.20.sigs} | 0 lib/ldb/common/ldb_msg.c | 38 ++++++++++++++++---- lib/ldb/wscript | 2 +- source4/dsdb/tests/python/ldap.py | 40 ++++++++++++++++++++++ 5 files changed, 73 insertions(+), 7 deletions(-) copy lib/ldb/ABI/{ldb-1.1.19.sigs => ldb-1.1.20.sigs} (100%) copy lib/ldb/ABI/{pyldb-util-1.1.10.sigs => pyldb-util-1.1.20.sigs} (100%) Changeset truncated at 500 lines: diff --git a/lib/ldb/ABI/ldb-1.1.19.sigs b/lib/ldb/ABI/ldb-1.1.20.sigs similarity index 100% copy from lib/ldb/ABI/ldb-1.1.19.sigs copy to lib/ldb/ABI/ldb-1.1.20.sigs diff --git a/lib/ldb/ABI/pyldb-util-1.1.10.sigs b/lib/ldb/ABI/pyldb-util-1.1.20.sigs similarity index 100% copy from lib/ldb/ABI/pyldb-util-1.1.10.sigs copy to lib/ldb/ABI/pyldb-util-1.1.20.sigs diff --git a/lib/ldb/common/ldb_msg.c b/lib/ldb/common/ldb_msg.c index 809e3af..3f65351 100644 --- a/lib/ldb/common/ldb_msg.c +++ b/lib/ldb/common/ldb_msg.c @@ -1090,28 +1090,54 @@ time_t ldb_string_to_time(const char *s) */ int ldb_val_to_time(const struct ldb_val *v, time_t *t) { - struct tm tm; + char val[15] = {}; + struct tm tm = {}; - if (v == NULL || !v->data || (v->length != 17 && v->length != 13)) { + if (v == NULL) { return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX; } - memset(&tm, 0, sizeof(tm)); + if (v->data == NULL) { + return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX; + } + + if (v->length < 16 && v->length != 13) { + return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX; + } + + if (v->data[v->length - 1] != 'Z') { + return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX; + } if (v->length == 13) { - if (sscanf((char *)v->data, "%02u%02u%02u%02u%02u%02uZ", + memcpy(val, v->data, 12); + + if (sscanf(val, "%02u%02u%02u%02u%02u%02u", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) { return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX; } + if (tm.tm_year < 50) { + tm.tm_year += 100; + } } else { - if (sscanf((char *)v->data, "%04u%02u%02u%02u%02u%02u.0Z", + + /* + * anything between '.' and 'Z' is silently ignored. + */ + if (v->data[14] != '.') { + return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX; + } + + memcpy(val, v->data, 14); + + if (sscanf(val, "%04u%02u%02u%02u%02u%02u", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) { return LDB_ERR_INVALID_ATTRIBUTE_SYNTAX; } + tm.tm_year -= 1900; } - tm.tm_year -= 1900; tm.tm_mon -= 1; *t = timegm(&tm); diff --git a/lib/ldb/wscript b/lib/ldb/wscript index 4d44a0a..6391e74 100755 --- a/lib/ldb/wscript +++ b/lib/ldb/wscript @@ -1,7 +1,7 @@ #!/usr/bin/env python APPNAME = 'ldb' -VERSION = '1.1.19' +VERSION = '1.1.20' blddir = 'bin' diff --git a/source4/dsdb/tests/python/ldap.py b/source4/dsdb/tests/python/ldap.py index 7139f3c..dc12fea 100755 --- a/source4/dsdb/tests/python/ldap.py +++ b/source4/dsdb/tests/python/ldap.py @@ -106,6 +106,7 @@ class BasicTests(samba.tests.TestCase): delete_force(self.ldb, "description=xyz,cn=users," + self.base_dn) delete_force(self.ldb, "ou=testou,cn=users," + self.base_dn) delete_force(self.ldb, "cn=Test Secret,cn=system," + self.base_dn) + delete_force(self.ldb, "cn=testtimevaluesuser1,cn=users," + self.base_dn) def test_objectclasses(self): """Test objectClass behaviour""" @@ -2859,6 +2860,45 @@ nTSecurityDescriptor:: """ + desc_base64 self.assertTrue("whenCreated" in res[0]) self.assertTrue("whenChanged" in res[0]) + def test_timevalues1(self): + """Tests possible syntax of time attributes""" + + user_name = "testtimevaluesuser1" + user_dn = "CN=%s,CN=Users,%s" % (user_name, self.base_dn) + + delete_force(self.ldb, user_dn) + self.ldb.add({ "dn": user_dn, + "objectClass": "user", + "sAMAccountName": user_name }) + + # + # We check the following values: + # + # 370101000000Z => 20370101000000.0Z + # 20370102000000.*Z => 20370102000000.0Z + # + ext = [ "Z", ".0Z", ".Z", ".000Z", ".RandomIgnoredCharacters...987654321Z" ] + for i in range(0, len(ext)): + v_raw = "203701%02d000000" % (i + 1) + if ext[i] == "Z": + v_set = v_raw[2:] + ext[i] + else: + v_set = v_raw + ext[i] + v_get = v_raw + ".0Z" + + m = Message() + m.dn = Dn(ldb, user_dn) + m["msTSExpireDate"] = MessageElement([v_set], + FLAG_MOD_REPLACE, + "msTSExpireDate") + self.ldb.modify(m) + + res = self.ldb.search(base=user_dn, scope=SCOPE_BASE, attrs=["msTSExpireDate"]) + self.assertTrue(len(res) == 1) + self.assertTrue("msTSExpireDate" in res[0]) + self.assertTrue(len(res[0]["msTSExpireDate"]) == 1) + self.assertEquals(res[0]["msTSExpireDate"][0], v_get) + class BaseDnTests(samba.tests.TestCase): def setUp(self): -- Samba Shared Repository