static char username[BUFSIZ];
static char fullname[BUFSIZ];
-/* variables for username masquerading */
-int MMailids = 0; /* used from post.c as well as here */
-static char *mmailid = "0";
-
+/* 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 = "";
/*
* MTS specific variables
*/
-#if defined(SENDMTS) || defined(SMTPMTS)
+#if defined(SMTPMTS)
+static char *sm_method = "smtp";
+int sm_mts = MTS_SMTP;
char *hostable = nmhetcdir(/hosts);
char *sendmail = SENDMAILPATH;
#endif
{ "uucplfil", &uucplfil },
{ "mmdelim1", &mmdlm1 },
{ "mmdelim2", &mmdlm2 },
- { "mmailid", &mmailid },
-
-#if defined(SENDMTS) || defined(SMTPMTS)
- { "hostable", &hostable },
-#endif
+ { "masquerade", &masquerade },
-#ifdef SENDMTS
- { "sendmail", &sendmail },
+#if defined(SMTPMTS)
+ { "mts", &sm_method },
+ { "hostable", &hostable },
+ { "sendmail", &sendmail },
#endif
{ "clientname", &clientname },
}
fclose (fp);
- MMailids = atoi (mmailid);
+
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
}
|| pw->pw_name == NULL
|| *pw->pw_name == '\0') {
#endif /* KPOP */
-
strncpy (username, "unknown", sizeof(username));
snprintf (fullname, sizeof(fullname), "The Unknown User-ID (%d)",
(int) getuid ());
np = pw->pw_gecos;
- /*
- * Do mmailid (username masquerading) 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.
- */
+ /* 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). */
#ifndef BSD42
- for (cp = fullname; *np && *np != (MMailids ? '<' : ','); *cp++ = *np++)
- continue;
+ 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;
#else /* BSD42 */
/* On BSD(-derived) systems, the system utilities that deal with the GECOS
field (finger, mail, sendmail, etc.) translate any '&' character in it to
fingering a user "bob" with the GECOS field "& Jones" would reveal him to
be "In real life: Bob Jones". Surprisingly, though, the OS doesn't do
the translation for you, so we have to do it manually here. */
- for (cp = fullname; *np && *np != (MMailids ? '<' : ','); ) {
- if (*np == '&') { /* blech! */
- strcpy (cp, pw->pw_name);
- *cp = toupper(*cp);
- while (*cp)
- cp++;
- np++;
- } else {
- *cp++ = *np++;
+ if (mmailid_masquerading)
+ /* Stop at ',' or '<'. */
+ for (cp = fullname;
+ *np != '\0' && *np != ',' && *np != '<';) {
+ if (*np == '&') { /* blech! */
+ strcpy (cp, pw->pw_name);
+ *cp = toupper(*cp);
+ while (*cp)
+ cp++;
+ np++;
+ } else {
+ *cp++ = *np++;
+ }
+ }
+ 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 != ',';) {
+ if (*np == '&') { /* blech! */
+ strcpy (cp, pw->pw_name);
+ *cp = toupper(*cp);
+ while (*cp)
+ cp++;
+ np++;
+ } else {
+ *cp++ = *np++;
+ }
}
- }
#endif /* BSD42 */
-
*cp = '\0';
- if (MMailids) {
+
+ 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 (MMailids == 0 || *np == '\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 ((cp = getenv ("SIGNATURE")) && *cp)
strncpy (fullname, cp, sizeof(fullname));