Commit 2638d8ba authored by ale's avatar ale

Update Python build

First steps towards Python 3 compatibility.
parent 602a0a64
# ===========================================================================
# http://www.gnu.org/software/autoconf-archive/ax_python_devel.html
# https://www.gnu.org/software/autoconf-archive/ax_python_devel.html
# ===========================================================================
#
# SYNOPSIS
......@@ -12,8 +12,8 @@
# in your configure.ac.
#
# This macro checks for Python and tries to get the include path to
# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LDFLAGS)
# output variables. It also exports $(PYTHON_EXTRA_LIBS) and
# 'Python.h'. It provides the $(PYTHON_CPPFLAGS) and $(PYTHON_LIBS) output
# variables. It also exports $(PYTHON_EXTRA_LIBS) and
# $(PYTHON_EXTRA_LDFLAGS) for embedding Python in your code.
#
# You can search for some particular version of Python by passing a
......@@ -34,11 +34,12 @@
# LICENSE
#
# Copyright (c) 2009 Sebastian Huber <sebastian-huber@web.de>
# Copyright (c) 2009 Alan W. Irwin <irwin@beluga.phys.uvic.ca>
# Copyright (c) 2009 Alan W. Irwin
# Copyright (c) 2009 Rafael Laboissiere <rafael@laboissiere.net>
# Copyright (c) 2009 Andrew Collier <colliera@ukzn.ac.za>
# Copyright (c) 2009 Andrew Collier
# Copyright (c) 2009 Matteo Settenvini <matteo@member.fsf.org>
# Copyright (c) 2009 Horst Knorr <hk_classes@knoda.org>
# Copyright (c) 2013 Daniel Mullner <muellner@math.stanford.edu>
#
# 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
......@@ -51,7 +52,7 @@
# 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/>.
# with this program. If not, see <https://www.gnu.org/licenses/>.
#
# As a special exception, the respective Autoconf Macro's copyright owner
# gives unlimited permission to copy, distribute and modify the configure
......@@ -66,7 +67,7 @@
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
#serial 8
#serial 21
AU_ALIAS([AC_PYTHON_DEVEL], [AX_PYTHON_DEVEL])
AC_DEFUN([AX_PYTHON_DEVEL],[
......@@ -98,7 +99,7 @@ AC_DEFUN([AX_PYTHON_DEVEL],[
This version of the AC@&t@_PYTHON_DEVEL macro
doesn't work properly with versions of Python before
2.1.0. You may need to re-run configure, setting the
variables PYTHON_CPPFLAGS, PYTHON_LDFLAGS, PYTHON_SITE_PKG,
variables PYTHON_CPPFLAGS, PYTHON_LIBS, PYTHON_SITE_PKG,
PYTHON_EXTRA_LIBS and PYTHON_EXTRA_LDFLAGS by hand.
Moreover, to disable this check, set PYTHON_NOVERSIONCHECK
to something else than an empty string.
......@@ -136,7 +137,7 @@ variable to configure. See ``configure --help'' for reference.
#
AC_MSG_CHECKING([for the distutils Python package])
ac_distutils_result=`$PYTHON -c "import distutils" 2>&1`
if test -z "$ac_distutils_result"; then
if test $? -eq 0; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
......@@ -153,8 +154,14 @@ $ac_distutils_result])
if test -z "$PYTHON_CPPFLAGS"; then
python_path=`$PYTHON -c "import distutils.sysconfig; \
print (distutils.sysconfig.get_python_inc ());"`
plat_python_path=`$PYTHON -c "import distutils.sysconfig; \
print (distutils.sysconfig.get_python_inc (plat_specific=1));"`
if test -n "${python_path}"; then
python_path="-I$python_path"
if test "${plat_python_path}" != "${python_path}"; then
python_path="-I$python_path -I$plat_python_path"
else
python_path="-I$python_path"
fi
fi
PYTHON_CPPFLAGS=$python_path
fi
......@@ -165,7 +172,7 @@ $ac_distutils_result])
# Check for Python library path
#
AC_MSG_CHECKING([for Python library path])
if test -z "$PYTHON_LDFLAGS"; then
if test -z "$PYTHON_LIBS"; then
# (makes two attempts to ensure we've got a version number
# from the interpreter)
ac_python_version=`cat<<EOD | $PYTHON -
......@@ -173,11 +180,9 @@ $ac_distutils_result])
# join all versioning strings, on some systems
# major/minor numbers could be in different list elements
from distutils.sysconfig import *
ret = ''
for e in get_config_vars ('VERSION'):
if (e != None):
ret += e
print (ret)
e = get_config_var('VERSION')
if e is not None:
print(e)
EOD`
if test -z "$ac_python_version"; then
......@@ -198,55 +203,49 @@ EOD`
# There should be only one
import distutils.sysconfig
for e in distutils.sysconfig.get_config_vars ('LIBDIR'):
if e != None:
print (e)
break
e = distutils.sysconfig.get_config_var('LIBDIR')
if e is not None:
print (e)
EOD`
# Before checking for libpythonX.Y, we need to know
# the extension the OS we're on uses for libraries
# (we take the first one, if there's more than one fix me!):
ac_python_soext=`$PYTHON -c \
"import distutils.sysconfig; \
print (distutils.sysconfig.get_config_vars('SO')[[0]])"`
# Now, for the library:
ac_python_soname=`$PYTHON -c \
"import distutils.sysconfig; \
print (distutils.sysconfig.get_config_vars('LDLIBRARY')[[0]])"`
ac_python_library=`cat<<EOD | $PYTHON -
# Strip away extension from the end to canonicalize its name:
ac_python_library=`echo "$ac_python_soname" | sed "s/${ac_python_soext}$//"`
import distutils.sysconfig
c = distutils.sysconfig.get_config_vars()
if 'LDVERSION' in c:
print ('python'+c[['LDVERSION']])
else:
print ('python'+c[['VERSION']])
EOD`
# This small piece shamelessly adapted from PostgreSQL python macro;
# credits goes to momjian, I think. I'd like to put the right name
# in the credits, if someone can point me in the right direction... ?
#
if test -n "$ac_python_libdir" -a -n "$ac_python_library" \
-a x"$ac_python_library" != x"$ac_python_soname"
if test -n "$ac_python_libdir" -a -n "$ac_python_library"
then
# use the official shared library
ac_python_library=`echo "$ac_python_library" | sed "s/^lib//"`
PYTHON_LDFLAGS="-L$ac_python_libdir -l$ac_python_library"
PYTHON_LIBS="-L$ac_python_libdir -l$ac_python_library"
else
# old way: use libpython from python_configdir
ac_python_libdir=`$PYTHON -c \
"from distutils.sysconfig import get_python_lib as f; \
import os; \
print (os.path.join(f(plat_specific=1, standard_lib=1), 'config'));"`
PYTHON_LDFLAGS="-L$ac_python_libdir -lpython$ac_python_version"
PYTHON_LIBS="-L$ac_python_libdir -lpython$ac_python_version"
fi
if test -z "PYTHON_LDFLAGS"; then
if test -z "PYTHON_LIBS"; then
AC_MSG_ERROR([
Cannot determine location of your Python DSO. Please check it was installed with
dynamic libraries enabled, or try setting PYTHON_LDFLAGS by hand.
dynamic libraries enabled, or try setting PYTHON_LIBS by hand.
])
fi
fi
AC_MSG_RESULT([$PYTHON_LDFLAGS])
AC_SUBST([PYTHON_LDFLAGS])
AC_MSG_RESULT([$PYTHON_LIBS])
AC_SUBST([PYTHON_LIBS])
#
# Check for site packages
......@@ -266,7 +265,7 @@ EOD`
if test -z "$PYTHON_EXTRA_LIBS"; then
PYTHON_EXTRA_LIBS=`$PYTHON -c "import distutils.sysconfig; \
conf = distutils.sysconfig.get_config_var; \
print (conf('LOCALMODLIBS') + ' ' + conf('LIBS'))"`
print (conf('LIBS') + ' ' + conf('SYSLIBS'))"`
fi
AC_MSG_RESULT([$PYTHON_EXTRA_LIBS])
AC_SUBST(PYTHON_EXTRA_LIBS)
......@@ -289,8 +288,10 @@ EOD`
AC_MSG_CHECKING([consistency of all components of python development environment])
# save current global flags
ac_save_LIBS="$LIBS"
ac_save_LDFLAGS="$LDFLAGS"
ac_save_CPPFLAGS="$CPPFLAGS"
LIBS="$ac_save_LIBS $PYTHON_LDFLAGS $PYTHON_EXTRA_LDFLAGS $PYTHON_EXTRA_LIBS"
LIBS="$ac_save_LIBS $PYTHON_LIBS $PYTHON_EXTRA_LIBS $PYTHON_EXTRA_LIBS"
LDFLAGS="$ac_save_LDFLAGS $PYTHON_EXTRA_LDFLAGS"
CPPFLAGS="$ac_save_CPPFLAGS $PYTHON_CPPFLAGS"
AC_LANG_PUSH([C])
AC_LINK_IFELSE([
......@@ -301,6 +302,7 @@ EOD`
# turn back to default flags
CPPFLAGS="$ac_save_CPPFLAGS"
LIBS="$ac_save_LIBS"
LDFLAGS="$ac_save_LDFLAGS"
AC_MSG_RESULT([$pythonexists])
......@@ -308,8 +310,8 @@ EOD`
AC_MSG_FAILURE([
Could not link test program to Python. Maybe the main Python library has been
installed in some non-standard library path. If so, pass it to configure,
via the LDFLAGS environment variable.
Example: ./configure LDFLAGS="-L/usr/non-standard-path/python/lib"
via the LIBS environment variable.
Example: ./configure LIBS="-L/usr/non-standard-path/python/lib"
============================================================================
ERROR!
You probably have to install the development version of the Python package
......
......@@ -18,7 +18,7 @@ check-local:
nosetests -v
clean-local:
-rm -f sso/sso_c.py sso/sso_wrap.cpp sso/_sso_c.so
-rm -f sso/sso_c.py sso/sso_wrap.cpp $(wildcard sso/_sso_c.*so)
$(PYTHON_SETUP_PY) clean --all
install-exec-local:
......
......@@ -22,14 +22,14 @@ if not os.getenv('BUILD_MODULE'):
# Run the build_ext command first (swig generates a Python file).
class build_py(_build_py):
def run(self):
self.run_command("build_ext")
self.run_command('build_ext')
return _build_py.run(self)
setup(name='sso',
cmdclass={'build_py': build_py},
ext_modules=[Extension('sso._sso_c', ext_sources,
swig_opts=['-c++', '-modern', '-I' + top_srcdir],
swig_opts=['-modern', '-I' + top_srcdir, '-py3'],
include_dirs=[top_srcdir],
libraries=libraries,
library_dirs=[SSO_LIB_DIR],
......
_sso_c.so
sso_c.py
sso_wrap.cpp
sso_wrap.c
#from sso_c import generate_keys, read_key_from_file, groups_overlap, Signer, Verifier, Ticket
from sso_c import sso_generate_keys as generate_keys
from sso_c import sso_ticket_new, sso_ticket_free, \
# Python 3 compatibility for basestring check as used in isinstance() below.
try:
basestring
except NameError:
basestring = (str, bytes)
from .sso_c import sso_generate_keys as generate_keys
from .sso_c import sso_ticket_new, sso_ticket_free, \
sso_ticket_sign, sso_ticket_open, sso_strerror, \
sso_validate
......@@ -28,7 +32,8 @@ class Ticket(object):
self._tkt = tkt_or_user
def __del__(self):
sso_ticket_free(self._tkt)
if hasattr(self, '_tkt'):
sso_ticket_free(self._tkt)
def __eq__(self, t2):
return (self.user() == t2.user() and
......
......@@ -11,9 +11,9 @@ class SignerTest(unittest.TestCase):
def _signok(self, tkt):
signed = self.s.sign(tkt)
self.assertTrue(isinstance(signed, basestring))
self.assertTrue(signed != '')
self.assertTrue('user' in base64.urlsafe_b64decode(signed))
self.assertTrue(isinstance(signed, bytes))
self.assertGreater(len(signed), 0)
#self.assertTrue('user' in base64.urlsafe_b64decode(signed))
def test_sign_ticket(self):
self._signok(sso.Ticket('user', 'service', 'domain'))
......
from __future__ import print_function
import base64
import unittest
import sso
......@@ -27,7 +29,7 @@ class VerifierTest(unittest.TestCase):
tkt = sso.Ticket('user', 'service/', 'domain', groups=set(['group1']))
signed = self._sign_token(tkt)
print 'signed:', signed
print('signed:', signed)
v = sso.Verifier(self.public, 'service/', 'domain', self.groups)
tkt2 = v.verify(signed)
......@@ -61,8 +63,8 @@ class VerifierTest(unittest.TestCase):
class KnownDataVerifierTest(unittest.TestCase):
def setUp(self):
self.secret = '\xd0\xd8\xe3v\x04\x91_v\x9f\x9e\xa3\xbb\xe2wd\x07\x89\xe4\xcc\x9a}\x11\xdd\xe8\xd6\xf2\xe3^\xa7\x03\xbe\x82\xc0\xda\xdb\xb4\x83v[\x05]O\x9f\xf5UM\x92\xb3\xedzC?\x15\xf4\xd8\xeb\xab\xbb\xd0rQ\x0b\xfe#'
self.public = '\xc0\xda\xdb\xb4\x83v[\x05]O\x9f\xf5UM\x92\xb3\xedzC?\x15\xf4\xd8\xeb\xab\xbb\xd0rQ\x0b\xfe#'
self.secret = b'\xd0\xd8\xe3v\x04\x91_v\x9f\x9e\xa3\xbb\xe2wd\x07\x89\xe4\xcc\x9a}\x11\xdd\xe8\xd6\xf2\xe3^\xa7\x03\xbe\x82\xc0\xda\xdb\xb4\x83v[\x05]O\x9f\xf5UM\x92\xb3\xedzC?\x15\xf4\xd8\xeb\xab\xbb\xd0rQ\x0b\xfe#'
self.public = b'\xc0\xda\xdb\xb4\x83v[\x05]O\x9f\xf5UM\x92\xb3\xedzC?\x15\xf4\xd8\xeb\xab\xbb\xd0rQ\x0b\xfe#'
self.signer = sso.Signer(self.secret)
self.verifier = sso.Verifier(self.public, 'service/', 'sso.net')
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment