| version 1.1, 2003/01/07 21:59:40 |
version 1.2, 2003/01/12 14:30:39 |
|
|
| /* Added by Ondrej Jombik <nepto@hot.ee> */ |
/* Added by Ondrej Jombik <nepto@hot.ee> */ |
| #include <unistd.h> |
#include <unistd.h> |
| #include <errno.h> |
|
| #include <string.h> |
#include <string.h> |
| #include <syslog.h> |
#include <stdlib.h> |
| |
#include <errno.h> |
| |
|
| #include "../main.h" |
#include "../main.h" |
| #include "error.h" |
#include "error.h" |
| #include "pathexec.h" |
#include "pathexec.h" |
| #include "prot.h" |
#include "prot.h" |
| |
|
| |
#ifndef SYSLOG_LEVEL |
| |
# error SYSLOG_LEVEL not defined |
| |
#else |
| |
# if SYSLOG_LEVEL >= 1 |
| |
# include <syslog.h> |
| |
# endif |
| |
#endif |
| |
|
| extern char *crypt(); |
extern char *crypt(); |
| #include <pwd.h> |
#include <pwd.h> |
| static struct passwd *pw; |
static struct passwd *pw; |
| Line 16 static struct passwd *pw; |
|
| Line 24 static struct passwd *pw; |
|
| #include "hasspnam.h" |
#include "hasspnam.h" |
| #undef HASGETSPNAM /* Nepto hack */ |
#undef HASGETSPNAM /* Nepto hack */ |
| #ifdef HASGETSPNAM |
#ifdef HASGETSPNAM |
| #include <shadow.h> |
# include <shadow.h> |
| static struct spwd *spw; |
static struct spwd *spw; |
| #endif |
#endif |
| |
|
| #include "hasuserpw.h" |
#include "hasuserpw.h" |
| #ifdef HASUSERPW |
#ifdef HASUSERPW |
| #include <userpw.h> |
# include <userpw.h> |
| static struct userpw *upw; |
static struct userpw *upw; |
| #endif |
#endif |
| |
|
| extern char *login; |
extern char *login; |
| Line 48 int main_sys(int argc, char **argv) |
|
| Line 56 int main_sys(int argc, char **argv) |
|
| stored = pw->pw_passwd; |
stored = pw->pw_passwd; |
| else { |
else { |
| if (errno == error_txtbsy) |
if (errno == error_txtbsy) |
| _exit(111); |
exit(111); |
| |
|
| syslog(LOG_AUTH | LOG_WARNING, |
#if SYSLOG_LEVEL >= 5 |
| "atomicpop3pass[sys]: FAILED: unknown username: %s", login); |
/* Value of 5 is used, because this message will appear |
| |
on every virtual user logon. */ |
| |
syslog(SYSLOG_INFO, "sys: FAILED: unknown username: %s", login); |
| |
#endif |
| return -1; |
return -1; |
| } |
} |
| #ifdef HASUSERPW |
#ifdef HASUSERPW |
| Line 59 int main_sys(int argc, char **argv) |
|
| Line 70 int main_sys(int argc, char **argv) |
|
| if (upw) |
if (upw) |
| stored = upw->upw_passwd; |
stored = upw->upw_passwd; |
| else |
else |
| if (errno == error_txtbsy) _exit(111); |
if (errno == error_txtbsy) |
| |
exit(111); |
| #endif |
#endif |
| #ifdef HASGETSPNAM |
#ifdef HASGETSPNAM |
| spw = getspnam(login); |
spw = getspnam(login); |
| if (spw) |
if (spw) |
| stored = spw->sp_pwdp; |
stored = spw->sp_pwdp; |
| else |
else |
| if (errno == error_txtbsy) _exit(111); |
if (errno == error_txtbsy) |
| |
exit(111); |
| #endif |
#endif |
| |
|
| if (!stored) |
if (!stored) |
| _exit(1); |
exit(1); |
| |
|
| encrypted = crypt(password, stored); |
encrypted = crypt(password, stored); |
| |
|
| #if DEBUG |
#if SYSLOG_LEVEL >= 9 |
| syslog(LOG_AUTH | LOG_WARNING, "atomicpop3pass[sys]: debug:" |
syslog(SYSLOG_DEBUG, "sys: debug: login = %s", login); |
| " login = %s", login); |
syslog(SYSLOG_DEBUG, "sys: debug: password = %s", password); |
| syslog(LOG_AUTH | LOG_WARNING, "atomicpop3pass[sys]: debug:" |
syslog(SYSLOG_DEBUG, "sys: debug: stored = %s", stored); |
| " password = %s", password); |
syslog(SYSLOG_DEBUG, "sys: debug: encrypted = %s", encrypted); |
| syslog(LOG_AUTH | LOG_WARNING, "atomicpop3pass[sys]: debug:" |
|
| " stored = %s", stored); |
|
| syslog(LOG_AUTH | LOG_WARNING, "atomicpop3pass[sys]: debug:" |
|
| " encrypted = %s", encrypted); |
|
| #endif |
#endif |
| |
|
| /* Here are password compared. */ |
/* Here are password compared. */ |
| if (! *stored || strcmp(encrypted, stored)) { |
if (! *stored || strcmp(encrypted, stored)) { |
| |
|
| syslog(LOG_AUTH | LOG_WARNING, "atomicpop3pass[sys]:" |
#if SYSLOG_LEVEL >= 3 |
| " FAILED: %s [%s] - password incorrect (%s)" |
syslog(SYSLOG_INFO, "sys: FAILED: %s [%s] - password incorrect (%s)" |
| " from %s@%s [%s]", |
" from %s@%s [%s]", login, pw->pw_name, password, |
| login, pw->pw_name, password, |
|
| remoteinfo, remotehost, remoteip); |
remoteinfo, remotehost, remoteip); |
| |
#endif |
| return -1; |
return -1; |
| } |
} |
| |
|
| Line 101 int main_sys(int argc, char **argv) |
|
| Line 109 int main_sys(int argc, char **argv) |
|
| nuke_dynamic_string(&password); |
nuke_dynamic_string(&password); |
| |
|
| if (prot_gid((int) pw->pw_gid) == -1) { |
if (prot_gid((int) pw->pw_gid) == -1) { |
| syslog(LOG_AUTH | LOG_WARNING, "atomicpop3pass[sys]:" |
#if SYSLOG_LEVEL >= 3 |
| " FAILED: %s - protected GID: %d", |
syslog(SYSLOG_INFO, "sys: FAILED: %s - protected GID: %d", |
| pw->pw_name, (int) pw->pw_gid); |
pw->pw_name, (int) pw->pw_gid); |
| _exit(1); |
#endif |
| |
exit(1); |
| } |
} |
| |
|
| if (prot_uid((int) pw->pw_uid) == -1) { |
if (prot_uid((int) pw->pw_uid) == -1) { |
| syslog(LOG_AUTH | LOG_WARNING, "atomicpop3pass[sys]:" |
#if SYSLOG_LEVEL >= 3 |
| " FAILED: %s - protected UID: %d", |
syslog(SYSLOG_INFO, "sys: FAILED: %s - protected UID: %d", |
| pw->pw_name, (int) pw->pw_uid); |
pw->pw_name, (int) pw->pw_uid); |
| _exit(1); |
#endif |
| |
exit(1); |
| } |
} |
| |
|
| if (chdir(pw->pw_dir) == -1) { |
if (chdir(pw->pw_dir) == -1) { |
| syslog(LOG_AUTH | LOG_WARNING, "atomicpop3pass[sys]:" |
#if SYSLOG_LEVEL >= 3 |
| " FAILED: %s - unable to change to Mail directory: %s", |
syslog(SYSLOG_INFO, |
| |
"sys: FAILED: %s - unable to change to Mail directory: %s", |
| pw->pw_name, pw->pw_dir); |
pw->pw_name, pw->pw_dir); |
| _exit(111); |
#endif |
| |
exit(111); |
| } |
} |
| |
|
| if (! pathexec_env("USER", pw->pw_name) |
if (! pathexec_env("USER", pw->pw_name) |
| || ! pathexec_env("HOME", pw->pw_dir) |
|| ! pathexec_env("HOME", pw->pw_dir) |
| || ! pathexec_env("SHELL", pw->pw_shell)) { |
|| ! pathexec_env("SHELL", pw->pw_shell)) { |
| syslog(LOG_AUTH | LOG_WARNING, "atomicpop3pass[sys]:" |
#if SYSLOG_LEVEL >= 3 |
| " FAILED: %s - pathexec_env() failure(s)", |
syslog(SYSLOG_INFO, "sys: FAILED: %s - pathexec_env() failure(s)", |
| pw->pw_name); |
pw->pw_name); |
| _exit(111); |
#endif |
| |
exit(111); |
| } |
} |
| |
|
| syslog(LOG_AUTH | LOG_WARNING, "atomicpop3pass[sys]:" |
#if SYSLOG_LEVEL >= 3 |
| " POP3 user %s : %s logged in from %s@%s [%s]", |
syslog(SYSLOG_INFO, "sys: POP3 user %s : %s logged in from %s@%s [%s]", |
| pw->pw_name, pw->pw_dir, remoteinfo, remotehost, remoteip); |
pw->pw_name, pw->pw_dir, remoteinfo, remotehost, remoteip); |
| |
#endif |
| |
|
| pathexec(argv + 1); |
pathexec(argv + 1); |
| /* _exit(111); */ |
/* exit(111); */ |
| |
|
| return 0; |
return 0; |
| } |
} |
| |
|