Dotfiles_ArchAP/tests/clipboard/test_privacy.py

43 lines
2.1 KiB
Python

"""Permission and diagnostic regressions with synthetic files only."""
import importlib.util
import os
from pathlib import Path
import subprocess
import sys
import tempfile
import unittest
from unittest.mock import patch
SOURCE=Path(__file__).resolve().parents[2]/'quickshell/.config/quickshell/labfy-sway/clipboard/backend.py'
spec=importlib.util.spec_from_file_location('clipboard_privacy',SOURCE)
b=importlib.util.module_from_spec(spec);spec.loader.exec_module(b)
class Privacy(unittest.TestCase):
def test_database_mode_is_tightened_without_content_change(self):
with tempfile.TemporaryDirectory() as directory:
p=Path(directory)/'db';p.write_bytes(b'TEST_ONLY');p.chmod(0o644)
b.command(str(p),'list')
self.assertEqual(p.stat().st_mode&0o777,0o600)
self.assertEqual(p.read_bytes(),b'TEST_ONLY')
def test_symlink_database_rejected_without_touching_target(self):
with tempfile.TemporaryDirectory() as directory:
target=Path(directory)/'sentinel';target.write_bytes(b'TEST_ONLY');target.chmod(0o644)
db=Path(directory)/'db';db.symlink_to(target)
r=subprocess.run([sys.executable,'-B',str(SOURCE),'list','--db-path',str(db)],capture_output=True,text=True)
self.assertNotEqual(r.returncode,0)
self.assertNotIn('TEST_ONLY',r.stdout+r.stderr)
self.assertNotIn(str(target),r.stdout+r.stderr)
self.assertEqual(target.stat().st_mode&0o777,0o644)
def test_thumbnail_symlink_and_insecure_runtime_rejected(self):
with tempfile.TemporaryDirectory() as directory:
root=Path(directory)
with patch.dict(os.environ,LABFY_CLIPHIST_TEST_CACHE_DIR=directory):
(root/('labfy-cliphist-panel-'+str(os.getuid()))).symlink_to(root,target_is_directory=True)
with self.assertRaises((RuntimeError,OSError)):b.cache_dir()
root.chmod(0o755)
with patch.dict(os.environ,LABFY_CLIPHIST_TEST_CACHE_DIR=directory):
with self.assertRaises((RuntimeError,OSError)):b.cache_dir()
if __name__=='__main__':unittest.main()