majuna/app/models/onions.py

85 lines
2.3 KiB
Python
Raw Normal View History

2024-12-06 13:34:44 +00:00
from datetime import datetime
2024-11-10 21:41:54 +00:00
from typing import Optional, TypedDict
from sqlalchemy.orm import Mapped, mapped_column, relationship
2022-11-09 13:36:12 +00:00
2022-06-15 11:50:15 +01:00
from app.brm.brn import BRN
2022-05-04 15:36:36 +01:00
from app.extensions import db
from app.models import AbstractConfiguration, AbstractResource
from app.models.base import Group
from app.models.types import AwareDateTime
from app.util.onion import onion_hostname
2022-05-04 15:36:36 +01:00
2024-11-10 21:41:54 +00:00
class OnionDict(TypedDict):
2024-12-06 13:34:44 +00:00
Added: str
CertExpiry: str
CertSans: str
Description: str
2024-11-10 21:41:54 +00:00
DomainName: str
2024-12-06 13:34:44 +00:00
GroupId: int
GroupName: str
Id: int
2024-11-10 21:41:54 +00:00
OnionName: str
2024-12-06 13:34:44 +00:00
Updated: str
2024-11-10 21:41:54 +00:00
2022-05-04 15:36:36 +01:00
class Onion(AbstractConfiguration):
2022-11-08 14:23:32 +00:00
@property
def brn(self) -> BRN:
return BRN(
group_id=self.group_id,
product="eotk",
provider="*",
resource_type="onion",
resource_id=self.onion_name
)
2024-12-06 13:34:44 +00:00
group_id: Mapped[int] = mapped_column(db.ForeignKey("group.id"))
domain_name: Mapped[str]
cert_expiry: Mapped[datetime] = mapped_column(AwareDateTime())
2024-12-06 13:34:44 +00:00
cert_sans: Mapped[str]
onion_public_key: Mapped[bytes]
onion_private_key: Mapped[bytes]
tls_public_key: Mapped[bytes]
tls_private_key: Mapped[bytes]
2022-11-09 13:36:12 +00:00
2022-05-04 15:36:36 +01:00
group = db.relationship("Group", back_populates="onions")
2022-11-09 13:36:12 +00:00
@property
def onion_name(self) -> str:
return onion_hostname(self.onion_public_key)
2022-11-09 13:36:12 +00:00
2024-11-10 21:41:54 +00:00
def to_dict(self) -> OnionDict:
return {
2024-12-06 13:34:44 +00:00
"Added": self.added.isoformat(),
2024-11-10 21:41:54 +00:00
"Id": self.id,
2024-12-06 13:34:44 +00:00
"CertExpiry": self.cert_expiry.isoformat(),
"CertSans": self.cert_sans,
"Description": self.description,
2024-11-10 21:41:54 +00:00
"DomainName": self.domain_name,
2024-12-06 13:34:44 +00:00
"GroupId": self.group_id,
"GroupName": self.group.group_name,
2024-11-10 21:41:54 +00:00
"OnionName": self.onion_name,
2024-12-06 13:34:44 +00:00
"Updated": self.updated.isoformat(),
2024-11-10 21:41:54 +00:00
}
2022-05-04 15:36:36 +01:00
class Eotk(AbstractResource):
group_id: Mapped[int] = mapped_column(db.Integer(), db.ForeignKey("group.id"))
instance_id: Mapped[Optional[str]]
provider: Mapped[str]
region: Mapped[str]
2022-05-04 15:36:36 +01:00
group: Mapped[Group] = relationship("Group", back_populates="eotks")
@property
2022-06-15 11:50:15 +01:00
def brn(self) -> BRN:
return BRN(
group_id=self.group_id,
provider=self.provider,
product="eotk",
resource_type="instance",
resource_id=self.region
)