From a996f78277d5ba5adccb0daa535bc2494350975c Mon Sep 17 00:00:00 2001 From: srdusr Date: Fri, 26 Sep 2025 12:40:58 +0200 Subject: Initial Commit --- core/__init__.py | 93 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 core/__init__.py (limited to 'core/__init__.py') diff --git a/core/__init__.py b/core/__init__.py new file mode 100644 index 0000000..368a4d7 --- /dev/null +++ b/core/__init__.py @@ -0,0 +1,93 @@ +"""Cerberus Core - Core functionality for the Cerberus password manager. + +This module provides the core functionality for the Cerberus password manager, +including the C core bindings and high-level password management interfaces. +""" + +import os +import cffi +from pathlib import Path +from typing import Optional, Any + +# Initialize CFFI (exported for callers that need to manage buffers) +ffi = cffi.FFI() + +# Load the C header +def _load_header(): + header_path = Path(__file__).parent / 'cerberus.h' + with open(header_path) as f: + # Read and clean up the header for CFFI + lines = [] + for line in f: + # Remove #include directives and other preprocessor commands + if line.startswith('#'): + continue + # Remove C++ style comments + if '//' in line: + line = line.split('//')[0] + '\n' + lines.append(line) + + # Join the cleaned lines and pass to cdef + ffi.cdef('\n'.join(filter(None, lines))) + +# Load the header +_load_header() + +# Try to load the compiled library +_lib = None + +def init() -> bool: + """Initialize the Cerberus C core. + + Returns: + bool: True if initialization was successful, False otherwise + """ + global _lib + + if _lib is not None: + return True + + # Try multiple candidate names + candidates = [ + Path(__file__).parent / 'libcerberus.so', + Path(__file__).parent / 'cerberus.so' + ] + for lib_path in candidates: + try: + _lib = ffi.dlopen(str(lib_path)) + return True + except OSError: + continue + _lib = None + return False + +# Initialize on import +if not init(): + class DummyLib: + def __getattribute__(self, name: str) -> Any: + raise RuntimeError( + "Cerberus C core not initialized. " + "Please ensure the core is compiled and in your library path." + ) + + _lib = DummyLib() + +# Re-export the C functions with proper typing +for name in dir(_lib): + if name.startswith('cerb_'): + globals()[name] = getattr(_lib, name) + +# Clean up the namespace (keep ffi exported) +del os, Path, _load_header, init, DummyLib + +# Export high-level interfaces +from .password_manager import PasswordManager +from .models import PasswordEntry + +__all__ = [ + 'PasswordManager', + 'PasswordEntry', + 'VaultError', + 'CoreNotAvailableError', + 'ffi' +] -- cgit v1.2.3