userinfo-passwd.c revision 66251e6ab31e5cc153fe5cae608e416dacafe9cd
5717e8e12768ab1d667cd3e908e5f3ffe540655aTimo Sirainen/*
5717e8e12768ab1d667cd3e908e5f3ffe540655aTimo Sirainen Loosely based on auth_passwd.c from popa3d by
70267341ccf430f6c77646e69c24e33d111b65a8Pascal Volk Solar Designer <solar@openwall.com>
70267341ccf430f6c77646e69c24e33d111b65a8Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk Copyright (C) 2002 Timo Sirainen
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk*/
3188bfdf2c36fed3cbbea5e3901850e34e174a56Timo Sirainen
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk#define _XOPEN_SOURCE 4
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk#define _XOPEN_SOURCE_EXTENDED
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk#define _XOPEN_VERSION 4 /* FIXME: needed? solaris throws warnings with it */
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk#define _XPG4_2
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk#include "common.h"
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk#ifdef USERINFO_PASSWD
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk#include "userinfo.h"
0610b6dfbdcb6a8f234a6495ec243bcf996b5572Pascal Volk#include "userinfo-passwd.h"
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk#include <unistd.h>
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volkvoid passwd_fill_cookie_reply(struct passwd *pw, AuthCookieReplyData *reply)
0610b6dfbdcb6a8f234a6495ec243bcf996b5572Pascal Volk{
88c816e8be4e1a29bca8b67d67a92c67a33f3795Timo Sirainen i_assert(sizeof(reply->user) > strlen(pw->pw_name));
e0579d45910f8a4ed55aa670f136db183344a786Timo Sirainen i_assert(sizeof(reply->home) > strlen(pw->pw_dir));
ed1ad90a15ea48d43edef858da3a598adca8b1feTimo Sirainen
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk reply->uid = pw->pw_uid;
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk reply->gid = pw->pw_gid;
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk strcpy(reply->user, pw->pw_name);
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk strcpy(reply->home, pw->pw_dir);
e0579d45910f8a4ed55aa670f136db183344a786Timo Sirainen}
f6b42d6832887ee5a94deb278f924bae7216e660Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volkstatic int passwd_verify_plain(const char *user, const char *password,
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk AuthCookieReplyData *reply)
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk{
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk struct passwd *pw;
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk char *passdup;
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk int result;
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk pw = getpwnam(user);
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk if (pw == NULL || !IS_VALID_PASSWD(pw->pw_passwd))
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk return FALSE;
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk /* check if the password is valid */
28372fb7f889fbf9d0b5266f154f7f3004e26324Pascal Volk passdup = (char *) t_strdup(password);
28372fb7f889fbf9d0b5266f154f7f3004e26324Pascal Volk result = strcmp(crypt(passdup, pw->pw_passwd), pw->pw_passwd) == 0;
28372fb7f889fbf9d0b5266f154f7f3004e26324Pascal Volk
28372fb7f889fbf9d0b5266f154f7f3004e26324Pascal Volk /* clear the passwords from memory */
44c6dbf0a48ebf3d18aec72849bd114b54f4b0aaPascal Volk memset(passdup, 0, strlen(passdup));
28372fb7f889fbf9d0b5266f154f7f3004e26324Pascal Volk memset(pw->pw_passwd, 0, strlen(pw->pw_passwd));
28372fb7f889fbf9d0b5266f154f7f3004e26324Pascal Volk
28372fb7f889fbf9d0b5266f154f7f3004e26324Pascal Volk if (!result)
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk return FALSE;
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk /* password ok, save the user info */
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk passwd_fill_cookie_reply(pw, reply);
0610b6dfbdcb6a8f234a6495ec243bcf996b5572Pascal Volk return TRUE;
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk}
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volkstatic void passwd_deinit(void)
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk{
2f45711505ab4564ee8a64ed7af87ae725a3f5d8Timo Sirainen endpwent();
88c816e8be4e1a29bca8b67d67a92c67a33f3795Timo Sirainen}
e0579d45910f8a4ed55aa670f136db183344a786Timo Sirainen
ed1ad90a15ea48d43edef858da3a598adca8b1feTimo SirainenUserInfoModule userinfo_passwd = {
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk NULL,
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk passwd_deinit,
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk passwd_verify_plain,
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk NULL
e0579d45910f8a4ed55aa670f136db183344a786Timo Sirainen};
f6b42d6832887ee5a94deb278f924bae7216e660Pascal Volk
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk#endif
fa9f5378ec558c451f1f1c47a4c41aa7c916c929Pascal Volk