Build: move xtext routines out of auths drivers to main
authorJeremy Harris <jgh146exb@wizmail.org>
Thu, 25 Jul 2024 13:37:21 +0000 (14:37 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Thu, 25 Jul 2024 13:37:21 +0000 (14:37 +0100)
12 files changed:
src/OS/Makefile-Base
src/scripts/MakeLinks
src/src/auths/Makefile
src/src/auths/xtextdecode.c [deleted file]
src/src/auths/xtextencode.c [deleted file]
src/src/deliver.c
src/src/expand.c
src/src/functions.h
src/src/smtp_in.c
src/src/transports/smtp.c
src/src/xclient.c
src/src/xtextencode.c [new file with mode: 0644]

index 1daded431a58ead47063251f02792861a22f6687..4df9451f80e298a01b6d3bed7cb4b1d901d9515b 100644 (file)
@@ -518,7 +518,7 @@ OBJ_EXIM = acl.o base64.o child.o crypt16.o daemon.o dbfn.o debug.o deliver.o \
         rda.o readconf.o receive.o retry.o rewrite.o rfc2047.o regex_cache.o \
         route.o search.o sieve.o smtp_in.o smtp_out.o spool_in.o spool_out.o \
         std-crypto.o store.o string.o tls.o tod.o transport.o tree.o verify.o \
         rda.o readconf.o receive.o retry.o rewrite.o rfc2047.o regex_cache.o \
         route.o search.o sieve.o smtp_in.o smtp_out.o spool_in.o spool_out.o \
         std-crypto.o store.o string.o tls.o tod.o transport.o tree.o verify.o \
-        environment.o macro.o \
+        xtextencode.o environment.o macro.o \
         $(OBJ_LOOKUPS) \
         local_scan.o $(EXIM_PERL) $(OBJ_WITH_CONTENT_SCAN) \
         $(OBJ_EXPERIMENTAL)
         $(OBJ_LOOKUPS) \
         local_scan.o $(EXIM_PERL) $(OBJ_WITH_CONTENT_SCAN) \
         $(OBJ_EXPERIMENTAL)
@@ -869,6 +869,7 @@ tod.o:           $(HDRS) tod.c
 transport.o:     $(HDRS) transport.c
 tree.o:          $(HDRS) tree.c
 verify.o:        $(HDRS) transports/smtp.h verify.c
 transport.o:     $(HDRS) transport.c
 tree.o:          $(HDRS) tree.c
 verify.o:        $(HDRS) transports/smtp.h verify.c
+xtextencode.o:   $(HDRS) xtextencode.c
 dkim.o:          $(HDRS) pdkim/pdkim.h dkim.c
 dkim_transport.o: $(HDRS) dkim_transport.c
 
 dkim.o:          $(HDRS) pdkim/pdkim.h dkim.c
 dkim_transport.o: $(HDRS) dkim_transport.c
 
index cda5ef65bae4bbe8838553670720739becaf3295..77dbe26bd32b78ca796e226f3d6c1fded42898a3 100755 (executable)
@@ -78,7 +78,7 @@ cd $d
 for f in README Makefile call_pam.c call_pwcheck.c \
   call_radius.c check_serv_cond.c cyrus_sasl.c cyrus_sasl.h gsasl_exim.c \
   gsasl_exim.h get_data.c get_no64_data.c heimdal_gssapi.c heimdal_gssapi.h \
 for f in README Makefile call_pam.c call_pwcheck.c \
   call_radius.c check_serv_cond.c cyrus_sasl.c cyrus_sasl.h gsasl_exim.c \
   gsasl_exim.h get_data.c get_no64_data.c heimdal_gssapi.c heimdal_gssapi.h \
-  xtextencode.c xtextdecode.c cram_md5.c cram_md5.h plaintext.c plaintext.h \
+  cram_md5.c cram_md5.h plaintext.c plaintext.h \
   pwcheck.c pwcheck.h auth-spa.c auth-spa.h dovecot.c dovecot.h sha1.c spa.c \
   spa.h tls.c tls.h external.c external.h
 do
   pwcheck.c pwcheck.h auth-spa.c auth-spa.h dovecot.c dovecot.h sha1.c spa.c \
   spa.h tls.c tls.h external.c external.h
 do
@@ -125,7 +125,7 @@ for f in blob.h dbfunctions.h exim.h functions.h globals.h \
   sieve.c smtp_in.c smtp_out.c spool_in.c spool_out.c std-crypto.c store.c \
   string.c tls.c tlscert-gnu.c tlscert-openssl.c tls-cipher-stdname.c \
   tls-gnu.c tls-openssl.c \
   sieve.c smtp_in.c smtp_out.c spool_in.c spool_out.c std-crypto.c store.c \
   string.c tls.c tlscert-gnu.c tlscert-openssl.c tls-cipher-stdname.c \
   tls-gnu.c tls-openssl.c \
-  tod.c transport.c tree.c verify.c version.c \
+  tod.c transport.c tree.c verify.c version.c xtextencode.c \
   dkim.c dkim.h dkim_transport.c dmarc.c dmarc.h \
   valgrind.h memcheck.h \
   macro_predef.c macro_predef.h
   dkim.c dkim.h dkim_transport.c dmarc.c dmarc.h \
   valgrind.h memcheck.h \
   macro_predef.c macro_predef.h
index e85b22a8ad8bdf20f2eee098a06425a7b01f8058..ac5cf865b7fccc13450f82196dedfd78bf9312c5 100644 (file)
@@ -9,7 +9,7 @@ OBJ = auth-spa.o call_pam.o call_pwcheck.o \
       call_radius.o check_serv_cond.o cram_md5.o cyrus_sasl.o dovecot.o \
       external.o get_data.o get_no64_data.o gsasl_exim.o heimdal_gssapi.o \
       plaintext.o pwcheck.o \
       call_radius.o check_serv_cond.o cram_md5.o cyrus_sasl.o dovecot.o \
       external.o get_data.o get_no64_data.o gsasl_exim.o heimdal_gssapi.o \
       plaintext.o pwcheck.o \
-      spa.o tls.o xtextdecode.o xtextencode.o
+      spa.o tls.o
 
 auths.a:         $(OBJ)
                 @$(RM_COMMAND) -f auths.a
 
 auths.a:         $(OBJ)
                 @$(RM_COMMAND) -f auths.a
@@ -29,8 +29,6 @@ check_serv_cond.o:  $(HDRS) check_serv_cond.c
 get_data.o:         $(HDRS) get_data.c
 get_no64_data.o:    $(HDRS) get_no64_data.c
 pwcheck.o:          $(HDRS) pwcheck.c pwcheck.h
 get_data.o:         $(HDRS) get_data.c
 get_no64_data.o:    $(HDRS) get_no64_data.c
 pwcheck.o:          $(HDRS) pwcheck.c pwcheck.h
-xtextdecode.o:      $(HDRS) xtextdecode.c
-xtextencode.o:      $(HDRS) xtextencode.c
 
 cram_md5.o:         $(HDRS) cram_md5.c cram_md5.h
 cyrus_sasl.o:       $(HDRS) cyrus_sasl.c cyrus_sasl.h
 
 cram_md5.o:         $(HDRS) cram_md5.c cram_md5.h
 cyrus_sasl.o:       $(HDRS) cyrus_sasl.c cyrus_sasl.h
diff --git a/src/src/auths/xtextdecode.c b/src/src/auths/xtextdecode.c
deleted file mode 100644 (file)
index d261801..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*************************************************
-*     Exim - an Internet mail transport agent    *
-*************************************************/
-
-/* Copyright (c) The Exim Maintainers 2022 - 2023 */
-/* Copyright (c) University of Cambridge 1995 - 2009 */
-/* See the file NOTICE for conditions of use and distribution. */
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-
-#include "../exim.h"
-
-
-/*************************************************
-*          Decode byte-string in xtext           *
-*************************************************/
-
-/* This function decodes a string in xtextformat as defined in RFC 1891 and
-required by the SMTP AUTH extension (RFC 2554). We put the result in a piece of
-store of equal length - it cannot be longer than this. Although in general the
-result of decoding an xtext may be binary, in the context in which it is used
-by Exim (for decoding the value of AUTH on a MAIL command), the result is
-expected to be an addr-spec. We therefore add on a terminating zero, for
-convenience.
-
-Arguments:
-  code        points to the coded string, zero-terminated
-  ptr         where to put the pointer to the result, which is in
-              dynamic store
-
-Returns:      the number of bytes in the result, excluding the final zero;
-              -1 if the input is malformed
-*/
-
-int
-auth_xtextdecode(uschar * code, uschar ** ptr)
-{
-int x;
-uschar * result = store_get(Ustrlen(code) + 1, code);
-*ptr = result;
-
-while ((x = (*code++)) != 0)
-  {
-  if (x < 33 || x > 127 || x == '=') return -1;
-  if (x == '+')
-    {
-    register int y;
-    if (!isxdigit((x = (*code++)))) return -1;
-    y = ((isdigit(x))? x - '0' : (tolower(x) - 'a' + 10)) << 4;
-    if (!isxdigit((x = (*code++)))) return -1;
-    *result++ = y | ((isdigit(x))? x - '0' : (tolower(x) - 'a' + 10));
-    }
-  else *result++ = x;
-  }
-
-*result = 0;
-return result - *ptr;
-}
-
-/* End of xtextdecode.c */
diff --git a/src/src/auths/xtextencode.c b/src/src/auths/xtextencode.c
deleted file mode 100644 (file)
index 04cd302..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*************************************************
-*     Exim - an Internet mail transport agent    *
-*************************************************/
-
-/* Copyright (c) The Exim Maintainers 2022 - 2024 */
-/* Copyright (c) University of Cambridge 1995 - 2018 */
-/* See the file NOTICE for conditions of use and distribution. */
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-
-#include "../exim.h"
-
-
-/*************************************************
-*          Encode byte-string in xtext           *
-*************************************************/
-
-/* This function encodes a string of bytes, containing any values whatsoever,
-as "xtext", as defined in RFC 1891 and required by the SMTP AUTH extension (RFC
-2554).
-
-Arguments:
-  clear       points to the clear text bytes
-  len         the number of bytes to encode
-
-Returns:      a pointer to the zero-terminated xtext string, which
-              is in working store
-*/
-
-uschar *
-auth_xtextencode(uschar *clear, int len)
-{
-gstring * g = NULL;
-for(uschar ch; len > 0; len--, clear++)
-  g = (ch = *clear) < 33 || ch > 126 || ch == '+' || ch == '='
-    ? string_fmt_append(g, "+%.02X", ch)
-    : string_catn(g, clear, 1);
-gstring_release_unused(g);
-return string_from_gstring(g);
-}
-
-
-/* End of xtextencode.c */
-/* vi: aw ai sw=2
-*/
index 64a53c7bae4208695c6d1fc195ff4e43efdbafbd..19b5c81dfed1fc13b09a73eb28b3118e39e3d49a 100644 (file)
@@ -6085,7 +6085,7 @@ wording. */
     {
     /* must be decoded from xtext: see RFC 3461:6.3a */
     uschar * xdec_envid;
     {
     /* must be decoded from xtext: see RFC 3461:6.3a */
     uschar * xdec_envid;
-    if (auth_xtextdecode(dsn_envid, &xdec_envid) > 0)
+    if (xtextdecode(dsn_envid, &xdec_envid) > 0)
       fprintf(fp, "Original-Envelope-ID: %s\n", dsn_envid);
     else
       fprintf(fp, "X-Original-Envelope-ID: error decoding xtext formatted ENVID\n");
       fprintf(fp, "Original-Envelope-ID: %s\n", dsn_envid);
     else
       fprintf(fp, "X-Original-Envelope-ID: error decoding xtext formatted ENVID\n");
@@ -6390,7 +6390,7 @@ if (dsn_envid)
   {
   /* must be decoded from xtext: see RFC 3461:6.3a */
   uschar *xdec_envid;
   {
   /* must be decoded from xtext: see RFC 3461:6.3a */
   uschar *xdec_envid;
-  if (auth_xtextdecode(dsn_envid, &xdec_envid) > 0)
+  if (xtextdecode(dsn_envid, &xdec_envid) > 0)
     fprintf(f,"Original-Envelope-ID: %s\n", dsn_envid);
   else
     fprintf(f,"X-Original-Envelope-ID: error decoding xtext formatted ENVID\n");
     fprintf(f,"Original-Envelope-ID: %s\n", dsn_envid);
   else
     fprintf(f,"X-Original-Envelope-ID: error decoding xtext formatted ENVID\n");
@@ -6549,7 +6549,7 @@ if (addr_senddsn)
     if (dsn_envid)
       {                        /* must be decoded from xtext: see RFC 3461:6.3a */
       uschar * xdec_envid;
     if (dsn_envid)
       {                        /* must be decoded from xtext: see RFC 3461:6.3a */
       uschar * xdec_envid;
-      if (auth_xtextdecode(dsn_envid, &xdec_envid) > 0)
+      if (xtextdecode(dsn_envid, &xdec_envid) > 0)
         fprintf(f, "Original-Envelope-ID: %s\n", dsn_envid);
       else
         fprintf(f, "X-Original-Envelope-ID: error decoding xtext formatted ENVID\n");
         fprintf(f, "Original-Envelope-ID: %s\n", dsn_envid);
       else
         fprintf(f, "X-Original-Envelope-ID: error decoding xtext formatted ENVID\n");
index 8232ed942dfdc47f090b1cc94cfd89b9f5d7ce39..ca9c7c3aceeead0abaf7ca5935bd2237c251f181 100644 (file)
@@ -8329,7 +8329,7 @@ NOT_ITEM: ;
       case EOP_XTEXTD:
        {
        uschar * s;
       case EOP_XTEXTD:
        {
        uschar * s;
-       int len = auth_xtextdecode(sub, &s);
+       int len = xtextdecode(sub, &s);
        yield = string_catn(yield, s, len);
        break;
        }
        yield = string_catn(yield, s, len);
        break;
        }
index 4bd6ff51ba0266e682a5bc93dd8c0d12ad8f04ac..079e94f5e15e830f19b878c146754d28afc914a4 100644 (file)
@@ -137,8 +137,6 @@ extern int     auth_get_no64_data(uschar **, uschar *);
 extern int     auth_prompt(const uschar *);
 extern int     auth_read_input(const uschar *);
 extern gstring * auth_show_supported(gstring *);
 extern int     auth_prompt(const uschar *);
 extern int     auth_read_input(const uschar *);
 extern gstring * auth_show_supported(gstring *);
-extern uschar *auth_xtextencode(uschar *, int);
-extern int     auth_xtextdecode(uschar *, uschar **);
 extern uschar *authenticator_current_name(void);
 
 #ifdef EXPERIMENTAL_ARC
 extern uschar *authenticator_current_name(void);
 
 #ifdef EXPERIMENTAL_ARC
@@ -693,6 +691,8 @@ extern uschar *wrap_header(const uschar *, unsigned, unsigned, const uschar *, u
 extern uschar * xclient_smtp_command(uschar *, int *, BOOL *);
 extern gstring * xclient_smtp_advertise_str(gstring *);
 #endif
 extern uschar * xclient_smtp_command(uschar *, int *, BOOL *);
 extern gstring * xclient_smtp_advertise_str(gstring *);
 #endif
+extern uschar *xtextencode(uschar *, int);
+extern int     xtextdecode(uschar *, uschar **);
 
 
 /******************************************************************************/
 
 
 /******************************************************************************/
index f8656a6e84487e0418db0e566ba0fb2837f1b44d..eadad682bd8d554b9d8fa72fa87a9b48085c7906 100644 (file)
@@ -4565,7 +4565,7 @@ while (done <= 0)
              int rc;
              uschar *ignore_msg;
 
              int rc;
              uschar *ignore_msg;
 
-             if (auth_xtextdecode(value, &authenticated_sender) < 0)
+             if (xtextdecode(value, &authenticated_sender) < 0)
                {
                /* Put back terminator overrides for error message */
                value[-1] = '=';
                {
                /* Put back terminator overrides for error message */
                value[-1] = '=';
index 5b54fa1ae889c4d6b863835e0b7760aac9f3ad30..769c5d235698b073524787bd3b2e96d997a3aa69 100644 (file)
@@ -1809,7 +1809,7 @@ if (  (f.smtp_authenticated || ob->authenticated_sender_force)
    && local_authenticated_sender)
   {
   string_format_nt(p, sizeof(sx->buffer) - (p-sx->buffer), " AUTH=%s",
    && local_authenticated_sender)
   {
   string_format_nt(p, sizeof(sx->buffer) - (p-sx->buffer), " AUTH=%s",
-    auth_xtextencode(local_authenticated_sender,
+    xtextencode(local_authenticated_sender,
       Ustrlen(local_authenticated_sender)));
   client_authenticated_sender = string_copy(local_authenticated_sender);
   }
       Ustrlen(local_authenticated_sender)));
   client_authenticated_sender = string_copy(local_authenticated_sender);
   }
index cca5dd88776dbc2c9da85ecaca82681b77fc531f..af2f287b9f9b6609ed01cfd7b1461cf10aed477f 100644 (file)
@@ -66,7 +66,7 @@ Returns:      the number of bytes in the result, excluding the final zero;
 static int
 xclient_xtextdecode(uschar * code, uschar * end, uschar ** ptr)
 {
 static int
 xclient_xtextdecode(uschar * code, uschar * end, uschar ** ptr)
 {
-return auth_xtextdecode(string_copyn(code, end-code), ptr);
+return xtextdecode(string_copyn(code, end-code), ptr);
 }
 
 /*************************************************
 }
 
 /*************************************************
diff --git a/src/src/xtextencode.c b/src/src/xtextencode.c
new file mode 100644 (file)
index 0000000..fa2b26b
--- /dev/null
@@ -0,0 +1,90 @@
+/*************************************************
+*     Exim - an Internet mail transport agent    *
+*************************************************/
+
+/* Copyright (c) The Exim Maintainers 2022 - 2024 */
+/* Copyright (c) University of Cambridge 1995 - 2018 */
+/* See the file NOTICE for conditions of use and distribution. */
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include "exim.h"
+
+
+/*************************************************
+*          Encode byte-string in xtext           *
+*************************************************/
+
+/* This function encodes a string of bytes, containing any values whatsoever,
+as "xtext", as defined in RFC 1891 and required by the SMTP AUTH extension (RFC
+2554).
+
+Arguments:
+  clear       points to the clear text bytes
+  len         the number of bytes to encode
+
+Returns:      a pointer to the zero-terminated xtext string, which
+              is in working store
+*/
+
+uschar *
+xtextencode(uschar *clear, int len)
+{
+gstring * g = NULL;
+for(uschar ch; len > 0; len--, clear++)
+  g = (ch = *clear) < 33 || ch > 126 || ch == '+' || ch == '='
+    ? string_fmt_append(g, "+%.02X", ch)
+    : string_catn(g, clear, 1);
+gstring_release_unused(g);
+return string_from_gstring(g);
+}
+
+
+/*************************************************
+*          Decode byte-string in xtext           *
+*************************************************/
+
+/* This function decodes a string in xtextformat as defined in RFC 1891 and
+required by the SMTP AUTH extension (RFC 2554). We put the result in a piece of
+store of equal length - it cannot be longer than this. Although in general the
+result of decoding an xtext may be binary, in the context in which it is used
+by Exim (for decoding the value of AUTH on a MAIL command), the result is
+expected to be an addr-spec. We therefore add on a terminating zero, for
+convenience.
+
+Arguments:
+  code        points to the coded string, zero-terminated
+  ptr         where to put the pointer to the result, which is in
+              dynamic store
+
+Returns:      the number of bytes in the result, excluding the final zero;
+              -1 if the input is malformed
+*/
+
+int
+xtextdecode(uschar * code, uschar ** ptr)
+{
+int x;
+uschar * result = store_get(Ustrlen(code) + 1, code);
+*ptr = result;
+
+while ((x = (*code++)) != 0)
+  {
+  if (x < 33 || x > 127 || x == '=') return -1;
+  if (x == '+')
+    {
+    register int y;
+    if (!isxdigit((x = (*code++)))) return -1;
+    y = ((isdigit(x))? x - '0' : (tolower(x) - 'a' + 10)) << 4;
+    if (!isxdigit((x = (*code++)))) return -1;
+    *result++ = y | ((isdigit(x))? x - '0' : (tolower(x) - 'a' + 10));
+    }
+  else *result++ = x;
+  }
+
+*result = 0;
+return result - *ptr;
+}
+
+/* End of xtextencode.c */
+/* vi: aw ai sw=2
+*/