@@ -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