Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Windows Support #177

Merged
merged 3 commits into from
Jul 16, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 49 additions & 15 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,25 @@ stages:
if: tag is PRESENT

script:
- if [[ "$TRAVIS_OS_NAME" != "osx" ]]; then sudo sed -i '1i 127.0.0.1 test.box' /etc/hosts; fi
- if [[ "$TRAVIS_OS_NAME" != "osx" ]]; then sudo hostname test.box; fi
- if [[ "$TRAVIS_OS_NAME" != "osx" ]]; then source ./.travis/lib-util.sh; fi
- if [[ "$TRAVIS_OS_NAME" != "osx" ]]; then util::docker-run $DISTRO ./.travis/build.sh; fi
- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then ./.travis/build.sh; fi
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then
sudo sed -i '1i 127.0.0.1 test.box' /etc/hosts;
sudo hostname test.box;
source ./.travis/lib-util.sh;
util::docker-run $DISTRO ./.travis/build.sh;
fi
- if [[ "$TRAVIS_OS_NAME" != "linux" ]]; then ./.travis/build.sh; fi

jobs:
include:
- stage: verify
- &docker_verify
stage: verify
env: DISTRO=fedora:latest PYTHON="2"
script:
- source ./.travis/lib-util.sh
- util::docker-run $DISTRO ./.travis/verify.sh

- stage: verify
- <<: *docker_verify
env: DISTRO=fedora:latest PYTHON="3"
script:
- source ./.travis/lib-util.sh
- util::docker-run $DISTRO ./.travis/verify.sh


# need to explictly define each builder for test due to different os types
Expand All @@ -59,17 +59,27 @@ jobs:
- stage: test
env: DISTRO=fedora:latest PYTHON="2"

- stage: test
- &osx_test
stage: test
env: PYTHON="2" KRB5_VER="heimdal" PYENV="2.7.14"
os: osx
osx_image: xcode9.2
language: generic # causes issues with pyenv installer when set to python

- stage: test
- <<: *osx_test
env: PYTHON="3" KRB5_VER="heimdal" PYENV="3.6.3"
os: osx
osx_image: xcode9.2
language: generic # causes issues with pyenv installer when set to python

- &win_test
stage: test
env: PYTHON="2" PYENV="2.7.16" EXTRA_BUILDEXT="--compiler=mingw32"
os: windows
language: sh # Windows not supported yet

- <<: *win_test
env: PYTHON="3" PYENV="3.6.8"

- <<: *win_test
env: PYTHON="3" PYENV="3.7.3"


- stage: deploy latest docs
Expand Down Expand Up @@ -129,3 +139,27 @@ jobs:
skip_cleanup: true
on:
all_branches: true

- &win_deploy
stage: deploy
os: windows
script: skip
env: PYTHON="2" PYENV="2.7.16" EXTRA_BUILDEXT="--compiler=mingw32"
before_deploy:
- ./.travis/before-deploy-windows-wheels.sh
deploy:
- provider: pypi
user:
secure: "jUAMucBq+9xH8x9u0I0LOwrs3Zb++KN7FwIIwz2CyAt/+TyyrJzeGJaV+dTiJ1OqcUIFqQG6jopzpnAe4biL1O68PEwz9BphKetFLpLHiFNm/n67LYno6NFonWmxndIy99pOP6NZu29nzSNeYq/KgEHo/5OkqEGOxk//lh7X/OY="
password:
secure: "ZqywwnR+G5VeM2sStwfLeutOvqbULHtnStjrdYc8WcC/FBVwmH/W48fTlvxrnswmfKx7Eljv0nN4VcBpoFf1tvz4O2oK/tCRpf0N8SvpT0jBx8bLGUxJ1/3Po6rFgBRWgSb/mzKHPKI6fLlQNcNg8lrd9e1j/zgbVRSwNeMUOR8="
skip_cleanup: true
on:
all_branches: true
distributions: "check" # Hack, see above

- <<: *win_deploy
env: PYTHON="3" PYENV="3.6.8"

- <<: *win_deploy
env: PYTHON="3" PYENV="3.7.3"
29 changes: 29 additions & 0 deletions .travis/before-deploy-windows-wheels.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/bin/bash -ex

# See before-deploy.sh for anything unexplained

source ./.travis/lib-setup.sh
source ./.travis/lib-deploy.sh

