Skip to content
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
6 changes: 1 addition & 5 deletions .github/workflows/integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ jobs:
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get install libkrb5-dev
pip install kerberos requests
pip install -r devel.txt

- name: Build & start services
run: |
Expand Down Expand Up @@ -72,10 +72,6 @@ jobs:
make verify-web-login
klist

- name: Install coverage tools
run: |
pip install codecov

- name: Verify tcms-api can communicate via username/password
run: |
cat > ~/.tcms.conf << _EOF_
Expand Down
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ env:
- MAKE=build

install:
- pip install codecov pylint flake8 twine kerberos requests
- pip install -r devel.txt

script:
- make $MAKE
Expand Down
2 changes: 1 addition & 1 deletion MANIFEST.in
Original file line number Diff line number Diff line change
@@ -1 +1 @@
include README.rst LICENSE
include README.rst LICENSE requirements.txt
6 changes: 6 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ INSTALLATION

pip install tcms-api

**WARNING:** on Windows you need to install MIT Kerberos and make sure
``C:\Program Files\MIT\Kerberos\bin`` is included in ``%PATH%`` -
this is usually the case when you install and restart! It must be
a 64bit installation, see
`MIT Kerberos for Windows 4.1 <https://web.mit.edu/kerberos/dist/index.html#kfw-4.1>`_


CHANGELOG
---------
Expand Down
11 changes: 9 additions & 2 deletions appveyor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,20 @@ environment:
- MAKE: build

install:
# install MIT Kerberos for Windows
- SET PATH=%PATH%;"C:\\Program Files\\MIT\\Kerberos\\bin"'
- "curl -fsS -o kfw-4.1-amd64.msi https://web.mit.edu/kerberos/dist/kfw/4.1/kfw-4.1-amd64.msi"
# NOTE: always exit 0 b/c the installer needs restart but we're forcing it not to
- "msiexec /i kfw-4.1-amd64.msi /quiet /qn /norestart & exit 0"

# Prepend Python to the PATH of this build (this cannot be done from inside
# the powershell script as it would require to restart the parent CMD process).
# cygwin64\bin contains all commands used by 'make build'
- "SET PATH=%PYTHON%;%PYTHON%\\Scripts;C:\\Users\\appveyor\\AppData\\Roaming\\Python\\Python36\\Scripts;C:\\cygwin64\\bin;%PATH%"

- "python --version"
- "python -m pip install --disable-pip-version-check --user --upgrade pip wheel"
- "python -m pip install codecov pylint flake8 twine winkerberos requests"
- "python -m pip install -r devel.txt"

build: off

Expand All @@ -28,5 +34,6 @@ artifacts:
test_script:
- 'sed -i "s|-p \$(which python)||" tests/check-build'
- 'sed -i "s|bin/activate|Scripts/activate|" tests/check-build'
- 'sed -i "s|pip install kerberos||" tests/check-build'
- 'sed -i "s|--no-binary :all: gssapi|--only-binary :all: gssapi|" tests/check-build'
- 'sed -i "s|pip install gssapi||" tests/check-build'
- "make %MAKE%"
6 changes: 6 additions & 0 deletions devel.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
-r requirements.txt

codecov
flake8
pylint
twine
2 changes: 1 addition & 1 deletion docs/source/conf.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
# generate documentation from Python sources
subprocess.run(['make', '-C', '../', 'apidoc'], check=True)

autodoc_mock_imports = ['kerberos']
autodoc_mock_imports = ['gssapi']

# -- General configuration ------------------------------------------------

Expand Down
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
gssapi
requests
18 changes: 12 additions & 6 deletions setup.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#!/usr/bin/env python
import os
import sys
from setuptools import setup


Expand All @@ -11,12 +10,22 @@ def get_version():
).replace('__version__=', '').strip().strip("'").strip('"')


def get_install_requires(path):
requires = []

with open(path, 'r') as file:
for line in file:
if line.startswith('-r '):
continue
requires.append(line.strip())
return requires


with open("README.rst") as readme:
LONG_DESCRIPTION = readme.read()


setup(name='tcms-api',
# always update version/release in docs/conf.py
version=get_version(),
packages=['tcms_api'],
description='Python API for Kiwi',
Expand All @@ -27,10 +36,7 @@ def get_version():
license='LGPLv2+',
url='https://github.com/kiwitcms/tcms-api',
python_requires='>=3.6',
install_requires=[
'requests',
'winkerberos' if sys.platform.startswith("win") else 'kerberos',
],
install_requires=get_install_requires('requirements.txt'),
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Console',
Expand Down
18 changes: 7 additions & 11 deletions tcms_api/xmlrpc.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,17 @@
# pylint: disable=too-few-public-methods

import sys
import urllib.parse

from base64 import b64encode
from http import HTTPStatus
from http.client import HTTPSConnection
from xmlrpc.client import SafeTransport, Transport, ServerProxy

import gssapi
import requests

from tcms_api.version import __version__

if sys.platform.startswith("win"):
import winkerberos as kerberos # pylint: disable=import-error
else:
import kerberos # pylint: disable=import-error

VERBOSE = 0

Expand Down Expand Up @@ -45,9 +42,8 @@ class SafeCookieTransport(SafeTransport, CookieTransport):
scheme = 'https'


# Taken from FreeIPA source freeipa-1.2.1/ipa-python/krbtransport.py
class KerbTransport(SafeCookieTransport):
"""Handles Kerberos Negotiation authentication to an XML-RPC server."""
"""Handles GSSAPI Negotiation (SPNEGO) authentication."""

def get_host_info(self, host):
host, extra_headers, x509 = Transport.get_host_info(self, host)
Expand All @@ -56,12 +52,12 @@ def get_host_info(self, host):
hostinfo = host.split(':')
service = "HTTP@" + hostinfo[0]

_result, context = kerberos.authGSSClientInit(service)
kerberos.authGSSClientStep(context, "")
service_name = gssapi.Name(service, gssapi.NameType.hostbased_service)
context = gssapi.SecurityContext(usage="initiate", name=service_name)
token = context.step()

extra_headers = [
("Authorization", "Negotiate %s" %
kerberos.authGSSClientResponse(context))
("Authorization", "Negotiate %s" % b64encode(token).decode())
]

return host, extra_headers, x509
Expand Down
7 changes: 4 additions & 3 deletions tests/check-build
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ echo "..... Trying to install the new tarball inside a virtualenv"
virtualenv -q -p $(which python) .venv/test-tarball
source .venv/test-tarball/bin/activate
pip install --upgrade setuptools pip
pip install --no-binary :all: -f dist/ tcms-api
pip install --no-binary :all: gssapi
pip install --no-binary :all: dist/tcms-api*.tar.gz
pip freeze | grep tcms-api
deactivate
rm -rf .venv/
Expand All @@ -55,8 +56,8 @@ echo "..... Trying to install the new wheel inside a virtualenv"
virtualenv -q -p $(which python) .venv/test-wheel
source .venv/test-wheel/bin/activate
pip install --upgrade setuptools pip
pip install kerberos
pip install --only-binary :all: -f dist/ tcms_api
pip install gssapi
pip install --only-binary :all: dist/tcms_api*.whl
pip freeze | grep tcms-api
deactivate
rm -rf .venv/
Expand Down