2022-04-22 14:01:16 +01:00
|
|
|
from datetime import datetime
|
2022-05-16 11:44:03 +01:00
|
|
|
from typing import List
|
2022-04-22 14:01:16 +01:00
|
|
|
|
2023-01-21 15:15:07 +00:00
|
|
|
from app.brm.brn import BRN
|
2022-05-17 08:28:37 +01:00
|
|
|
from app.extensions import db
|
2022-04-22 14:01:16 +01:00
|
|
|
from app.models import AbstractConfiguration
|
|
|
|
|
|
|
|
|
|
|
|
class Group(AbstractConfiguration):
|
|
|
|
group_name = db.Column(db.String(80), unique=True, nullable=False)
|
|
|
|
eotk = db.Column(db.Boolean())
|
|
|
|
|
|
|
|
origins = db.relationship("Origin", back_populates="group")
|
|
|
|
bridgeconfs = db.relationship("BridgeConf", back_populates="group")
|
2022-05-04 15:36:36 +01:00
|
|
|
eotks = db.relationship("Eotk", back_populates="group")
|
|
|
|
onions = db.relationship("Onion", back_populates="group")
|
2022-05-24 19:51:38 +01:00
|
|
|
smart_proxies = db.relationship("SmartProxy", back_populates="group")
|
2022-09-26 13:40:59 +01:00
|
|
|
pools = db.relationship("Pool", secondary="pool_group", back_populates="groups")
|
2022-04-22 14:01:16 +01:00
|
|
|
|
|
|
|
@classmethod
|
2022-05-16 11:44:03 +01:00
|
|
|
def csv_header(cls) -> List[str]:
|
2022-04-22 14:01:16 +01:00
|
|
|
return super().csv_header() + [
|
|
|
|
"group_name", "eotk"
|
|
|
|
]
|
|
|
|
|
2023-01-21 15:15:07 +00:00
|
|
|
@property
|
|
|
|
def brn(self) -> BRN:
|
|
|
|
return BRN(
|
|
|
|
group_id=self.id,
|
|
|
|
product="group",
|
|
|
|
provider="",
|
|
|
|
resource_type="group",
|
|
|
|
resource_id=str(self.id)
|
|
|
|
)
|
|
|
|
|
2022-04-22 14:01:16 +01:00
|
|
|
|
2022-09-26 13:40:59 +01:00
|
|
|
class Pool(AbstractConfiguration):
|
|
|
|
pool_name = db.Column(db.String(80), unique=True, nullable=False)
|
2022-12-21 19:27:46 +00:00
|
|
|
api_key = db.Column(db.String(80), nullable=False)
|
2023-01-18 10:25:34 +00:00
|
|
|
redirector_domain = db.Column(db.String(128), nullable=True)
|
2022-09-26 13:40:59 +01:00
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def csv_header(cls) -> List[str]:
|
|
|
|
return super().csv_header() + [
|
|
|
|
"pool_name"
|
|
|
|
]
|
|
|
|
|
|
|
|
proxies = db.relationship("Proxy", back_populates="pool")
|
|
|
|
lists = db.relationship("MirrorList", back_populates="pool")
|
|
|
|
groups = db.relationship("Group", secondary="pool_group", back_populates="pools")
|
|
|
|
|
2023-01-21 15:15:07 +00:00
|
|
|
@property
|
|
|
|
def brn(self) -> BRN:
|
|
|
|
return BRN(
|
|
|
|
group_id=0,
|
|
|
|
product="pool",
|
|
|
|
provider="",
|
|
|
|
resource_type="pool",
|
|
|
|
resource_id=str(self.pool_name)
|
|
|
|
)
|
|
|
|
|
2022-09-26 13:40:59 +01:00
|
|
|
|
2022-11-02 14:25:59 +00:00
|
|
|
class PoolGroup(db.Model): # type: ignore[name-defined,misc]
|
2022-09-26 13:40:59 +01:00
|
|
|
pool_id = db.Column(db.Integer, db.ForeignKey("pool.id"), primary_key=True)
|
|
|
|
group_id = db.Column(db.Integer, db.ForeignKey("group.id"), primary_key=True)
|
|
|
|
|
|
|
|
|
2022-04-22 14:01:16 +01:00
|
|
|
class MirrorList(AbstractConfiguration):
|
2022-09-26 13:40:59 +01:00
|
|
|
pool_id = db.Column(db.Integer, db.ForeignKey("pool.id"))
|
2022-04-22 14:01:16 +01:00
|
|
|
provider = db.Column(db.String(255), nullable=False)
|
|
|
|
format = db.Column(db.String(20), nullable=False)
|
2022-05-16 17:09:33 +01:00
|
|
|
encoding = db.Column(db.String(20), nullable=False)
|
2022-04-22 14:01:16 +01:00
|
|
|
container = db.Column(db.String(255), nullable=False)
|
|
|
|
branch = db.Column(db.String(255), nullable=False)
|
2022-05-11 16:12:52 +01:00
|
|
|
role = db.Column(db.String(255), nullable=True)
|
2022-04-22 14:01:16 +01:00
|
|
|
filename = db.Column(db.String(255), nullable=False)
|
|
|
|
|
2022-09-26 13:40:59 +01:00
|
|
|
pool = db.relationship("Pool", back_populates="lists")
|
|
|
|
|
2022-05-12 17:03:26 +01:00
|
|
|
providers_supported = {
|
|
|
|
"github": "GitHub",
|
|
|
|
"gitlab": "GitLab",
|
2022-11-08 14:31:45 +00:00
|
|
|
"http_post": "HTTP POST",
|
2022-05-12 17:03:26 +01:00
|
|
|
"s3": "AWS S3",
|
|
|
|
}
|
|
|
|
|
|
|
|
formats_supported = {
|
|
|
|
"bc2": "Bypass Censorship v2",
|
|
|
|
"bc3": "Bypass Censorship v3",
|
|
|
|
"bca": "Bypass Censorship Analytics",
|
2022-12-21 19:27:46 +00:00
|
|
|
"bridgelines": "Tor Bridge Lines",
|
|
|
|
"rdr": "Redirector Data"
|
2022-05-12 17:03:26 +01:00
|
|
|
}
|
|
|
|
|
2022-05-16 17:09:33 +01:00
|
|
|
encodings_supported = {
|
|
|
|
"json": "JSON (Plain)",
|
|
|
|
"jsno": "JSON (Obfuscated)",
|
|
|
|
"js": "JavaScript (Plain)",
|
|
|
|
"jso": "JavaScript (Obfuscated)"
|
|
|
|
}
|
|
|
|
|
2022-05-16 11:44:03 +01:00
|
|
|
def destroy(self) -> None:
|
2022-04-22 14:01:16 +01:00
|
|
|
self.destroyed = datetime.utcnow()
|
|
|
|
self.updated = datetime.utcnow()
|
|
|
|
|
2022-05-16 11:44:03 +01:00
|
|
|
def url(self) -> str:
|
2022-04-22 14:01:16 +01:00
|
|
|
if self.provider == "gitlab":
|
|
|
|
return f"https://gitlab.com/{self.container}/-/raw/{self.branch}/{self.filename}"
|
|
|
|
if self.provider == "github":
|
|
|
|
return f"https://raw.githubusercontent.com/{self.container}/{self.branch}/{self.filename}"
|
|
|
|
if self.provider == "s3":
|
|
|
|
return f"s3://{self.container}/{self.filename}"
|
2022-11-08 14:31:45 +00:00
|
|
|
if self.provider == "http_post":
|
2022-11-09 15:16:39 +00:00
|
|
|
return str(self.container)
|
2022-05-16 11:44:03 +01:00
|
|
|
return "Unknown provider"
|
2022-04-22 14:01:16 +01:00
|
|
|
|
|
|
|
@classmethod
|
2022-05-16 11:44:03 +01:00
|
|
|
def csv_header(cls) -> List[str]:
|
2022-04-22 14:01:16 +01:00
|
|
|
return super().csv_header() + [
|
|
|
|
"provider", "format", "container", "branch", "filename"
|
|
|
|
]
|
2023-01-21 15:15:07 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
def brn(self) -> BRN:
|
|
|
|
return BRN(
|
|
|
|
group_id=0,
|
|
|
|
product="list",
|
|
|
|
provider=self.provider,
|
|
|
|
resource_type="list",
|
|
|
|
resource_id=str(self.id)
|
|
|
|
)
|