./.travis/build.sh

# build the wheel
python -m pip install wheel
python setup.py bdist_wheel

cd dist

# Rename and checksum the wheel
if [ x"${TRAVIS_TAG#v[0-9]}" = "x${TRAVIS_TAG}" ]; then
PYTHON_GSSAPI_VERSION=${TRAVIS_TAG}
else
PYTHON_GSSAPI_VERSION=${TRAVIS_TAG#v}
fi

PKG_NAME_VER=$(ls *.whl | sed "s/gssapi-[^-]*-\(.*\)\.whl/python-gssapi-${PYTHON_GSSAPI_VERSION}-\1/")

cp *.whl "${PKG_NAME_VER}.whl"

sha512sum --binary ./${PKG_NAME_VER}.whl > ./${PKG_NAME_VER}.sha512sum

cd ..
7 changes: 6 additions & 1 deletion .travis/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,19 @@ source ./.travis/lib-setup.sh
setup::install

# always build in-place so that Sphinx can find the modules
python setup.py build_ext --inplace
python setup.py build_ext --inplace $EXTRA_BUILDEXT
BUILD_RES=$?

if [ x"$KRB5_VER" = "xheimdal" ]; then
# heimdal can't run the tests yet, so just exit
exit $BUILD_RES
fi

if [ "$TRAVIS_OS_NAME" == "windows" ]; then
# Windows can't run tests yet, so just exit
exit $BUILD_RES
fi

if [ $BUILD_RES -ne 0 ]; then
# if the build failed, don't run the tests
exit $BUILD_RES
Expand Down
20 changes: 20 additions & 0 deletions .travis/lib-setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,33 @@ setup::macos::install() {
pip install --install-option='--no-cython-compile' cython
}

setup::windows::install() {
# Install the right Python version and MIT Kerberos
choco install python"${PYENV:0:1}" --version $PYENV
choco install mitkerberos --install-arguments "'ADDLOCAL=ALL'" || true
PYPATH="/c/Python${PYENV:0:1}${PYENV:2:1}"
# Update path to include them
export PATH="$PYPATH:$PYPATH/Scripts:/c/Program Files/MIT/Kerberos/bin:$PATH"

if [ "${PYENV:0:1}" == "2" ]; then
choco install vcredist2008
# Skip dotnet dependency:
# https://github.com/fredrikaverpil/vcpython27/pull/3
choco install --ignore-dependencies vcpython27
fi

python -m pip install --upgrade pip
}

setup::install() {
if [ -f /etc/debian_version ]; then
setup::debian::install
elif [ -f /etc/redhat-release ]; then
setup::rh::install
elif [ "$(uname)" == "Darwin" ]; then
setup::macos::install
elif [ "$TRAVIS_OS_NAME" == "windows" ]; then
setup::windows::install
else
echo "Distro not found!"
false
Expand Down
2 changes: 1 addition & 1 deletion gssapi/raw/ext_cred_imp_exp.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ def export_cred(Creds creds not None):
maj_stat = gss_export_cred(&min_stat, creds.raw_creds, &exported_creds)

if maj_stat == GSS_S_COMPLETE:
res = exported_creds.value[:exported_creds.length]
res = (<char*>exported_creds.value)[:exported_creds.length]
gss_release_buffer(&min_stat, &exported_creds)
return res
else:
Expand Down
6 changes: 3 additions & 3 deletions gssapi/raw/ext_dce.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -209,7 +209,7 @@ cdef class IOV:
new_val = b'\x00' * new_len
else:
new_len = self._iov[i].buffer.length
new_val = self._iov[i].buffer.value[:new_len]
new_val = (<char*>self._iov[i].buffer.value)[:new_len]

alloc = False
if self._iov[i].type & GSS_IOV_BUFFER_FLAG_ALLOCATE:
Expand Down Expand Up @@ -503,7 +503,7 @@ def wrap_aead(SecurityContext context not None, bytes message not None,
&conf_used, &output_buffer)

if maj_stat == GSS_S_COMPLETE:
output_message = output_buffer.value[:output_buffer.length]
output_message = (<char*>output_buffer.value)[:output_buffer.length]
gss_release_buffer(&min_stat, &output_buffer)
return WrapResult(output_message, <bint>conf_used)
else:
Expand Down Expand Up @@ -553,7 +553,7 @@ def unwrap_aead(SecurityContext context not None, bytes message not None,
&conf_state, &qop_state)

if maj_stat == GSS_S_COMPLETE:
output_message = output_buffer.value[:output_buffer.length]
output_message = (<char*>output_buffer.value)[:output_buffer.length]
gss_release_buffer(&min_stat, &output_buffer)
return UnwrapResult(output_message, <bint>conf_state, qop_state)
else:
Expand Down
4 changes: 2 additions & 2 deletions gssapi/raw/ext_ggf.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def inquire_cred_by_oid(Creds cred_handle not None,
if data_set != GSS_C_NO_BUFFER_SET:
for i in range(data_set.count):
token = data_set.elements[i]
py_tokens.append(token.value[:token.length])
py_tokens.append((<char*>token.value)[:token.length])

gss_release_buffer_set(&min_stat, &data_set)

Expand Down Expand Up @@ -124,7 +124,7 @@ def inquire_sec_context_by_oid(SecurityContext context not None,
if data_set != GSS_C_NO_BUFFER_SET:
for i in range(data_set.count):
token = data_set.elements[i]
py_tokens.append(token.value[:token.length])
py_tokens.append((<char*>token.value)[:token.length])

gss_release_buffer_set(&min_stat, &data_set)

Expand Down
6 changes: 3 additions & 3 deletions gssapi/raw/ext_rfc5587.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -140,9 +140,9 @@ def display_mech_attr(OID attr):
&long_desc)

if maj_stat == GSS_S_COMPLETE:
out_name = name.value[:name.length]
out_short = short_desc.value[:short_desc.length]
out_long = long_desc.value[:long_desc.length]
out_name = (<char*>name.value)[:name.length]
out_short = (<char*>short_desc.value)[:short_desc.length]
out_long = (<char*>long_desc.value)[:long_desc.length]

gss_release_buffer(&min_stat, &name)
gss_release_buffer(&min_stat, &short_desc)
Expand Down
6 changes: 3 additions & 3 deletions gssapi/raw/ext_rfc5801.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ def inquire_saslname_for_mech(OID mech not None):
&mech_name, &mech_desc)

if maj_stat == GSS_S_COMPLETE:
out_smn = sasl_mech_name.value[:sasl_mech_name.length]
out_mn = mech_name.value[:mech_name.length]
out_md = mech_desc.value[:mech_desc.length]
out_smn = (<char*>sasl_mech_name.value)[:sasl_mech_name.length]
out_mn = (<char*>mech_name.value)[:mech_name.length]
out_md = (<char*>mech_desc.value)[:mech_desc.length]

gss_release_buffer(&min_stat, &sasl_mech_name)
gss_release_buffer(&min_stat, &mech_name)
Expand Down
12 changes: 7 additions & 5 deletions gssapi/raw/ext_rfc6680.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ def display_name_ext(Name name not None, OID name_type not None):
&name_type.raw_oid, &output_name)

if maj_stat == GSS_S_COMPLETE:
name_text = output_name.value[:output_name.length]
name_text = (<char*>output_name.value)[:output_name.length]
gss_release_buffer(&min_stat, &output_name)
return name_text
else:
Expand Down Expand Up @@ -126,7 +126,9 @@ def inquire_name(Name name not None, mech_name=True, attrs=True):
if attr_names != GSS_C_NO_BUFFER_SET:
for i in range(attr_names.count):
attr_name = attr_names.elements[i]
py_attr_names.append(attr_name.value[:attr_name.length])
py_attr_names.append(
(<char*>attr_name.value)[:attr_name.length]
)

gss_release_buffer_set(&min_stat, &attr_names)

Expand Down Expand Up @@ -233,9 +235,9 @@ def get_name_attribute(Name name not None, attr not None, more=None):
&more_val)

