Compare commits

...

3 Commits

Author SHA1 Message Date
d48c773cb4
Test basics
Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
2024-09-16 03:50:02 +02:00
b9bf679028
Add ruff linter configuration
Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
2024-09-16 03:49:35 +02:00
031593d470
Formatting
For a better code style:
- consistent trailing commas
- use constant instead of repeated "magic" values

Signed-off-by: Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
2024-09-16 03:47:31 +02:00
5 changed files with 117 additions and 6 deletions

View File

@ -1,4 +1,3 @@
#!/usr/bin/python3
"""
pyacl - high level abstractions over pylibacl
Copyright 2024, Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
@ -33,16 +32,18 @@ DEFAULT_ENTRYTYPES = [
'user',
'group',
'mask',
'other'
'other',
]
MAX_PERMBITS = 3
def acl_reduce_entries(acl):
entries = acl.to_any_text().decode().split()
entries = [entry for entry in entries if entry not in DEFAULT_ENTRIES]
return entries
def acl_parse_permission(strpermission):
if len(strpermission) != 3:
if len(strpermission) != MAX_PERMBITS:
return ValueError('Invalid permission')
permap = {
@ -78,13 +79,13 @@ def acl_parse_entry(strentry):
elif not entryvalue:
return ValueError('Invalid entry value')
if len(permissions) != 3:
if len(permissions) != MAX_PERMBITS:
raise ValueError('Unsupported amount of permissions')
return {
entrytype: {
entryvalue: acl_parse_permission(permissions)
}
entryvalue: acl_parse_permission(permissions),
},
}
def acl_parse_entries(acl):

33
ruff.toml Normal file
View File

@ -0,0 +1,33 @@
[lint]
# https://docs.astral.sh/ruff/rules/
extend-select = [
"A", # flake8-builtins
"BLE", # flake8-blind-except
"C4", # flake8-comprehensions
"COM", # flake8-commas
"E", # pycodestyle
"E261", # spaces before inline comments
"ERA", # eradicate
"EXE", # flake8-executable
"FBT", # flake8-boolean-trap
"I", # isort
"ISC", # flake8-implicit-str-concat
"PL", # Pylint
"S", # flake8-bandit
"UP", # pyupgrade
"W", # pycodestyle
"YTT", # flake8-2020
]
ignore = [
"E501", # line lengths
"S603", # https://github.com/astral-sh/ruff/issues/4045
"S607", # makes subprocess calls in test suite more portable
]
preview = true
explicit-preview-rules = true
[lint.per-file-ignores]
"tests/*.py" = ["S101"] # allow "assert" in test suites
[lint.pydocstyle]
convention = "pep257"

2
test.sh Executable file
View File

@ -0,0 +1,2 @@
#!/bin/sh -x
PYTHONPATH=. pytest --pdb --pdbcls=IPython.terminal.debugger:Pdb -rA -s -v -x

27
tests/conftest.py Normal file
View File

@ -0,0 +1,27 @@
"""
Helpers for the pyacl test suite
Copyright 2024, Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
Licensed under the EUPL, Version 1.2 or - as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence").
You may not use this work except in compliance with the Licence.
An English copy of the Licence is shipped in a file called LICENSE along with this applications source code.
You may obtain copies of the Licence in any of the official languages at https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12.
"""
from shutil import rmtree
from subprocess import run
import pytest
@pytest.fixture(scope='session')
def sample_file(tmp_path_factory):
directory = tmp_path_factory.mktemp('sample_files')
file = directory / 'file_with_user_read_acl'
file.touch()
assert not file.read_text() # file should exist
run(['setfacl', '-m', 'u:georg2:r', file], check=True)
out = run(['getfacl', '-c', file], check=True, capture_output=True)
assert 'user:georg2:r--' in out.stdout.decode() # file should have the ACL set
yield file
rmtree(directory)

48
tests/test_pyacl.py Normal file
View File

@ -0,0 +1,48 @@
"""
Test suite for pyacl
Copyright 2024, Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
Licensed under the EUPL, Version 1.2 or - as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence").
You may not use this work except in compliance with the Licence.
An English copy of the Licence is shipped in a file called LICENSE along with this applications source code.
You may obtain copies of the Licence in any of the official languages at https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12.
"""
import posix1e
from pyacl import acl
def test_parse_acl(sample_file):
want = {
'user': {
'georg2': {
'read': True,
'write': False,
'execute': False,
},
},
'group': {
None: {
'read': True,
'write': False,
'execute': False,
},
},
'mask': {
None: {
'read': True,
'write': False,
'execute': False,
},
},
'other': {
None: {
'read': True,
'write': False,
'execute': False,
},
},
}
have = acl.acl_parse_entries(acl.acl_reduce_entries(posix1e.ACL(file=sample_file)))
assert want == have