from __future__ import annotations
from typing import List, cast
from . import htb
from .errors import IncorrectFlagException
[docs]class Fortress(htb.HTBObject):
"""The class representing Hack The Box fortresses
Attributes:
id: The ID of the Fortress
name: The name of the Fortress
image: The relative URL of the Fortress' image
num_flags: The number of available flags
reset_votes: The number of votes to reset the Fortress
progress: The active user's progress through the Fortress, out of 100
flags: The list of flags available
company: The Fortress' associated Company
ip: IP address the Fortress can be contacted on
"""
name: str
image: str
num_flags: int
_detailed_attributes = ("reset_votes", "progress", "flags", "company", "ip")
reset_votes: int
progress: int
flags: List
company: Company
ip: str
[docs] def submit(self, flag: str):
"""Submits a flag for an Fortress
Args:
flag: The flag for the Fortress
"""
submission = cast(
dict,
self._client.do_request(
f"fortress/{self.id}/flag",
json_data={
"flag": flag,
},
),
)
if submission["message"] == "Wrong flag":
raise IncorrectFlagException
return True
def __repr__(self):
return f"<Fortress '{self.name}'>"
def __init__(self, data: dict, client: htb.HTBClient, summary=False):
self._client = client
self._detailed_func = client.get_fortress # type: ignore
self.id = data["id"]
self.name = data["name"]
self.image = data["image"]
if summary:
self.num_flags = data["number_of_flags"]
self._is_summary = True
else:
self.num_flags = len(data["flags"])
self.company = Company(data["company"])
self.reset_votes = data["reset_votes"]
self.progress = data["progress_percent"]
self.flags = data["flags"]
self.ip = data["ip"]
class Company:
"""Representation of a company registered on Hack The Box
Attributes:
id: The Company ID
name: The Company name
description: The Company description
url: The Company website
image: The Company logo
"""
id: int
name: str
description: str
url: str
image: str
def __init__(self, data: dict):
self.id = data["id"]
self.name = data["name"]
self.description = data["description"]
self.url = data["url"]
self.image = data["image"]