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
|
2024-11-10 15:13:29 +00:00
|
|
|
|
|
|
|
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
|
2024-11-10 15:13:29 +00:00
|
|
|
from app.models.base import Group
|
2024-12-06 18:02:59 +00:00
|
|
|
from app.models.types import AwareDateTime
|
2024-12-02 00:00:05 +00:00
|
|
|
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]
|
2024-12-06 18:02:59 +00:00
|
|
|
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
|
2022-11-09 15:16:39 +00:00
|
|
|
def onion_name(self) -> str:
|
2024-12-02 00:00:05 +00:00
|
|
|
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):
|
2024-11-10 15:13:29 +00:00
|
|
|
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
|
|
|
|
2024-11-10 15:13:29 +00:00
|
|
|
group: Mapped[Group] = relationship("Group", back_populates="eotks")
|
2022-05-18 15:49:36 +01:00
|
|
|
|
|
|
|
@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
|
|
|
|
)
|