Mercurial > hgrepos > hgweb.cgi > imapext
diff src/osdep/unix/env_unix.c @ 1:28a55bc1110c imapext-2007-1
[mq]: imapext
author | yuuji@gentei.org |
---|---|
date | Mon, 14 Sep 2009 19:23:11 +0900 |
parents | ada5e610ab86 |
children | 2366b362676d 20c025a380ab |
line wrap: on
line diff
--- a/src/osdep/unix/env_unix.c Mon Sep 14 15:17:45 2009 +0900 +++ b/src/osdep/unix/env_unix.c Mon Sep 14 19:23:11 2009 +0900 @@ -422,6 +422,10 @@ case SET_DISABLEPLAINTEXT: disablePlaintext = (long) value; case GET_DISABLEPLAINTEXT: +#ifdef RESTRICT_POP + if (getenv("INTRANET") == NIL) disablePlaintext = 1; + else disablePlaintext = NIL; +#endif ret = (void *) disablePlaintext; break; case SET_CHROOTSERVER: @@ -665,6 +669,7 @@ char *s; struct passwd *pw; struct passwd *ret = NIL; +#ifndef QMAIL /* imapext md5 checker run previously. no need to do here */ if (auth_md5.server) { /* using CRAM-MD5 authentication? */ if (s = auth_md5_pwd (user)) { if (!strcmp (s,pwd) || ((*pwd == ' ') && pwd[1] && !strcmp (s,pwd+1))) @@ -673,7 +678,9 @@ fs_give ((void **) &s); } } - else if (pw = pwuser (user)) {/* can get user? */ + else +#endif + if (pw = pwuser (user)) {/* can get user? */ s = cpystr (pw->pw_name); /* copy returned name in case we need it */ if (*pwd && !(ret = checkpw (pw,pwd,argc,argv)) && (*pwd == ' ') && pwd[1] && (ret = pwuser (s))) @@ -697,6 +704,10 @@ struct passwd *pw = NIL; int level = LOG_NOTICE; char *err = "failed"; +#ifdef QMAIL + char usr[MAILTMPLEN], *apoppswd; + strncpy(usr, user, MAILTMPLEN-1); +#endif /* cretins still haven't given up */ if ((strlen (user) >= NETMAXUSER) || (authuser && (strlen (authuser) >= NETMAXUSER))) { @@ -706,6 +717,16 @@ } else if (logtry-- <= 0) err = "excessive login failures"; else if (disablePlaintext) err = "disabled"; +#ifdef QMAIL + else if ((logtry > 0) && + (apoppswd = auth_md5_pwd(usr)) + && !strcmp(apoppswd, pwd) + && (pw = getpwnam(usr))) { + memset(apoppswd, 0, strlen(apoppswd)); + fs_give((void**) &apoppswd); + return pw_login(pw, usr, pw->pw_name, pw->pw_dir, argc, argv); + } +#endif else if (!(authuser && *authuser)) pw = valpwd (user,pwd,argc,argv); else if (valpwd (authuser,pwd,argc,argv)) pw = pwuser (user); if (pw && pw_login (pw,authuser,pw->pw_name,NIL,argc,argv)) return T; @@ -728,6 +749,34 @@ return pw_login (pwuser (user),authuser,user,NIL,argc,argv); } +void permitsmtp() /* to update tcp permission */ +{ +#ifdef POPBEFORESMTP + #include <sys/types.h> + #include <sys/wait.h> + #ifndef POP3RECORDER + # define POP3RECORDER "/usr/local/etc/pop3-record" + #endif + int child; + int wstat; + char *permsmtp = POP3RECORDER; + + switch(child = fork()) + { + case -1: + syslog (LOG_INFO,"Cannot exec %s", permsmtp); + _exit(111); + break; + case 0: + execl(permsmtp, permsmtp, 0); + syslog (LOG_INFO,"Cannot exec %s", permsmtp); + _exit(111); break; + } + waitpid(child, &wstat, 0); +#endif +} + + /* Log in as anonymous daemon * Accepts: argument count @@ -781,8 +830,14 @@ else fatal ("Login failed after chroot"); } /* normal login */ +#ifdef QMAIL + else if (((pw->pw_uid == geteuid ()) || (permitsmtp(), loginpw (pw,argc,argv +))) && + (ret = env_init (user,home))) chdir (myhomedir ()); +#else else if (((pw->pw_uid == geteuid ()) || loginpw (pw,argc,argv)) && - (ret = env_init (user,home))) chdir (myhomedir ()); + (ret = env_init (user,home))) chdir (myhomedir ()); +#endif fs_give ((void **) &home); /* clean up */ if (user) fs_give ((void **) &user); }