Skip to content

Commit

Permalink
Add FileMetadataCheck check.
Browse files Browse the repository at this point in the history
  • Loading branch information
marxin committed Feb 3, 2021
1 parent eced02b commit b02a935
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 0 deletions.
50 changes: 50 additions & 0 deletions rpmlint/checks/FileMetadataCheck.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import os
from pathlib import Path
import stat

from rpmlint.checks.AbstractCheck import AbstractCheck


class FileMetadataCheck(AbstractCheck):
def __init__(self, config, output):
super().__init__(config, output)
self.metadata = {}
for values in self.config.configuration['FileMetadataCheck'].values():
for path, meta in values['metadata'].items():
self.metadata[path] = meta

def check_binary(self, pkg):
"""
TODO: add comment
"""
for filename, pkgfile in pkg.files.items():
if filename in self.metadata:
path = Path(pkgfile.path)
path_stat = path.stat()
meta = self.metadata[filename]

if 'mode' in meta:
mode = stat.filemode(path_stat.st_mode)
if mode != meta['mode']:
self.output.add_info('E', pkg, 'permissions-incorrect-mode', filename,
f'expected:{meta["mode"]}', f'has:{mode}')
if 'owner' in meta:
owner = path.owner()
if owner != meta['owner']:
self.output.add_info('E', pkg, 'permissions-incorrect-owner', filename,
f'expected:{meta["owner"]}', f'has:{owner}')
if 'group' in meta:
group = path.group()
if group != meta['group']:
self.output.add_info('E', pkg, 'permissions-incorrect-group', filename,
f'expected:{meta["group"]}', f'has:{group}')
if 'device_minor' in meta:
device_minor = os.minor(path_stat.st_dev)
if device_minor != meta['device_minor']:
self.output.add_info('E', pkg, 'permissions-incorrect-device-minor', filename,
f'expected:{meta["device_minor"]}', f'has:{device_minor}')
if 'device_major' in meta:
device_major = os.major(path_stat.st_dev)
if device_major != meta['device_major']:
self.output.add_info('E', pkg, 'permissions-incorrect-device-major', filename,
f'expected:{meta["device_major"]}', f'has:{device_major}')
3 changes: 3 additions & 0 deletions rpmlint/configdefaults.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ Checks = [
"FilelistCheck",
"FilesCheck",
"FileDigestCheck",
"FileMetadataCheck",
"IconSizesCheck",
"I18NCheck",
"LogrotateCheck",
Expand Down Expand Up @@ -333,6 +334,8 @@ binaries = false

[FileDigestGroup]

[FileMetadataCheck]

# A table with key/value pairs representing new descriptions for rpmlint errors
[Descriptions]
# rpmlint-error-name = """
Expand Down
7 changes: 7 additions & 0 deletions test/configs/test.config
Original file line number Diff line number Diff line change
Expand Up @@ -102,3 +102,10 @@ digests = [
algorithm = "skip"
},
]

[FileMetadataCheck."boo#2345".metadata."/etc/cron.daily/test-me"]
mode = "crw-rw----"
owner = "root"
group = "tty"
device_minor = 12
device_major = 55
24 changes: 24 additions & 0 deletions test/test_file_metadata.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import pytest
from rpmlint.checks.FileMetadataCheck import FileMetadataCheck
from rpmlint.filter import Filter

from Testing import CONFIG, get_tested_package


@pytest.fixture(scope='function', autouse=True)
def metadatacheck():
CONFIG.info = True
output = Filter(CONFIG)
test = FileMetadataCheck(CONFIG, output)
return output, test


@pytest.mark.parametrize('package', ['binary/file-signature-good'])
def test_signatures(tmpdir, package, metadatacheck):
output, test = metadatacheck
test.check(get_tested_package(package, tmpdir))
out = output.print_results(output.results)
assert 'E: permissions-incorrect-mode /etc/cron.daily/test-me expected:crw-rw---- has:-rw-r--r--' in out
assert 'E: permissions-incorrect-group /etc/cron.daily/test-me expected:tty has:' in out
assert 'E: permissions-incorrect-device-minor /etc/cron.daily/test-me expected:12 has:' in out
assert 'E: permissions-incorrect-device-major /etc/cron.daily/test-me expected:55 has:' in out
1 change: 1 addition & 0 deletions test/test_lint.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
'FilelistCheck',
'FilesCheck',
'FileDigestCheck',
'FileMetadataCheck',
'IconSizesCheck',
'I18NCheck',
'LogrotateCheck',
Expand Down

0 comments on commit b02a935

Please sign in to comment.