X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=mts%2Fsmtp%2Fsmtp.c;h=5760356e3c9b2ff37b87e794e8544371a4bba751;hp=5b33ed827009ce40e5d4da8859b0b7a6e59b349b;hb=557d33aeabe46e9a0411959703f721c5b9ce2ae9;hpb=a60b66a4ee37b8cd59233b7f35a50398f0a27da6 diff --git a/mts/smtp/smtp.c b/mts/smtp/smtp.c index 5b33ed8..5760356 100644 --- a/mts/smtp/smtp.c +++ b/mts/smtp/smtp.c @@ -2,17 +2,31 @@ * smtp.c -- nmh SMTP interface * * $Id$ + * + * This code is Copyright (c) 2002, by the authors of nmh. See the + * COPYRIGHT file in the root directory of the nmh distribution for + * complete copyright information. */ #include #include "smtp.h" -#include +#include #include #include #ifdef MPOP #include #endif +#ifdef CYRUS_SASL +#include +#include +#include +#include +#include +#include +#include +#endif /* CYRUS_SASL */ + /* * This module implements an interface to SendMail very similar * to the MMDF mm_(3) routines. The sm_() routines herein talk @@ -108,7 +122,8 @@ char *EHLOkeys[MAXEHLO + 1]; /* * static prototypes */ -static int smtp_init (char *, char *, int, int, int, int, int); +static int smtp_init (char *, char *, int, int, int, int, int, int, + char *, char *); static int sendmail_init (char *, char *, int, int, int, int, int); static int rclient (char *, char *, char *); @@ -140,7 +155,7 @@ char **smail_copyip (char **, char **, int); static int sm_auth_sasl(char *, char *, char *); #endif /* CYRUS_SASL */ -/* from zotnet/mts/client.c */ +/* from mts/generic/client.c */ int client (char *, char *, char *, int, char *, int); int @@ -1094,12 +1109,11 @@ no_dice: static int sm_auth_sasl(char *user, char *mechlist, char *host) { - int result, status, outlen; - unsigned int buflen; + int result, status; + unsigned int buflen, outlen; char *buf, outbuf[BUFSIZ]; const char *chosen_mech; sasl_security_properties_t secprops; - sasl_external_properties_t extprops; sasl_ssf_t *ssf; int *outbufmax; @@ -1152,7 +1166,7 @@ sm_auth_sasl(char *user, char *mechlist, char *host) return NOTOK; } - result = sasl_client_new("smtp", host, NULL, SASL_SECURITY_LAYER, &conn); + result = sasl_client_new("smtp", host, NULL, NULL, NULL, 0, &conn); if (result != SASL_OK) { sm_ierror("SASL client initialization failed: %s", @@ -1167,7 +1181,6 @@ sm_auth_sasl(char *user, char *mechlist, char *host) memset(&secprops, 0, sizeof(secprops)); secprops.maxbufsize = BUFSIZ; secprops.max_ssf = 0; /* XXX change this when we do encryption */ - memset(&extprops, 0, sizeof(extprops)); result = sasl_setprop(conn, SASL_SEC_PROPS, &secprops); @@ -1177,21 +1190,13 @@ sm_auth_sasl(char *user, char *mechlist, char *host) return NOTOK; } - result = sasl_setprop(conn, SASL_SSF_EXTERNAL, &extprops); - - if (result != SASL_OK) { - sm_ierror("SASL external property initialization failed: %s", - sasl_errstring(result, NULL, NULL)); - return NOTOK; - } - /* * Start the actual protocol. Feed the mech list into the library * and get out a possible initial challenge */ - result = sasl_client_start(conn, mechlist, NULL, NULL, &buf, &buflen, - &chosen_mech); + result = sasl_client_start(conn, mechlist, NULL, (const char **) &buf, + &buflen, (const char **) &chosen_mech); if (result != SASL_OK && result != SASL_CONTINUE) { sm_ierror("SASL client start failed: %s", @@ -1206,7 +1211,6 @@ sm_auth_sasl(char *user, char *mechlist, char *host) if (buflen) { status = sasl_encode64(buf, buflen, outbuf, sizeof(outbuf), NULL); - free(buf); if (status != SASL_OK) { sm_ierror("SASL base64 encode failed: %s", sasl_errstring(status, NULL, NULL)); @@ -1249,7 +1253,7 @@ sm_auth_sasl(char *user, char *mechlist, char *host) outlen = 0; } else { result = sasl_decode64(sm_reply.text, sm_reply.length, - outbuf, &outlen); + outbuf, sizeof(outbuf), &outlen); if (result != SASL_OK) { smtalk(SM_AUTH, "*"); @@ -1259,7 +1263,8 @@ sm_auth_sasl(char *user, char *mechlist, char *host) } } - result = sasl_client_step(conn, outbuf, outlen, NULL, &buf, &buflen); + result = sasl_client_step(conn, outbuf, outlen, NULL, + (const char **) &buf, &buflen); if (result != SASL_OK && result != SASL_CONTINUE) { smtalk(SM_AUTH, "*"); @@ -1269,7 +1274,6 @@ sm_auth_sasl(char *user, char *mechlist, char *host) } status = sasl_encode64(buf, buflen, outbuf, sizeof(outbuf), NULL); - free(buf); if (status != SASL_OK) { smtalk(SM_AUTH, "*"); @@ -1289,24 +1293,11 @@ sm_auth_sasl(char *user, char *mechlist, char *host) return RP_BHST; /* - * Depending on the mechanism, we need to do a FINAL call to - * sasl_client_step(). Do that now. - */ - - result = sasl_client_step(conn, NULL, 0, NULL, &buf, &buflen); - - if (result != SASL_OK) { - sm_ierror("SASL final client negotiation failed: %s", - sasl_errstring(result, NULL, NULL)); - return NOTOK; - } - - /* * We _should_ have completed the authentication successfully. * Get a few properties from the authentication exchange. */ - result = sasl_getprop(conn, SASL_MAXOUTBUF, (void **) &outbufmax); + result = sasl_getprop(conn, SASL_MAXOUTBUF, (const void **) &outbufmax); if (result != SASL_OK) { sm_ierror("Cannot retrieve SASL negotiated output buffer size: %s", @@ -1316,7 +1307,7 @@ sm_auth_sasl(char *user, char *mechlist, char *host) maxoutbuf = *outbufmax; - result = sasl_getprop(conn, SASL_SSF, (void **) &ssf); + result = sasl_getprop(conn, SASL_SSF, (const void **) &ssf); sasl_ssf = *ssf; @@ -1376,7 +1367,7 @@ sm_get_pass(sasl_conn_t *conn, void *context, int id, } (*psecret)->len = len; - strcpy((*psecret)->data, pass); + strcpy((char *) (*psecret)->data, pass); /* free(pass); */ return SASL_OK;