Code: Select all
diff -r -u -N ssmtp-2.61/aliases ssmtp-2.61.new/aliases
--- ssmtp-2.61/aliases 1970-01-01 03:00:00.000000000 +0300
+++ ssmtp-2.61.new/aliases 2007-01-25 13:06:28.000000000 +0300
@@ -0,0 +1,5 @@
+# Simple rcpt aliases
+# Mapping done before all other translations (UID checking, appending domain, etc.)
+#
+# Example:
+# john: john.smith@domain.com
diff -r -u -N ssmtp-2.61/Makefile.in ssmtp-2.61.new/Makefile.in
--- ssmtp-2.61/Makefile.in 2004-07-26 09:32:18.000000000 +0400
+++ ssmtp-2.61.new/Makefile.in 2007-01-25 13:02:50.000000000 +0300
@@ -17,9 +17,11 @@
# Configuration files
CONFIGURATION_FILE=$(SSMTPCONFDIR)/ssmtp.conf
REVALIASES_FILE=$(SSMTPCONFDIR)/revaliases
+ALIASES_FILE=$(SSMTPCONFDIR)/aliases
INSTALLED_CONFIGURATION_FILE=$(CONFIGURATION_FILE)
INSTALLED_REVALIASES_FILE=$(REVALIASES_FILE)
+INSTALLED_ALIASES_FILE=$(ALIASES_FILE)
# Programs
GEN_CONFIG=$(srcdir)/generate_config
@@ -34,6 +36,7 @@
-DSSMTPCONFDIR=\"$(SSMTPCONFDIR)\" \
-DCONFIGURATION_FILE=\"$(CONFIGURATION_FILE)\" \
-DREVALIASES_FILE=\"$(REVALIASES_FILE)\" \
+-DALIASES_FILE=\"$(ALIASES_FILE)\" \
CFLAGS=-Wall @DEFS@ $(EXTRADEFS) @CFLAGS@
@@ -52,6 +55,7 @@
$(INSTALL) -m 644 $(srcdir)/ssmtp.8 $(mandir)/ssmtp.8
$(INSTALL) -d -m 755 $(SSMTPCONFDIR)
$(INSTALL) -m 644 $(srcdir)/revaliases $(INSTALLED_REVALIASES_FILE)
+ $(INSTALL) -m 644 $(srcdir)/aliases $(INSTALLED_ALIASES_FILE)
$(GEN_CONFIG) $(INSTALLED_CONFIGURATION_FILE)
@@ -69,7 +73,7 @@
uninstall:
$(RM) $(bindir)/ssmtp
$(RM) $(mandir)/ssmtp.8
- $(RM) $(CONFIGURATION_FILE) $(REVALIASES_FILE)
+ $(RM) $(CONFIGURATION_FILE) $(REVALIASES_FILE) $(ALIASES_FILE)
$(RM) -r $(SSMTPCONFDIR)
.PHONY: uninstall-sendmail
diff -r -u -N ssmtp-2.61/ssmtp.c ssmtp-2.61.new/ssmtp.c
--- ssmtp-2.61/ssmtp.c 2004-07-23 09:58:48.000000000 +0400
+++ ssmtp-2.61.new/ssmtp.c 2007-01-25 15:53:15.000000000 +0300
@@ -420,6 +420,46 @@
}
/*
+ * Eugene:
+ *
+ * simple aliases support:
+ * lookup aliases file and remap rcpt
+ */
+char *aliases_lookup(char *str)
+{
+ char buf[(BUF_SZ + 1)], *p;
+ char name[(BUF_SZ + 1)];
+ FILE *fp;
+ char *saveptr = NULL;
+
+ if((fp = fopen(ALIASES_FILE, "r"))) {
+ strncpy(name, str, BUF_SZ);
+ while(fgets(buf, sizeof(buf), fp)) {
+ /* Make comments invisible */
+ if((p = strchr(buf, '#'))) {
+ *p = (char)NULL;
+ }
+
+ /* Ignore malformed lines and comments */
+ if(strchr(buf, ':') == (char *)NULL) {
+ continue;
+ }
+
+ /* Parse the alias */
+ if( (p = strtok_r(buf, ": \t\r\n", &saveptr) ) && !strncmp(p, name, BUF_SZ) &&
+ (p = strtok_r(NULL, ": \t\r\n", &saveptr) )) {
+ /*if(log_level > 0)*/ log_event(LOG_INFO, "Remapping: \"%s\" --> \"%s\"\n", name, p);
+ strncpy(name, p, BUF_SZ);
+ }
+ }
+
+ fclose(fp);
+ return strdup(name);
+
+ } else return str; /* can't read aliases? it's not a problem */
+}
+
+/*
from_strip() -- Transforms "Name <login@host>" into "login@host" or "login@host (Real name)"
*/
char *from_strip(char *str)
@@ -480,6 +520,11 @@
die("from_format() -- snprintf() failed");
}
}
+ else {
+ if(snprintf(buf, BUF_SZ, "%s", str) == -1) {
+ die("from_format() -- snprintf() failed");
+ }
+ }
}
#if 0
@@ -640,9 +685,14 @@
char *rcpt_remap(char *str)
{
struct passwd *pw;
- if((root==NULL) || strlen(root)==0 || strchr(str, '@') ||
- ((pw = getpwnam(str)) == NULL) || (pw->pw_uid > MAXSYSUID)) {
- return(append_domain(str)); /* It's not a local systems-level user */
+ char *rcpt;
+
+ /* before all other mappings */
+ rcpt = aliases_lookup(str);
+
+ if((root==NULL) || strlen(root)==0 || strchr(rcpt, '@') ||
+ ((pw = getpwnam(rcpt)) == NULL) || (pw->pw_uid > MAXSYSUID)) {
+ return(append_domain(rcpt)); /* It's not a local systems-level user */
}
else {
return(append_domain(root));


