r26069: Import python bindings for credentials.
authorJelmer Vernooij <jelmer@samba.org>
Wed, 21 Nov 2007 10:56:41 +0000 (11:56 +0100)
committerStefan Metzmacher <metze@samba.org>
Fri, 21 Dec 2007 04:45:52 +0000 (05:45 +0100)
(This used to be commit 97bb235cc8c2855a0903bbd9dee53f0e03c4adc0)

.bzrignore
source4/auth/credentials/config.mk
source4/auth/credentials/credentials.i [new file with mode: 0644]
source4/auth/credentials/tests/bindings.py [new file with mode: 0644]
source4/selftest/samba4_tests.sh

index c9ad12a6359270061a539446394afd4967381f96..38606678fb9ae228373334153e3f3e9c840c9423 100644 (file)
@@ -207,3 +207,4 @@ source/lib/ldb/tdbtest.ldb
 *.po
 libtdb.so.*
 libtalloc.so.*
+source/auth/credentials/credentials.py
index b35d0ea84420a7b6e02643f941cb539999f62316..7b091313c9c4c137f297ffaca50704ed916ac244 100644 (file)
@@ -22,3 +22,7 @@ PUBLIC_DEPENDENCIES = \
                HEIMDAL_GSSAPI 
 # End SUBSYSTEM CREDENTIALS
 #################################
+
+[PYTHON::swig_credentials]
+PUBLIC_DEPENDENCIES = CREDENTIALS LIBPYTHON
+SWIG_FILE = credentials.i
diff --git a/source4/auth/credentials/credentials.i b/source4/auth/credentials/credentials.i
new file mode 100644 (file)
index 0000000..2edda11
--- /dev/null
@@ -0,0 +1,93 @@
+/* 
+   Unix SMB/CIFS implementation.
+   Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
+   
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+   
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+   
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+%module(package="samba.credentials") credentials
+
+%{
+
+/* Include headers */
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "includes.h"
+#include "auth/credentials/credentials.h"
+typedef struct cli_credentials cli_credentials;
+%}
+
+%include "carrays.i"
+%include "typemaps.i"
+
+%typemap(default) struct cli_credentials * {
+    $1 = NULL;
+}
+
+%{
+#include "librpc/gen_ndr/samr.h" /* for struct samr_Password */
+%}
+
+%typemap(out) struct samr_Password * {
+    $result = PyString_FromStringAndSize($1->hash, 16);
+}
+
+%rename(Credentials) cli_credentials;
+typedef struct cli_credentials {
+    %extend {
+        cli_credentials() {
+            return cli_credentials_init(NULL);
+        }
+        ~cli_credentials() {
+            talloc_free($self);
+        }
+        /* username */
+        const char *get_username(void);
+        bool set_username(const char *value, 
+                          enum credentials_obtained=CRED_SPECIFIED);
+
+        /* password */
+        const char *get_password(void);
+        bool set_password(const char *val, 
+                          enum credentials_obtained=CRED_SPECIFIED);
+
+        /* domain */
+        const char *get_domain(void);
+        bool set_domain(const char *val, 
+                        enum credentials_obtained=CRED_SPECIFIED);
+
+        /* realm */
+        const char *get_realm(void);
+        bool set_realm(const char *val, 
+                       enum credentials_obtained=CRED_SPECIFIED);
+
+        void parse_string(const char *text,
+                       enum credentials_obtained=CRED_SPECIFIED);
+
+        /* bind dn */
+        const char *get_bind_dn(void);
+        bool set_bind_dn(const char *bind_dn);
+
+        /* workstation name */
+        const char *get_workstation(void);
+        bool set_workstation(const char *workstation, 
+                             enum credentials_obtained obtained=CRED_SPECIFIED);
+
+        void guess(void);
+        bool is_anonymous(void);
+
+        const struct samr_Password *get_nt_hash(TALLOC_CTX *mem_ctx);
+    }
+} cli_credentials;
diff --git a/source4/auth/credentials/tests/bindings.py b/source4/auth/credentials/tests/bindings.py
new file mode 100644 (file)
index 0000000..9bb49a1
--- /dev/null
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+
+# Unix SMB/CIFS implementation.
+# Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
+#   
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#   
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#   
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+
+"""Tests for the Credentials Python bindings. 
+
+Note that this just tests the bindings work. It does not intend to test 
+the functionality, that's already done in other tests.
+"""
+
+import unittest
+import credentials
+
+class CredentialsTests(unittest.TestCase):
+    def setUp(self):
+        self.creds = credentials.Credentials()
+
+    def test_set_username(self):
+        self.creds.set_username("somebody")
+        self.assertEquals("somebody", self.creds.get_username())
+
+    def test_set_password(self):
+        self.creds.set_password("S3CreT")
+        self.assertEquals("S3CreT", self.creds.get_password())
+
+    def test_set_domain(self):
+        self.creds.set_domain("ABMAS")
+        self.assertEquals("ABMAS", self.creds.get_domain())
+
+    def test_set_realm(self):
+        self.creds.set_realm("myrealm")
+        self.assertEquals("MYREALM", self.creds.get_realm())
+
+    def test_parse_string_anon(self):
+        self.creds.parse_string("%")
+        self.assertEquals("", self.creds.get_username())
+        self.assertEquals(None, self.creds.get_password())
+
+    def test_parse_string_user_pw_domain(self):
+        self.creds.parse_string("dom\\someone%secr")
+        self.assertEquals("someone", self.creds.get_username())
+        self.assertEquals("secr", self.creds.get_password())
+        self.assertEquals("DOM", self.creds.get_domain())
+
+    def test_bind_dn(self):
+        self.assertEquals(None, self.creds.get_bind_dn())
+        self.creds.set_bind_dn("dc=foo,cn=bar")
+        self.assertEquals("dc=foo,cn=bar", self.creds.get_bind_dn())
+
+    def test_is_anon(self):
+        self.creds.set_username("")
+        self.assertTrue(self.creds.is_anonymous())
+        self.creds.set_username("somebody")
+        self.assertFalse(self.creds.is_anonymous())
+
+    def test_workstation(self):
+        # FIXME: This is uninitialised, it should be None
+        #self.assertEquals(None, self.creds.get_workstation())
+        self.creds.set_workstation("myworksta")
+        self.assertEquals("myworksta", self.creds.get_workstation())
+
+    def test_get_nt_hash(self):
+        self.creds.set_password("geheim")
+        self.assertEquals('\xc2\xae\x1f\xe6\xe6H\x84cRE>\x81o*\xeb\x93', 
+                          self.creds.get_nt_hash())
+
+    def test_guess(self):
+        # Just check the method is there and doesn't raise an exception
+        self.creds.guess()
index 155a8be7a4449a8f93e73edfd6c029262c23725b..a4d2bb2e29cf6e5cae9d71697f92e9b95251de1d 100755 (executable)
@@ -295,4 +295,5 @@ fi
 if which trial 2>/dev/null >/dev/null
 then
        plantest "ldb.python" none PYTHONPATH=bin/python trial lib/ldb/tests/python/api.py
+       plantest "credentials.python" none PYTHONPATH=bin/python trial auth/credentials/tests/bindings.py
 fi