70 lines
2.1 KiB
Python
Executable File
70 lines
2.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
import re
|
|
import ast
|
|
|
|
# Запрещенные QSS-свойства
|
|
FORBIDDEN_PROPERTIES = {
|
|
"box-shadow",
|
|
"backdrop-filter",
|
|
"cursor",
|
|
"text-shadow",
|
|
}
|
|
|
|
# Запрещенные модули и функции
|
|
FORBIDDEN_MODULES = {
|
|
"os",
|
|
"subprocess",
|
|
"shutil",
|
|
"sys",
|
|
"socket",
|
|
"ctypes",
|
|
"pathlib",
|
|
"glob",
|
|
}
|
|
FORBIDDEN_FUNCTIONS = {
|
|
"exec",
|
|
"eval",
|
|
"open",
|
|
"__import__",
|
|
}
|
|
|
|
def check_qss_files():
|
|
has_errors = False
|
|
for qss_file in Path("portprotonqt/themes").glob("**/*.py"):
|
|
with open(qss_file, "r") as f:
|
|
content = f.read()
|
|
|
|
# Проверка на запрещённые QSS-свойства
|
|
for prop in FORBIDDEN_PROPERTIES:
|
|
if re.search(rf"{prop}\s*:", content, re.IGNORECASE):
|
|
print(f"ERROR: Unknown QSS property found '{prop}' in file {qss_file}")
|
|
has_errors = True
|
|
|
|
# Проверка на опасные импорты и функции
|
|
try:
|
|
tree = ast.parse(content)
|
|
for node in ast.walk(tree):
|
|
# Проверка импортов
|
|
if isinstance(node, (ast.Import, ast.ImportFrom)):
|
|
for name in node.names:
|
|
if name.name in FORBIDDEN_MODULES:
|
|
print(f"ERROR: Forbidden module '{name.name}' found in file {qss_file}")
|
|
has_errors = True
|
|
# Проверка вызовов функций
|
|
if isinstance(node, ast.Call):
|
|
if isinstance(node.func, ast.Name) and node.func.id in FORBIDDEN_FUNCTIONS:
|
|
print(f"ERROR: Forbidden function '{node.func.id}' found in file {qss_file}")
|
|
has_errors = True
|
|
except SyntaxError as e:
|
|
print(f"ERROR: Syntax error in file {qss_file}: {e}")
|
|
has_errors = True
|
|
|
|
return has_errors
|
|
|
|
if __name__ == "__main__":
|
|
if check_qss_files():
|
|
sys.exit(1)
|