70 lines
1.8 KiB
C++
70 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include <security/pam_ext.h>
|
|
|
|
#include <security/pam_appl.h>
|
|
#include <security/pam_client.h>
|
|
#include <security/pam_ext.h>
|
|
#include <security/pam_misc.h>
|
|
#include <security/pam_modules.h>
|
|
|
|
#include <optional>
|
|
#include <string>
|
|
#include <system_error>
|
|
#include <type_traits>
|
|
#include <utility>
|
|
|
|
#include <memory>
|
|
|
|
#include "utils.hpp"
|
|
|
|
namespace rublon {
|
|
class LinuxPam {
|
|
pam_handle_t * pamh;
|
|
|
|
public:
|
|
LinuxPam(pam_handle_t * handler) : pamh{handler} {}
|
|
|
|
rublon::NonOwningPtr< const char > ip() const {
|
|
const void * ip = NULL;
|
|
pam_get_item(pamh, PAM_RHOST, &ip);
|
|
if(ip == NULL) {
|
|
rublon::log(rublon::LogLevel::Warning, "Cant read user from linux PAM");
|
|
ip = "";
|
|
}
|
|
return ( const char * ) ip;
|
|
}
|
|
|
|
rublon::NonOwningPtr< const char > username() const {
|
|
const char * user = NULL;
|
|
pam_get_user(pamh, &user, nullptr);
|
|
if(user == NULL) {
|
|
rublon::log(rublon::LogLevel::Warning, "Cant read user from linux PAM");
|
|
user = "";
|
|
}
|
|
return user;
|
|
}
|
|
|
|
template < typename... Ti >
|
|
void print(const char * fmt, Ti... ti) const noexcept {
|
|
|
|
log(LogLevel::Debug, fmt, std::forward< Ti >(ti)...);
|
|
pam_prompt(pamh, PAM_TEXT_INFO, nullptr, fmt, std::forward< Ti >(ti)...);
|
|
sleep(1);
|
|
}
|
|
|
|
template < typename Fun, typename... Ti >
|
|
auto scan(Fun && f, const char * fmt, Ti... ti) const noexcept {
|
|
char * response = nullptr;
|
|
pam_prompt(pamh, PAM_PROMPT_ECHO_ON, &response, fmt, std::forward< Ti >(ti)...);
|
|
sleep(1);
|
|
if(response) {
|
|
auto ret = f(response);
|
|
free(response);
|
|
return ret;
|
|
}
|
|
return std::result_of_t< Fun(char *) >();
|
|
}
|
|
};
|
|
} // namespace rublon
|