svn commit: samba r26585 - in branches/SAMBA_4_0: . source source/lib/tdb source/scripting/python/samba source/scripting/python/samba/tests

jelmer at samba.org jelmer at samba.org
Mon Dec 24 11:02:54 GMT 2007


Author: jelmer
Date: 2007-12-24 11:02:52 +0000 (Mon, 24 Dec 2007)
New Revision: 26585

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=26585

Log:
Fix samba3.python tests.
Modified:
   branches/SAMBA_4_0/
   branches/SAMBA_4_0/source/lib/tdb/tdb.i
   branches/SAMBA_4_0/source/lib/tdb/tdb.py
   branches/SAMBA_4_0/source/lib/tdb/tdb_wrap.c
   branches/SAMBA_4_0/source/samba4-skip
   branches/SAMBA_4_0/source/scripting/python/samba/samba3.py
   branches/SAMBA_4_0/source/scripting/python/samba/tests/samba3.py


Changeset:

Property changes on: branches/SAMBA_4_0
___________________________________________________________________
Name: bzr:revision-info
...skipped...
Name: bzr:revision-id:v3-trunk0
...skipped...

Modified: branches/SAMBA_4_0/source/lib/tdb/tdb.i
===================================================================
--- branches/SAMBA_4_0/source/lib/tdb/tdb.i	2007-12-24 11:02:45 UTC (rev 26584)
+++ branches/SAMBA_4_0/source/lib/tdb/tdb.i	2007-12-24 11:02:52 UTC (rev 26585)
@@ -60,12 +60,16 @@
    data.. */
 
 %typemap(in,noblock=1) TDB_DATA {
-	if (!PyString_Check($input)) {
+    if ($input == Py_None) {
+        $1.dsize = 0;
+        $1.dptr = NULL;
+    } else if (!PyString_Check($input)) {
 		PyErr_SetString(PyExc_TypeError, "string arg expected");
 		return NULL;
-	}
-	$1.dsize = PyString_Size($input);
-	$1.dptr = (uint8_t *)PyString_AsString($input);
+	} else {
+        $1.dsize = PyString_Size($input);
+        $1.dptr = (uint8_t *)PyString_AsString($input);
+    }
 }
 
 %typemap(out,noblock=1) TDB_DATA {
@@ -74,7 +78,7 @@
 	} else {
 		$result = PyString_FromStringAndSize((const char *)$1.dptr, $1.dsize);
 		free($1.dptr);
-	}
+    }
 }
 
 /* Treat a mode_t as an unsigned integer */
