git.fiddlerwoaroof.com
pam.cc
01c00cfe
 #include <string>
 #include <vector>
 #include <memory>
 #include <security/pam_modules.h>
 #include <security/pam_appl.h>
 
 #include "pam.h"
 
cdf7fd74
 class pam_conversation_impl : public pam_conversation
 {
 private:
     struct pam_conv *pam_conv_;
 public:
b017a4d2
     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);
01c00cfe
 };
 
cdf7fd74
 class pam_impl : public pam
 {
 public:
b017a4d2
     int get_conversation (pam_handle_t *pamh,
                           std::shared_ptr<pam_conversation> &conversation);
01c00cfe
 };
 
b017a4d2
 int pam_impl::get_conversation (pam_handle_t *pamh,
                                 std::shared_ptr<pam_conversation> &conversation)
cdf7fd74
 {
01c00cfe
     struct pam_conv *pam_conv;
b017a4d2
     int result = pam_get_item (pamh, PAM_CONV, (const void **)&pam_conv);
     conversation.reset (new pam_conversation_impl (pam_conv));
01c00cfe
     return result;
 }
 
b017a4d2
 int pam_conversation_impl::conv (const
                                  std::vector<const struct pam_message *> &prompts,
                                  std::vector<struct pam_response *> &answers)
cdf7fd74
 {
b017a4d2
     return pam_conv_->conv (prompts.size(),
                             const_cast<const struct pam_message **> (prompts.data()),
                             answers.data(), pam_conv_->appdata_ptr);
01c00cfe
 }
 
cdf7fd74
 pam_p get_system_pam()
 {
01c00cfe
     return (pam_p)new pam_impl;
 }
92957308