chiark / gitweb /
REORG Delete everything that's not innduct or build system or changed for innduct
[innduct.git] / doc / compliance-nntp
diff --git a/doc/compliance-nntp b/doc/compliance-nntp
deleted file mode 100644 (file)
index 403e104..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-$Id: compliance-nntp 6817 2004-05-18 09:25:55Z rra $
-
-The following are outstanding issues regarding INN's compliance with the
-NNTP standard.  The reference documents used in this analysis are the
-current NNTP IETF Working Group draft (draft-ietf-nntpext-base-15.txt at
-the time of the last check of this audit) or RFC 2980, not RFC 977 (which
-is woefully out of date).
-
-This file documents only compliance issues with the latest version of the
-standard NNTP protocol.  It does not cover INN's private extensions or
-INN's implementation of widely available extensions not documented in the
-NNTP standard.  Specifically, it does not cover the extensions listed in
-RFC 2980.
-
-------------------------------
-
-  Summary: innd doesn't require whitespace between commands and arguments
- Standard: draft-ietf-nntpext-base-15.txt, section 4
-  Version: 1.0 to CURRENT 2002-12-26
-Reference: innd/nc.c NCproc() and command handlers
- Severity: Accepts invalid input
-
-The standard states:
-
-    Keywords and arguments MUST be each separated by one or more US-ASCII
-    SPACE or US-ASCII TAB characters.
-
-This is not checked in NCproc or in the individual command handlers in
-innd.  Commands followed immediately by their argument will be accepted by
-innd.  For example:
-
-    stat<9k6vjk.hg0@example.com> 
-    223 0 @0301543531000000000000079AAE0000006A@
-
-Impact:  Should one command be a prefix of another, innd could dispatch
-the handling of the command to the wrong handler, treating the remainder
-of the command verb as an argument.  This laxness also encourages sloppy
-client code.  Internally, the lack of argument parsing in NCproc also
-results in code duplication in all of the command handlers.
-
-Suggested fix:  Lift the argument parsing code into a function called from
-NCproc, breaking the command line into a vector of command and arguments.
-This will work for all commands implemented by innd and will simplify the
-implementation of command handlers, as well as fixing this problem.  This
-is what nnrpd already does.
-
-Impact of fix:  It's possible that some serving code is relying on this
-behavior and not sending spaces after commands.  Fixing this problem would
-break interoperability with that code.
-
-------------------------------
-
-  Summary: INN doesn't check argument length
- Standard: draft-ietf-nntpext-base-15.txt, section 4
-  Version: 1.0 to CURRENT 2002-12-26
-Reference: innd/nc.c and nnrpd/nnrpd.c
- Severity: Accepts invalid input
-
-The standard says:
-
-    Arguments MUST NOT exceed 497 octets.
-
-This is not checked by either innd or nnrpd, although both do check that
-the command itself does not exceed 512 octets.
-
-Impact:  Small.  May accept invalid commands in extremely rare edge cases.
-
-Suggested fix:  Probably not worth fixing separately, although if standard
-command parsing code is written to handle both innd and nnrpd, it wouldn't
-hurt to check this along with everything else.
-
-------------------------------
-
-  Summary: Reply codes other than x9x used for private extensions
- Standard: draft-ietf-nntpext-base-15.txt, section 4.1
-  Version: 1.0 to CURRENT 2002-12-26
-Reference: include/nntp.h
- Severity: Violates SHOULD
-
-The standard says:
-
-    Response codes not specified in this standard MAY be used for any
-    installation-specific additional commands also not specified.  These
-    SHOULD be chosen to fit the pattern of x9x specified above.
-
-INN uses quite a few response codes that do not fit this pattern for
-various extensions.  Some of these will likely later be standardized with
-the response codes that INN uses (the streaming commands, the
-authentication reply codes, and possibly the STARTTLS reply codes), but
-the rest (XGTITLE, MODE CANCEL, and XBATCH) should have used response
-codes in the x9x range.
-
-Impact:  Additional ambiguity over the meaning of reply codes, as those
-reply codes could later be standardized as the reply codes for other
-commands.
-
-Suggested fix:  For XGTITLE and probably XBATCH, there is no way to fix
-this now.  Changing the reply codes would break all existing
-implementations.  It may still be possible to change the reply codes for
-MODE CANCEL (which should probably be MODE XCANCEL), but it may not be
-worth the effort.
-
-------------------------------
-
-  Summary: innd may return 480 instead of 500 for unrecognized commands
- Standard: draft-ietf-nntpext-base-15.txt, section 4.1.1
-  Version: 1.0 to CURRENT 2002-12-26
-Reference: innd/nc.c NCauthinfo()
- Severity: Violates MUST
-
-The standard says:
-
-    If the command is not recognized, or it is an optional command or
-    extension that is not implemented by the server, the response code 500
-    MUST be returned.
-
-In innd, if the connection is determined to need authentication, all
-incoming commands other than MODE are handed off to NCauthinfo() rather
-than their normal command handlers.  NCauthinfo() responds with a 480
-reply code to anything other than AUTHINFO USER, AUTHINFO PASS, or QUIT.
-
-Impact:  Unlikely to cause problems in practice, but may confuse clients
-that don't understand the rarely used innd-level authentication
-mechanisms.
-
-Suggested fix:  Restructure the command table so that each command also
-has a flag indicating whether it requires authentication for peers that
-are required to authenticate.  (Some commands, like HELP and MODE READER,
-should be allowed without authentication.)  Then eliminate the special
-casing of the state CSgetauth (it may be better to store whether the peer
-has authenticated in the channel rather than in the channel state) and the
-special handling in NCauthinfo.  This should also simplify the code.
-
-------------------------------
-
-  Summary: innd always sends 200 for an accepted connection
- Standard: draft-ietf-nntpext-base-15.txt, section 7.1
-  Version: 1.0 to CURRENT 2002-12-26
-Reference: innd/nc.c NCsetup() and rc.c RCreader()
- Severity: Violates MUST
-
-The standard says:
-
-    If the server will accept further commands from the client including
-    POST, the server MUST present a 200 greeting code.  If the server will
-    accept further commands from the client, but it is not authorized to
-    post articles using the POST command, the server MUST present a 201
-    greeting code.
-
-The implication is that the greeting code from innd (which doesn't
-implement POST and therefore is never going to allow it) should always be
-201, at least for the case where innd never spawns nnrpd.  In the case
-where innd spawns nnrpd, it's unclear what the greeting code should be.
-
-The current implementation nevers send 201 unless one knows for certain
-that the connection will never be allowed to issue a POST command, which
-means that innd always sends 200.
-
-It's unknown whether there is any transit news software that would have
-difficulties with a 201 greeting.  Both innxmit and innfeed handle it
-correctly in CURRENT 2001-07-04 and NNTPconnect() handles it correctly in
-INN 1.0, so it seems likely that if any such software exists, it's rare.
-
-Impact:  It's almost certain that the current innd behavior isn't hurting
-anything.  Even a confused client that thought 200 meant that it could
-send a POST command would then try and be rejected with no damage done.
-
-Suggested fix:  The purpose of this return code is to give a hint to a
-reading client indicating whether it should even attempt POST, since
-attempting it may involve a lot of work by the user only to have the post
-rejected.  It's only relevant to reading connections, not to transit
-connections.
-
-It's known that some clients, upon seeing a 201 response, will never
-attempt POST, even if MODE READER then returns 200.  Therefore innd, when
-handing off connections to nnrpd, must return 200 to not confuse a client
-that will later send MODE READER.  For connections where innd won't do
-that handoff, it makes sense to always send 201 if all transit feeds can
-handle that and won't interpret it as unwillingness to accept IHAVE or
-streaming feeds.
-
-RCreader() should therefore be modified to send 201 if noreader is set,
-and otherwise send 200.
-
-Impact of fix:  Any feeding software that didn't consider 201 to be a
-valid greeting would be unable to feed a fixed innd unless that innd also
-allowed reading connections.
-
-------------------------------
-
-  Summary: innd doesn't support LIST EXTENSIONS
- Standard: draft-ietf-nntpext-base-15.txt, section 8.1
-  Version: 1.0 to CURRENT 2002-12-26
-Reference: innd/nc.c NClist()
- Severity: Not a violation
-
-Support for LIST EXTENSIONS is optional, and innd's current behavior
-(returning a 500 response) is permitted by the standard, but it means that
-innd cannot advertise any of the extensions that it supports.  Since this
-will eventually include streaming, support should be added.
-
-Suggested fix:  Add support for LIST EXTENSIONS to NClist() as soon as
-innd supports a registered extension or as soon as there is documentation
-for INN's extensions that specify an extension name (beginning with X).
-
-------------------------------
-
-  Summary: nnrpd doesn't return 423 errors when there is no overview info
- Standard: draft-ietf-nntpext-base-17.txt, section 10.5.1.2
-  Version: 1.4 to CURRENT 2003-05-04
-Reference: nnrpd/article.c CMDxover()
- Severity: Violates a MUST
-
-The standard says:
-
-   If there are no articles in the range specified, a 423 response MUST be
-   returned.
-
-nnrpd (from the beginning of the XOVER command) has always returned a 224
-response with an empty multiline response instead.  INN doesn't support
-OVER yet so this isn't actually a bug in INN, but eventually the XOVER
-implementation will also be used for OVER.
-
-Impact:  Less information is communicated to the client about why there
-are no overview records returned.  An error response indicating there are
-no valid articles in that range is possibly more informative.
-
-Suggested fix:  Don't print out the initial 224 message until at least one
-overview entry has been found, so that CMDxover() can print a 420 response
-instead if no overview records are found.
-
-Impact of fix:  May confuse some clients that don't expect to get 420
-errors back from overview queries.  It may be necessary to do something
-different for OVER (where clients should expect this behavior since OVER
-is a new command) than for XOVER (where clients may be relying on the
-existing behavior.
-
-------------------------------
-
-  Summary: HDR can return message IDs rather than article numbers
- Standard: draft-ietf-nntpext-base-17.txt, section 10.6.1.2
-  Version: 1.0 to CURRENT 2003-05-04
-Reference: nnrpd/article.c CMDpat()
- Severity: Violates a protocol description
-
-The standard says:
-
-   The line consists of the article number, a US-ASCII space, and then the
-   contents of the header (without the header name or the colon and space
-   that follow it) or metadata item.  If the article is specified by
-   message-id rather than by article range, the article number is given as
-   "0".
-
-nnrpd instead returns the message ID as the first word of the line when
-HDR is given a message ID argument.
-
-Impact:  A client may not be able to parse the output of HDR correctly,
-since the first word is not a number.
-
-Suggested fix:  Change the code to return 0 as the first word instead of
-the message ID, per the standard.
-
-Impact of fix:  Clients that are expecting the message ID may be
-confused.
-
-------------------------------
-
-  Summary: innd improperly caches DNS returns
- Standard: draft-ietf-nntpext-base-15.txt, section 14.4
-  Version: 1.0 to CURRENT 2002-12-26
-Reference: innd/rc.c RCreadfile() and elsewhere
- Severity: Violates a MUST
-
-The standard says:
-
-    If NNTP clients or servers cache the results of host name lookups in
-    order to achieve a performance improvement, they MUST observe the TTL
-    information reported by DNS.
-
-innd caches DNS lookups when reading incoming.conf and doesn't refresh its
-knowledge of DNS except when incoming.conf is reloaded.
-
-Impact:  An explicit reload is required whenever the IP address of any
-peer changes, and in the presence of network renumbering innd is
-vulnerable to spoofing if DNS is the only authentication mechanism used.
-
-Suggested fix:  This is hard to fix without unacceptable performance
-impact.  The only good fix is to either fork a separate helper process to
-do DNS lookups (since gethostbyname may block for essentially an
-arbitrarily long period) or to use the direct resolver library so that one
-can get access to a file descriptor and throw it into the select loop.
-Either way, this requires keeping a DNS file descriptor in the main select
-loop and updating knowledge of DNS periodically, which is a substantial
-amount of additional complexity.
-
-------------------------------
-
-  Summary: innd doesn't diagnose repeated AUTHINFO USER commands
- Standard: RFC 2980, section 3.1.1
-  Version: 1.0 to CURRENT 2002-12-26
-Reference: innd/nc.c NCauthinfo()
- Severity: Violates a protocol description
-
-RFC 2980 says:
-
-    The 482 code will also be returned when the AUTHINFO commands are not
-    entered in the correct sequence (like two AUTHINFO USERs in a row, or
-    AUTHINFO PASS preceding AUTHINFO USER).
-
-innd ignores AUTHINFO USER and just always returns a 381 response, however,
-since it doesn't care about the username.
-
-Impact:  Probably none.
-
-Suggested fix:  A long-term solution would be to add real authentication
-to innd, in which case it would start caring about the authenticated
-identity (and perhaps use that identity to map to an incoming.conf entry).
-It's unclear if this would be worthwhile.  Failing that, innd would need
-to keep internal state to know whether AUTHINFO USER had already been
-sent.