From f6322e4b96c589b968c18953cd454dd12bde2c18 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 21 Nov 2007 11:56:41 +0100 Subject: r26069: Import python bindings for credentials. (This used to be commit 97bb235cc8c2855a0903bbd9dee53f0e03c4adc0) --- source4/auth/credentials/config.mk | 4 ++ source4/auth/credentials/credentials.i | 93 ++++++++++++++++++++++++++++++ source4/auth/credentials/tests/bindings.py | 84 +++++++++++++++++++++++++++ 3 files changed, 181 insertions(+) create mode 100644 source4/auth/credentials/credentials.i create mode 100644 source4/auth/credentials/tests/bindings.py (limited to 'source4/auth') diff --git a/source4/auth/credentials/config.mk b/source4/auth/credentials/config.mk index b35d0ea844..7b091313c9 100644 --- a/source4/auth/credentials/config.mk +++ b/source4/auth/credentials/config.mk @@ -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 index 0000000000..2edda111b4 --- /dev/null +++ b/source4/auth/credentials/credentials.i @@ -0,0 +1,93 @@ +/* + Unix SMB/CIFS implementation. + Copyright (C) Jelmer Vernooij 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 . +*/ + +%module(package="samba.credentials") credentials + +%{ + +/* Include headers */ +#include +#include + +#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 index 0000000000..9bb49a12a5 --- /dev/null +++ b/source4/auth/credentials/tests/bindings.py @@ -0,0 +1,84 @@ +#!/usr/bin/python + +# Unix SMB/CIFS implementation. +# Copyright (C) Jelmer Vernooij 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 . +# + +"""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() -- cgit