exchange($session); if ('success' !== $result['kind']) { if ('rejected' === $result['kind']) return self::fail(); return 'retry' === $result['kind'] ? 'session_retry' : 'session_pending'; } unset($result['kind']); $validated = Akkedli_V2_Credential_Response::validate($result, $session['callback_url']); unset($result); if (!is_array($validated) || !Akkedli_V2_Outbox_Readiness::check($readiness, true)) return 'session_error'; $expected = Akkedli_Connector_State::load(); if (!is_array($expected) || 'migration_pending' !== $expected['mode']) return 'session_error'; $pending = Akkedli_V2_Binding_State::pending( $validated, $expected['legacy_backup'], time()); unset($validated); if (!Akkedli_Connector_State::replace($pending, $expected)) return 'session_error'; if ('verifying' !== self::clear_session('verifying')) return 'session_error'; Akkedli_V2_Binding_Poller::schedule_current(); return 'verifying'; } public static function cleanup_terminal($notice) { if (!in_array($notice, array('session_failed', 'session_expired'), true) || !Akkedli_Connector_State::delete_pending() || 'absent' !== Akkedli_Connector_State::status()) return 'session_error'; return self::clear_session($notice); } public static function clear_session($notice) { if (!in_array($notice, array('verifying', 'session_failed', 'session_expired', 'session_error'), true)) return 'session_error'; return Akkedli_V2_Session_State::delete() && !Akkedli_V2_Session_State::exists() ? $notice : 'session_error'; } private static function fail() { return self::cleanup_terminal('session_failed'); } }