@@ -146,8 +150,8 @@
 
 typedef struct tdb_context {
     %extend {
-        tdb(const char *name, int hash_size, int tdb_flags, int open_flags, mode_t mode) {
-            return tdb_open(name, hash_size, tdb_flags, open_flags, mode);
+        tdb(const char *name, int hash_size, int tdb_flags, int flags, mode_t mode) {
+            return tdb_open(name, hash_size, tdb_flags, flags, mode);
         }
         enum TDB_ERROR error();
         ~tdb() { tdb_close($self); }
@@ -202,6 +206,20 @@
     def has_key(self, key):
         return self.exists(key) != 0
 
+    def fetch_uint32(self, key):
+        data = self.fetch(key)
+        if data is None:
+            return None
+        import struct
+        return struct.unpack("<L", data)[0]
+
+    def fetch_int32(self, key):
+        data = self.fetch(key)
+        if data is None:
+            return None
+        import struct
+        return struct.unpack("<l", data)[0]
+
     # Tdb iterator
     class TdbIterator:
         def __init__(self, tdb):

Modified: branches/SAMBA_4_0/source/lib/tdb/tdb.py
===================================================================
--- branches/SAMBA_4_0/source/lib/tdb/tdb.py	2007-12-24 11:02:45 UTC (rev 26584)
+++ branches/SAMBA_4_0/source/lib/tdb/tdb.py	2007-12-24 11:02:52 UTC (rev 26585)
@@ -108,7 +108,21 @@
     def has_key(self, key):
         return self.exists(key) != 0
 
+    def fetch_uint32(self, key):
+        data = self.fetch(key)
+        if data is None:
+            return None
+        import struct
+        return struct.unpack("<L", data)[0]
 
+    def fetch_int32(self, key):
+        data = self.fetch(key)
+        if data is None:
+            return None
+        import struct
+        return struct.unpack("<l", data)[0]
+
+
     class TdbIterator:
         def __init__(self, tdb):
             self.tdb = tdb

Modified: branches/SAMBA_4_0/source/lib/tdb/tdb_wrap.c
===================================================================
--- branches/SAMBA_4_0/source/lib/tdb/tdb_wrap.c	2007-12-24 11:02:45 UTC (rev 26584)
+++ branches/SAMBA_4_0/source/lib/tdb/tdb_wrap.c	2007-12-24 11:02:52 UTC (rev 26585)
@@ -2747,8 +2747,8 @@
   return res;
 }
 
-SWIGINTERN tdb *new_tdb(char const *name,int hash_size,int tdb_flags,int open_flags,mode_t mode){
-            return tdb_open(name, hash_size, tdb_flags, open_flags, mode);
+SWIGINTERN tdb *new_tdb(char const *name,int hash_size,int tdb_flags,int flags,mode_t mode){
+            return tdb_open(name, hash_size, tdb_flags, flags, mode);
         }
 SWIGINTERN void delete_tdb(tdb *self){ tdb_close(self); }
 
@@ -2818,12 +2818,11 @@
   PyObject * obj3 = 0 ;
   PyObject * obj4 = 0 ;
   char *  kwnames[] = {
-    (char *) "name",(char *) "hash_size",(char *) "tdb_flags",(char *) "open_flags",(char *) "mode", NULL 
+    (char *) "name",(char *) "hash_size",(char *) "tdb_flags",(char *) "flags",(char *) "mode", NULL 
   };
   
   arg2 = 0;
   arg3 = TDB_DEFAULT;
-  arg4 = O_RDWR;
   arg5 = 0600;
   if (!PyArg_ParseTupleAndKeywords(args,kwargs,(char *)"O|OOOO:new_Tdb",kwnames,&obj0,&obj1,&obj2,&obj3,&obj4)) SWIG_fail;
   res1 = SWIG_AsCharPtrAndSize(obj0, &buf1, NULL, &alloc1);
@@ -2964,18 +2963,26 @@
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tdb_append" "', argument " "1"" of type '" "tdb *""'"); 
   }
   arg1 = (tdb *)(argp1);
-  if (!PyString_Check(obj1)) {
+  if (obj1 == Py_None) {
+    (&arg2)->dsize = 0;
+    (&arg2)->dptr = NULL;
+  } else if (!PyString_Check(obj1)) {
     PyErr_SetString(PyExc_TypeError, "string arg expected");
     return NULL;
+  } else {
+    (&arg2)->dsize = PyString_Size(obj1);
+    (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
   }
-  (&arg2)->dsize = PyString_Size(obj1);
-  (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
-  if (!PyString_Check(obj2)) {
+  if (obj2 == Py_None) {
+    (&arg3)->dsize = 0;
+    (&arg3)->dptr = NULL;
+  } else if (!PyString_Check(obj2)) {
     PyErr_SetString(PyExc_TypeError, "string arg expected");
     return NULL;
+  } else {
+    (&arg3)->dsize = PyString_Size(obj2);
+    (&arg3)->dptr = (uint8_t *)PyString_AsString(obj2);
   }
-  (&arg3)->dsize = PyString_Size(obj2);
-  (&arg3)->dptr = (uint8_t *)PyString_AsString(obj2);
   result = (int)tdb_append(arg1,arg2,arg3);
   resultobj = SWIG_From_int((int)(result));
   return resultobj;
@@ -3026,12 +3033,16 @@
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tdb_fetch" "', argument " "1"" of type '" "tdb *""'"); 
   }
   arg1 = (tdb *)(argp1);
-  if (!PyString_Check(obj1)) {
+  if (obj1 == Py_None) {
+    (&arg2)->dsize = 0;
+    (&arg2)->dptr = NULL;
+  } else if (!PyString_Check(obj1)) {
     PyErr_SetString(PyExc_TypeError, "string arg expected");
     return NULL;
+  } else {
+    (&arg2)->dsize = PyString_Size(obj1);
+    (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
   }
-  (&arg2)->dsize = PyString_Size(obj1);
-  (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
   result = tdb_fetch(arg1,arg2);
   if ((&result)->dptr == NULL && (&result)->dsize == 0) {
     resultobj = Py_None;
@@ -3064,12 +3075,16 @@
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tdb_delete" "', argument " "1"" of type '" "tdb *""'"); 
   }
   arg1 = (tdb *)(argp1);
-  if (!PyString_Check(obj1)) {
+  if (obj1 == Py_None) {
+    (&arg2)->dsize = 0;
+    (&arg2)->dptr = NULL;
+  } else if (!PyString_Check(obj1)) {
     PyErr_SetString(PyExc_TypeError, "string arg expected");
     return NULL;
+  } else {
+    (&arg2)->dsize = PyString_Size(obj1);
+    (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
   }
-  (&arg2)->dsize = PyString_Size(obj1);
-  (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
   result = (int)tdb_delete(arg1,arg2);
   resultobj = SWIG_From_int((int)(result));
   return resultobj;
@@ -3104,18 +3119,26 @@
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tdb_store" "', argument " "1"" of type '" "tdb *""'"); 
   }
   arg1 = (tdb *)(argp1);
-  if (!PyString_Check(obj1)) {
+  if (obj1 == Py_None) {
+    (&arg2)->dsize = 0;
+    (&arg2)->dptr = NULL;
+  } else if (!PyString_Check(obj1)) {
     PyErr_SetString(PyExc_TypeError, "string arg expected");
     return NULL;
+  } else {
+    (&arg2)->dsize = PyString_Size(obj1);
+    (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
   }
-  (&arg2)->dsize = PyString_Size(obj1);
-  (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
-  if (!PyString_Check(obj2)) {
+  if (obj2 == Py_None) {
+    (&arg3)->dsize = 0;
+    (&arg3)->dptr = NULL;
+  } else if (!PyString_Check(obj2)) {
     PyErr_SetString(PyExc_TypeError, "string arg expected");
     return NULL;
+  } else {
+    (&arg3)->dsize = PyString_Size(obj2);
+    (&arg3)->dptr = (uint8_t *)PyString_AsString(obj2);
   }
-  (&arg3)->dsize = PyString_Size(obj2);
-  (&arg3)->dptr = (uint8_t *)PyString_AsString(obj2);
   if (obj3) {
     ecode4 = SWIG_AsVal_int(obj3, &val4);
     if (!SWIG_IsOK(ecode4)) {
@@ -3150,12 +3173,16 @@
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tdb_exists" "', argument " "1"" of type '" "tdb *""'"); 
   }
   arg1 = (tdb *)(argp1);
-  if (!PyString_Check(obj1)) {
+  if (obj1 == Py_None) {
+    (&arg2)->dsize = 0;
+    (&arg2)->dptr = NULL;
+  } else if (!PyString_Check(obj1)) {
     PyErr_SetString(PyExc_TypeError, "string arg expected");
     return NULL;
+  } else {
+    (&arg2)->dsize = PyString_Size(obj1);
+    (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
   }
-  (&arg2)->dsize = PyString_Size(obj1);
-  (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
   result = (int)tdb_exists(arg1,arg2);
   resultobj = SWIG_From_int((int)(result));
   return resultobj;
@@ -3211,12 +3238,16 @@
     SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "tdb_nextkey" "', argument " "1"" of type '" "tdb *""'"); 
   }
   arg1 = (tdb *)(argp1);
-  if (!PyString_Check(obj1)) {
+  if (obj1 == Py_None) {
+    (&arg2)->dsize = 0;
+    (&arg2)->dptr = NULL;
+  } else if (!PyString_Check(obj1)) {
     PyErr_SetString(PyExc_TypeError, "string arg expected");
     return NULL;
+  } else {
+    (&arg2)->dsize = PyString_Size(obj1);
+    (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
   }
-  (&arg2)->dsize = PyString_Size(obj1);
-  (&arg2)->dptr = (uint8_t *)PyString_AsString(obj1);
   result = tdb_nextkey(arg1,arg2);
   if ((&result)->dptr == NULL && (&result)->dsize == 0) {
     resultobj = Py_None;

Modified: branches/SAMBA_4_0/source/samba4-skip
===================================================================
--- branches/SAMBA_4_0/source/samba4-skip	2007-12-24 11:02:45 UTC (rev 26584)
+++ branches/SAMBA_4_0/source/samba4-skip	2007-12-24 11:02:52 UTC (rev 26585)
@@ -50,4 +50,3 @@
 WINBIND							# FIXME: This should not be skipped
 NSS-TEST						# Fails
 samba4.ldap.python			 # Conversion from EJS not yet finished
-samba4.samba3.python		 # Conversion from EJS not yet finished

Modified: branches/SAMBA_4_0/source/scripting/python/samba/samba3.py
===================================================================
--- branches/SAMBA_4_0/source/scripting/python/samba/samba3.py	2007-12-24 11:02:45 UTC (rev 26584)
+++ branches/SAMBA_4_0/source/scripting/python/samba/samba3.py	2007-12-24 11:02:52 UTC (rev 26585)
@@ -22,13 +22,17 @@
 REGISTRY_VALUE_PREFIX = "SAMBA_REGVAL"
 REGISTRY_DB_VERSION = 1
 
+import os
 import tdb
 
 class Registry:
     """Simple read-only support for reading the Samba3 registry."""
     def __init__(self, file):
-        self.tdb = tdb.Tdb(file)
+        self.tdb = tdb.Tdb(file, flags=os.O_RDONLY)
 
+    def close(self):
+        self.tdb.close()
+
     def __len__(self):
         """Return the number of keys."""
         return len(self.keys())
@@ -38,7 +42,7 @@
         return [k.rstrip("\x00") for k in self.tdb.keys() if not k.startswith(REGISTRY_VALUE_PREFIX)]
 
     def subkeys(self, key):
-        data = self.tdb.get(key)
+        data = self.tdb.get("%s\x00" % key)
         if data is None:
             return []
         # FIXME: Parse data
@@ -46,7 +50,7 @@
 
     def values(self, key):
         """Return a dictionary with the values set for a specific key."""
-        data = self.tdb.get("%s/%s" % (REGISTRY_VALUE_PREFIX, key))
+        data = self.tdb.get("%s/%s\x00" % (REGISTRY_VALUE_PREFIX, key))
         if data is None:
             return {}
         # FIXME: Parse data
@@ -55,17 +59,17 @@
 
 class PolicyDatabase:
     def __init__(self, file):
-        self.tdb = tdb.Tdb(file)
-        self.min_password_length = tdb.fetch_uint32("min password length")
-        self.user_must_logon_to_change_password = tdb.fetch_uint32("password history")
-        self.user_must_logon_to_change_password = tdb.fetch_uint32("user must logon to change pasword")
-        self.maximum_password_age = tdb.fetch_uint32("maximum password age")
-        self.minimum_password_age = tdb.fetch_uint32("minimum password age")
-        self.lockout_duration = tdb.fetch_uint32("lockout duration")
-        self.reset_count_minutes = tdb.fetch_uint32("reset count minutes")
-        self.bad_lockout_minutes = tdb.fetch_uint32("bad lockout minutes")
-        self.disconnect_time = tdb.fetch_uint32("disconnect time")
-        self.refuse_machine_password_change = tdb.fetch_uint32("refuse machine password change")
+        self.tdb = tdb.Tdb(file, flags=os.O_RDONLY)
+        self.min_password_length = self.tdb.fetch_uint32("min password length\x00")
+        self.password_history = self.tdb.fetch_uint32("password history\x00")
+        self.user_must_logon_to_change_password = self.tdb.fetch_uint32("user must logon to change pasword\x00")
+        self.maximum_password_age = self.tdb.fetch_uint32("maximum password age\x00")
+        self.minimum_password_age = self.tdb.fetch_uint32("minimum password age\x00")
+        self.lockout_duration = self.tdb.fetch_uint32("lockout duration\x00")
+        self.reset_count_minutes = self.tdb.fetch_uint32("reset count minutes\x00")
+        self.bad_lockout_minutes = self.tdb.fetch_uint32("bad lockout minutes\x00")
+        self.disconnect_time = self.tdb.fetch_int32("disconnect time\x00")
+        self.refuse_machine_password_change = self.tdb.fetch_uint32("refuse machine password change\x00")
 
         # FIXME: Read privileges as well
 
@@ -83,7 +87,7 @@
 
 class GroupMappingDatabase:
     def __init__(self, file): 
-        self.tdb = tdb.Tdb(file)
+        self.tdb = tdb.Tdb(file, flags=os.O_RDONLY)
 
 
 # High water mark keys
@@ -95,13 +99,13 @@
 
 class IdmapDatabase:
     def __init__(self, file):
-        self.tdb = tdb.Tdb(file)
+        self.tdb = tdb.Tdb(file, flags=os.O_RDONLY)
         assert self.tdb.fetch_int32("IDMAP_VERSION") == IDMAP_VERSION
 
 
 class SecretsDatabase:
     def __init__(self, file):
-        self.tdb = tdb.Tdb(file)
+        self.tdb = tdb.Tdb(file, flags=os.O_RDONLY)
         self.domains = {}
         for k, v in self.tdb.items():
             if k == "SECRETS/AUTH_PASSWORD":
@@ -138,7 +142,7 @@
 
 class ShareInfoDatabase:
     def __init__(self, file):
-        self.tdb = tdb.Tdb(file)
+        self.tdb = tdb.Tdb(file, flags=os.O_RDONLY)
         assert self.tdb.fetch_int32("INFO/version") in (SHARE_DATABASE_VERSION_V1, SHARE_DATABASE_VERSION_V2)
 
     def get_secdesc(self, name):
@@ -189,7 +193,7 @@
 
 class TdbSam:
     def __init__(self, file):
-        self.tdb = tdb.Tdb(file)
+        self.tdb = tdb.Tdb(file, flags=os.O_RDONLY)
 
 
 class WinsDatabase:

Modified: branches/SAMBA_4_0/source/scripting/python/samba/tests/samba3.py
===================================================================
--- branches/SAMBA_4_0/source/scripting/python/samba/tests/samba3.py	2007-12-24 11:02:45 UTC (rev 26584)
+++ branches/SAMBA_4_0/source/scripting/python/samba/tests/samba3.py	2007-12-24 11:02:52 UTC (rev 26585)
@@ -22,16 +22,20 @@
 import os
 
 DATADIR=os.path.join(os.path.dirname(__file__), "../../../../../testdata/samba3")
+print "Samba 3 data dir: %s" % DATADIR
 
 class RegistryTestCase(unittest.TestCase):
     def setUp(self):
         self.registry = Registry(os.path.join(DATADIR, "registry.tdb"))
 
+    def tearDown(self):
+        self.registry.close()
+
     def test_length(self):
         self.assertEquals(28, len(self.registry))
 
     def test_keys(self):
-        self.assertEquals([], self.registry.keys())
+        self.assertTrue("HKLM" in self.registry.keys())
 
 
 class PolicyTestCase(unittest.TestCase):
@@ -45,10 +49,10 @@
         self.assertEquals(self.policy.refuse_machine_password_change, 0)
         self.assertEquals(self.policy.reset_count_minutes, 0)
         self.assertEquals(self.policy.disconnect_time, -1)
-        self.assertEquals(self.policy.user_must_logon_to_change_password, 0)
+        self.assertEquals(self.policy.user_must_logon_to_change_password, None)
         self.assertEquals(self.policy.password_history, 0)
         self.assertEquals(self.policy.lockout_duration, 0)
-        self.assertEquals(self.policy.bad_lockout_minutes, 0)
+        self.assertEquals(self.policy.bad_lockout_minutes, None)
 
 
 class GroupsTestCase(unittest.TestCase):



More information about the samba-cvs mailing list