SPDX: license tags (mostly by guesswork)
[exim.git] / src / src / auths / cyrus_sasl.c
index 37e78989fbae96fc46cab022145b71490eac7f92..4fe257ba748863c6a2d52c6854999735ebcf9809 100644 (file)
@@ -2,8 +2,10 @@
 *     Exim - an Internet mail transport agent    *
 *************************************************/
 
+/* Copyright (c) The Exim Maintainers 2020 - 2022 */
 /* Copyright (c) University of Cambridge 1995 - 2018 */
 /* See the file NOTICE for conditions of use and distribution. */
+/* SPDX-License-Identifier: GPL-2.0-only */
 
 /* This code was originally contributed by Matthew Byng-Maddick */
 
@@ -38,13 +40,13 @@ static void dummy(int x) { dummy2(x-1); }
 
 optionlist auth_cyrus_sasl_options[] = {
   { "server_hostname",      opt_stringptr,
-      (void *)(offsetof(auth_cyrus_sasl_options_block, server_hostname)) },
+      OPT_OFF(auth_cyrus_sasl_options_block, server_hostname) },
   { "server_mech",          opt_stringptr,
-      (void *)(offsetof(auth_cyrus_sasl_options_block, server_mech)) },
+      OPT_OFF(auth_cyrus_sasl_options_block, server_mech) },
   { "server_realm",         opt_stringptr,
-      (void *)(offsetof(auth_cyrus_sasl_options_block, server_realm)) },
+      OPT_OFF(auth_cyrus_sasl_options_block, server_realm) },
   { "server_service",       opt_stringptr,
-      (void *)(offsetof(auth_cyrus_sasl_options_block, server_service)) }
+      OPT_OFF(auth_cyrus_sasl_options_block, server_service) }
 };
 
 /* Size of the options list. An extern variable has to be used so that its
@@ -70,7 +72,7 @@ void auth_cyrus_sasl_init(auth_instance *ablock) {}
 int auth_cyrus_sasl_server(auth_instance *ablock, uschar *data) {return 0;}
 int auth_cyrus_sasl_client(auth_instance *ablock, void * sx,
   int timeout, uschar *buffer, int buffsize) {return 0;}
-void auth_cyrus_sasl_version_report(FILE *f) {}
+gstring * auth_cyrus_sasl_version_report(gstring * g) {return NULL;}
 
 #else   /*!MACRO_PREDEF*/
 
@@ -290,7 +292,6 @@ for (int i = 0; i < 2; ++i)
   const uschar * label;
   uschar * address_port;
   const char *s_err;
-  socklen_t sslen;
 
   if (i)
     {
@@ -331,10 +332,10 @@ for (rc = SASL_CONTINUE; rc == SASL_CONTINUE; )
     }
   else
     {
-    /* make sure that we have a null-terminated string */
-    out2 = string_copyn(output, outlen);
+    /* auth_get_data() takes a length-specfied block of binary
+    which can include zeroes; no terminating NUL is needed */
 
-    if ((rc = auth_get_data(&input, out2, outlen)) != OK)
+    if ((rc = auth_get_data(&input, output, outlen)) != OK)
       {
       /* we couldn't get the data, so free up the library before
       returning whatever error we get */
@@ -373,12 +374,12 @@ for (rc = SASL_CONTINUE; rc == SASL_CONTINUE; )
   /* Get the username and copy it into $auth1 and $1. The former is now the
   preferred variable; the latter is the original variable. */
 
-  if ((sasl_getprop(conn, SASL_USERNAME, (const void **)(&out2))) != SASL_OK)
+  if ((sasl_getprop(conn, SASL_USERNAME, (const void **)&out2)) != SASL_OK)
     {
     HDEBUG(D_auth)
       debug_printf("Cyrus SASL library will not tell us the username: %s\n",
          sasl_errstring(rc, NULL, NULL));
-    log_write(0, LOG_REJECT, "%s authenticator (%s):\n  "
+    log_write(0, LOG_REJECT, "%s authenticator (%s): "
        "Cyrus SASL username fetch problem: %s", ablock->name, ob->server_mech,
        sasl_errstring(rc, NULL, NULL));
     sasl_dispose(&conn);
@@ -397,7 +398,7 @@ for (rc = SASL_CONTINUE; rc == SASL_CONTINUE; )
       /* these are considered permanent failure codes */
       HDEBUG(D_auth)
        debug_printf("Cyrus SASL permanent failure %d (%s)\n", rc, sasl_errstring(rc, NULL, NULL));
-      log_write(0, LOG_REJECT, "%s authenticator (%s):\n  "
+      log_write(0, LOG_REJECT, "%s authenticator (%s): "
         "Cyrus SASL permanent failure: %s", ablock->name, ob->server_mech,
         sasl_errstring(rc, NULL, NULL));
       sasl_dispose(&conn);
@@ -427,7 +428,7 @@ for (rc = SASL_CONTINUE; rc == SASL_CONTINUE; )
        HDEBUG(D_auth)
          debug_printf("Cyrus SASL library will not tell us the SSF: %s\n",
              sasl_errstring(rc, NULL, NULL));
-       log_write(0, LOG_REJECT, "%s authenticator (%s):\n  "
+       log_write(0, LOG_REJECT, "%s authenticator (%s): "
            "Cyrus SASL SSF value not available: %s", ablock->name, ob->server_mech,
            sasl_errstring(rc, NULL, NULL));
        sasl_dispose(&conn);
@@ -441,7 +442,7 @@ for (rc = SASL_CONTINUE; rc == SASL_CONTINUE; )
        {
        HDEBUG(D_auth)
          debug_printf("Exim does not implement SASL wrapping (needed for SSF %d).\n", negotiated_ssf);
-       log_write(0, LOG_REJECT, "%s authenticator (%s):\n  "
+       log_write(0, LOG_REJECT, "%s authenticator (%s): "
            "Cyrus SASL SSF %d not supported by Exim", ablock->name, ob->server_mech, negotiated_ssf);
        sasl_dispose(&conn);
        sasl_done();
@@ -476,15 +477,17 @@ return 0;  /* Stop compiler complaints */
 *                Diagnostic API                  *
 *************************************************/
 
-void
-auth_cyrus_sasl_version_report(FILE *f)
+gstring *
+auth_cyrus_sasl_version_report(gstring * g)
 {
-const char *implementation, *version;
+const char * implementation, * version;
 sasl_version_info(&implementation, &version, NULL, NULL, NULL, NULL);
-fprintf(f, "Library version: Cyrus SASL: Compile: %d.%d.%d\n"
-          "                             Runtime: %s [%s]\n",
+g = string_fmt_append(g,
+       "Library version: Cyrus SASL: Compile: %d.%d.%d\n"
+       "                             Runtime: %s [%s]\n",
        SASL_VERSION_MAJOR, SASL_VERSION_MINOR, SASL_VERSION_STEP,
        version, implementation);
+return g;
 }
 
 /*************************************************