Found vehicle: passkeys-1.0.0-pl/MODX/Revolution/modPlugin/3e5733bd6ac584b5ae506a764033532c.vehicle
Vehicle Data:
Array
(
    [unique_key] => name
    [preserve_keys] => 
    [update_object] => 1
    [related_objects] => Array
        (
            [PluginEvents] => Array
                (
                    [0a4bf199b92097bc6e8102741dcf2f76] => Array
                        (
                            [preserve_keys] => 1
                            [update_object] => 
                            [unique_key] => Array
                                (
                                    [0] => pluginid
                                    [1] => event
                                )

                            [class] => MODX\Revolution\modPluginEvent
                            [object] => {"pluginid":0,"event":"OnManagerLoginFormPrerender","priority":0,"propertyset":0}
                            [guid] => 9f3bdc13f0c734ee0bcc07d08730329c
                            [native_key] => Array
                                (
                                    [0] => 0
                                    [1] => OnManagerLoginFormPrerender
                                )

                            [signature] => 4baf63d4cd3064d170d5368322002e07
                        )

                    [7eafbe0fda8b4e3fe71f821764272d9a] => Array
                        (
                            [preserve_keys] => 1
                            [update_object] => 
                            [unique_key] => Array
                                (
                                    [0] => pluginid
                                    [1] => event
                                )

                            [class] => MODX\Revolution\modPluginEvent
                            [object] => {"pluginid":0,"event":"OnManagerAuthentication","priority":0,"propertyset":0}
                            [guid] => 7c5dec36a8028b38667cbfa12610fa46
                            [native_key] => Array
                                (
                                    [0] => 0
                                    [1] => OnManagerAuthentication
                                )

                            [signature] => 0eff7e1aa1f9d6fdddcadc8faebbd01d
                        )

                )

        )

    [related_object_attributes] => Array
        (
            [PluginEvents] => Array
                (
                    [preserve_keys] => 1
                    [update_object] => 
                    [unique_key] => Array
                        (
                            [0] => pluginid
                            [1] => event
                        )

                )

        )

    [namespace] => passkeys
    [guid] => 36cd39903d7eea00ebd5d3141d632d48
    [package] => 
    [class] => MODX\Revolution\modPlugin
    [signature] => 3e5733bd6ac584b5ae506a764033532c
    [native_key] => 
    [object] => {"id":null,"source":0,"property_preprocess":0,"name":"Passkeys","description":"Passkeys (WebAuthn\/FIDO2) authentication plugin for MODX Revolution 3","editor_type":0,"category":0,"cache_type":0,"plugincode":"\/**\n * Passkeys Plugin for MODX Revolution 3\n *\n * Events: OnManagerLoginFormPrerender, OnManagerAuthentication\n *\n * @var modX $modx\n * @var array $scriptProperties\n *\/\n\nuse Passkeys\\Passkeys;\nuse Passkeys\\Model\\modUserPasskey;\n\n\/\/ Use MODX_CORE_PATH directly to guarantee correct physical path on Linux\/shared hosting\n$corePath = MODX_CORE_PATH . 'components\/passkeys\/';\n\nif (file_exists($corePath . 'vendor\/autoload.php')) {\n    require_once $corePath . 'vendor\/autoload.php';\n}\n\nspl_autoload_register(function ($class) use ($corePath) {\n    $prefix = 'Passkeys\\\\';\n    $baseDir = $corePath . 'src\/';\n    $len = strlen($prefix);\n    if (strncmp($prefix, $class, $len) !== 0) {\n        return;\n    }\n    $relativeClass = substr($class, $len);\n    $file = $baseDir . str_replace('\\\\', '\/', $relativeClass) . '.php';\n    if (file_exists($file)) {\n        require_once $file;\n    }\n});\n\n$modx->addPackage('Passkeys\\\\Model', $corePath . 'src\/');\n$passkeys = new Passkeys($modx);\n\nswitch ($modx->event->name) {\n    case 'OnManagerLoginFormPrerender':\n        $assetsUrl = $passkeys->config['assetsUrl'];\n        if (isset($modx->controller)) {\n            $modx->controller->addCss($assetsUrl . 'css\/mgr\/main.css');\n            $modx->controller->addJavascript($assetsUrl . 'js\/mgr\/login.js');\n        }\n        $html = '<link rel=\"stylesheet\" type=\"text\/css\" href=\"' . $assetsUrl . 'css\/mgr\/main.css\" \/>' . \"\\n\";\n        $html .= '<script type=\"text\/javascript\">var passkeysAssetsUrl = \"' . $assetsUrl . '\";<\/script>' . \"\\n\";\n        $html .= '<script type=\"text\/javascript\" src=\"' . $assetsUrl . 'js\/mgr\/login.js\"><\/script>' . \"\\n\";\n        $modx->event->output($html);\n        break;\n\n    case 'OnManagerAuthentication':\n        \/\/ Check if WebAuthn assertion payload is submitted\n        if (!empty($_POST['passkey_login']) && !empty($_POST['passkey_id'])) {\n            $id = $_POST['passkey_id'] ?? '';\n            $clientDataJSON = $_POST['passkey_clientDataJSON'] ?? '';\n            $authenticatorData = $_POST['passkey_authenticatorData'] ?? '';\n            $signature = $_POST['passkey_signature'] ?? '';\n\n            if (empty($id) || empty($clientDataJSON) || empty($authenticatorData) || empty($signature)) {\n                $modx->event->output('\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Passkey.');\n                return false;\n            }\n\n            \/** @var modUserPasskey $passkey *\/\n            $passkey = $modx->getObject(modUserPasskey::class, ['credential_id' => $id]);\n            if (!$passkey) {\n                $modx->event->output('\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 Passkey.');\n                return false;\n            }\n\n            \/** @var MODX\\Revolution\\modUser $user *\/\n            $user = $passkey->getOne('User');\n            if (!$user) {\n                $modx->event->output('\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.');\n                return false;\n            }\n\n            try {\n                $passkeys->processAuthResponse([\n                    'id' => $id,\n                    'clientDataJSON' => $clientDataJSON,\n                    'authenticatorData' => $authenticatorData,\n                    'signature' => $signature,\n                ], $passkey);\n\n                \/\/ Authenticate user for mgr context directly\n                $user->addSessionContext('mgr');\n                $modx->user = $user;\n\n                \/\/ Ensure username property matches\n                if (isset($scriptProperties['user']) && is_object($scriptProperties['user'])) {\n                    $scriptProperties['user'] = $user;\n                }\n\n                $modx->event->output(true);\n                return true;\n            } catch (\\Exception $e) {\n                $modx->event->output('\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043f\u043e Passkey: ' . $e->getMessage());\n                return false;\n            }\n        }\n        break;\n}","locked":0,"properties":null,"disabled":0,"moduleguid":"","static":0,"static_file":"","content":"\/**\n * Passkeys Plugin for MODX Revolution 3\n *\n * Events: OnManagerLoginFormPrerender, OnManagerAuthentication\n *\n * @var modX $modx\n * @var array $scriptProperties\n *\/\n\nuse Passkeys\\Passkeys;\nuse Passkeys\\Model\\modUserPasskey;\n\n\/\/ Use MODX_CORE_PATH directly to guarantee correct physical path on Linux\/shared hosting\n$corePath = MODX_CORE_PATH . 'components\/passkeys\/';\n\nif (file_exists($corePath . 'vendor\/autoload.php')) {\n    require_once $corePath . 'vendor\/autoload.php';\n}\n\nspl_autoload_register(function ($class) use ($corePath) {\n    $prefix = 'Passkeys\\\\';\n    $baseDir = $corePath . 'src\/';\n    $len = strlen($prefix);\n    if (strncmp($prefix, $class, $len) !== 0) {\n        return;\n    }\n    $relativeClass = substr($class, $len);\n    $file = $baseDir . str_replace('\\\\', '\/', $relativeClass) . '.php';\n    if (file_exists($file)) {\n        require_once $file;\n    }\n});\n\n$modx->addPackage('Passkeys\\\\Model', $corePath . 'src\/');\n$passkeys = new Passkeys($modx);\n\nswitch ($modx->event->name) {\n    case 'OnManagerLoginFormPrerender':\n        $assetsUrl = $passkeys->config['assetsUrl'];\n        if (isset($modx->controller)) {\n            $modx->controller->addCss($assetsUrl . 'css\/mgr\/main.css');\n            $modx->controller->addJavascript($assetsUrl . 'js\/mgr\/login.js');\n        }\n        $html = '<link rel=\"stylesheet\" type=\"text\/css\" href=\"' . $assetsUrl . 'css\/mgr\/main.css\" \/>' . \"\\n\";\n        $html .= '<script type=\"text\/javascript\">var passkeysAssetsUrl = \"' . $assetsUrl . '\";<\/script>' . \"\\n\";\n        $html .= '<script type=\"text\/javascript\" src=\"' . $assetsUrl . 'js\/mgr\/login.js\"><\/script>' . \"\\n\";\n        $modx->event->output($html);\n        break;\n\n    case 'OnManagerAuthentication':\n        \/\/ Check if WebAuthn assertion payload is submitted\n        if (!empty($_POST['passkey_login']) && !empty($_POST['passkey_id'])) {\n            $id = $_POST['passkey_id'] ?? '';\n            $clientDataJSON = $_POST['passkey_clientDataJSON'] ?? '';\n            $authenticatorData = $_POST['passkey_authenticatorData'] ?? '';\n            $signature = $_POST['passkey_signature'] ?? '';\n\n            if (empty($id) || empty($clientDataJSON) || empty($authenticatorData) || empty($signature)) {\n                $modx->event->output('\u041e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 Passkey.');\n                return false;\n            }\n\n            \/** @var modUserPasskey $passkey *\/\n            $passkey = $modx->getObject(modUserPasskey::class, ['credential_id' => $id]);\n            if (!$passkey) {\n                $modx->event->output('\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 Passkey.');\n                return false;\n            }\n\n            \/** @var MODX\\Revolution\\modUser $user *\/\n            $user = $passkey->getOne('User');\n            if (!$user) {\n                $modx->event->output('\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.');\n                return false;\n            }\n\n            try {\n                $passkeys->processAuthResponse([\n                    'id' => $id,\n                    'clientDataJSON' => $clientDataJSON,\n                    'authenticatorData' => $authenticatorData,\n                    'signature' => $signature,\n                ], $passkey);\n\n                \/\/ Authenticate user for mgr context directly\n                $user->addSessionContext('mgr');\n                $modx->user = $user;\n\n                \/\/ Ensure username property matches\n                if (isset($scriptProperties['user']) && is_object($scriptProperties['user'])) {\n                    $scriptProperties['user'] = $user;\n                }\n\n                $modx->event->output(true);\n                return true;\n            } catch (\\Exception $e) {\n                $modx->event->output('\u041e\u0448\u0438\u0431\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u043f\u043e Passkey: ' . $e->getMessage());\n                return false;\n            }\n        }\n        break;\n}"}
    [resolve] => Array
        (
            [0] => Array
                (
                    [type] => file
                    [body] => {"source":"passkeys-1.0.0-pl\/MODX\/Revolution\/modPlugin\/3e5733bd6ac584b5ae506a764033532c\/0\/","target":"return MODX_CORE_PATH . 'components\/';","name":"passkeys"}
                )

            [1] => Array
                (
                    [type] => file
                    [body] => {"source":"passkeys-1.0.0-pl\/MODX\/Revolution\/modPlugin\/3e5733bd6ac584b5ae506a764033532c\/1\/","target":"return MODX_ASSETS_PATH . 'components\/';","name":"passkeys"}
                )

            [2] => Array
                (
                    [type] => php
                    [body] => {"type":"php","source":"passkeys-1.0.0-pl\/MODX\/Revolution\/modPlugin\/3e5733bd6ac584b5ae506a764033532c.resolve.tables.resolver","name":"resolve.tables"}
                )

        )

)
