From 10af4f205182e3acd6654d4997e2351e7860849a Mon Sep 17 00:00:00 2001 From: "Eric S. Raymond" Date: Thu, 24 Jul 1997 20:56:44 +0000 Subject: Added the via option. svn path=/trunk/; revision=1179 --- NEWS | 1 + driver.c | 79 +++++++++++++++++++++++++++++++++++++++++++++--------- fetchmail-FAQ.html | 6 ++--- fetchmail.c | 11 +++++--- fetchmail.h | 1 + fetchmail.man | 24 ++++++++++++++--- rcfile_l.l | 1 + rcfile_y.y | 5 +++- sample.rcfile | 5 ++-- 9 files changed, 107 insertions(+), 26 deletions(-) diff --git a/NEWS b/NEWS index ffa50749..d05a25a3 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,7 @@ ------------------------------------------------------------------------------ fetchmail 4.0.3 () * Replace vsprintf with vnsprintf to avoid buffer-overrun screws. +* Added via option to make ssh configuration cleaner. There are 257 people on the fetchmail-friends list. diff --git a/driver.c b/driver.c index aba38f09..934ddacb 100644 --- a/driver.c +++ b/driver.c @@ -114,23 +114,32 @@ static int is_host_alias(const char *name, struct query *ctl) ctl->server.lead_server ? ctl->server.lead_server : &ctl->server; /* - * The first two checks are optimizations that will catch a good - * many cases. (1) check against the hostname the user - * specified. Odds are good this will either be the mailserver's - * FQDN or a suffix of it with the mailserver's domain's default - * host name omitted. Then check the rest of the `also known as' + * The first three checks are optimizations that will catch a good + * many cases. + * + * (1) check against the poll name the user specified. Odds are + * good this will either be the mailserver's FQDN or a suffix of + * it with the mailserver's domain's default host name omitted. + * + * (2) Check the `via' or true host name if present, just in case + * the poll name is a label for one of a couple of different + * configurations and the real server name is here. + * + * (3) Then check the rest of the `also known as' * cache accumulated by previous DNS checks. This cache is primed * by the aka list option. * - * (2) check against the mailserver's FQDN, in case + * (4) Finally check against the mailserver's FQDN, in case * it's not the same as the declared hostname. * - * Either of these on a mail address is definitive. Only if the - * name doesn't match either is it time to call the bind library. + * Any of these on a mail address is definitive. Only if the + * name doesn't match any is it time to call the bind library. * If this happens odds are good we're looking at an MX name. */ if (str_in_list(&lead_server->names, name)) return(TRUE); + else if (ctl->server.via && strcmp(name, ctl->server.via) == 0) + return(TRUE); else if (strcmp(name, ctl->server.canonical_name) == 0) return(TRUE); else if (!ctl->server.dns) @@ -391,11 +400,48 @@ int smtp_open(struct query *ctl) /* if no socket to this host is already set up, try to open ESMTP */ if (ctl->smtp_socket == -1) { +#ifndef HAVE_RES_SEARCH + char *fakename; +#endif /* HAVE_RES_SEARCH */ + if ((ctl->smtp_socket = SockOpen(idp->id,SMTP_PORT)) == -1) continue; - else if (SMTP_ok(ctl->smtp_socket) != SM_OK + +#ifndef HAVE_RES_SEARCH + /* + * How we compute the fake client name to pass to the + * listener doesn't affect behavior on RFC1123- violating + * listener that check for name match; we're going to lose + * on those anyway because we can never give them a name + * that matches the local machine fetchmail is running on. + * What it will affect is the listener's logging. + * + * If we have the mailserver's canonical FQDN that is clearly + * the right thing to log. If we don't life is more complicated. + * The problem is there are two clashing cases: + * + * (1) The poll name is a label. In that case we want the + * log to show the via or true mailserver name. + * + * (2) The poll name is the true one, the via name is localhost. + * This is going to be typical for ssh-using configurations. + * + * We're going to assume the via name is true unless it's + * localhost. + */ + if (ctrl->server.via && strcmp(ctrl->server.via, "localhost")) + fakename = ctrl->server.via; + else + fakename = ctrl->server->names.id; +#endif /* HAVE_RES_SEARCH */ + + if (SMTP_ok(ctl->smtp_socket) != SM_OK || SMTP_ehlo(ctl->smtp_socket, - ctl->server.names->id, +#ifdef HAVE_RES_SEARCH + ctl->server.canonical_name, +#else + fakename, +#endif /* HAVE_RES_SEARCH */ &ctl->server.esmtp_options) != SM_OK) { /* @@ -418,7 +464,13 @@ int smtp_open(struct query *ctl) if ((ctl->smtp_socket = SockOpen(idp->id,SMTP_PORT)) == -1) continue; else if (SMTP_ok(ctl->smtp_socket) != SM_OK - || SMTP_helo(ctl->smtp_socket, ctl->server.names->id) != SM_OK) + || SMTP_helo(ctl->smtp_socket, +#ifdef HAVE_RES_SEARCH + ctl->server.canonical_name +#else + fakename +#endif /* HAVE_RES_SEARCH */ + ) != SM_OK) { close(ctl->smtp_socket); ctl->smtp_socket = -1; @@ -1242,7 +1294,7 @@ const struct method *proto; /* protocol method table */ } else { - char buf [POPBUFSIZE+1], *sp; + char buf [POPBUFSIZE+1], *sp, *realhost; int *msgsizes, len, num, count, new, deletions = 0; int port, fetches; struct idlist *idp; @@ -1258,7 +1310,8 @@ const struct method *proto; /* protocol method table */ /* open a socket to the mail server */ port = ctl->server.port ? ctl->server.port : protocol->port; - if ((sock = SockOpen(ctl->server.names->id, port)) == -1) + realhost = ctl->server.via ? ctl->server.via : ctl->server.names->id; + if ((sock = SockOpen(realhost, port)) == -1) { #ifndef EHOSTUNREACH #define EHOSTUNREACH (-1) diff --git a/fetchmail-FAQ.html b/fetchmail-FAQ.html index bbf1d34c..d2788233 100644 --- a/fetchmail-FAQ.html +++ b/fetchmail-FAQ.html @@ -480,14 +480,14 @@ but only supports one user at a time.

First, a lightly edited version of a recipe from Masafumi NAKANE:

1. You must have ssh (the ssh client) on the local host and sshd (ssh -server) on the remote mail server. And, you have to configure ssh so +server) on the remote mail server. And you have to configure ssh so you can login to the sshd server host without a password. (Refer to ssh man page for several authentication methods.)

