]> diplodocus.org Git - nmh/blobdiff - sbr/mts.c
pending-release-notes: add mhshow's "-prefer", and mh-format's %(kibi/kilo)
[nmh] / sbr / mts.c
index 868e603c5a506170cf275963dba9cfca62e28c42..99851d92a71a95c34bdc7020a6785adb25179394 100644 (file)
--- a/sbr/mts.c
+++ b/sbr/mts.c
@@ -8,13 +8,10 @@
  */
 
 #include <h/mh.h>   /* for snprintf() */
  */
 
 #include <h/mh.h>   /* for snprintf() */
-#include <h/nmh.h>
 #include <h/utils.h>
 
 #define nmhetcdir(file) NMHETCDIR#file
 
 #include <h/utils.h>
 
 #define nmhetcdir(file) NMHETCDIR#file
 
-#include <ctype.h>
-#include <stdio.h>
 #include <h/mts.h>
 #include <pwd.h>
 #include <sys/socket.h>
 #include <h/mts.h>
 #include <pwd.h>
 #include <sys/socket.h>
@@ -23,7 +20,7 @@
 /*
  * static prototypes
  */
 /*
  * static prototypes
  */
-static char *tailor_value (unsigned char *);
+static char *tailor_value (char *);
 static void getuserinfo (void);
 static const char *get_mtsconf_pathname(void);
 static const char *get_mtsuserconf_pathname(void);
 static void getuserinfo (void);
 static const char *get_mtsconf_pathname(void);
 static const char *get_mtsuserconf_pathname(void);
@@ -54,25 +51,19 @@ char *uucplfil = "";
 char *mmdlm1 = "\001\001\001\001\n";
 char *mmdlm2 = "\001\001\001\001\n";
 
 char *mmdlm1 = "\001\001\001\001\n";
 char *mmdlm2 = "\001\001\001\001\n";
 
-/* Cache the username and fullname of the user */
+char *spoollocking = DEFAULT_LOCKING;
+
+/* Cache the username, fullname, and mailbox of the user */
 static char username[BUFSIZ];
 static char fullname[BUFSIZ];
 static char username[BUFSIZ];
 static char fullname[BUFSIZ];
-
-/* Variables for username masquerading: */
-       boolean  draft_from_masquerading = FALSE;  /* also used from post.c */
-static boolean  mmailid_masquerading = FALSE;
-       boolean  username_extension_masquerading = FALSE;  /* " from addrsbr.c */
-static char*    masquerade = "";
+static char localmbox[BUFSIZ];
 
 /*
  * MTS specific variables
  */
 
 /*
  * MTS specific variables
  */
-#if defined(SMTPMTS)
-static char *sm_method = "smtp";
-int  sm_mts    = MTS_SMTP;
-char *hostable = nmhetcdir(/hosts);
+static char *mts_method = "smtp";
+int  sm_mts    = MTS_SENDMAIL_SMTP;
 char *sendmail = SENDMAILPATH;
 char *sendmail = SENDMAILPATH;
