Compare commits
No commits in common. "d48c773cb496b80b25eb7bbf535cc4e0347264fb" and "191c0fac6a088247b8976d449606c6a8ff7cedaf" have entirely different histories.
d48c773cb4
...
191c0fac6a
13
pyacl/acl.py
13
pyacl/acl.py
@ -1,3 +1,4 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
"""
|
"""
|
||||||
pyacl - high level abstractions over pylibacl
|
pyacl - high level abstractions over pylibacl
|
||||||
Copyright 2024, Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
|
Copyright 2024, Georg Pfuetzenreuter <mail@georg-pfuetzenreuter.net>
|
||||||
@ -32,18 +33,16 @@ DEFAULT_ENTRYTYPES = [
|
|||||||
'user',
|
'user',
|
||||||
'group',
|
'group',
|
||||||
'mask',
|
'mask',
|
||||||
'other',
|
'other'
|
||||||
]
|
]
|
||||||
|
|
||||||
MAX_PERMBITS = 3
|
|
||||||
|
|
||||||
def acl_reduce_entries(acl):
|
def acl_reduce_entries(acl):
|
||||||
entries = acl.to_any_text().decode().split()
|
entries = acl.to_any_text().decode().split()
|
||||||
entries = [entry for entry in entries if entry not in DEFAULT_ENTRIES]
|
entries = [entry for entry in entries if entry not in DEFAULT_ENTRIES]
|
||||||
return entries
|
return entries
|
||||||
|
|
||||||
def acl_parse_permission(strpermission):
|
def acl_parse_permission(strpermission):
|
||||||
if len(strpermission) != MAX_PERMBITS:
|
if len(strpermission) != 3:
|
||||||
return ValueError('Invalid permission')
|
return ValueError('Invalid permission')
|
||||||
|
|
||||||
permap = {
|
permap = {
|
||||||
@ -79,13 +78,13 @@ def acl_parse_entry(strentry):
|
|||||||
elif not entryvalue:
|
elif not entryvalue:
|
||||||
return ValueError('Invalid entry value')
|
return ValueError('Invalid entry value')
|
||||||
|
|
||||||
if len(permissions) != MAX_PERMBITS:
|
if len(permissions) != 3:
|
||||||
raise ValueError('Unsupported amount of permissions')
|
raise ValueError('Unsupported amount of permissions')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
entrytype: {
|
entrytype: {
|
||||||
entryvalue: acl_parse_permission(permissions),
|
entryvalue: acl_parse_permission(permissions)
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
def acl_parse_entries(acl):
|
def acl_parse_entries(acl):
|
||||||
|
33
ruff.toml
33
ruff.toml
@ -1,33 +0,0 @@
|
|||||||
[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
2
test.sh
@ -1,2 +0,0 @@
|
|||||||
#!/bin/sh -x
|
|
||||||
PYTHONPATH=. pytest --pdb --pdbcls=IPython.terminal.debugger:Pdb -rA -s -v -x
|
|
@ -1,27 +0,0 @@
|
|||||||
"""
|
|
||||||
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)
|
|
@ -1,48 +0,0 @@
|
|||||||
"""
|
|
||||||
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
|
|
Loading…
x
Reference in New Issue
Block a user