if maj_stat == GSS_S_COMPLETE:
py_vals.append(val_buff.value[:val_buff.length])
py_vals.append((<char*>val_buff.value)[:val_buff.length])
py_displ_vals.append(
displ_val_buff.value[:displ_val_buff.length])
(<char*>displ_val_buff.value)[:displ_val_buff.length])

gss_release_buffer(&min_stat, &val_buff)
gss_release_buffer(&min_stat, &displ_val_buff)
Expand Down Expand Up @@ -310,7 +312,7 @@ def export_name_composite(Name name not None):
maj_stat = gss_export_name_composite(&min_stat, name.raw_name, &res)

if maj_stat == GSS_S_COMPLETE:
py_res = res.value[:res.length]
py_res = (<char*>res.value)[:res.length]
gss_release_buffer(&min_stat, &res)
return py_res
else:
Expand Down
6 changes: 3 additions & 3 deletions gssapi/raw/message.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ def get_mic(SecurityContext context not None, message, qop=None):
&message_buffer, &token_buffer)

if maj_stat == GSS_S_COMPLETE:
res = token_buffer.value[:token_buffer.length]
res = (<char*>token_buffer.value)[:token_buffer.length]
gss_release_buffer(&min_stat, &token_buffer)
return res
else:
Expand Down Expand Up @@ -220,7 +220,7 @@ def wrap(SecurityContext context not None, message, confidential=True,
&message_buffer, &conf_used, &output_buffer)