-#endif
 
 /*
  * SMTP/POP stuff
 
 /*
  * SMTP/POP stuff
@@ -87,13 +78,6 @@ char *pophost    = "";
 char *maildelivery = nmhetcdir(/maildelivery);
 
 
 char *maildelivery = nmhetcdir(/maildelivery);
 
 
-/*
- * Aliasing Facility (doesn't belong here)
- */
-int Everyone = NOTOK;
-static char *everyone = "-1";
-char *NoShell = "";
-
 /*
  * Customize the MTS settings for nmh by adjusting
  * the file mts.conf in the nmh etc directory.
 /*
  * Customize the MTS settings for nmh by adjusting
  * the file mts.conf in the nmh etc directory.
@@ -110,29 +94,41 @@ static struct bind binds[] = {
     { "systemname", &systemname },
     { "mmdfldir", &mmdfldir },
     { "mmdflfil", &mmdflfil },
     { "systemname", &systemname },
     { "mmdfldir", &mmdfldir },
     { "mmdflfil", &mmdflfil },
+    { "spoollocking", &spoollocking },
     { "uucpldir", &uucpldir },
     { "uucplfil", &uucplfil },
     { "mmdelim1", &mmdlm1 },
     { "mmdelim2", &mmdlm2 },
     { "uucpldir", &uucpldir },
     { "uucplfil", &uucplfil },
     { "mmdelim1", &mmdlm1 },
     { "mmdelim2", &mmdlm2 },
-    { "masquerade", &masquerade },
-
-#if defined(SMTPMTS)
-    { "mts",      &sm_method },
-    { "hostable", &hostable  },
+    { "mts",      &mts_method },
     { "sendmail", &sendmail  },
     { "sendmail", &sendmail  },
-#endif
-
     { "clientname",  &clientname },
     { "servers", &servers },
     { "pophost", &pophost },
 
     { "maildelivery", &maildelivery },
     { "clientname",  &clientname },
     { "servers", &servers },
     { "pophost", &pophost },
 
     { "maildelivery", &maildelivery },
-    { "everyone", &everyone },
-    { "noshell", &NoShell },
     { NULL, NULL }
 };
 
 
     { NULL, NULL }
 };
 
 
+/* Convert name of mts method to integer value and store it. */
+void
+save_mts_method (const char *value) {
+    if (! strcasecmp (value, "smtp")) {
+        mts_method = "smtp";
+        sm_mts = MTS_SMTP;
+    } else if (! strcasecmp (value, "sendmail/smtp")  ||
+               ! strcasecmp (value, "sendmail")) {
+        mts_method = "sendmail/smtp";
+        sm_mts = MTS_SENDMAIL_SMTP;
+    } else if (! strcasecmp (value, "sendmail/pipe")) {
+        mts_method = "sendmail/pipe";
+        sm_mts = MTS_SENDMAIL_PIPE;
+    } else {
+        adios (NULL, "unsupported mts selection \"%s\"", value);
+    }
+}
+
+
 /*
  * Read the configuration file for the nmh interface
  * to the mail transport system (MTS).
 /*
  * Read the configuration file for the nmh interface
  * to the mail transport system (MTS).
@@ -141,11 +137,10 @@ static struct bind binds[] = {
 void
 mts_init (char *name)
 {
 void
 mts_init (char *name)
 {
-    NMH_UNUSED (name);
-
     const char *cp;
     FILE *fp;
     static int inited = 0;
     const char *cp;
     FILE *fp;
     static int inited = 0;
+    NMH_UNUSED (name);
 
     if (inited++ || (fp = fopen (get_mtsconf_pathname(), "r")) == NULL)
        return;
 
     if (inited++ || (fp = fopen (get_mtsconf_pathname(), "r")) == NULL)
        return;
@@ -159,27 +154,7 @@ mts_init (char *name)
         fclose (fp);
     }
 
         fclose (fp);
     }
 
-    Everyone = atoi (everyone);
-
-    if (strstr(masquerade, "draft_from") != NULL)
-       draft_from_masquerading = TRUE;
-
-    if (strstr(masquerade, "mmailid") != NULL)
-       mmailid_masquerading = TRUE;
-
-    if (strstr(masquerade, "username_extension") != NULL)
-       username_extension_masquerading = TRUE;
-
-#ifdef SMTPMTS
-    if (strcmp(sm_method, "smtp") == 0)
-        sm_mts = MTS_SMTP;
-    else if (strcmp(sm_method, "sendmail") == 0)
-        sm_mts = MTS_SENDMAIL;
-    else {
-        advise(NULL, "unsupported \"mts\" value in mts.conf: %s", sm_method);
-        sm_mts = MTS_SMTP;
-    }
-#endif
+    save_mts_method (mts_method);
 }
 
 
 }
 
 
@@ -191,7 +166,7 @@ mts_init (char *name)
  */
 
 static char *
  */
 
 static char *
