Wrapper for PAM

Salih Dincer salihdb at hotmail.com
Thu Oct 10 13:10:58 UTC 2024


On Thursday, 10 October 2024 at 12:58:22 UTC, Salih Dincer wrote:
```d
class Auth
{
   private:
     struct PAMdata
     {
       string password;
       string newPassword;
     }

     extern(C)
     { // 1. Salih changed it:
       static int conversation_func(int num_msg,
                        const pam_message **msg,
                            pam_response **resp,
                              void *appdata_ptr)
       {
         auto data = cast(PAMdata*)appdata_ptr;
         auto responses = cast(pam_response*)
           calloc(num_msg, pam_response.sizeof);

         if (responses == null)
         {
           return PAM_BUF_ERR;
         }

         for (int i = 0; i < num_msg; ++i)
         {
           responses[i].resp_retcode = 0;
           switch (msg[i].msg_style)
           {
             case PAM_PROMPT_ECHO_ON: goto case;
             case PAM_PROMPT_ECHO_OFF:
               switch (msg[i].msg.to!string)
               {
                 case "New password: ": goto case;
                 case "Retype new password: ":
                   responses[i].resp = 
strdup(data.newPassword.toStringz);
                   break;
                 case "Password: ": goto case;
                 case "Current password: ":
                   responses[i].resp = 
strdup(data.password.toStringz);
                   break;
                 default:
                   responses[i].resp = null;
                   break;
               }
               break;
             default:
               responses[i].resp = null;
               break;
           }
         }
         *resp = responses;
         return PAM_SUCCESS;
       }
     }

   public:
     int authenticate(string username, string password)
     {
       if (!username.length)
       {
         return AUTH_ERR_USER;
       }

       if (!password.length)
       {
         return AUTH_ERR_PASS;
       }

       pam_handle_t *pamh = null;
       PAMdata data = {
         password
       };

       void *appdata_ptr = &data;
       // 2. Salih changed it:
       pam_conv conv = {
         cast(conversation*)&conversation_func,
         appdata_ptr
       };
       // 3. Salih changed it:
       auto retval = pam_start("login", username.toStringz, &conv, 
&pamh);
       if (retval != PAM_SUCCESS)
       {
         return AUTH_ERR_START;
       }

       retval = pam_authenticate(pamh, 0);
       if (retval != PAM_SUCCESS)
       {
         pam_end(pamh, retval);
         return AUTH_ERR_AUTH;
       }

       retval = pam_end(pamh, PAM_SUCCESS);
       if (retval != PAM_SUCCESS)
       {
         return AUTH_ERR_END;
       }
       return AUTH_SUCCESS;
     }
}
```

SDB at 79




More information about the Digitalmars-d-learn mailing list