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);
   }

yatex.org