bugbounty_gpt/env.py (43 lines of code) (raw):

import os import yaml import re import logging logger = logging.getLogger(__name__) def load_config() -> dict: """Loads the configuration from the YAML file.""" config_path = os.path.join(os.path.dirname(__file__), '../config.yaml') with open(config_path, 'r') as file: return yaml.safe_load(file) def sanitize_category(category: str) -> str: """Sanitizes a single category name to ensure it is a valid Python identifier.""" return re.sub(r'\W|^(?=\d)', '_', category).upper().strip() def sanitize_categories(categories: list) -> list: """Sanitizes a list of category names using sanitize_category.""" return [sanitize_category(category) for category in categories] def validate_valid_categories(config: dict): """Checks that the 'valid' categories are defined in the configuration.""" if 'valid' not in config['categories']: raise ValueError("Missing 'valid' categories in configuration.") def validate_response_categories_subset(config: dict): """Ensures that the response categories are a subset of the valid categories.""" valid_categories = set(config['categories']['valid']) response_categories = {item['name'] for item in config['categories']['response']} if not response_categories.issubset(valid_categories): raise ValueError('Response categories must be a subset of valid categories.') def validate_response_pairs(config: dict): """Ensures that each response category contains both a 'name' and 'response' key.""" for item in config['categories']['response']: if 'name' not in item or 'response' not in item: raise ValueError("Each response category must contain 'name' and 'response' keys.") def validate_config(config: dict): """Validates the entire configuration.""" validate_valid_categories(config) validate_response_categories_subset(config) validate_response_pairs(config) CONFIG = load_config() # API settings API_BASE_URL = CONFIG['api']['base_url'] BUGCROWD_API_KEY = os.getenv('BUGCROWD_API_KEY') OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") OPENAI_MODEL = CONFIG['api']['openai_model'] # Database settings SQLALCHEMY_URL = os.getenv("SQLALCHEMY_URL") # Other user-specific settings USER_ID = CONFIG['user']['user_id'] FILTER_PROGRAM = CONFIG['user']['filter_program'] # OpenAI Prompt OPENAI_PROMPT = CONFIG['openai_prompt'] # Categories & Responses VALID_CATEGORIES = sanitize_categories(CONFIG['categories']['valid']) RESPONSE_CATEGORIES = sanitize_categories([item['name'] for item in CONFIG['categories']['response']]) DEFAULT_CATEGORY = sanitize_category(CONFIG['categories']['default']) RESPONSES = {sanitize_category(item['name']): item['response'] for item in CONFIG['categories']['response']} validate_config(CONFIG)