diff --git a/README.md b/README.md index aa50ae3..cc4dd94 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,4 @@ # python-pyOpenSSL +Python wrapper around a small subset of the OpenSSL library. Includes: X509 Certificates, SSL Context objects, SSL Connection objects using Python sockets as transport layer. The Connection object wraps all the socket methods and can therefore be used in + diff --git a/python-pyOpenSSL-elinks.patch b/python-pyOpenSSL-elinks.patch new file mode 100644 index 0000000..cdbefab --- /dev/null +++ b/python-pyOpenSSL-elinks.patch @@ -0,0 +1,33 @@ +diff -Nur pyOpenSSL-0.5.1.orig/doc/tools/mkhowto pyOpenSSL-0.5.1/doc/tools/mkhowto +--- pyOpenSSL-0.5.1.orig/doc/tools/mkhowto 2001-07-30 13:31:48.000000000 +0200 ++++ pyOpenSSL-0.5.1/doc/tools/mkhowto 2003-08-08 16:46:10.000000000 +0200 +@@ -56,7 +56,7 @@ + DVIPS_BINARY = "dvips" + LATEX_BINARY = "latex" + LATEX2HTML_BINARY = "latex2html" +-LYNX_BINARY = "lynx" ++LYNX_BINARY = "elinks" + MAKEINDEX_BINARY = "makeindex" + PDFLATEX_BINARY = "pdflatex" + PERL_BINARY = "perl" +@@ -397,7 +397,7 @@ + if tempdir is None: + tempdir = self.doc + indexfile = os.path.join(tempdir, "index.html") +- self.run("%s -nolist -dump %s >%s.txt" ++ self.run("%s -dump %s >%s.txt" + % (LYNX_BINARY, indexfile, self.doc)) + + def require_temps(self, binary=None): +diff -Nur pyOpenSSL-0.5.1.orig/setup.cfg pyOpenSSL-0.5.1/setup.cfg +--- pyOpenSSL-0.5.1.orig/setup.cfg 2002-09-10 00:05:21.000000000 +0200 ++++ pyOpenSSL-0.5.1/setup.cfg 2003-08-08 16:48:34.000000000 +0200 +@@ -4,7 +4,7 @@ + # bdist_rpm settings contributed by Mihai Ibanescu + [bdist_rpm] + release = 1 +-build-requires = lynx openssl-devel python-devel perl tetex-dvips tetex-latex ++build-requires = elinks openssl-devel python-devel perl tetex-dvips tetex-latex + group = Development/Libraries + build_script = rpm/build_script + doc-files = doc/pyOpenSSL.txt doc/pyOpenSSL.ps doc/html diff --git a/python-pyOpenSSL-nopdfout.patch b/python-pyOpenSSL-nopdfout.patch new file mode 100644 index 0000000..0c30083 --- /dev/null +++ b/python-pyOpenSSL-nopdfout.patch @@ -0,0 +1,46 @@ +--- pyOpenSSL-0.6/doc/tools/texinputs/howto.cls.nopdfout 2001-07-16 07:53:03.000000000 -0400 ++++ pyOpenSSL-0.6/doc/tools/texinputs/howto.cls 2005-03-14 20:22:34.745230000 -0500 +@@ -54,10 +54,16 @@ + % changes \\ to ', ' (comma-space), making it pass muster for + % generating document info in the PDF file. + \def\\{, } +- \pdfinfo{ +- /Author (\@author) +- /Title (\@title) +- } ++ \ifx\pdfoutput\relax ++ \else ++ \ifcase\pdfoutput ++ \else ++ \pdfinfo{ ++ /Author (\@author) ++ /Title (\@title) ++ } ++ \fi ++ \fi + }} + \begin{flushright} + {\rm\Huge\py@HeaderFamily \@title} \par +--- pyOpenSSL-0.6/doc/tools/texinputs/manual.cls.nopdfout 2005-03-14 09:32:50.000000000 -0500 ++++ pyOpenSSL-0.6/doc/tools/texinputs/manual.cls 2005-03-14 09:34:20.000000000 -0500 +@@ -69,10 +69,16 @@ + % changes \\ to ', ' (comma-space), making it pass muster for + % generating document info in the PDF file. + \def\\{, } +- \pdfinfo{ +- /Author (\@author) +- /Title (\@title) +- } ++ \ifx\pdfoutput\relax ++ \else ++ \ifcase\pdfoutput ++ \else ++ \pdfinfo{% ++ /Author (\@author) ++ /Title (\@title) ++ } ++ \fi ++ \fi + }} + \begin{flushright}% + {\rm\Huge\py@HeaderFamily \@title \par}% diff --git a/python-pyOpenSSL-threadsafe.patch b/python-pyOpenSSL-threadsafe.patch new file mode 100644 index 0000000..ad56567 --- /dev/null +++ b/python-pyOpenSSL-threadsafe.patch @@ -0,0 +1,197 @@ +diff -Nur pyOpenSSL-0.7-bad/src/crypto/crypto.c pyOpenSSL-0.7/src/crypto/crypto.c +--- pyOpenSSL-0.7-bad/src/crypto/crypto.c 2008-03-21 17:34:42.000000000 -0500 ++++ pyOpenSSL-0.7/src/crypto/crypto.c 2008-09-19 18:06:08.000000000 -0500 +@@ -694,6 +694,74 @@ + { NULL, NULL } + }; + ++ ++#ifdef WITH_THREAD ++ ++#include ++ ++#define MUTEX_TYPE pthread_mutex_t ++#define MUTEX_SETUP(x) pthread_mutex_init(&(x), NULL) ++#define MUTEX_CLEANUP(x) pthread_mutex_destroy(&(x)) ++#define MUTEX_LOCK(x) pthread_mutex_lock(&(x)) ++#define MUTEX_UNLOCK(x) pthread_mutex_unlock(&(x)) ++#define THREAD_ID pthread_self() ++ ++void handle_error(const char *file, int lineno, const char *msg) ++{ ++ fprintf(stderr, "** %s:%i %s\n", file, lineno, msg); ++ ERR_print_errors_fp(stderr); ++} ++ ++ ++/* This array will store all of the mutexes available to OpenSSL. */ ++static MUTEX_TYPE *mutex_buf = NULL; ++ ++ ++static void locking_function(int mode, int n, const char * file, int line) ++{ ++ if (mode & CRYPTO_LOCK) ++ MUTEX_LOCK(mutex_buf[n]); ++ else ++ MUTEX_UNLOCK(mutex_buf[n]); ++} ++ ++static unsigned long id_function(void) ++{ ++ return ((unsigned long)THREAD_ID); ++} ++ ++int init_openssl_threads(void) ++{ ++ int i; ++ ++ mutex_buf = (MUTEX_TYPE *)malloc(CRYPTO_num_locks() * sizeof(MUTEX_TYPE)); ++ if (!mutex_buf) ++ return 0; ++ for (i = 0; i < CRYPTO_num_locks(); i++) ++ MUTEX_SETUP(mutex_buf[i]); ++ CRYPTO_set_id_callback(id_function); ++ CRYPTO_set_locking_callback(locking_function); ++ return 1; ++} ++ ++int deinit_openssl_threads(void) ++{ ++ int i; ++ ++ if (!mutex_buf) ++ return 0; ++ CRYPTO_set_id_callback(NULL); ++ CRYPTO_set_locking_callback(NULL); ++ for (i = 0; i < CRYPTO_num_locks(); i++) ++ MUTEX_CLEANUP(mutex_buf[i]); ++ free(mutex_buf); ++ mutex_buf = NULL; ++ return 1; ++} ++ ++#endif ++ ++ + /* + * Initialize crypto sub module + * +@@ -739,6 +807,10 @@ + PyModule_AddIntConstant(module, "TYPE_DSA", crypto_TYPE_DSA); + + dict = PyModule_GetDict(module); ++#ifdef WITH_THREAD ++ if (!init_openssl_threads()) ++ goto error; ++#endif + if (!init_crypto_x509(dict)) + goto error; + if (!init_crypto_x509name(dict)) +diff -Nur pyOpenSSL-0.7-bad/src/ssl/context.c pyOpenSSL-0.7/src/ssl/context.c +--- pyOpenSSL-0.7-bad/src/ssl/context.c 2008-03-21 17:34:42.000000000 -0500 ++++ pyOpenSSL-0.7/src/ssl/context.c 2008-09-19 18:27:00.000000000 -0500 +@@ -64,39 +64,33 @@ + static int + global_passphrase_callback(char *buf, int maxlen, int verify, void *arg) + { +- int len; ++ int len = 0; + char *str; + PyObject *argv, *ret = NULL; + ssl_ContextObj *ctx = (ssl_ContextObj *)arg; + ++ if (!ctx->tstate) ++ fprintf (stderr, "ERROR: ctx->tstate == NULL!\n"); ++ MY_END_ALLOW_THREADS(ctx->tstate); ++ + /* The Python callback is called with a (maxlen,verify,userdata) tuple */ + argv = Py_BuildValue("(iiO)", maxlen, verify, ctx->passphrase_userdata); +- if (ctx->tstate != NULL) +- { +- /* We need to get back our thread state before calling the callback */ +- MY_END_ALLOW_THREADS(ctx->tstate); +- ret = PyEval_CallObject(ctx->passphrase_callback, argv); +- MY_BEGIN_ALLOW_THREADS(ctx->tstate); +- } +- else +- { +- ret = PyEval_CallObject(ctx->passphrase_callback, argv); +- } ++ ret = PyEval_CallObject(ctx->passphrase_callback, argv); + Py_DECREF(argv); + + if (ret == NULL) +- return 0; ++ goto out; + + if (!PyObject_IsTrue(ret)) + { + Py_DECREF(ret); +- return 0; ++ goto out; + } + + if (!PyString_Check(ret)) + { + Py_DECREF(ret); +- return 0; ++ goto out; + } + + len = PyString_Size(ret); +@@ -107,6 +101,8 @@ + strncpy(buf, str, len); + Py_XDECREF(ret); + ++out: ++ MY_BEGIN_ALLOW_THREADS(ctx->tstate); + return len; + } + +@@ -173,28 +169,19 @@ + ssl_ConnectionObj *conn = (ssl_ConnectionObj *)SSL_get_app_data(ssl); + PyObject *argv, *ret; + ++ if (!conn->tstate) ++ fprintf (stderr, "ERROR: ctx->tstate == NULL!\n"); ++ MY_END_ALLOW_THREADS(conn->tstate); ++ + argv = Py_BuildValue("(Oii)", (PyObject *)conn, where, _ret); +- if (conn->tstate != NULL) +- { +- /* We need to get back our thread state before calling the callback */ +- MY_END_ALLOW_THREADS(conn->tstate); +- ret = PyEval_CallObject(conn->context->info_callback, argv); +- if (ret == NULL) +- PyErr_Clear(); +- else +- Py_DECREF(ret); +- MY_BEGIN_ALLOW_THREADS(conn->tstate); +- } ++ ret = PyEval_CallObject(conn->context->info_callback, argv); ++ if (ret == NULL) ++ PyErr_Clear(); + else +- { +- ret = PyEval_CallObject(conn->context->info_callback, argv); +- if (ret == NULL) +- PyErr_Clear(); +- else +- Py_DECREF(ret); +- } ++ Py_DECREF(ret); + Py_DECREF(argv); + ++ MY_BEGIN_ALLOW_THREADS(conn->tstate); + return; + } + +@@ -447,6 +434,8 @@ + if (!PyArg_ParseTuple(args, "s|i:use_privatekey_file", &keyfile, &filetype)) + return NULL; + ++ if (self->tstate) ++ fprintf (stderr, "ERROR: ctx->tstate != NULL!\n"); + MY_BEGIN_ALLOW_THREADS(self->tstate); + ret = SSL_CTX_use_PrivateKey_file(self->ctx, keyfile, filetype); + MY_END_ALLOW_THREADS(self->tstate); diff --git a/python-pyOpenSSL.spec b/python-pyOpenSSL.spec new file mode 100644 index 0000000..b6779fc --- /dev/null +++ b/python-pyOpenSSL.spec @@ -0,0 +1,80 @@ +Name: python-pyOpenSSL +Version: 0.9 +Release: 2mamba +Summary: Python interface to the OpenSSL library +Group: System/Libraries/Python +Vendor: openmamba +Distribution: openmamba +Packager: Automatic Build System +URL: http://pyopenssl.sourceforge.net/ +Source: http://downloads.sourceforge.net/pyopenssl/pyOpenSSL-%{version}.tar.gz +Patch0: python-pyOpenSSLL-0.7-openssl.patch +Patch1: python-pyOpenSSL-elinks.patch +Patch2: python-pyOpenSSL-nopdfout.patch +Patch3: python-pyOpenSSL-threadsafe.patch +License: LGPL +## AUTOBUILDREQ-BEGIN +BuildRequires: glibc-devel +BuildRequires: libopenssl-devel +BuildRequires: libpython-devel +## AUTOBUILDREQ-END +BuildRequires: elinks +BuildRequires: tetex-dvips +BuildRequires: tetex-latex +BuildRequires: latex2html +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +%description +Python wrapper around a small subset of the OpenSSL library. Includes: X509 Certificates, SSL Context objects, SSL Connection objects using Python sockets as transport layer. The Connection object wraps all the socket methods and can therefore be used in + +%prep +%setup -q -n pyOpenSSL-%{version} +%patch0 -p1 -b .openssl097 +%patch1 -p1 -b .elinks +%patch2 -p1 -b .nopdfout +#%patch3 -p1 -b .threadsafe + +# Fix permissions for debuginfo package +%{__chmod} -x src/ssl/connection.c + +%build +CFLAGS="%{optflags}" %{__python} setup.py build +##sed -i "s|python|python2.6|" doc/Makefile +%make -C doc ps +%make -C doc text +#html +%install +[ "%{buildroot}" != / ] && rm -rf "%{buildroot}" +%{__python} setup.py install \ + --root="%{buildroot}" \ + --install-headers=%{_includedir}/python \ + --install-lib=%{python_sitearch} + +%clean +[ "%{buildroot}" != / ] && rm -rf "%{buildroot}" + +%files +%defattr(-,root,root) +%{python_sitearch}/pyOpenSSL-%{version}-py%{python_version}.egg-info +%dir %{python_sitearch}/OpenSSL +%{python_sitearch}/OpenSSL/*.so +%{python_sitearch}/OpenSSL/*.py +%{python_sitearch}/OpenSSL/*.pyc +%dir %{python_sitearch}/OpenSSL/test +%{python_sitearch}/OpenSSL/test/*.py +%{python_sitearch}/OpenSSL/test/*.pyc +%doc README doc/pyOpenSSL.ps +#%doc doc/pyOpenSSL.txt + +%changelog +* Sat Jun 01 2013 Silvan Calarco 0.9-2mamba +- python 2.7 mass rebuild + +* Fri Jul 10 2009 Automatic Build System 0.9-1mamba +- automatic update by autodist + +* Mon Dec 29 2008 gil 0.8-2mamba +- rebuilt with python 2.6 + +* Tue Nov 18 2008 gil 0.8-1mamba +- package created by autospec diff --git a/python-pyOpenSSLL-0.7-openssl.patch b/python-pyOpenSSLL-0.7-openssl.patch new file mode 100644 index 0000000..e9b55b9 --- /dev/null +++ b/python-pyOpenSSLL-0.7-openssl.patch @@ -0,0 +1,12 @@ +--- pyOpenSSL-0.7/setup.py 2008-04-11 16:53:24.000000000 +0100 ++++ pyOpenSSL-0.7/setup-new.py 2008-09-15 23:46:19.000000000 +0100 +@@ -64,6 +64,9 @@ + if sys.platform == 'darwin': + IncludeDirs = ['/sw/include'] + LibraryDirs = ['/sw/lib'] ++elif os.name == 'posix': ++ IncludeDirs = ['/usr/kerberos/include'] ++ LibraryDirs = ['/usr/kerberos/lib'] + + def mkExtension(name): + modname = 'OpenSSL.' + name