2. Add something like following to your .fetchmailrc file:

-poll localhost port 1234 with pop3:
+poll mailhost port 1234 via localhost with pop3:
         preconnect "ssh -f -L 1234:mailhost:110 mailhost sleep 20 /dev/null";
 
@@ -1200,7 +1200,7 @@ biff n to solve the problem system-wide.

-$Id: fetchmail-FAQ.html,v 1.47 1997/07/24 08:22:49 esr Exp $

+$Id: fetchmail-FAQ.html,v 1.48 1997/07/24 20:56:41 esr Exp $


Eric S. Raymond <esr@snark.thyrsus.com>
diff --git a/fetchmail.c b/fetchmail.c index 7810ec9b..dfd0c300 100644 --- a/fetchmail.c +++ b/fetchmail.c @@ -135,8 +135,12 @@ int main (int argc, char **argv) printf("\n"); else printf(" and %s\n", rcfile); + if (poll_interval) + printf("Poll interval is %d seconds\n", poll_interval); if (outlevel == O_VERBOSE) printf("Lockfile at %s\n", tmpbuf); + if (logfile) + printf("Logfile is %s\n", logfile); for (ctl = querylist; ctl; ctl = ctl->next) { if (ctl->active && !(implicitmode && ctl->server.skip)) dump_params(ctl); @@ -779,10 +783,9 @@ void dump_params (struct query *ctl) printf("Options for retrieving from %s@%s:\n", ctl->remotename, visbuf(ctl->server.names->id)); - if (logfile) - printf(" Logfile is %s\n", logfile); - if (poll_interval) - printf(" Poll interval is %d seconds\n", poll_interval); + if (ctl->server.via) + printf(" Mail will be retrieved via %s\n", ctl->server.via); + if (ctl->server.interval) printf(" Poll of this server will occur every %d intervals.\n", ctl->server.interval); diff --git a/fetchmail.h b/fetchmail.h index a9775c70..24ef5ee0 100644 --- a/fetchmail.h +++ b/fetchmail.h @@ -78,6 +78,7 @@ typedef char flag; struct hostdata /* shared among all user connections to given server */ { /* rc file data */ + char *via; /* "true" server name if non-NULL */ struct idlist *names; /* server name first, then akas */ struct idlist *localdomains; /* list of pass-through domains */ int protocol; /* protocol type */ diff --git a/fetchmail.man b/fetchmail.man index e2b4ce62..792093fb 100644 --- a/fetchmail.man +++ b/fetchmail.man @@ -657,6 +657,7 @@ safely, or easily disable entries for hosts that are temporarily down.) .PP Legal server options are: + via protocol (or proto) port authenticate (or auth) @@ -704,9 +705,26 @@ The 'folder' and 'smtphost' options can take a space- or comma-separated list of names following them. .PP All options correspond to the obvious command-line arguments, except -the following: `interval', `aka', `is', `to', `dns'/`no dns', `password', -\&`preconnect', `localdomains', `stripcr'/`no stripcr' , -\&`forcecr'/`no forcecr', `pass8bits'/`no pass8bits' and `no received'. +the following: `via', `interval', `aka', `is', `to', `dns'/`no dns', +\&`password', \&`preconnect', `localdomains', `stripcr'/`no stripcr' , +\&`forcecr'/`no forcecr', `pass8bits'/`no pass8bits' and `no +received'. +.PP +The `via' option is for use with ssh, or if you want to have more +than one configuration pointing at the same site. If it is present, +the string argument will be taken as the actual DNS name of the +mailserver host to query. So, for example, you can say: + +.nf +poll mailhost.net via localhost port 1234 with pop3: + preconnect "ssh -f -L 1234:mailhost.net:110 mailhost.net sleep 20 /dev/null"; +.fi + +This will override the argument of poll, which can simply be a +distinct label for the configuration. The poll name will still be the +one you would give on the command line to explicitly query this host. +It will also still be used as a possible match in multidrop mode, in +case it is (as in this case) the real host name. .PP The `interval' option (which takes a numeric argument) allows you to poll a server less frequently than the basic poll interval. If you say diff --git a/rcfile_l.l b/rcfile_l.l index f708f157..fdb6e03d 100644 --- a/rcfile_l.l +++ b/rcfile_l.l @@ -30,6 +30,7 @@ defaults { return DEFAULTS; } server { return POLL; } poll { return POLL; } skip { return SKIP; } +via { return VIA; } aka { return AKA; } local(domains) { return LOCALDOMAINS; } proto(col)? { return PROTOCOL; } diff --git a/rcfile_y.y b/rcfile_y.y index ea163e10..d9705945 100644 --- a/rcfile_y.y +++ b/rcfile_y.y @@ -54,7 +54,7 @@ extern char * yytext; char *sval; } -%token DEFAULTS POLL SKIP AKA LOCALDOMAINS PROTOCOL +%token DEFAULTS POLL SKIP VIA AKA LOCALDOMAINS PROTOCOL %token AUTHENTICATE TIMEOUT KPOP KERBEROS4 %token ENVELOPE USERNAME PASSWORD FOLDER SMTPHOST MDA PRECONNECT LIMIT %token IS HERE THERE TO MAP WILDCARD @@ -126,6 +126,7 @@ domain_list : STRING {save_str(¤t.server.localdomains,-1,$1);} ; serv_option : AKA alias_list + | VIA STRING {current.server.via = xstrdup($2);} | LOCALDOMAINS domain_list | PROTOCOL PROTO {current.server.protocol = $2;} | PROTOCOL KPOP { @@ -398,6 +399,7 @@ static void record_current(void) /* register current parameters and append to the host list */ { #define FLAG_FORCE(fld) if (cmd_opts.fld) current.fld = cmd_opts.fld + FLAG_FORCE(server.via); FLAG_FORCE(server.protocol); FLAG_FORCE(server.port); FLAG_FORCE(server.interval); @@ -449,6 +451,7 @@ void optmerge(struct query *h2, struct query *h1) append_str_list(&h2->smtphunt, &h1->smtphunt); #define FLAG_MERGE(fld) if (!h2->fld) h2->fld = h1->fld + FLAG_MERGE(server.via); FLAG_MERGE(server.protocol); FLAG_MERGE(server.port); FLAG_MERGE(server.interval); diff --git a/sample.rcfile b/sample.rcfile index 9f0fa62b..fd648fc6 100644 --- a/sample.rcfile +++ b/sample.rcfile @@ -19,8 +19,9 @@ # arguments in this file, the command-line arguments take precedence. # # Legal keywords are -# poll -- must be followed by a mailserver name -# skip -- must be followed by a mailserver name +# poll -- must be followed by a mailserver name or label +# skip -- must be followed by a mailserver name or label +# via -- must be followed by true name of host to poll # interval -- must be followed by an interval skip count # protocol (or proto) -- must be followed by a protocol ID # uidl -- cgit v1.2.3