# Copyright (C) 2025 James Brotosky, Brandon Wickline # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published # by the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import logging from services.agenthandler import selectAgents from services.API import AirlockAPIWrapper from utils.selector import Selector from utils.utils import colorText, get_sanitized_input logger = logging.getLogger(__name__) def generate(api: AirlockAPIWrapper): otp_dict = {} agents = selectAgents(api) print(colorText("Would you like to continue with these devices?","white")) for agent in agents: print(agent.hostname) confirm = Selector.confirm() if agents and confirm: requester = get_sanitized_input("Who is requesting the OTP: ") because = get_sanitized_input("Why/What work are they doing?: ") purpose = f"Requester: {requester} - for : {because}" possible_durations = [15, 60, 360, 1440, 10080] print(colorText("Please select a duration in minutes: ", "white")) print(colorText("15 mins, 60 mins, 360 mins(6 Hours), 1440 mins (24 Hours), 10080 mins (7 Days):", "white")) duration_selected = Selector.select_int(possible_durations) if isinstance(duration_selected, list): duration_selected = duration_selected[0] if duration_selected else None if duration_selected is not None: for agent in agents: otp_code = api.otp_generate(agent.agentid, duration_selected, purpose) logger.info(f"Generated OTP for {agent.hostname}: {otp_code}") otp_dict[agent.hostname] = otp_code return otp_dict def otp_activities_by_agent(api: AirlockAPIWrapper): agents = selectAgents(api) otp_dict = {} for agent in agents: otp_info = api.otp_find_by_agent(agent.agentid) otp_dict[agent.hostname] = otp_info return otp_dict def revoke(api: AirlockAPIWrapper): otp_dict = otp_activities_by_agent(api) list_to_revoke = [entry["otpid"] for entry in otp_dict] if otp_dict and list_to_revoke: for revokee in list_to_revoke: api.otp_revoke(revokee)