if maj_stat == GSS_S_COMPLETE:
output_message = output_buffer.value[:output_buffer.length]
output_message = (<char*>output_buffer.value)[:output_buffer.length]
gss_release_buffer(&min_stat, &output_buffer)
return WrapResult(output_message, <bint>conf_used)
else:
Expand Down Expand Up @@ -268,7 +268,7 @@ def unwrap(SecurityContext context not None, message):
&output_buffer, &conf_state, &qop_state)

if maj_stat == GSS_S_COMPLETE:
output_message = output_buffer.value[:output_buffer.length]
output_message = (<char*>output_buffer.value)[:output_buffer.length]
gss_release_buffer(&min_stat, &output_buffer)
return UnwrapResult(output_message, <bint>conf_state, qop_state)
else:
Expand Down
2 changes: 1 addition & 1 deletion gssapi/raw/misc.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ def _display_status(unsigned int error_code, bint is_major_code,

if maj_stat == GSS_S_COMPLETE:
call_again = bool(msg_ctx_out)
msg_out = msg_buff.value[:msg_buff.length]
msg_out = (<char*>msg_buff.value)[:msg_buff.length]
gss_release_buffer(&min_stat, &msg_buff)
return (msg_out, msg_ctx_out, call_again)
else:
Expand Down
4 changes: 2 additions & 2 deletions gssapi/raw/names.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ def display_name(Name name not None, name_type=True):

cdef OID py_name_type
if maj_stat == GSS_S_COMPLETE:
text = output_buffer.value[:output_buffer.length]
text = (<char*>output_buffer.value)[:output_buffer.length]
gss_release_buffer(&min_stat, &output_buffer)
if name_type:
if output_name_type == GSS_C_NO_OID:
Expand Down Expand Up @@ -240,7 +240,7 @@ def export_name(Name name not None):
if maj_stat == GSS_S_COMPLETE:
# force conversion to a python string with the specified length
# (we use the slice to tell cython that we know the length already)
res = exported_name.value[:exported_name.length]
res = (<char*>exported_name.value)[:exported_name.length]
gss_release_buffer(&min_stat, &exported_name)
return res
else:
Expand Down
2 changes: 1 addition & 1 deletion gssapi/raw/python_gssapi.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#ifdef OSX_HAS_GSS_FRAMEWORK
#include <GSS/GSS.h>
#elif __MINGW32__
#elif defined(__MINGW32__) && defined(__MSYS__)
#include <gss.h>
#else
#include <gssapi/gssapi.h>
Expand Down
2 changes: 1 addition & 1 deletion gssapi/raw/python_gssapi_ext.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#ifdef OSX_HAS_GSS_FRAMEWORK
#include <GSS/GSS.h>
#else
#ifdef __MINGW32__
#if defined(__MINGW32__) && defined(__MSYS__)
#include <gss.h>
#else
#ifdef HAS_GSSAPI_EXT_H
Expand Down
2 changes: 1 addition & 1 deletion gssapi/raw/python_gssapi_krb5.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#ifdef OSX_HAS_GSS_FRAMEWORK
#include <GSS/gssapi_krb5.h>
#elif __MINGW32__
#elif defined(__MINGW32__) && defined(__MSYS__)
#include <gss.h>
#else
#include <gssapi/gssapi_krb5.h>
Expand Down
Loading