-tailor_value (unsigned char *s)
+tailor_value (char *s)
 {
     int i, r;
     char *bp;
 {
     int i, r;
     char *bp;
@@ -214,13 +189,13 @@ tailor_value (unsigned char *s)
                    break;
 
                default: 
                    break;
 
                default: 
-                   if (!isdigit (*s)) {
+                   if (!isdigit ((unsigned char) *s)) {
                        *bp++ = QUOTE;
                        *bp = *s;
                    }
                        *bp++ = QUOTE;
                        *bp = *s;
                    }
-                   r = *s != '0' ? 10 : 8;
-                   for (i = 0; isdigit (*s); s++)
-                       i = i * r + *s - '0';
+                   r = ((unsigned char) *s) != '0' ? 10 : 8;
+                   for (i = 0; isdigit ((unsigned char) *s); s++)
+                       i = i * r + ((unsigned char) *s) - '0';
                    s--;
                    *bp = toascii (i);
                    break;
                    s--;
                    *bp = toascii (i);
                    break;
@@ -351,18 +326,30 @@ getfullname (void)
 }
 
 
 }
 
 
+/*
+ * Get the full local mailbox name.  This is in the form:
+ *
+ * User Name <user@name.com>
+ */
+
+char *
+getlocalmbox (void)
+{
+    if (username[0] == '\0')
+       getuserinfo();
+
+    return localmbox;
+}
+
 /*
  * Find the user's username and full name, and cache them.
 /*
  * Find the user's username and full name, and cache them.
- * Also, handle "mmailid" username masquerading controlled from the GECOS field
- * of the passwd file. 
  */
 
 static void
 getuserinfo (void)
 {
  */
 
 static void
 getuserinfo (void)
 {
-    register unsigned char *cp;
-    register char *np;
-    register struct passwd *pw;
+    char *cp, *np;
+    struct passwd *pw;
 
     if ((pw = getpwuid (getuid ())) == NULL
            || pw->pw_name == NULL
 
     if ((pw = getpwuid (getuid ())) == NULL
            || pw->pw_name == NULL
@@ -373,63 +360,70 @@ getuserinfo (void)
        return;
     }
 
        return;
     }
 
+
+    /* username */
+    /* If there's a Local-Mailbox profile component, try to extract
+       the username from it.  But don't try very hard, this assumes
+       the very simple User Name <user@name.com> form.
+       Note that post(8) and whom(1) use context_foil (), so they
+       won't see the profile component. */
+    if ((np = context_find("Local-Mailbox")) != NULL) {
+       char *left_angle_bracket = strchr (np, '<');
+       char *at_sign = strchr (np, '@');
+       char *right_angle_bracket = strchr (np, '>');
+
+       strncpy(localmbox, np, sizeof(localmbox));
+
+       if (left_angle_bracket  &&  at_sign  &&  right_angle_bracket) {
+           if (at_sign > left_angle_bracket  &&
+               at_sign - left_angle_bracket < BUFSIZ) {
+               strncpy(username, left_angle_bracket + 1,
+                       at_sign - left_angle_bracket - 1);
+           }
+       }
+    }
+
+    if (username[0] == '\0') {
+       strncpy (username, pw->pw_name, sizeof(username));
+    }
+
+    username[sizeof(username) - 1] = '\0';
+
+    escape_local_part(username, sizeof(username));
+
+
+    /* fullname */
     np = pw->pw_gecos;
 
     /* Get the user's real name from the GECOS field.  Stop once we hit a ',',
        which some OSes use to separate other 'finger' information in the GECOS
     np = pw->pw_gecos;
 
     /* Get the user's real name from the GECOS field.  Stop once we hit a ',',
        which some OSes use to separate other 'finger' information in the GECOS
-       field, like phone number.  Also, if mmailid masquerading is turned on due
-       to "mmailid" appearing on the "masquerade:" line of mts.conf, stop if we
-       hit a '<' (which should precede any ','s). */
-    if (mmailid_masquerading)
-       /* Stop at ',' or '<'. */
-       for (cp = fullname; *np != '\0' && *np != ',' && *np != '<';
-            *cp++ = *np++)
-           continue;
-    else
-       /* Allow '<' as a legal character of the user's name.  This code is
-          basically a duplicate of the code above the "else" -- we don't
-          collapse it down to one copy and put the mmailid_masquerading check
-          inside the loop with "(x ? y : z)" because that's inefficient and the
-          value'll never change while it's in there. */
-       for (cp = fullname; *np != '\0' && *np != ',';
-            *cp++ = *np++)
-           continue;
+       field, like phone number. */
+    for (cp = fullname; *np != '\0' && *np != ','; *cp++ = *np++)
+       continue;
     *cp = '\0';
 
     *cp = '\0';
 
-    if (mmailid_masquerading) {
-       /* Do mmailid processing.  The GECOS field should have the form
-          "Full Name <fakeusername>".  For instance,
-          "Dan Harkless <Dan.Harkless>".  Naturally, you'll want your MTA to
-          have an alias (e.g. in /etc/aliases) from "fakeusername" to your
-          account name.  */ 
-       if (*np)
-           np++;
-       for (cp = username; *np && *np != '>'; *cp++ = *np++)
-           continue;
-       *cp = '\0';
-    }
-    if (!mmailid_masquerading || *np == '\0')
-       strncpy (username, pw->pw_name, sizeof(username));
-
     /* The $SIGNATURE environment variable overrides the GECOS field's idea of
        your real name. If SIGNATURE isn't set, use the Signature profile
     /* The $SIGNATURE environment variable overrides the GECOS field's idea of
        your real name. If SIGNATURE isn't set, use the Signature profile
-       setting if it exists. */
+       setting if it exists.
+       Note that post(8) and whom(1) use context_foil (), so they
+       won't see the profile component. */
     if ((cp = getenv ("SIGNATURE")) && *cp)
        strncpy (fullname, cp, sizeof(fullname));
     else if ((cp = context_find("Signature")))
        strncpy (fullname, cp, sizeof(fullname));
 
     if ((cp = getenv ("SIGNATURE")) && *cp)
        strncpy (fullname, cp, sizeof(fullname));
     else if ((cp = context_find("Signature")))
        strncpy (fullname, cp, sizeof(fullname));
 
-    if (strchr(fullname, '.')) {               /*  quote any .'s */
-       char tmp[BUFSIZ];
+    fullname[sizeof(fullname) - 1] = '\0';
 
 
-       /* should quote "'s too */
-       snprintf (tmp, sizeof(tmp), "\"%s\"", fullname);
-       strncpy (fullname, tmp, sizeof(fullname));
-    }
+    escape_display_name(fullname, sizeof(fullname));
 
 
-    fullname[sizeof(fullname) - 1] = '\0';
 
 
-    return;
+    /* localmbox, if not using Local-Mailbox */
+    if (localmbox[0] == '\0') {
+       snprintf(localmbox, sizeof(localmbox), "%s <%s@%s>", fullname,
+                username, LocalName(0));
+    }
+
+    localmbox[sizeof(localmbox) - 1] = '\0';
 }
 
 static const char*
 }
 
 static const char*
@@ -455,8 +449,7 @@ get_mtsuserconf_pathname (void)
 static void
 mts_read_conf_file (FILE *fp)
 {
 static void
 mts_read_conf_file (FILE *fp)
 {
-    unsigned char *bp;
-    char *cp, buffer[BUFSIZ];
+    char *bp, *cp, buffer[BUFSIZ];
     struct bind *b;
 
     while (fgets (buffer, sizeof(buffer), fp)) {
     struct bind *b;
 
     while (fgets (buffer, sizeof(buffer), fp)) {
@@ -468,7 +461,7 @@ mts_read_conf_file (FILE *fp)
        if (!(bp = strchr(buffer, ':')))
            break;
        *bp++ = 0;
        if (!(bp = strchr(buffer, ':')))
            break;
        *bp++ = 0;
-       while (isspace (*bp))
+       while (isspace ((unsigned char) *bp))
            *bp++ = 0;
 
        for (b = binds; b->keyword; b++)
            *bp++ = 0;
 
        for (b = binds; b->keyword; b++)