Auths: in plaintext authenticator, fix parsing of consecutive circuflex. Bug 2687
authorJeremy Harris <jgh146exb@wizmail.org>
Tue, 12 Jan 2021 15:36:09 +0000 (15:36 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Tue, 12 Jan 2021 19:16:42 +0000 (19:16 +0000)
(cherry picked from commit ca22cc0abe93c28f3d296d99c239413bb0d079c4)

doc/doc-docbook/spec.xfpt
doc/doc-txt/ChangeLog
src/src/auths/get_data.c

index d7a7f851605c1de2ff010fc2662a6cb63f033a0e..112234bd91f3e2fea88c7d01104e714b6a561cce 100644 (file)
@@ -27643,7 +27643,14 @@ fixed_plain:
   client_send = ^username^mysecret
 .endd
 The lack of colons means that the entire text is sent with the AUTH
-command, with the circumflex characters converted to NULs. A similar example
+command, with the circumflex characters converted to NULs.
+.new
+Note that due to the ambiguity of parsing three consectutive circumflex characters
+there is no way to provide a password having a leading circumflex.
+.wen
+
+
+A similar example
 that uses the LOGIN mechanism is:
 .code
 fixed_login:
index 888bd828bb24e6f987924e497a45769b68c4e91b..d5a98071ba3aa6f6aff6e12e07c2c6fe32baa1c0 100644 (file)
@@ -131,6 +131,13 @@ JH/33 Fix a taint trap in the ${listextract } expansion when the source data
 
 JH/35 Bug 2343: Harden exim_tidydb against corrupt wait- files.
 
+JH/36 Bug 2687: Fix interpretation of multiple ^ chars in a plaintext
+      authenticator client_send option.  Previously the next char, after a pair
+      was collapsed, was taken verbatim (so ^^^foo became ^^foo; ^^^^foo became
+      ^^\x00foo). Fixed to get ^\x00foo and ^^foo respectively to match the
+      documentation.  There is still no way to get a leading ^ immediately
+      after a NUL (ie. for the password of a PLAIN method authenticator.
+
 
 Exim version 4.94
 -----------------
index 602a1181a38f7f3cb18c80e4253d1a73c5117128..88359658ab5c3300f610bc152a64841924f9fd9e 100644 (file)
@@ -168,14 +168,20 @@ if (!ss)
 len = Ustrlen(ss);
 
 /* The character ^ is used as an escape for a binary zero character, which is
-needed for the PLAIN mechanism. It must be doubled if really needed. */
+needed for the PLAIN mechanism. It must be doubled if really needed.
+
+The parsing ambiguity of ^^^ is taken as ^^ -> ^ ; ^ -> NUL - and there is
+no way to get a leading ^ after a NUL.  We would need to intro new syntax to
+support that (probably preferring to take a more-standard exim list as a source
+and concat the elements with intervening NULs.  Either a magic marker on the
+source string for client_send, or a new option). */
 
 for (int i = 0; i < len; i++)
   if (ss[i] == '^')
     if (ss[i+1] != '^')
       ss[i] = 0;
     else
-      if (--len > ++i) memmove(ss + i, ss + i + 1, len - i);
+      if (--len > i+1) memmove(ss + i + 1, ss + i + 2, len - i);
 
 /* The first string is attached to the AUTH command; others are sent
 unembellished. */