diff options
-rw-r--r-- | conf.c | 18 | ||||
-rw-r--r-- | fetchmail-FAQ.html | 22 | ||||
-rw-r--r-- | fetchmail.c | 79 | ||||
-rw-r--r-- | fetchmail.h | 11 | ||||
-rw-r--r-- | fetchmail.man | 28 | ||||
-rwxr-xr-x | fetchmailconf | 18 | ||||
-rw-r--r-- | gssapi.c | 20 | ||||
-rw-r--r-- | imap.c | 74 | ||||
-rw-r--r-- | pop3.c | 40 | ||||
-rw-r--r-- | rcfile_l.l | 1 | ||||
-rw-r--r-- | rcfile_y.y | 4 |
11 files changed, 162 insertions, 153 deletions
@@ -155,11 +155,11 @@ void dump_config(struct runctl *runp, struct query *querylist) printf("'imap',"); #endif /* IMAP_ENABLE */ #ifdef GSSAPI - printf("'imap-gss',"); + printf("'gssapi',"); #endif /* GSSAPI */ -#if defined(IMAP4) && defined(KERBEROS_V4) - printf("'imap-k4',"); -#endif /* defined(IMAP4) && defined(KERBEROS_V4) */ +#if defined(KERBEROS_V4) + printf("'kerberos',"); +#endif /* defined(IMAP4) */ #ifdef RPA_ENABLE printf("'rpa',"); #endif /* RPA_ENABLE */ @@ -271,14 +271,18 @@ void dump_config(struct runctl *runp, struct query *querylist) numdump("envskip", ctl->server.envskip); stringdump("qvirtual", ctl->server.qvirtual); - if (ctl->server.preauthenticate == A_KERBEROS_V4) + if (ctl->server.preauthenticate == A_ANY) + stringdump("preauth", "any"); + else if (ctl->server.preauthenticate == A_PASSWORD) + stringdump("preauth", "password"); + else if (ctl->server.preauthenticate == A_GSSAPI) + stringdump("preauth", "gssapi"); + else if (ctl->server.preauthenticate == A_KERBEROS_V4) stringdump("preauth", "kerberos_v4"); else if (ctl->server.preauthenticate == A_KERBEROS_V5) stringdump("preauth", "kerberos_v5"); else if (ctl->server.preauthenticate == A_SSH) stringdump("preauth", "ssh"); - else - stringdump("preauth", "password"); #if defined(HAVE_GETHOSTBYNAME) && defined(HAVE_RES_SEARCH) booldump("dns", ctl->server.dns); diff --git a/fetchmail-FAQ.html b/fetchmail-FAQ.html index 84d06ae9..df418399 100644 --- a/fetchmail-FAQ.html +++ b/fetchmail-FAQ.html @@ -10,7 +10,7 @@ <table width="100%" cellpadding=0><tr> <td width="30%">Back to <a href="index.html">Fetchmail Home Page</a> <td width="30%" align=center>To <a href="/~esr/sitemap.html">Site Map</a> -<td width="30%" align=right>$Date: 2001/02/11 23:26:07 $ +<td width="30%" align=right>$Date: 2001/02/12 01:14:27 $ </table> <HR> <H1>Frequently Asked Questions About Fetchmail</H1> @@ -682,6 +682,24 @@ once you have installed the `bind' package.<P> <hr> <h2><a name="F1">F1. Why does my old .fetchmailrc file no longer work?</a></h2> +<h3>If your file predates 5.6.5</h3> + +The <tt>imap-gss</tt>, <tt>imap-k4</tt>, and <tt>imap-login</tt> +protocol types are gone. This is a result of a major re-factoring +of the authentication machinery; fetchmail can now use Kerberos V4 +and GSSAPI not just with IMAP but with POP3 servers that have RFC1734 +support for the AUTH command.<p> + +When trying to identify you to an IMAP or POP mailserver, fetchmail +now first tries methods that don't require a password (GSSAPI, +KERBEROS_IV); then it looks for methods that mask your password +(CRAM-MD5, X-OTP); and only if it the server doesn't support any of +those will it ship your password en clair.<p> + +Setting the <tt>preauth</tt> option to any value other than `password' +will prevent from looking for a password in your <tt>.netrc</tt> file +or querying for it at startup time.<p> + <h3>If your file predates 5.1.0</h3> In 5.1.0, the <tt>auth</tt> keyword and option were changed to @@ -2963,7 +2981,7 @@ switching to IMAP and using a short expunge interval.<p> <table width="100%" cellpadding=0><tr> <td width="30%">Back to <a href="index.html">Fetchmail Home Page</a> <td width="30%" align=center>To <a href="/~esr/sitemap.html">Site Map</a> -<td width="30%" align=right>$Date: 2001/02/11 23:26:07 $ +<td width="30%" align=right>$Date: 2001/02/12 01:14:27 $ </table> <P><ADDRESS>Eric S. Raymond <A HREF="mailto:esr@thyrsus.com"><esr@snark.thyrsus.com></A></ADDRESS> diff --git a/fetchmail.c b/fetchmail.c index 9e42335a..b7510513 100644 --- a/fetchmail.c +++ b/fetchmail.c @@ -323,7 +323,7 @@ int main(int argc, char **argv) { if (ctl->active && !(implicitmode && ctl->server.skip)&&!ctl->password) { - if (ctl->server.preauthenticate != A_PASSWORD) + if (ctl->server.preauthenticate > A_PASSWORD) /* Server won't care what the password is, but there must be some non-null string here. */ ctl->password = ctl->remotename; @@ -493,7 +493,7 @@ int main(int argc, char **argv) for (ctl = querylist; ctl; ctl = ctl->next) { if (ctl->active && !(implicitmode && ctl->server.skip) - && ctl->server.preauthenticate == A_PASSWORD + && ctl->server.preauthenticate <= A_PASSWORD && !ctl->password) { if (!isatty(0)) @@ -1102,12 +1102,9 @@ static int load_params(int argc, char **argv, int optind) * * If we're using Kerberos for authentication, we need * the FQDN in order to generate capability keys. */ - if (ctl->server.protocol == P_ETRN -#ifdef ODMR_ENABLE - || ctl->server.protocol == P_ODMR -#endif /* ODMR_ENABLE */ - || ctl->server.preauthenticate == A_KERBEROS_V4 - || ctl->server.preauthenticate == A_KERBEROS_V5) + if (ctl->server.protocol==P_ETRN || ctl->server.protocol==P_ODMR + || ctl->server.preauthenticate == A_KERBEROS_V4 + || ctl->server.preauthenticate == A_KERBEROS_V5) if (strcmp(fetchmailhost, "localhost") == 0) fetchmailhost = host_fqdn(); @@ -1563,32 +1560,22 @@ static void dump_params (struct runctl *runp, if (ctl->server.skip || outlevel >= O_VERBOSE) printf(_(" This host %s be queried when no host is specified.\n"), ctl->server.skip ? _("will not") : _("will")); - /* - * Don't poll for password when there is one or when using the ETRN - * or GSSAPI or KERBEROS protocol - */ - /* ETRN, IMAP_GSS, and IMAP_K4 do not need a password, so skip this */ - if ( (ctl->server.protocol != P_ETRN) -#ifdef GSSAPI - && (ctl->server.preauthenticate != A_GSSAPI) -#endif /* GSSAPI */ - && (ctl->server.preauthenticate != A_KERBEROS_V4) - && (ctl->server.preauthenticate != A_KERBEROS_V5)) + if (ctl->server.preauthenticate <= A_PASSWORD) { - if (!ctl->password) - printf(_(" Password will be prompted for.\n")); - else if (outlevel >= O_VERBOSE) - { - if (ctl->server.protocol == P_APOP) - printf(_(" APOP secret = \"%s\".\n"), - visbuf(ctl->password)); - else if (ctl->server.protocol == P_RPOP) - printf(_(" RPOP id = \"%s\".\n"), - visbuf(ctl->password)); - else - printf(_(" Password = \"%s\".\n"), + if (!ctl->password) + printf(_(" Password will be prompted for.\n")); + else if (outlevel >= O_VERBOSE) + { + if (ctl->server.protocol == P_APOP) + printf(_(" APOP secret = \"%s\".\n"), + visbuf(ctl->password)); + else if (ctl->server.protocol == P_RPOP) + printf(_(" RPOP id = \"%s\".\n"), + visbuf(ctl->password)); + else + printf(_(" Password = \"%s\".\n"), visbuf(ctl->password)); - } + } } if (ctl->server.protocol == P_POP3 @@ -1618,15 +1605,29 @@ static void dump_params (struct runctl *runp, printf(_(" (forcing UIDL use)")); putchar('.'); putchar('\n'); - if (ctl->server.preauthenticate == A_KERBEROS_V4) - printf(_(" Kerberos V4 preauthentication enabled.\n")); - else if (ctl->server.preauthenticate == A_KERBEROS_V5) - printf(_(" Kerberos V5 preauthentication enabled.\n")); - else if (ctl->server.preauthenticate == A_SSH) + switch (ctl->server.preauthenticate) + { + case A_ANY: + printf(_(" All authentication methods will be described.\n")); + break; + case A_PASSWORD: + printf(_(" Password authentication will be forced.\n")); + break; + case A_GSSAPI: + printf(_(" GSSAPI preauthentication will be forced.\n")); + break; + case A_KERBEROS_V4: + printf(_(" Kerberos V4 preauthentication will be forced.\n")); + break; + case A_KERBEROS_V5: + printf(_(" Kerberos V5 preauthentication will be forced.\n")); + break; + case A_SSH: printf(_(" End-to-end encryption assumed.\n")); - if (ctl->server.principal != (char *) NULL) { - printf(_(" Mail service principal is: %s\n"), ctl->server.principal); + break; } + if (ctl->server.principal != (char *) NULL) + printf(_(" Mail service principal is: %s\n"), ctl->server.principal); #ifdef SSL_ENABLE if (ctl->use_ssl) printf(" SSL encrypted sessions enabled.\n"); diff --git a/fetchmail.h b/fetchmail.h index dbc386d4..b1b37d05 100644 --- a/fetchmail.h +++ b/fetchmail.h @@ -29,11 +29,12 @@ #endif /* preauthentication types */ -#define A_PASSWORD 0 /* password or inline authentication */ -#define A_KERBEROS_V4 1 /* preauthenticate w/ Kerberos V4 */ -#define A_KERBEROS_V5 2 /* preauthenticate w/ Kerberos V5 */ -#define A_GSSAPI 3 /* preauthenticate with GSSAPI */ -#define A_SSH 4 /* preauthentication at session level */ +#define A_ANY 0 /* use the first method that works */ +#define A_PASSWORD 1 /* password or inline authentication */ +#define A_KERBEROS_V4 2 /* preauthenticate w/ Kerberos V4 */ +#define A_KERBEROS_V5 3 /* preauthenticate w/ Kerberos V5 */ +#define A_GSSAPI 4 /* preauthenticate with GSSAPI */ +#define A_SSH 5 /* preauthentication at session level */ /* * Definitions for buffer sizes. We get little help on setting maxima diff --git a/fetchmail.man b/fetchmail.man index db1444aa..26e940bb 100644 --- a/fetchmail.man +++ b/fetchmail.man @@ -499,20 +499,22 @@ when interface data is being collected. .TP .B --preauth <type> (Keyword: preauth[enticate]) -This option permits you to specify a preauthentication type (see USER -AUTHENTICATION below for details). The possible values are +This option permits you to specify an authentication type (see USER +AUTHENTICATION below for details). The possible values are \fBany\fR, \&`\fBpassword\fR', `\fBkerberos_v5\fR' and `\fBkerberos\fR' (or, for excruciating exactness, `\fBkerberos_v4\fR'), \fRgssapi\fR, and -\fBssh\fR. Any value other than "password" suppresses fetchmail's -normal inquiry for a password. Specify \fBssh\fR when you are using -an end-to-end secure connection such as an ssh tunnel; specify -\fRgssapi\fR or \fBkerberos_v4\fR if you are using a protocol variant -that employs GSSAPI or K4. Other values of this option are provided -primarily for developers; choosing KPOP protocol automatically selects -Kerberos preauthentication, and all other alternatives use password -authentication (though APOP uses a generated one-time key as the -password and IMAP-K4 uses RFC1731 Kerberos v4 authentication). This -option does not work with ETRN or ODMR. +\fBssh\fR. When \fBany\fR (the default) is specified, fetchmail tries +first methods that don't require a password (GSSAPI, KERBEROS_IV); +then it looks for methods that mask your password (CRAM-MD5, X-OTP); +and only if it the server doesn't support any of those will it ship +your password en clair. Other values may be used to force various +authentication methods (\fBssh\fR suppresses authentication). Any +value other than "password" suppresses fetchmail's normal inquiry for +a password. Specify \fBssh\fR when you are using an end-to-end secure +connection such as an ssh tunnel; specify \fRgssapi\fR or +\fBkerberos_v4\fR if you are using a protocol variant that employs +GSSAPI or K4. Choosing KPOP protocol automatically selects Kerberos +preauthentication. This option does not work with ETRN or ODMR. .SS Miscellaneous Options .TP .B \-f <pathname>, --fetchmailrc <pathname> @@ -601,7 +603,7 @@ editor like written in Python. .SH USER AUTHENTICATION AND ENCRYPTION -Every mode except ETRN requires authentication of the client. +All modes except ETRN and ODMR requires authentication of the client. Normal user authentication in .I fetchmail is very much like the authentication mechanism of diff --git a/fetchmailconf b/fetchmailconf index a794ae69..7ef4add8 100755 --- a/fetchmailconf +++ b/fetchmailconf @@ -4,7 +4,7 @@ # by Eric S. Raymond, <esr@snark.thyrsus.com>. # Requires Python with Tkinter, and the following OS-dependent services: # posix, posixpath, socket -version = "1.35" +version = "1.36" from Tkinter import * from Dialog import * @@ -80,7 +80,7 @@ class Server: self.protocol = 'auto' # Default to auto protocol self.port = 0 # Port number to use self.uidl = FALSE # Don't use RFC1725 UIDLs by default - self.preauth = 'password' # Default to password authentication + self.preauth = 'any' # Default to password authentication self.timeout = 300 # 5-minute timeout self.envelope = 'Received' # Envelope-address header self.envskip = 0 # Number of envelope headers to skip @@ -370,12 +370,10 @@ defaultports = {"auto":0, "APOP":110, "KPOP":1109, "IMAP":143, - "IMAP-GSS":143, - "IMAP-K4":143, "ETRN":25, "ODMR":366} -preauthlist = ("password", "kerberos", "ssh") +preauthlist = ("any", "password", "gssapi", "kerberos", "ssh") listboxhelp = { 'title' : 'List Selection Help', @@ -1046,10 +1044,6 @@ class ServerEdit(Frame, MyWidget): protolist.append("SDPS") if 'imap' in feature_options: protolist.append("IMAP") - if 'imap-gss' in feature_options: - protolist.append("IMAP-GSS") - if 'imap-k4' in feature_options: - protolist.append("IMAP-K4") if 'etrn' in feature_options: protolist.append("ETRN") if 'odmr' in feature_options: @@ -1104,7 +1098,7 @@ class ServerEdit(Frame, MyWidget): self.server.localdomains, None, None, mdropwin, multihelp) mdropwin.pack(fill=X) - if os_type == 'linux' or os_type == 'freebsd' or 'netsec' in feature_options or 'imap-k4' in feature_options: + if os_type in ('linux', 'freebsd') or 'netsec' in feature_options: secwin = Frame(rightwin, relief=RAISED, bd=5) Label(secwin, text="Security").pack(side=TOP) # Don't actually let users set this. KPOP sets it implicitly @@ -1120,7 +1114,7 @@ class ServerEdit(Frame, MyWidget): LabeledEntry(secwin, 'IPV6 security options:', self.netsec, leftwidth).pack(side=TOP, fill=X) # Someday this should handle Kerberos 5 too - if 'imap-k4' in feature_options: + if 'kerberos' in feature_options: LabeledEntry(secwin, 'Principal:', self.principal, '12').pack(side=TOP, fill=X) Button(secwin, text='Help', fg='blue', @@ -1602,7 +1596,7 @@ class UserEdit(Frame, MyWidget): variable=self.idle).pack(side=TOP, anchor=W) limwin.pack(fill=X) - if self.parent.server.protocol in ('IMAP', 'IMAP-K4', 'IMAP-GSS'): + if self.parent.server.protocol == 'IMAP': foldwin = Frame(rightwin, relief=RAISED, bd=5) Label(foldwin, text="Remote folders (IMAP only)").pack(side=TOP) ListEdit("New folder:", self.user.mailboxes, @@ -106,10 +106,11 @@ int do_gssauth(int sock, char *command, char *hostname, char *username) } to64frombits(buf1, send_token.value, send_token.length); gss_release_buffer(&min_stat, &send_token); - strcat(buf1, "\r\n"); - SockWrite(sock, buf1, strlen(buf1)); - if (outlevel >= O_MONITOR) - report(stdout, "IMAP> %s\n", buf1); + + suppress_tags = TRUE; + gen_send(sock, buf1, strlen(buf1)); + suppress_tags = FALSE; + if (maj_stat == GSS_S_CONTINUE_NEEDED) { if (result = gen_recv(sock, buf1, sizeof buf1)) { gss_release_name(&min_stat, &target_name); @@ -119,18 +120,19 @@ int do_gssauth(int sock, char *command, char *hostname, char *username) request_buf.value = buf2; sec_token = &request_buf; } - } while (maj_stat == GSS_S_CONTINUE_NEEDED); + } while + (maj_stat == GSS_S_CONTINUE_NEEDED); gss_release_name(&min_stat, &target_name); /* get security flags and buffer size */ - if (result = gen_recv(sock, buf1, sizeof buf1)) { + if (result = gen_recv(sock, buf1, sizeof buf1)) return result; - } + request_buf.length = from64tobits(buf2, buf1 + 2); request_buf.value = buf2; - maj_stat = gss_unwrap(&min_stat, context, &request_buf, &send_token, - &cflags, &quality); + maj_stat = gss_unwrap(&min_stat, context, + &request_buf, &send_token, &cflags, &quality); if (maj_stat != GSS_S_COMPLETE) { report(stderr, _("Couldn't unwrap security level data\n")); gss_release_buffer(&min_stat, &send_token); @@ -277,46 +277,26 @@ int imap_getauth(int sock, struct query *ctl, char *greeting) } /* - * OK, now try the protocol variants that don't require passwords first. + * Time to authenticate the user. + * Try the protocol variants that don't require passwords first. */ #ifdef GSSAPI - if (strstr(capabilities, "AUTH=GSSAPI")) - { - if (ctl->server.preauthenticate == A_GSSAPI) - { - if (outlevel >= O_DEBUG) - report(stdout, _("GSS authentication is supported\n")); - return do_gssauth(sock, ctl->server.truename, ctl->remotename); - } - } - else if (ctl->server.preauthenticate == P_IMAP_GSS) - { - report(stderr, - _("Required GSS capability not supported by server\n")); - return(PS_AUTHFAIL); - } + if ((ctl->server.preauthenticate == A_ANY + || ctl->server.preauthenticate==A_GSSAPI) + && strstr(capabilities, "AUTH=GSSAPI")) + return(do_gssauth(sock, ctl->server.truename, ctl->remotename)); #endif /* GSSAPI */ #ifdef KERBEROS_V4 - if (strstr(capabilities, "AUTH=KERBEROS_V4")) - { - if (outlevel >= O_DEBUG) - report(stdout, _("KERBEROS_V4 authentication is supported\n")); - - if (ctl->server.preauthenticate == A_KERBEROS_V4) - { - if ((ok = do_rfc1731(sock, "AUTHENTICATE", ctl->server.truename))) - /* SASL cancellation of authentication */ - gen_send(sock, "*"); - return(ok); - } - /* else fall through to ordinary AUTH=LOGIN case */ - } - else if (ctl->server.preauthenticate == A_KERBEROS_V4) + if ((ctl->server.preauthenticate == A_ANY + || ctl->server.preauthenticate==A_KERBEROS_V4 + || ctl->server.preauthenticate==A_KERBEROS_V5) + && strstr(capabilities, "AUTH=KERBEROS_V4")) { - report(stderr, - _("Required KERBEROS_V4 capability not supported by server\n")); - return(PS_AUTHFAIL); + if ((ok = do_rfc1731(sock, "AUTHENTICATE", ctl->server.truename))) + /* SASL cancellation of authentication */ + gen_send(sock, "*"); + return(ok); } #endif /* KERBEROS_V4 */ @@ -327,8 +307,6 @@ int imap_getauth(int sock, struct query *ctl, char *greeting) if (strstr(capabilities, "AUTH=CRAM-MD5")) { - if (outlevel >= O_DEBUG) - report(stdout, _("CRAM-MD5 authentication is supported\n")); if ((ok = do_cram_md5 (sock, "AUTHENTICATE", ctl))) /* SASL cancellation of authentication */ gen_send(sock, "*"); @@ -337,30 +315,22 @@ int imap_getauth(int sock, struct query *ctl, char *greeting) #if OPIE_ENABLE if (strstr(capabilities, "AUTH=X-OTP")) - { - if (outlevel >= O_DEBUG) - report(stdout, _("OTP authentication is supported\n")); - if (do_otp(sock, ctl) == PS_SUCCESS) - return(PS_SUCCESS); - }; + return(do_otp(sock, ctl); #endif /* OPIE_ENABLE */ #ifdef NTLM_ENABLE if (strstr (capabilities, "AUTH=NTLM")) - { - if (outlevel >= O_DEBUG) - report (stdout, _("NTLM authentication is supported\n")); - return do_imap_ntlm (sock, ctl); - } + return(do_imap_ntlm (sock, ctl)); #endif /* NTLM_ENABLE */ #ifdef __UNUSED__ /* The Cyrus IMAP4rev1 server chokes on this */ /* this handles either AUTH=LOGIN or AUTH-LOGIN */ - if ((imap_version >= IMAP4rev1) && (!strstr(capabilities, "LOGIN"))) { - report(stderr, - _("Required LOGIN capability not supported by server\n")); - return PS_AUTHFAIL; - }; + if ((imap_version >= IMAP4rev1) && (!strstr(capabilities, "LOGIN"))) + { + report(stderr, + _("Required LOGIN capability not supported by server\n")); + return PS_AUTHFAIL; + } #endif /* __UNUSED__ */ /* we're stuck with sending the password en clair */ @@ -211,40 +211,54 @@ int pop3_getauth(int sock, struct query *ctl, char *greeting) if (strchr(greeting, '<') && gen_transact(sock, "AUTH") == 0) { char buffer[10]; - flag has_cram = FALSE; -#if defined(KERBEROS_IV) +#if defined(GSSAPI) + flag has_gssapi = FALSE; +#endif /* defined(GSSAPI) */ +#if defined(KERBEROS_V4) || defined(KERBEROS_V5) flag has_kerberos = FALSE; -#endif /* defined(KERBEROS_IV) */ +#endif /* defined(KERBEROS_V4) || defined(KERBEROS_V5) */ + flag has_cram = FALSE; #ifdef OPIE_ENABLE flag has_opie = FALSE; #endif /* OPIE_ENABLE */ + /* determine what authentication methods we have available */ while ((ok = gen_recv(sock, buffer, sizeof(buffer))) == 0) { if (DOTLINE(buffer)) break; - if (strncasecmp(buffer, "CRAM-MD5", 8) == 0) - has_cram = TRUE; -#if defined(KERBEROS_IV) +#if defined(GSSAPI) + if (strncasecmp(buffer, "GSSAPI", 8) == 0) + has_gssapi = TRUE; +#endif /* defined(GSSAPI) */ +#if defined(KERBEROS_V4) || defined(KERBEROS_V5) if (strncasecmp(buffer, "KERBEROS_V4", 8) == 0) has_kerberos = TRUE; -#endif /* defined(KERBEROS_IV) */ +#endif /* defined(KERBEROS_V4) || defined(KERBEROS_V5) */ + if (strncasecmp(buffer, "CRAM-MD5", 8) == 0) + has_cram = TRUE; #ifdef OPIE_ENABLE if (strncasecmp(buffer, "X-OTP", 8) == 0) has_opie = TRUE; #endif /* OPIE_ENABLE */ } -#if defined(KERBEROS_IV) + +#if defined(GSSAPI) + if (has_kerberos) + return(do_gssauth(sock, "AUTH", + ctl->server.truename, ctl->remotename)); +#endif /* defined(GSSAPI) */ +#if defined(KERBEROS_V4) || defined(KERBEROS_V5) if (has_kerberos) return(do_rfc1731(sock, "AUTH", ctl->server.truename)); -#endif /* defined(KERBEROS_IV) */ +#endif /* defined(KERBEROS_V4) || defined(KERBEROS_V5) */ + if (has_cram) + return(do_cram_md5(sock, "AUTH", ctl)); #ifdef OPIE_ENABLE if (has_opie) - do_otp(sock, ctl) + do_otp(sock, "AUTH", ctl) #endif /* OPIE_ENABLE */ - if (has_cram) - return(do_cram_md5(sock, "AUTH", ctl)); - } + } /* ordinary validation, no one-time password or RPA */ ok = gen_transact(sock, "PASS %s", ctl->password); @@ -83,6 +83,7 @@ service { return SERVICE; } port { return PORT; } interval { return INTERVAL; } preauth(enticate)? { SETSTATE(PREAUTH); return PREAUTHENTICATE; } +any { SETSTATE(0); return ANY; } gssapi { SETSTATE(0); return GSSAPI; } kerberos(_v)?4 { SETSTATE(0); return KERBEROS4; } kerberos(_v)?5 { SETSTATE(0); return KERBEROS5; } @@ -58,7 +58,7 @@ extern char * yytext; char *sval; } -%token DEFAULTS POLL SKIP VIA AKA LOCALDOMAINS PROTOCOL +%token DEFAULTS POLL SKIP VIA AKA LOCALDOMAINS PROTOCOL ANY %token PREAUTHENTICATE TIMEOUT KPOP SDPS KERBEROS4 KERBEROS5 KERBEROS GSSAPI %token SSH ENVELOPE QVIRTUAL USERNAME PASSWORD FOLDER SMTPHOST MDA BSMTP LMTP %token SMTPADDRESS SMTPNAME SPAMRESPONSE PRECONNECT POSTCONNECT LIMIT WARNINGS @@ -181,7 +181,9 @@ serv_option : AKA alias_list #endif /* INET6_ENABLE */ } | INTERVAL NUMBER {current.server.interval = $2;} + | PREAUTHENTICATE ANY {current.server.preauthenticate = A_ANY;} | PREAUTHENTICATE PASSWORD {current.server.preauthenticate = A_PASSWORD;} + | PREAUTHENTICATE GSSAPI {current.server.preauthenticate = A_GSSAPI;} | PREAUTHENTICATE KERBEROS4 {current.server.preauthenticate = A_KERBEROS_V4;} | PREAUTHENTICATE KERBEROS5 {current.server.preauthenticate = A_KERBEROS_V5;} | PREAUTHENTICATE KERBEROS { |