#3298: Mutt's way to get the FQDN is broken
---------------------+----------------------
  Reporter:  vinc17  |      Owner:  mutt-dev
      Type:  defect  |     Status:  reopened
  Priority:  major   |  Milestone:
 Component:  mutt    |    Version:  1.5.20
Resolution:          |   Keywords:
---------------------+----------------------

Comment (by code@…):

 Some clarification of how this patch works may be in order here.

 Vincent is correct, there will not and can not be any problems with mobile
 machines, unless they are already badly misconfigured.  This is because,
 for hostname resolution to work properly on ANY TCP/IP-networked host,
 four things MUST be true:

 1. The host MUST have a hostname.
 2. The configured hostname MUST resolve to an IP address.
 3. That IP address MUST resolve to the configured hostname.
 4. The host MUST be configured, via nsswitch.conf or whatever other
 mechanism it uses, to use a name resolution service which is properly
 configured on that machine.

 If these four items are not ALL true for your host, it is misconfigured.
 Lots of things will break, not just Mutt (though, it's possible the user
 may not notice, as he may not be using any of them).  If they are all
 true, then the algorithm used to get the domain which my patch uses WILL
 work.  This is because it obtains the hostname by doing the following:

   1. Uses whatever was configured IN MUTT, if any.
   2. Obtains the domain from the configured host resolution system as
 follows:
      - Obtains the hostname from the operating system
      - Feeds that hostname to getaddrinfo(), which:
        - looks up the IP associated with the provided hostname
        - resolves that IP to the name known by the host's name resolution
 service
   3. If the above fails, it will fall back to what's in the hostname.
   4. If all of the above fail, the machine is COMPLETELY BROKEN.  Fail.

 Note in particular that when DNS is in use, this mechanism is 100%
 equivalent to using /etc/resolv.conf to obtain the domain.  When DNS is
 NOT in use (for resolving LOCAL names), using /etc/resolv.conf will
 potentially obtain a value which is not being used and misconfigured,
 whereas using the method above will produce whatever the host is actually
 using, ALWAYS.

 If all of the above fail, it will bail, as it should, since Mutt has no
 way to correctly determine what the hostname is.  Excepting the case of
 badly misconfigured hosts, this should never happen.  Even on unconnected
 mobile hosts, if the hostname contains the domain the user wants to use,
 and the host resolution mechanism failed, this patch will fail back to
 that.

 It is possible, however, that the algorithm will produce a domain which is
 not what the user wants, either because their configured host resolution
 service's entry for their hostname does not include a domain, or uses a
 domain which is different from the one they want to use.  Making sure the
 host has an entry in /etc/hosts such as what Vincent provided will
 GUARANTEE that it will produce the correct domain name, in all cases, so
 long as their configured host resolution services include local files.
 Again, misconfigurations are possible, but there's nothing Mutt can do
 about that--parsing /etc/resolv.conf directly is still less correct IN ALL
 CASES.

 However, if the user's system is not already so configured, Mutt will, via
 the patch I provided, use its own configured value for the domain.  So,
 even in the case where the machine is so badly misconfigured that the
 domain can't be determined, the user, can, should, and in fact MUST
 configure mutt to use the specific domain they wish to use.

 It is worth pointing out that in fact, even when DNS IS in use for
 resolving local names, (and configured correctly), using the value in
 /etc/resolv.conf still may be "wrong".  For example, the search domain may
 be configured as:

 search local.domain.example.com example.com other.domain.example.com

 This could be because the host is in local.domain.example.com, and
 normally the hosts it uses will be in that domain.  Mutt will use that as
 the domain, but the user will no doubt want to use "example.com" as their
 domain instead.  My patch duplicates this, as there is no real way around
 this problem...  The point here is, in this case, and in all other cases
 where automation fails to produce the correct domain, Mutt can and MUST be
 configured to use
 the correct desired domain using its own internal configuration.

 However, say the host is actually using NIS (or LDAP, or whatever), and
 that, using that service, the domain is actually set to "example.com"
 already.  In that case, parsing /etc/resolv.conf is WRONG, a) because it
 is not used by the system for local name resolution, and b) because the
 domain value obtained that way IS WRONG, whereas obtaining it via the
 mechanism this patch uses gets you the correct domain.

 If you followed this explanation, it should be completely clear that this
 patch is much more correct than what Mutt is currently doing.

-- 
Ticket URL: <http://dev.mutt.org/trac/ticket/3298#comment:35>
Mutt <http://www.mutt.org/>
The Mutt mail user agent

Reply via email to