Files
microdao-daarion/infrastructure/matrix-gateway/gateway/rbac.py
Apple a0c3c0cbb5 🚀 Matrix Gateway: базова реалізація v1
- Matrix Client (підключення та синхронізація)
- RBAC Checker (перевірка прав через Postgres)
- Job Creator (створення jobs з команд)
- NATS Publisher (публікація jobs у streams)
- K8s deployment
- README з документацією

Команди: !embed, !retrieve, !summarize

TODO: Реальна інтеграція з Matrix homeserver, статуси результатів
2026-01-10 10:40:18 -08:00

79 lines
3.1 KiB
Python

"""
RBAC Checker — перевірка прав доступу через Postgres
"""
import asyncpg
from typing import Optional
class RBACChecker:
def __init__(self, postgres_url: str):
self.postgres_url = postgres_url
self.pool: Optional[asyncpg.Pool] = None
async def connect(self):
"""Підключення до Postgres"""
if not self.postgres_url:
print("⚠️ POSTGRES_URL не встановлено, RBAC вимкнено")
return
try:
self.pool = await asyncpg.create_pool(self.postgres_url)
await self._ensure_table()
print("✅ Підключено до Postgres для RBAC")
except Exception as e:
print(f"❌ Помилка підключення до Postgres: {e}")
self.pool = None
async def disconnect(self):
"""Відключення від Postgres"""
if self.pool:
await self.pool.close()
print("✅ Відключено від Postgres")
async def _ensure_table(self):
"""Створення таблиці для RBAC якщо не існує"""
async with self.pool.acquire() as conn:
await conn.execute("""
CREATE TABLE IF NOT EXISTS matrix_rbac (
user_id VARCHAR(255) PRIMARY KEY,
permissions TEXT[] NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_matrix_rbac_user_id
ON matrix_rbac(user_id);
""")
# Додаємо дефолтний користувач (якщо потрібно)
# await conn.execute("""
# INSERT INTO matrix_rbac (user_id, permissions)
# VALUES ($1, $2)
# ON CONFLICT (user_id) DO NOTHING
# """, "@admin:matrix.org", ["execute_job", "admin"])
async def check_permission(self, user_id: str, permission: str) -> bool:
"""Перевірка прав доступу"""
if not self.pool:
# Якщо Postgres не підключено, дозволяємо всім (dev режим)
return True
try:
async with self.pool.acquire() as conn:
row = await conn.fetchrow(
"SELECT permissions FROM matrix_rbac WHERE user_id = $1",
user_id
)
if not row:
# Користувач не знайдено - за замовчуванням заборонено
return False
permissions = row["permissions"]
return permission in permissions or "admin" in permissions
except Exception as e:
print(f"❌ Помилка перевірки RBAC: {e}")
return False