On Thursday, 10 October 2024 at 13:10:58 UTC, Salih Dincer wrote:
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@79
Thanks for the example. I'll try to test it.
