Merge branch 'main' into security
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2025-09-07 14:22:04 +09:00
16 changed files with 1051 additions and 133 deletions

View File

@@ -1,10 +1,16 @@
<<<<<<< HEAD
from datetime import datetime
from sqlalchemy import Column, Integer, String, ForeignKey, Text
=======
from sqlalchemy import Column, Integer, String, ForeignKey, Text, DateTime, Boolean
>>>>>>> main
from sqlalchemy.orm import relationship
from db import Base
from datetime import datetime
<<<<<<< HEAD
class ActionLog(Base):
__tablename__ = 'action_logs'
id = Column(Integer, primary_key=True)
@@ -13,6 +19,36 @@ class ActionLog(Base):
details = Column(String)
timestamp = Column(String, default=lambda: datetime.utcnow().isoformat())
=======
# Битовые флаги прав
SCOPE_POST = 1 # право постить
SCOPE_MANAGE_BTNS = 2 # право управлять кнопками (опционально)
SCOPE_SHARE = 4 # право делиться дальше (опционально)
class ChannelAccess(Base):
__tablename__ = "channel_accesses"
id = Column(Integer, primary_key=True)
channel_id = Column(Integer, ForeignKey("channels.id"), nullable=False)
# Кто выдал доступ (владелец/менеджер с SCOPE_SHARE)
invited_by_admin_id = Column(Integer, ForeignKey("admins.id"), nullable=False)
# Кому выдан доступ (заполняется при активации, до активации = NULL)
invited_admin_id = Column(Integer, ForeignKey("admins.id"), nullable=True)
# Безопасно: храним ХЭШ токена приглашения (сам токен не храним)
token_hash = Column(String, nullable=False)
scopes = Column(Integer, default=SCOPE_POST, nullable=False) # битовая маска
status = Column(String, default="pending", nullable=False) # pending|active|revoked|expired
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
accepted_at = Column(DateTime, nullable=True)
revoked_at = Column(DateTime, nullable=True)
expires_at = Column(DateTime, nullable=True)
channel = relationship("Channel", foreign_keys=[channel_id])
>>>>>>> main
class Admin(Base):
__tablename__ = 'admins'
id = Column(Integer, primary_key=True)