git.fiddlerwoaroof.com
Raw Blame History
#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<const std::string> &arguments );
        int setcred(pam_handle *handle, int flags, const std::vector<const std::string> &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<const std::string> &arguments) {
    return PAM_SUCCESS;
}

int impl::authenticate(pam_handle *handle, int flags, const std::vector<const std::string> &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));
}