aboutsummaryrefslogtreecommitdiffstats
path: root/packages/meshbay-hub/src/meshbay_hub/db/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'packages/meshbay-hub/src/meshbay_hub/db/models.py')
-rw-r--r--packages/meshbay-hub/src/meshbay_hub/db/models.py25
1 files changed, 3 insertions, 22 deletions
diff --git a/packages/meshbay-hub/src/meshbay_hub/db/models.py b/packages/meshbay-hub/src/meshbay_hub/db/models.py
index c420661..cdebd3c 100644
--- a/packages/meshbay-hub/src/meshbay_hub/db/models.py
+++ b/packages/meshbay-hub/src/meshbay_hub/db/models.py
@@ -6,7 +6,6 @@ Tables:
nodes — node announcements
groups — group registry
group_members — group membership
- gek_bundles — encrypted GEK per (group, user)
refresh_tokens — hashed refresh tokens
ip_logs — connection log for legal compliance (1-year retention)
"""
@@ -45,15 +44,14 @@ class User(Base):
pw_version: Mapped[int] = mapped_column(Integer, default=1)
pk_ed25519: Mapped[str] = mapped_column(String(64), nullable=False) # base64 raw 32B
pk_x25519: Mapped[str] = mapped_column(String(64), nullable=False) # base64 raw 32B
+ pk_node_ed25519: Mapped[str | None] = mapped_column(String(64), nullable=True) # node daemon key
hub_id: Mapped[str] = mapped_column(String(128), nullable=False)
- keypair_bundle: Mapped[str | None] = mapped_column(Text) # AES-GCM encrypted, web clients only
role: Mapped[str] = mapped_column(String(16), default="user") # user|moderator|admin
status: Mapped[str] = mapped_column(String(16), default="active") # active|suspended|revoked
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_now)
nodes: Mapped[list["Node"]] = relationship(back_populates="user")
group_memberships: Mapped[list["GroupMember"]] = relationship(back_populates="user")
- gek_bundles: Mapped[list["GEKBundle"]] = relationship(back_populates="user")
refresh_tokens: Mapped[list["RefreshToken"]] = relationship(back_populates="user")
ip_logs: Mapped[list["IPLog"]] = relationship(back_populates="user")
@@ -89,11 +87,11 @@ class Group(Base):
admin_id: Mapped[str] = mapped_column(ForeignKey("users.id"), nullable=False)
visibility: Mapped[str] = mapped_column(String(16), default="private") # public|private
join_policy: Mapped[str] = mapped_column(String(16), default="invite") # open|request|invite
- status: Mapped[str] = mapped_column(String(16), default="active") # active|revoked
+ description: Mapped[str | None] = mapped_column(String(512))
+ status: Mapped[str] = mapped_column(String(16), default="active") # active|suspended|revoked
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_now)
members: Mapped[list["GroupMember"]] = relationship(back_populates="group")
- gek_bundles: Mapped[list["GEKBundle"]] = relationship(back_populates="group")
__table_args__ = (Index("ix_groups_name", "name"),)
@@ -109,23 +107,6 @@ class GroupMember(Base):
user: Mapped["User"] = relationship(back_populates="group_memberships")
-# ── GEK bundles ───────────────────────────────────────────────────────────────
-
-class GEKBundle(Base):
- """Encrypted GEK bundle — opaque to the hub (hub cannot decrypt it)."""
- __tablename__ = "gek_bundles"
-
- group_id: Mapped[str] = mapped_column(ForeignKey("groups.id"), primary_key=True)
- user_id: Mapped[str] = mapped_column(ForeignKey("users.id"), primary_key=True)
- pk_eph_b64: Mapped[str] = mapped_column(String(64), nullable=False)
- nonce_b64: Mapped[str] = mapped_column(String(32), nullable=False)
- wrapped_b64: Mapped[str] = mapped_column(String(128), nullable=False)
- stored_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=_now)
-
- group: Mapped["Group"] = relationship(back_populates="gek_bundles")
- user: Mapped["User"] = relationship(back_populates="gek_bundles")
-
-
# ── Refresh tokens ────────────────────────────────────────────────────────────
class RefreshToken(Base):