#pragma once #include #include #include #include #include #include namespace rublon::method { class WebsocketBasedAuth : public AuthenticationStep { tl::expected< void, Error > prompt(const Pam_t & pam) const { if(not _session.inInteractiveMode()) { return {}; } if(not _autopushPrompt) pam.print("Autopush"); else pam.scan([](const auto /*ignored userinput*/) { return ""; }, "Rublon authentication initiated. Complete the authentication and press Enter to proceed"); return {}; } public: const char * _name = ""; const bool _autopushPrompt = true; WebsocketBasedAuth(Session & session, const char * name, bool autopushPrompt = true) : AuthenticationStep(session), _name{name}, _autopushPrompt{autopushPrompt} {} template < typename Hander_t > tl::expected< AuthenticationStatus, Error > verify(const CoreHandlerInterface< Hander_t > & coreHandler, const Pam_t & pam) const { const auto promprUser = [&]() { return prompt(pam); }; const auto waitForCoreToConfirm = [&]() { return waitForCoreConfirmation(coreHandler); }; return promprUser() // .and_then(waitForCoreToConfirm); } }; } // namespace rublon::method