/[projects]/misc/checkuser/cpp/pamwrapper.cpp
ViewVC logotype

Contents of /misc/checkuser/cpp/pamwrapper.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 328 - (show annotations) (download)
Wed Sep 16 20:13:41 2009 UTC (14 years, 8 months ago) by torben
File size: 3574 byte(s)
Added some old code for storage/ reference


1 #include "pamwrapper.h"
2
3 #include <string>
4 #include <vector>
5
6 using std::string;
7 using std::vector;
8
9 extern "C" int conversation(int num_msg, const pam_message **msg,
10 pam_response **resp, void *appdata_prt)
11 {
12
13 if (num_msg <= 0)
14 return PAM_CONV_ERR;
15
16 PamWrapper *wrap = (PamWrapper*) appdata_prt;
17
18 pam_response* reply = static_cast<pam_response*>
19 (::calloc(num_msg, sizeof(pam_response)));
20 if (!reply)
21 return PAM_SYSTEM_ERR;
22
23 for (int replies = 0; replies < num_msg; replies++) {
24 switch (msg[replies]->msg_style) {
25 case PAM_PROMPT_ECHO_OFF: {
26 string tmp = wrap->promptEchoOff(msg[replies]->msg);
27 reply[replies].resp = (char*) tmp.c_str();
28 reply[replies].resp_retcode = PAM_SUCCESS;
29 break;
30 }
31 case PAM_PROMPT_ECHO_ON: {
32 string tmp = wrap->promptEchoOn(msg[replies]->msg);
33 reply[replies].resp = (char*) tmp.c_str();
34 reply[replies].resp_retcode = PAM_SUCCESS;
35 break;
36 }
37 case PAM_ERROR_MSG: {
38 wrap->errorMsg(msg[replies]->msg);
39 reply[replies].resp_retcode = PAM_SUCCESS;
40 break;
41 }
42 case PAM_TEXT_INFO: {
43 wrap->textInfo(msg[replies]->msg);
44 reply[replies].resp_retcode = PAM_SUCCESS;
45 break;
46 }
47 default:
48 ::free(reply);
49 return PAM_CONV_ERR;
50 }
51 }
52
53 *resp = reply;
54 return PAM_SUCCESS;
55 }
56
57 PamWrapper::PamWrapper(string service )
58 {
59 m_pamh = NULL;
60 m_isStarted = false;
61 m_service = service;
62 m_conv.conv = conversation;
63 m_conv.appdata_ptr = (void*)this;
64 }
65
66 PamWrapper::~PamWrapper()
67 {
68 if ( m_isStarted )
69 end();
70 }
71
72 int PamWrapper::start(string username)
73 {
74 m_isStarted = true;
75 if (username.size() == 0)
76 return pam_start(m_service.c_str(), NULL, &m_conv, &m_pamh);
77 else
78 return pam_start(m_service.c_str(), username.c_str(), &m_conv, &m_pamh);
79 }
80
81 int PamWrapper::end(int status)
82 {
83 m_isStarted = false;
84 return pam_end(m_pamh,status);
85 }
86
87 int PamWrapper::authenticate( int flags )
88 {
89 return pam_authenticate(m_pamh, flags);
90 }
91
92 int PamWrapper::account(int flags )
93 {
94 return pam_acct_mgmt(m_pamh, flags);
95 }
96
97 int PamWrapper::setCred(int flags)
98 {
99 return pam_setcred(m_pamh,flags);
100 }
101
102 int PamWrapper::openSession(int flags)
103 {
104 return pam_open_session(m_pamh, flags);
105 }
106
107 int PamWrapper::closeSession(int flags)
108 {
109 return pam_close_session(m_pamh, flags);
110 }
111
112 int PamWrapper::changeAuthToken(int flags)
113 {
114 return pam_chauthtok(m_pamh, flags);
115 }
116
117 string PamWrapper::strError(int err)
118 {
119 return pam_strerror(m_pamh, err);
120 }
121
122 int PamWrapper::putEnv(string nameValue)
123 {
124 return pam_putenv(m_pamh, nameValue.c_str() );
125 }
126
127 string PamWrapper::getEnv(string name)
128 {
129 const char *buf = pam_getenv(m_pamh, name.c_str() );
130 return (buf != NULL) ? string(buf) : string("NULL");
131 }
132
133
134 int PamWrapper::failDelay(unsigned int usec)
135 {
136 #ifdef PAM_FAIL_DELAY
137 return pam_fail_delay(m_pamh, usec);
138 #else
139 #warning PAM_FAIL_DELAY not defined
140 return 0;
141 #endif //PAM_FAIL_DELAY
142 }
143
144
145 int PamWrapper::setItem(int item_type, const void *item)
146 {
147 return pam_set_item(m_pamh, item_type, item);
148 }
149
150 int PamWrapper::getItem(int item_type, const void **item)
151 {
152 return pam_get_item(m_pamh, item_type, item);
153 }
154
155 bool PamWrapper::checkUser(string username, bool checkAccount)
156 {
157 this->start(username);
158 int auth = this->authenticate();
159 int acc = checkAccount ? this->account() : PAM_SUCCESS;
160 this->end();
161 return (auth == PAM_SUCCESS && acc == PAM_SUCCESS);
162 }
163
164 /*
165 vector<string> PamWrapper::getEnvList()
166 {
167 vector<string> output;
168 char **buf = pam_getenvlist(m_pamh);
169
170 for (char **ptr = buf; ptr != NULL; ptr++) {
171 string tmp = string(*ptr);
172 output.push_back(tmp);
173 }
174 std::free(buf);
175
176 return output;
177 }
178 */

  ViewVC Help
Powered by ViewVC 1.1.20