chiark / gitweb /
+ * Treat 8-bit characters in email addrs as RFC822 `special' (=> quote).
authorian <ian>
Sun, 17 Sep 2000 01:52:39 +0000 (01:52 +0000)
committerian <ian>
Sun, 17 Sep 2000 01:52:39 +0000 (01:52 +0000)
@@ -1,6 +1,7 @@
   Bugfixes:
+  * Treat 8-bit characters in email addrs as RFC822 `special' (=> quote).

changelog
src/adns.h
src/types.c

index fc8810340d78caf38b3cd72cb69a84f1e7ac5d63..2c6f597c0dae2756723ea330b657edf93807793a 100644 (file)
--- a/changelog
+++ b/changelog
@@ -1,6 +1,7 @@
 adns (1.0); urgency=low
 
   Bugfixes:
+  * Treat 8-bit characters in email addrs as RFC822 `special' (=> quote).
   * Fix incorrect `compressed datagram contains loop' error.
   * Actually compile shared libraries by default !
   * Fix adnsresfilter usage message to include correct default timeout.
index df1dede9663c5213bcd4f9c34beee8f1e8278fe2..ffd82743c28ca31f14da1f1f2795351d0f12d80b 100644 (file)
@@ -5,7 +5,7 @@
 /*
  *
  *  This file is
- *    Copyright (C) 1997-1999 Ian Jackson <ian@davenant.greenend.org.uk>
+ *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
  *
  *  It is part of adns, which is
  *    Copyright (C) 1997-2000 Ian Jackson <ian@davenant.greenend.org.uk>
@@ -151,12 +151,6 @@ typedef enum {
  * names) will be quoted, as \X if it is a printing ASCII character or
  * \DDD otherwise.
  *
- * (The characters which will be unquoted are the printing 7-bit ASCII
- * characters except the punctuation characters " ( ) @ ; $ \
-
- * I.e. unquoted characters are alphanumerics, and the following
- * punctuation characters:  ! # % ^ & * - _ = + [ ] { } 
- *
  * If the query goes via a CNAME then the canonical name (ie, the
  * thing that the CNAME record refers to) is usually allowed to
  * contain any characters, which will be quoted as above.  With
@@ -179,13 +173,26 @@ typedef enum {
  * header field.  The particular format used is that if the mailbox
  * requires quoting according to the rules in RFC822 then the
  * local-part is quoted in double quotes, which end at the next
- * unescaped double quote.  (\ is the escape char, and is doubled, and
- * is used to escape only \ and ".)  Otherwise the local-part is
- * presented as-is.  In any case this is followed by an @ and the
- * domain.  The domain will not contain any characters not legal in
- * hostnames.  adns will protect the application from local parts
- * containing control characters - these appear to be legal according
- * to RFC822 but are clearly a bad idea.
+ * unescaped double quote (\ is the escape char, and is doubled, and
+ * is used to escape only \ and ").  If the local-part is legal
+ * without quoting according to RFC822, it is presented as-is.  In any
+ * case the local-part is followed by an @ and the domain.  The domain
+ * will not contain any characters not legal in hostnames.
+ *
+ * Unquoted local-parts may contain any printing 7-bit ASCII
+ * except the punctuation characters ( ) < > @ , ; : \ " [ ]
+ * I.e. they may contain alphanumerics, and the following
+ * punctuation characters:  ! # % ^ & * - _ = + { } .
+ *
+ * adns will reject local parts containing control characters (byte
+ * values 0-31, 127-159, and 255) - these appear to be legal according
+ * to RFC822 but are clearly a bad idea.  RFC1035 syntax does not make
+ * any distinction between a single RFC822 quoted-string containing
+ * full stops, and a series of quoted-strings separated by full stops;
+ * adns will return anything that isn't all valid atoms as a single
+ * quoted-string.  RFC822 does not allow high-bit-set characters at
+ * all, but adns does allow them in local-parts, treating them as
+ * needing quoting.
  *
  * If you ask for the domain with _raw then _no_ checking is done
  * (even on the host part, regardless of adns_qf_quoteok_anshost), and
index 43ccc2b25884e6ef58da907f28cad2d61a995168..b1fdae79f93eefd6fd1500465e486058cbbac73c 100644 (file)
@@ -851,7 +851,7 @@ static adns_status pap_mailbox822(const parseinfo *pai, int *cbyte_io, int max,
     c= *p++;
     if ((c&~128) < 32 || (c&~128) == 127) return adns_s_invaliddata;
     if (c == '.' && !neednorm) neednorm= 1;
-    else if (c==' ' || ctype_822special(c)) needquote++;
+    else if (c==' ' || c>=127 || ctype_822special(c)) needquote++;
     else neednorm= 0;
   }