Skip to content

Commit

Permalink
make challenge resolving function static, fix issues with plugins
Browse files Browse the repository at this point in the history
  • Loading branch information
Miłosz Skaza committed Nov 29, 2023
1 parent 03502da commit b44a090
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 19 deletions.
2 changes: 1 addition & 1 deletion ctfcli/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ def main():
# if the command returns an int, then we serialize it as none to prevent fire from printing it
# (this does not change the actual return value, so it's still good to use as an exit code)
# everything else is returned as is, so fire can print help messages
ret = fire.Fire(CTFCLI, serialize=lambda r: None if isinstance(r, int) else r)
ret = fire.Fire(COMMANDS["cli"], serialize=lambda r: None if isinstance(r, int) else r)

if isinstance(ret, int):
sys.exit(ret)
Expand Down
38 changes: 20 additions & 18 deletions ctfcli/cli/challenges.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def new(self, type: str = "blank") -> int:
def edit(self, challenge: str, dockerfile: bool = False) -> int:
log.debug(f"edit: {challenge} (dockerfile={dockerfile})")

challenge_instance = self._resolve_single_challenge(challenge)
challenge_instance = self.resolve_single_challenge(challenge)
if not challenge_instance:
return 1

Expand Down Expand Up @@ -94,7 +94,7 @@ def show(self, challenge: str, color=True) -> int:
def view(self, challenge: str, color=True) -> int:
log.debug(f"view: {challenge} (color={color})")

challenge_instance = self._resolve_single_challenge(challenge)
challenge_instance = self.resolve_single_challenge(challenge)
if not challenge_instance:
return 1

Expand Down Expand Up @@ -450,13 +450,13 @@ def install(
log.debug(f"install: (challenge={challenge}, force={force}, hidden={hidden}, ignore={ignore})")

if challenge:
challenge_instance = self._resolve_single_challenge(challenge)
challenge_instance = self.resolve_single_challenge(challenge)
if not challenge_instance:
return 1

local_challenges = [challenge_instance]
else:
local_challenges = self._resolve_all_challenges()
local_challenges = self.resolve_all_challenges()

if isinstance(ignore, str):
ignore = (ignore,)
Expand Down Expand Up @@ -527,13 +527,13 @@ def sync(self, challenge: str = None, ignore: Union[str, Tuple[str]] = ()) -> in
log.debug(f"sync: (challenge={challenge}, ignore={ignore})")

if challenge:
challenge_instance = self._resolve_single_challenge(challenge)
challenge_instance = self.resolve_single_challenge(challenge)
if not challenge_instance:
return 1

local_challenges = [challenge_instance]
else:
local_challenges = self._resolve_all_challenges()
local_challenges = self.resolve_all_challenges()

if isinstance(ignore, str):
ignore = (ignore,)
Expand Down Expand Up @@ -588,13 +588,13 @@ def deploy(
log.debug(f"deploy: (challenge={challenge}, host={host}, skip_login={skip_login})")

if challenge:
challenge_instance = self._resolve_single_challenge(challenge)
challenge_instance = self.resolve_single_challenge(challenge)
if not challenge_instance:
return 1

challenges = [challenge_instance]
else:
challenges = self._resolve_all_challenges()
challenges = self.resolve_all_challenges()

deployable_challenges, failed_deployments, failed_syncs = [], [], []

Expand Down Expand Up @@ -727,7 +727,7 @@ def lint(
) -> int:
log.debug(f"lint: (challenge={challenge}, skip_hadolint={skip_hadolint}, flag_format='{flag_format}')")

challenge_instance = self._resolve_single_challenge(challenge)
challenge_instance = self.resolve_single_challenge(challenge)
if not challenge_instance:
return 1

Expand All @@ -745,7 +745,7 @@ def lint(
def healthcheck(self, challenge: Optional[str] = None) -> int:
log.debug(f"healthcheck: (challenge={challenge})")

challenge_instance = self._resolve_single_challenge(challenge)
challenge_instance = self.resolve_single_challenge(challenge)
if not challenge_instance:
return 1

Expand Down Expand Up @@ -817,13 +817,13 @@ def mirror(
)

if challenge:
challenge_instance = self._resolve_single_challenge(challenge)
challenge_instance = self.resolve_single_challenge(challenge)
if not challenge_instance:
return 1

local_challenges = [challenge_instance]
else:
local_challenges = self._resolve_all_challenges()
local_challenges = self.resolve_all_challenges()

if isinstance(ignore, str):
ignore = (ignore,)
Expand Down Expand Up @@ -873,13 +873,13 @@ def verify(self, challenge: str = None, ignore: Tuple[str] = ()) -> int:
log.debug(f"verify: (challenge={challenge}, ignore={ignore})")

if challenge:
challenge_instance = self._resolve_single_challenge(challenge)
challenge_instance = self.resolve_single_challenge(challenge)
if not challenge_instance:
return 1

local_challenges = [challenge_instance]
else:
local_challenges = self._resolve_all_challenges()
local_challenges = self.resolve_all_challenges()

if isinstance(ignore, str):
ignore = (ignore,)
Expand Down Expand Up @@ -938,13 +938,13 @@ def format(self, challenge: Optional[str] = None) -> int:
log.debug(f"format: (challenge={challenge})")

if challenge:
challenge_instance = self._resolve_single_challenge(challenge)
challenge_instance = self.resolve_single_challenge(challenge)
if not challenge_instance:
return 1

challenges = [challenge_instance]
else:
challenges = self._resolve_all_challenges()
challenges = self.resolve_all_challenges()

failed_formats = []
for challenge_instance in challenges:
Expand All @@ -967,7 +967,8 @@ def format(self, challenge: Optional[str] = None) -> int:

return 1

def _resolve_single_challenge(self, challenge: Optional[str] = None) -> Optional[Challenge]:
@staticmethod
def resolve_single_challenge(challenge: Optional[str] = None) -> Optional[Challenge]:
# if a challenge is specified
if challenge:
# check if it's a path to challenge.yml, or the current directory
Expand All @@ -992,7 +993,8 @@ def _resolve_single_challenge(self, challenge: Optional[str] = None) -> Optional
click.secho(str(e), fg="red")
return

def _resolve_all_challenges(self) -> List[Challenge]:
@staticmethod
def resolve_all_challenges() -> List[Challenge]:
config = Config()
challenge_keys = config.challenges.keys()

Expand Down
3 changes: 3 additions & 0 deletions ctfcli/core/plugins.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ def load_plugins(commands: Dict):
sys.path.insert(0, str(plugins_path.absolute()))

for plugin in sorted(plugins_path.iterdir()):
if plugin.name.startswith("_"):
continue

plugin_path = plugins_path / plugin / "__init__.py"

log.debug(f"Loading plugin '{plugin}' from '{plugin_path}'")
Expand Down

0 comments on commit b44a090

Please sign in to comment.