Source code for actingweb.handlers.meta

import json
import logging

from actingweb.handlers import base_handler

logger = logging.getLogger(__name__)


[docs] class MetaHandler(base_handler.BaseHandler):
[docs] def get(self, actor_id, path): # Meta endpoint allows unauthenticated access but still needs actor data myself = self.get_actor_allow_unauthenticated(actor_id, "meta", path) if not myself: return # Response already set trustee_root = myself.store.trustee_root if myself.store else None if not trustee_root: trustee_root = "" if not path: values = { "id": actor_id, "type": self.config.aw_type, "version": self.config.version, "desc": self.config.desc, "info": self.config.info, "trustee_root": trustee_root, "specification": self.config.specification, "aw_version": self.config.aw_version, "aw_supported": self.config.aw_supported, "aw_formats": self.config.aw_formats, } # Add supported trust types if available try: from ..trust_type_registry import get_registry registry = get_registry(self.config) trust_types = registry.list_types() if trust_types: # Convert trust types to a simple list of names for the meta endpoint supported_trust_types = [ trust_type.name for trust_type in trust_types ] values["aw_trust_types"] = supported_trust_types except Exception: # If trust type registry is not available, don't include trust types pass out = json.dumps(values) if self.response: self.response.write(out) self.response.headers["Content-Type"] = "application/json" return elif path == "id": out = actor_id elif path == "type": out = self.config.aw_type elif path == "version": out = self.config.version elif path == "desc": out = self.config.desc + (myself.id or "") elif path == "info": out = self.config.info elif path == "trustee_root": out = trustee_root elif path == "specification": out = self.config.specification elif path == "actingweb/version": out = self.config.aw_version elif path == "actingweb/supported": out = self.config.aw_supported elif path == "actingweb/formats": out = self.config.aw_formats elif path == "actingweb/trust_types": # Dedicated endpoint for supported trust types with more details try: from ..trust_type_registry import get_registry registry = get_registry(self.config) trust_types = registry.list_types() if trust_types: # Return detailed trust type information trust_type_details = [] for trust_type in trust_types: trust_type_details.append( { "name": trust_type.name, "display_name": trust_type.display_name, "description": getattr(trust_type, "description", ""), "created_by": trust_type.created_by, } ) out = json.dumps(trust_type_details) else: out = json.dumps([]) except Exception as e: logger.error(f"Error retrieving trust types: {e}") out = json.dumps([]) if self.response: self.response.write(out) self.response.headers["Content-Type"] = "application/json" return elif path == "trusttypes": # Trust types endpoint - returns available trust types (unauthenticated) try: from ..trust_type_registry import get_registry registry = get_registry(self.config) trust_types = registry.list_types() trust_types_dict: dict[str, dict[str, str]] = {} default_type = None if trust_types: for trust_type in trust_types: trust_types_dict[trust_type.name] = { "display_name": trust_type.display_name, "description": getattr(trust_type, "description", ""), } default_type = trust_types[0].name if trust_types else None # Fall back to config.trust_types if registry is empty if not trust_types_dict and hasattr(self.config, "trust_types"): config_types = getattr(self.config, "trust_types", {}) if config_types: for name, type_data in config_types.items(): trust_types_dict[name] = { "display_name": type_data.get( "display_name", type_data.get("name", name) ), "description": type_data.get("description", ""), } default_type = getattr(self.config, "default_trust_type", None) result = { "trust_types": trust_types_dict, "default_trust_type": default_type, } out = json.dumps(result) except Exception as e: logger.error(f"Error retrieving trust types: {e}") out = json.dumps({"trust_types": {}, "default_trust_type": None}) if self.response: self.response.write(out) self.response.headers["Content-Type"] = "application/json" return else: if self.response: self.response.set_status(404) return if self.response: self.response.write(out)