# 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 . # TODO Continue implementing logger # TODO Add input sanitation and CSV injection prevention # TODO Continue OTP and Local approval rewrites # TODO Explore pywin32 # TODO Fix Requirements.txt # TODO Create Generic system_config.json for gitea import logging import os import tempfile import dotenv import urllib3 from services.API import AirlockAPIWrapper from services.security import getAPI from TUI.TUI import run_Loxide from utils.setup import get_base_directory, setup from utils.utils import irtang urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) def main(): if "NUITKA_ONEFILE_PARENT" in os.environ: splash_filename = os.path.join( tempfile.gettempdir(), f"onefile_{int(os.environ['NUITKA_ONEFILE_PARENT'])}_splash_feedback.tmp", ) if os.path.exists(splash_filename): os.unlink(splash_filename) irtang() # Determine working directory, setup directory, configure logging, sent env, get API and URL if not already stored setup() base_dir = get_base_directory() logger = logging.getLogger(__name__) dotenv.load_dotenv(dotenv_path=base_dir / ".env") try: url = os.getenv("URL") username = os.getenv("USERNAME") if not url: raise ValueError("Missing URL in environment variables.") if not username: raise ValueError("Missing USERNAME in environment variables.") logger.debug(f"Retrieved URL: {url}") logger.debug(f"Retrieved Username: {username}") except ValueError as e: logger.error(f"Configuration error: {e}", exc_info=True) raise api_key = getAPI(username, "Loxide") if api_key is None: raise ValueError("API key for Loxide is missing.") api = AirlockAPIWrapper( base_url=str(os.getenv("URL")), api_key=api_key, ) run_Loxide(api) if __name__ == "__main__": main()