Skip to content

Commit ea64d17

Browse files
committed
auth: reworked pam auth, added pam_setcred
1 parent 98b8675 commit ea64d17

File tree

1 file changed

+32
-16
lines changed

1 file changed

+32
-16
lines changed

src/auth/Pam.cpp

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -111,27 +111,43 @@ bool CPam::auth() {
111111
auto uidPassword = getpwuid(getuid());
112112
RASSERT(uidPassword && uidPassword->pw_name, "Failed to get username (getpwuid)");
113113

114-
int ret = pam_start(m_sPamModule.c_str(), uidPassword->pw_name, &localConv, &handle);
114+
int ret;
115+
std::string primaryMessage;
116+
std::string secondaryMessage;
117+
118+
for (int i = 0; i < 4; i++) {
119+
switch (i) {
120+
case 0:
121+
ret = pam_start(m_sPamModule.c_str(), uidPassword->pw_name, &localConv, &handle);
122+
primaryMessage = secondaryMessage = "pam_start failed";
123+
break;
124+
case 1:
125+
ret = pam_authenticate(handle, 0);
126+
primaryMessage = "Authentication failed";
127+
secondaryMessage = "pam_authenticate failed";
128+
break;
129+
case 2:
130+
ret = pam_setcred(handle, PAM_REFRESH_CRED);
131+
primaryMessage = "Setting credentials failed";
132+
secondaryMessage = "pam_setcred failed";
133+
break;
134+
case 3:
135+
ret = pam_end(handle, ret);
136+
primaryMessage = secondaryMessage = "pam_end failed";
137+
break;
138+
}
115139

116-
if (ret != PAM_SUCCESS) {
117-
m_sConversationState.failText = "pam_start failed";
118-
Debug::log(ERR, "auth: pam_start failed for {}", m_sPamModule);
119-
return false;
140+
if (ret != PAM_SUCCESS) {
141+
handle = nullptr;
142+
if (!m_sConversationState.failTextFromPam)
143+
m_sConversationState.failText = ret == PAM_AUTH_ERR ? primaryMessage : secondaryMessage;
144+
Debug::log(ERR, "auth: {} for {}", m_sConversationState.failText, m_sPamModule);
145+
return false;
146+
}
120147
}
121148

122-
ret = pam_authenticate(handle, 0);
123-
pam_end(handle, ret);
124149
handle = nullptr;
125-
126150
m_sConversationState.waitingForPamAuth = false;
127-
128-
if (ret != PAM_SUCCESS) {
129-
if (!m_sConversationState.failTextFromPam)
130-
m_sConversationState.failText = ret == PAM_AUTH_ERR ? "Authentication failed" : "pam_authenticate failed";
131-
Debug::log(ERR, "auth: {} for {}", m_sConversationState.failText, m_sPamModule);
132-
return false;
133-
}
134-
135151
m_sConversationState.failText = "Successfully authenticated";
136152
Debug::log(LOG, "auth: authenticated for {}", m_sPamModule);
137153

0 commit comments

Comments
 (0)