On Wed, Sep 05, 2018 at 03:04:08PM +0200, Eric Faurot wrote:
> With the recent changes in the smarthost syntax, and the removal of
> the "secure" keyword, it's now possible to clarify the mta code by
> changing the TLS option from a set flags to exclusive values.
> This is far less confusing.
>
> More cleanup to come in mta_session.c after that.
>
nice !
> Index: mta.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/mta.c,v
> retrieving revision 1.222
> diff -u -p -r1.222 mta.c
> --- mta.c 22 Aug 2018 10:11:43 -0000 1.222
> +++ mta.c 5 Sep 2018 12:42:19 -0000
> @@ -635,6 +635,7 @@ mta_handle_envelope(struct envelope *evp
> }
>
> memset(&relayh, 0, sizeof(relayh));
> + relayh.tls = RELAY_TLS_OPPORTUNISTIC;
> if (smarthost && !text_to_relayhost(&relayh, smarthost)) {
> log_warnx("warn: Failed to parse smarthost %s", smarthost);
> m_create(p_queue, IMSG_MTA_DELIVERY_TEMPFAIL, 0, 0, -1);
> @@ -1730,10 +1731,9 @@ mta_relay(struct envelope *e, struct rel
> key.flags |= RELAY_MX;
> } else {
> key.domain = mta_domain(e->dest.domain, 0);
> - if (!(relayh->flags & RELAY_STARTTLS))
> - key.flags |= RELAY_TLS_OPTIONAL;
> }
>
> + key.tls = relayh->tls;
> key.flags |= relayh->flags;
> key.port = relayh->port;
> key.authlabel = relayh->authlabel;
> @@ -1748,6 +1748,7 @@ mta_relay(struct envelope *e, struct rel
> r = xcalloc(1, sizeof *r);
> TAILQ_INIT(&r->tasks);
> r->id = generate_uid();
> + r->tls = key.tls;
> r->flags = key.flags;
> r->domain = key.domain;
> r->backupname = key.backupname ?
> @@ -1834,14 +1835,25 @@ mta_relay_to_text(struct mta_relay *rela
> (void)strlcat(buf, tmp, sizeof buf);
> }
>
> - if (relay->flags & RELAY_STARTTLS) {
> - (void)strlcat(buf, sep, sizeof buf);
> - (void)strlcat(buf, "starttls", sizeof buf);
> - }
> -
> - if (relay->flags & RELAY_SMTPS) {
> - (void)strlcat(buf, sep, sizeof buf);
> + (void)strlcat(buf, sep, sizeof buf);
> + switch(relay->tls) {
> + case RELAY_TLS_OPPORTUNISTIC:
> + (void)strlcat(buf, "smtp", sizeof buf);
> + break;
> + case RELAY_TLS_STARTTLS:
> + (void)strlcat(buf, "smtp+tls", sizeof buf);
> + break;
> + case RELAY_TLS_SMTPS:
> (void)strlcat(buf, "smtps", sizeof buf);
> + break;
> + case RELAY_TLS_NO:
> + if (relay->flags & RELAY_LMTP)
> + (void)strlcat(buf, "lmtp", sizeof buf);
> + else
> + (void)strlcat(buf, "smtp+notls", sizeof buf);
> + break;
> + default:
> + (void)strlcat(buf, "???", sizeof buf);
> }
>
> if (relay->flags & RELAY_AUTH) {
> @@ -1993,6 +2005,11 @@ mta_relay_cmp(const struct mta_relay *a,
> if (a->domain < b->domain)
> return (-1);
> if (a->domain > b->domain)
> + return (1);
> +
> + if (a->tls < b->tls)
> + return (-1);
> + if (a->tls > b->tls)
> return (1);
>
> if (a->flags < b->flags)
> Index: mta_session.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/mta_session.c,v
> retrieving revision 1.109
> diff -u -p -r1.109 mta_session.c
> --- mta_session.c 5 Sep 2018 10:15:41 -0000 1.109
> +++ mta_session.c 5 Sep 2018 12:42:19 -0000
> @@ -199,24 +199,23 @@ mta_session(struct mta_relay *relay, str
>
> if (relay->flags & RELAY_LMTP)
> s->flags |= MTA_LMTP;
> - switch (relay->flags & (RELAY_SSL|RELAY_TLS_OPTIONAL)) {
> - case RELAY_SSL:
> - s->flags |= MTA_FORCE_ANYSSL;
> - s->flags |= MTA_WANT_SECURE;
> - break;
> - case RELAY_SMTPS:
> + switch (relay->tls) {
> + case RELAY_TLS_SMTPS:
> s->flags |= MTA_FORCE_SMTPS;
> s->flags |= MTA_WANT_SECURE;
> break;
> - case RELAY_STARTTLS:
> + case RELAY_TLS_STARTTLS:
> s->flags |= MTA_FORCE_TLS;
> s->flags |= MTA_WANT_SECURE;
> break;
> - case RELAY_TLS_OPTIONAL:
> + case RELAY_TLS_OPPORTUNISTIC:
> /* do not force anything, try tls then smtp */
> break;
> - default:
> + case RELAY_TLS_NO:
> s->flags |= MTA_FORCE_PLAIN;
> + break;
> + default:
> + fatalx("bad value for relay->tls: %d", relay->tls);
> }
>
> if (relay->flags & RELAY_BACKUP)
> Index: smtpd.h
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/smtpd.h,v
> retrieving revision 1.558
> diff -u -p -r1.558 smtpd.h
> --- smtpd.h 4 Sep 2018 13:04:42 -0000 1.558
> +++ smtpd.h 5 Sep 2018 12:42:19 -0000
> @@ -84,11 +84,11 @@
> #define F_RECEIVEDAUTH 0x800
> #define F_MASQUERADE 0x1000
>
> +#define RELAY_TLS_OPPORTUNISTIC 0
> +#define RELAY_TLS_STARTTLS 1
> +#define RELAY_TLS_SMTPS 2
> +#define RELAY_TLS_NO 3
>
> -#define RELAY_STARTTLS 0x01
> -#define RELAY_SMTPS 0x02
> -#define RELAY_TLS_OPTIONAL 0x04
> -#define RELAY_SSL (RELAY_STARTTLS | RELAY_SMTPS)
> #define RELAY_AUTH 0x08
> #define RELAY_BACKUP 0x10
> #define RELAY_MX 0x20
> @@ -115,6 +115,7 @@ struct netaddr {
>
> struct relayhost {
> uint16_t flags;
> + int tls;
> char hostname[HOST_NAME_MAX+1];
> uint16_t port;
> char authlabel[PATH_MAX];
> @@ -732,6 +733,7 @@ struct mta_relay {
> struct dispatcher *dispatcher;
> struct mta_domain *domain;
> struct mta_limits *limits;
> + int tls;
> int flags;
> char *backupname;
> int backuppref;
> Index: to.c
> ===================================================================
> RCS file: /cvs/src/usr.sbin/smtpd/to.c,v
> retrieving revision 1.32
> diff -u -p -r1.32 to.c
> --- to.c 3 Sep 2018 11:30:14 -0000 1.32
> +++ to.c 5 Sep 2018 12:42:19 -0000
> @@ -304,17 +304,18 @@ text_to_relayhost(struct relayhost *rela
> {
> static const struct schema {
> const char *name;
> - uint16_t flags;
> + int tls;
> + uint16_t flags;
> } schemas [] = {
> /*
> * new schemas should be *appended* otherwise the default
> * schema index needs to be updated later in this function.
> */
> - { "smtp://", RELAY_TLS_OPTIONAL },
> - { "smtp+tls://", RELAY_STARTTLS },
> - { "smtp+notls://", 0 },
> - { "lmtp://", RELAY_LMTP },
> - { "smtps://", RELAY_SMTPS }
> + { "smtp://", RELAY_TLS_OPPORTUNISTIC, 0
> },
> + { "smtp+tls://", RELAY_TLS_STARTTLS, 0
> },
> + { "smtp+notls://", RELAY_TLS_NO, 0
> },
> + { "lmtp://", RELAY_TLS_NO, RELAY_LMTP
> },
> + { "smtps://", RELAY_TLS_SMTPS, 0
> }
> };
> const char *errstr = NULL;
> char *p, *q;
> @@ -344,6 +345,7 @@ text_to_relayhost(struct relayhost *rela
> else
> p = buffer + strlen(schemas[i].name);
>
> + relay->tls = schemas[i].tls;
> relay->flags = schemas[i].flags;
>
> /* need to specify an explicit port for LMTP */
> @@ -395,7 +397,8 @@ text_to_relayhost(struct relayhost *rela
> return 0;
> if (relay->authlabel[0]) {
> /* disallow auth on non-tls scheme. */
> - if (!(relay->flags & (RELAY_STARTTLS | RELAY_SMTPS)))
> + if (relay->tls != RELAY_TLS_STARTTLS &&
> + relay->tls != RELAY_TLS_SMTPS)
> return 0;
> relay->flags |= RELAY_AUTH;
> }
>
--
Gilles Chehade
https://www.poolp.org @poolpOrg