commit python-pamela for openSUSE:Factory
Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-pamela for openSUSE:Factory checked in at 2023-12-15 21:49:58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-pamela (Old) and /work/SRC/openSUSE:Factory/.python-pamela.new.25432 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "python-pamela" Fri Dec 15 21:49:58 2023 rev:2 rq:1133386 version:1.1.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-pamela/python-pamela.changes 2020-04-07 10:31:54.870544947 +0200 +++ /work/SRC/openSUSE:Factory/.python-pamela.new.25432/python-pamela.changes 2023-12-15 21:50:16.224741592 +0100 @@ -1,0 +2,6 @@ +Fri Dec 8 10:03:59 UTC 2023 - Dirk Müller <dmueller@suse.com> + +- update to 1.1.0: + * Enable password input in authenticate to be an iterable + +------------------------------------------------------------------- Old: ---- 1.0.0.tar.gz New: ---- 1.1.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-pamela.spec ++++++ --- /var/tmp/diff_new_pack.4XJ1z5/_old 2023-12-15 21:50:16.948768231 +0100 +++ /var/tmp/diff_new_pack.4XJ1z5/_new 2023-12-15 21:50:16.952768378 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-pamela # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2023 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -18,7 +18,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} Name: python-pamela -Version: 1.0.0 +Version: 1.1.0 Release: 0 Summary: PAM interface using ctypes License: MIT ++++++ 1.0.0.tar.gz -> 1.1.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pamela-1.0.0/.bumpversion.cfg new/pamela-1.1.0/.bumpversion.cfg --- old/pamela-1.0.0/.bumpversion.cfg 2019-01-17 16:21:23.000000000 +0100 +++ new/pamela-1.1.0/.bumpversion.cfg 1970-01-01 01:00:00.000000000 +0100 @@ -1,18 +0,0 @@ -[bumpversion] -current_version = 1.0.0 -parse = (?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\.(?P<release>[a-z0-9]+))? -tag_name = {new_version} -allow_dirty = True -commit = True -serialize = - {major}.{minor}.{patch}.{release} - {major}.{minor}.{patch} - -[bumpversion:file:pamela.py] - -[bumpversion:part:release] -optional_value = stable -values = - dev - stable - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pamela-1.0.0/.flake8 new/pamela-1.1.0/.flake8 --- old/pamela-1.0.0/.flake8 1970-01-01 01:00:00.000000000 +0100 +++ new/pamela-1.1.0/.flake8 2023-06-01 11:43:37.000000000 +0200 @@ -0,0 +1,7 @@ +[flake8] +# Ignore style and complexity +# E: style errors +# W: style warnings +# C: complexity +# F841: local variable assigned but never used +ignore = E, C, W, D diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pamela-1.0.0/.github/workflows/release.yaml new/pamela-1.1.0/.github/workflows/release.yaml --- old/pamela-1.0.0/.github/workflows/release.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/pamela-1.1.0/.github/workflows/release.yaml 2023-06-01 11:43:37.000000000 +0200 @@ -0,0 +1,45 @@ +# This is a GitHub workflow defining a set of jobs with a set of steps. +# ref: https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-... +# +name: Release + +# always build releases (to make sure wheel-building works) +# but only publish to PyPI on tags +on: + pull_request: + paths-ignore: + - "*.md" + - ".github/workflows/*.yaml" + - "!.github/workflows/release.yaml" + push: + branches: + - main + tags: ["**"] + workflow_dispatch: + +jobs: + build-release: + permissions: + # IMPORTANT: this permission is mandatory for trusted publishing + id-token: write + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: "3.11" + + - name: install build package + run: | + pip install --upgrade pip + pip install build + pip freeze + + - name: build release + run: | + python -m build --sdist --wheel . + ls -l dist + + - name: publish to pypi + uses: pypa/gh-action-pypi-publish@v1.8.6 + if: startsWith(github.ref, 'refs/tags/') diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pamela-1.0.0/.github/workflows/test.yaml new/pamela-1.1.0/.github/workflows/test.yaml --- old/pamela-1.0.0/.github/workflows/test.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/pamela-1.1.0/.github/workflows/test.yaml 2023-06-01 11:43:37.000000000 +0200 @@ -0,0 +1,46 @@ +# This is a GitHub workflow defining a set of jobs with a set of steps. +# ref: https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-... +# +name: Tests + +on: + pull_request: + paths-ignore: + - "docs/**" + - ".github/workflows/*.yaml" + - "!.github/workflows/test.yaml" + push: + branches: + - main + tags: ["**"] + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-22.04 + timeout-minutes: 10 + + strategy: + # Keep running even if one variation of the job fail + fail-fast: false + matrix: + python: + - "3.7" + - "3.8" + - "3.9" + - "3.10" + - "3.11" + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: "${{ matrix.python }}" + + - name: Install Python dependencies + run: | + pip install . pytest + pip list + + - name: Run tests + run: pytest diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pamela-1.0.0/.pre-commit-config.yaml new/pamela-1.1.0/.pre-commit-config.yaml --- old/pamela-1.0.0/.pre-commit-config.yaml 1970-01-01 01:00:00.000000000 +0100 +++ new/pamela-1.1.0/.pre-commit-config.yaml 2023-06-01 11:43:37.000000000 +0200 @@ -0,0 +1,73 @@ +# pre-commit is a tool to perform a predefined set of tasks manually and/or +# automatically before git commits are made. +# +# Config reference: https://pre-commit.com/#pre-commit-configyaml---top-level +# +# Common tasks +# +# - Run on all files: pre-commit run --all-files +# - Register git hooks: pre-commit install --install-hooks +# +repos: + # Autoformat: Python code, syntax patterns are modernized + - repo: https://github.com/asottile/pyupgrade + rev: v3.3.1 + hooks: + - id: pyupgrade + args: + - --py37-plus + + # Autoformat: Python code + - repo: https://github.com/PyCQA/autoflake + rev: v2.0.2 + hooks: + - id: autoflake + # args ref: https://github.com/PyCQA/autoflake#advanced-usage + args: + - --in-place + + # Autoformat: python imports + - repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + + # Autoformat: Python code + - repo: https://github.com/psf/black + rev: 23.3.0 + hooks: + - id: black + + # Autoformat: markdown, yaml + - repo: https://github.com/pre-commit/mirrors-prettier + rev: v3.0.0-alpha.6 + hooks: + - id: prettier + + # Misc... + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + # ref: https://github.com/pre-commit/pre-commit-hooks#hooks-available + hooks: + # Autoformat: Makes sure files end in a newline and only a newline. + - id: end-of-file-fixer + + # Autoformat: Sorts entries in requirements.txt. + - id: requirements-txt-fixer + + # Lint: Check for files with names that would conflict on a + # case-insensitive filesystem like MacOS HFS+ or Windows FAT. + - id: check-case-conflict + + # Lint: Checks that non-binary executables have a proper shebang. + - id: check-executables-have-shebangs + + # Lint: Python code + - repo: https://github.com/pycqa/flake8 + rev: "6.0.0" + hooks: + - id: flake8 + +# pre-commit.ci config reference: https://pre-commit.ci/#configuration +ci: + autoupdate_schedule: monthly diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pamela-1.0.0/pamela.py new/pamela-1.1.0/pamela.py --- old/pamela-1.0.0/pamela.py 2019-01-17 16:21:23.000000000 +0100 +++ new/pamela-1.1.0/pamela.py 2023-06-01 11:43:37.000000000 +0200 @@ -11,9 +11,8 @@ Implemented using ctypes, so no compilation is necessary. """ -from __future__ import print_function -__version__ = '1.0.0' +__version__ = '1.1.0' __all__ = [ 'PAMError', @@ -24,21 +23,33 @@ 'change_password', ] -from ctypes import CDLL, POINTER, Structure, CFUNCTYPE, cast, pointer, sizeof, byref -from ctypes import c_void_p, c_uint, c_char_p, c_char, c_int -from ctypes.util import find_library import getpass import sys +from ctypes import ( + CDLL, + CFUNCTYPE, + POINTER, + Structure, + byref, + c_char, + c_char_p, + c_int, + c_uint, + c_void_p, + cast, + pointer, + sizeof, +) +from ctypes.util import find_library # Python 3 bytes/unicode compat -if sys.version_info >= (3,): - unicode = str - raw_input = input - def _bytes_to_str(s, encoding='utf8'): - return s.decode(encoding) -else: - def _bytes_to_str(s, encoding='utf8'): - return s +unicode = str +raw_input = input + + +def _bytes_to_str(s, encoding='utf8'): + return s.decode(encoding) + def _cast_bytes(s, encoding='utf8'): if isinstance(s, unicode): @@ -55,7 +66,7 @@ STRDUP = LIBC.strdup STRDUP.argstypes = [c_char_p] -STRDUP.restype = POINTER(c_char) # NOT c_char_p !!!! +STRDUP.restype = POINTER(c_char) # NOT c_char_p !!!! # Various constants PAM_PROMPT_ECHO_OFF = 1 @@ -83,9 +94,8 @@ class PamHandle(Structure): """wrapper class for pam_handle_t""" - _fields_ = [ - ("handle", c_void_p) - ] + + _fields_ = [("handle", c_void_p)] def __init__(self): Structure.__init__(self) @@ -117,16 +127,12 @@ return ret.decode(encoding) def put_env(self, k, v, encoding='utf-8'): - retval = PAM_PUTENV( - self, - ('%s=%s' % (k, v)).encode(encoding)) + retval = PAM_PUTENV(self, (f'{k}={v}').encode(encoding)) if retval != PAM_SUCCESS: raise PAMError(errno=retval) def del_env(self, k, encoding='utf-8'): - retval = PAM_PUTENV( - self, - k.encode(encoding)) + retval = PAM_PUTENV(self, k.encode(encoding)) if retval != PAM_SUCCESS: raise PAMError(errno=retval) @@ -159,13 +165,16 @@ PAM_STRERROR.restype = c_char_p PAM_STRERROR.argtypes = [PamHandle, c_int] + def pam_strerror(handle, errno): """Wrap bytes-only PAM_STRERROR in native str""" return _bytes_to_str(PAM_STRERROR(handle, errno)) + class PAMError(Exception): errno = None message = '' + def __init__(self, message='', errno=None): self.errno = errno if message: @@ -178,47 +187,51 @@ def __repr__(self): en = '' if self.errno is None else ' %i' % self.errno - return "<PAM Error%s: '%s'>" % (en, self.message) + return f"<PAM Error{en}: '{self.message}'>" def __str__(self): en = '' if self.errno is None else ' %i' % self.errno - return '[PAM Error%s] %s' % (en, self.message) + return f'[PAM Error{en}] {self.message}' + class PamMessage(Structure): """wrapper class for pam_message structure""" + _fields_ = [ - ("msg_style", c_int), - ("msg", POINTER(c_char)), - ] + ("msg_style", c_int), + ("msg", POINTER(c_char)), + ] def __repr__(self): return "<PamMessage %i '%s'>" % (self.msg_style, _bytes_to_str(self.msg)) + class PamResponse(Structure): """wrapper class for pam_response structure""" + _fields_ = [ - ("resp", POINTER(c_char)), - ("resp_retcode", c_int), - ] + ("resp", POINTER(c_char)), + ("resp_retcode", c_int), + ] def __repr__(self): return "<PamResponse %i '%s'>" % (self.resp_retcode, _bytes_to_str(self.resp)) -CONV_FUNC = CFUNCTYPE(c_int, - c_int, POINTER(POINTER(PamMessage)), - POINTER(POINTER(PamResponse)), c_void_p) + +CONV_FUNC = CFUNCTYPE( + c_int, c_int, POINTER(POINTER(PamMessage)), POINTER(POINTER(PamResponse)), c_void_p +) + class PamConv(Structure): """wrapper class for pam_conv structure""" - _fields_ = [ - ("conv", CONV_FUNC), - ("appdata_ptr", c_void_p) - ] + + _fields_ = [("conv", CONV_FUNC), ("appdata_ptr", c_void_p)] + PAM_START = LIBPAM.pam_start PAM_START.restype = c_int -PAM_START.argtypes = [c_char_p, c_char_p, POINTER(PamConv), - POINTER(PamHandle)] +PAM_START.argtypes = [c_char_p, c_char_p, POINTER(PamConv), POINTER(PamHandle)] PAM_END = LIBPAM.pam_end PAM_END.restype = c_int @@ -268,6 +281,7 @@ PAM_GET_ITEM.restype = c_int PAM_GET_ITEM.argtypes = [PamHandle, c_int, POINTER(c_void_p)] + @CONV_FUNC def default_conv(n_messages, messages, p_response, app_data): addr = CALLOC(n_messages, sizeof(PamResponse)) @@ -296,9 +310,11 @@ print(repr(messages[i].contents)) return 0 + def new_simple_password_conv(passwords, encoding): passwords = [_cast_bytes(password, encoding) for password in passwords] passwords.reverse() + @CONV_FUNC def conv_func(n_messages, messages, p_response, app_data): """Simple conversation function that responds to any @@ -314,8 +330,10 @@ p_response.contents[i].resp = pw_copy p_response.contents[i].resp_retcode = 0 return 0 + return conv_func + def pam_start(service, username, conv_func=default_conv, encoding='utf8'): service = _cast_bytes(service, encoding) username = _cast_bytes(username, encoding) @@ -330,6 +348,7 @@ return handle + def pam_end(handle, retval=0): e = PAM_END(handle, retval) if retval == 0 and e == 0: @@ -338,14 +357,22 @@ retval = e raise PAMError(errno=retval) -def authenticate(username, password=None, service='login', encoding='utf-8', - resetcred=PAM_REINITIALIZE_CRED, close=True): + +def authenticate( + username, + password=None, + service='login', + encoding='utf-8', + resetcred=PAM_REINITIALIZE_CRED, + close=True, +): """Returns None if the given username and password authenticate for the given service. Raises PAMError otherwise ``username``: the username to authenticate - ``password``: the password in plain text + ``password``: the password in plain text. It can also be an iterable of + passwords when using multifactor authentication. Defaults to None to use PAM's conversation interface ``service``: the PAM service to authenticate against. @@ -369,8 +396,9 @@ if password is None: conv_func = default_conv else: - password = _cast_bytes(password, encoding) - conv_func = new_simple_password_conv((password, ), encoding) + if isinstance(password, str): + password = (password,) + conv_func = new_simple_password_conv(password, encoding) handle = pam_start(service, username, conv_func=conv_func, encoding=encoding) @@ -388,18 +416,22 @@ else: return handle + def open_session(username, service='login', encoding='utf-8'): handle = pam_start(service, username, encoding=encoding) return pam_end(handle, PAM_OPEN_SESSION(handle, 0)) + def close_session(username, service='login', encoding='utf-8'): handle = pam_start(service, username, encoding=encoding) return pam_end(handle, PAM_CLOSE_SESSION(handle, 0)) + def check_account(username, service='login', encoding='utf-8'): handle = pam_start(service, username, encoding=encoding) return pam_end(handle, PAM_ACCT_MGMT(handle, 0)) + def change_password(username, password=None, service='login', encoding='utf-8'): if password is None: conv_func = default_conv @@ -412,34 +444,72 @@ handle = pam_start(service, username, conv_func=conv_func, encoding=encoding) return pam_end(handle, PAM_CHAUTHTOK(handle, 0)) + if __name__ == "__main__": import optparse usage = "usage: %prog [options] [username]" parser = optparse.OptionParser(usage=usage) - parser.add_option('-a', '--authenticate', dest='authenticate', - action='store_true', help='authenticate user') - parser.add_option('-o', '--open-session', dest='open_session', - action='store_true', help='open session') - parser.add_option('-c', '--close-session', dest='close_session', - action='store_true', help='close session') - parser.add_option('-v', '--validate-account', dest='validate_account', - action='store_true', help='check account validity') - parser.add_option('-p', '--change-password', dest='change_password', - action='store_true', help='change password') - parser.add_option('-s', '--service', dest='service', - action='store', default='login', - help='PAM service to use [default: %default]') - parser.add_option('-P', '--ask-password', dest='ask_password', - action='store_true', help="own password prompt instead of PAM's") + parser.add_option( + '-a', + '--authenticate', + dest='authenticate', + action='store_true', + help='authenticate user', + ) + parser.add_option( + '-o', + '--open-session', + dest='open_session', + action='store_true', + help='open session', + ) + parser.add_option( + '-c', + '--close-session', + dest='close_session', + action='store_true', + help='close session', + ) + parser.add_option( + '-v', + '--validate-account', + dest='validate_account', + action='store_true', + help='check account validity', + ) + parser.add_option( + '-p', + '--change-password', + dest='change_password', + action='store_true', + help='change password', + ) + parser.add_option( + '-s', + '--service', + dest='service', + action='store', + default='login', + help='PAM service to use [default: %default]', + ) + parser.add_option( + '-P', + '--ask-password', + dest='ask_password', + action='store_true', + help="own password prompt instead of PAM's", + ) (o, a) = parser.parse_args() - if not (o.authenticate or \ - o.open_session or \ - o.close_session or \ - o.validate_account or \ - o.change_password): + if not ( + o.authenticate + or o.open_session + or o.close_session + or o.validate_account + or o.change_password + ): parser.error("One of -a, -o, -c, -v or -p is mandatory") try: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pamela-1.0.0/pyproject.toml new/pamela-1.1.0/pyproject.toml --- old/pamela-1.0.0/pyproject.toml 1970-01-01 01:00:00.000000000 +0100 +++ new/pamela-1.1.0/pyproject.toml 2023-06-01 11:43:37.000000000 +0200 @@ -0,0 +1,83 @@ +[build-system] +requires = [ + "setuptools", +] +build-backend = "setuptools.build_meta" + +# autoflake is used for autoformatting Python code +# +# ref: https://github.com/PyCQA/autoflake#readme +# +[tool.autoflake] +ignore-init-module-imports = true +remove-all-unused-imports = true +remove-duplicate-keys = true +#remove-unused-variables = true + + +# isort is used for autoformatting Python code +# +# ref: https://pycqa.github.io/isort/ +# +[tool.isort] +profile = "black" + + +# black is used for autoformatting Python code +# +# ref: https://black.readthedocs.io/en/stable/ +# +[tool.black] +skip-string-normalization = true +# target-version should be all supported versions, see +# https://github.com/psf/black/issues/751#issuecomment-473066811 +target_version = [ + "py37", + "py38", + "py39", + "py310", + "py311", +] + +[tool.pytest.ini_options] +addopts = "--verbose --color=yes --durations=10" +testpaths = [ + "." +] + +# tbump is used to simplify and standardize the release process when updating +# the version, making a git commit and tag, and pushing changes. +# +# ref: https://github.com/your-tools/tbump#readme +# +[tool.tbump] +# Uncomment this if your project is hosted on GitHub: +github_url = "https://github.com/jupyterhub/jupyterhub" + +[tool.tbump.version] +current = "1.1.0" + +# Example of a semver regexp. +# Make sure this matches current_version before +# using tbump +regex = ''' + (?P<major>\d+) + \. + (?P<minor>\d+) + \. + (?P<patch>\d+) + (?P<pre>((a|b|rc)\d+)|) + \.? + (?P<dev>(?<=\.)dev\d*|) + ''' + +[tool.tbump.git] +message_template = "Bump to {new_version}" +tag_template = "{new_version}" + +# For each file to patch, add a [[tool.tbump.file]] config +# section containing the path of the file, relative to the +# pyproject.toml location. + +[[tool.tbump.file]] +src = "pamela.py" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pamela-1.0.0/setup.py new/pamela-1.1.0/setup.py --- old/pamela-1.0.0/setup.py 2019-01-17 16:21:23.000000000 +0100 +++ new/pamela-1.1.0/setup.py 2023-06-01 11:43:37.000000000 +0200 @@ -9,14 +9,18 @@ from setuptools import setup from setuptools.command.bdist_egg import bdist_egg + class bdist_egg_disabled(bdist_egg): """Disabled version of bdist_egg Prevents setup.py install from performing setuptools' default easy_install, which it should never ever do. """ + def run(self): - sys.exit("Aborting implicit building of eggs. Use `pip install .` to install from source.") + sys.exit( + "Aborting implicit building of eggs. Use `pip install .` to install from source." + ) with open('pamela.py') as f: @@ -27,28 +31,29 @@ version = version_ns['__version__'] -setup(name='pamela', - version=version, - description="PAM interface using ctypes", - long_description=open("README.md").read(), - long_description_content_type="text/markdown", - classifiers=[ - "Development Status :: 4 - Beta", - "Intended Audience :: Developers", - "License :: OSI Approved :: MIT License", - "Operating System :: POSIX :: Linux", - "Operating System :: MacOS :: MacOS X", - "Programming Language :: Python", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: System :: Systems Administration :: Authentication/Directory" - ], - cmdclass={ - "bdist_egg": bdist_egg if "bdist_egg" in sys.argv else bdist_egg_disabled, - }, - keywords=['pam', 'authentication'], - author='Min RK', - author_email='benjaminrk@gmail.com', - url='https://github.com/minrk/pamela', - license='MIT', - py_modules=["pamela"], +setup( + name='pamela', + version=version, + description="PAM interface using ctypes", + long_description=open("README.md").read(), + long_description_content_type="text/markdown", + classifiers=[ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "License :: OSI Approved :: MIT License", + "Operating System :: POSIX :: Linux", + "Operating System :: MacOS :: MacOS X", + "Programming Language :: Python", + "Topic :: Software Development :: Libraries :: Python Modules", + "Topic :: System :: Systems Administration :: Authentication/Directory", + ], + cmdclass={ + "bdist_egg": bdist_egg if "bdist_egg" in sys.argv else bdist_egg_disabled, + }, + keywords=['pam', 'authentication'], + author='Min RK', + author_email='benjaminrk@gmail.com', + url='https://github.com/minrk/pamela', + license='MIT', + py_modules=["pamela"], ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/pamela-1.0.0/test_pamela.py new/pamela-1.1.0/test_pamela.py --- old/pamela-1.0.0/test_pamela.py 2019-01-17 16:21:23.000000000 +0100 +++ new/pamela-1.1.0/test_pamela.py 2023-06-01 11:43:37.000000000 +0200 @@ -71,6 +71,7 @@ assert handle.get_item(pamela.PAM_RUSER) == None +@pytest.mark.skip(reason="doesn't work on CI") def test_session(): handle = pamela.pam_start(getpass.getuser(), 'login') handle.open_session()
participants (1)
-
Source-Sync