#include "dual_control.h" #include "conversation.h" #include "validator.h" class impl : public dual_control_ifc { private: conversations conversations_; validator validator_; logger logger_; public: impl(const dual_control_configuration &configuration); int authenticate(pam_handle *handle, int flags, const std::vector &arguments ); int setcred(pam_handle *handle, int flags, const std::vector &arguments); }; impl::impl(const dual_control_configuration &configuration) : conversations_(configuration.conversations), validator_(configuration.validator), logger_(configuration.logger) {} int impl::setcred(pam_handle *handle, int flags, const std::vector &arguments) { return PAM_SUCCESS; } int impl::authenticate(pam_handle *handle, int flags, const std::vector &arguments) { conversation_result conversation = conversations_.initiate_conversation(); std::string user_name = conversation.user_name(); std::string token = conversation.token(); int auth_result = validator_->validate(user_name, token) ? PAM_SUCCESS : PAM_AUTH_ERR; logger_.log(auth_result, user_name, token); return auth_result; } dual_control create_dual_control(const dual_control_configuration &configuration) { return dual_control(new impl(configuration)); }