From b489b4350b126c9373308e68d9c98d4b7bae4f9c Mon Sep 17 00:00:00 2001 From: Jake Bell Date: Tue, 4 Feb 2020 18:37:47 -0600 Subject: [PATCH] Fixing temporary file creation for Windows --- src/saml2/sigver.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/saml2/sigver.py b/src/saml2/sigver.py index 58e0ce83f..ea691077e 100644 --- a/src/saml2/sigver.py +++ b/src/saml2/sigver.py @@ -9,6 +9,7 @@ import logging import os import six +import sys from time import mktime @@ -17,7 +18,8 @@ import saml2.cryptography.asymmetric import saml2.cryptography.pki -from tempfile import NamedTemporaryFile +from tempfile import NamedTemporaryFile, gettempdir +from uuid import uuid4 from subprocess import Popen from subprocess import PIPE @@ -341,12 +343,21 @@ def make_temp(content, suffix="", decode=True, delete_tmpfiles=True): content.encode("utf-8") if not isinstance(content, six.binary_type) else content ) content_raw = base64.b64decode(content_encoded) if decode else content_encoded - ntf = NamedTemporaryFile(suffix=suffix, delete=delete_tmpfiles) + ntf = _make_temp(suffix=suffix, delete_tmpfiles=delete_tmpfiles) ntf.write(content_raw) ntf.seek(0) return ntf +def _make_temp(suffix="", delete_tmpfiles=True): + # `NamedTemporaryFile` is not very reliable on Windows, so we'll make a + # tempfile a different way. + if sys.platform == 'win32': + return open(os.path.join(gettempdir(), '%s.%s' % (uuid4(), suffix)), 'w+b') + else: + return NamedTemporaryFile(suffix=suffix, delete=delete_tmpfiles) + + def split_len(seq, length): return [seq[i:i + length] for i in range(0, len(seq), length)] @@ -888,7 +899,7 @@ def _run_xmlsec(self, com_list, extra_args): key-value parameters :result: Whatever xmlsec wrote to an --output temporary file """ - with NamedTemporaryFile(suffix='.xml') as ntf: + with _make_temp(suffix='.xml') as ntf: com_list.extend(['--output', ntf.name]) com_list += extra_args