git.fiddlerwoaroof.com
Raw Blame History
#include <string>
#include <vector>
#include <memory>
#include <security/pam_modules.h>
#include <security/pam_appl.h>

#include "pam.h"

class pam_conversation_impl : public pam_conversation
{
private:
    struct pam_conv *pam_conv_;
public:
    pam_conversation_impl (pam_conv *conv) : pam_conv_ (conv) {}
    int conv (const std::vector<const struct pam_message *> &prompts,
              std::vector<struct pam_response *> &answers);
};

class pam_impl : public pam
{
public:
    int get_conversation (pam_handle_t *pamh,
                          std::shared_ptr<pam_conversation> &conversation);
};

int pam_impl::get_conversation (pam_handle_t *pamh,
                                std::shared_ptr<pam_conversation> &conversation)
{
    struct pam_conv *pam_conv;
    int result = pam_get_item (pamh, PAM_CONV, (const void **)&pam_conv);
    conversation.reset (new pam_conversation_impl (pam_conv));
    return result;
}

int pam_conversation_impl::conv (const
                                 std::vector<const struct pam_message *> &prompts,
                                 std::vector<struct pam_response *> &answers)
{
    return pam_conv_->conv (prompts.size(),
                            const_cast<const struct pam_message **> (prompts.data()),
                            answers.data(), pam_conv_->appdata_ptr);
}

pam_p get_system_pam()
{
    return (pam_p)new pam_impl;
}