X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=mutt_sasl.c;h=8938afa82ca6949ee091eaa943ff7d0c7fef028a;hp=f38acda5ad5f6cd5a858dc94303a181a07394e48;hb=e4704214cabdd0b6e10b27cff5e2194959559809;hpb=f3cbb9f51357972f6e74244494236a41dc4d84cd diff --git a/mutt_sasl.c b/mutt_sasl.c index f38acda..8938afa 100644 --- a/mutt_sasl.c +++ b/mutt_sasl.c @@ -16,7 +16,7 @@ #include #include -#include +#include #include #include "mutt.h" @@ -28,7 +28,23 @@ * a protection buffer. */ #define M_SASL_MAXBUF 65536 -#define IP_PORT_BUFLEN 1024 +typedef struct { + sasl_conn_t *saslconn; + const sasl_ssf_t *ssf; + const unsigned int *pbufsize; + + /* read buffer */ + char *buf; + unsigned blen; + unsigned int bpos; + + /* underlying socket data */ + void *sockdata; + int (*msasl_open) (CONNECTION * conn); + int (*msasl_close) (CONNECTION * conn); + int (*msasl_read) (CONNECTION * conn, char *buf, ssize_t len); + int (*msasl_write) (CONNECTION * conn, const char *buf, ssize_t count); +} SASL_DATA; static sasl_callback_t mutt_sasl_callbacks[5]; @@ -115,7 +131,7 @@ int mutt_sasl_client_new (CONNECTION * conn, sasl_conn_t ** saslconn) struct sockaddr_storage local, remote; socklen_t size; - char iplocalport[IP_PORT_BUFLEN], ipremoteport[IP_PORT_BUFLEN]; + char iplocalport[STRING], ipremoteport[STRING]; const char *service; int rc; @@ -137,14 +153,14 @@ int mutt_sasl_client_new (CONNECTION * conn, sasl_conn_t ** saslconn) size = sizeof(local); if (getsockname(conn->fd, (struct sockaddr *) &local, &size) - || iptostring(&local, iplocalport, IP_PORT_BUFLEN) != SASL_OK) + || iptostring(&local, iplocalport, STRING) != SASL_OK) { return -1; } size = sizeof(remote); if (getpeername(conn->fd, (struct sockaddr *) &remote, &size) - || iptostring(&remote, ipremoteport, IP_PORT_BUFLEN) != SASL_OK) + || iptostring(&remote, ipremoteport, STRING) != SASL_OK) { return -1; } @@ -186,8 +202,8 @@ int mutt_sasl_client_new (CONNECTION * conn, sasl_conn_t ** saslconn) int mutt_sasl_interact (sasl_interact_t * interaction) { - char prompt[SHORT_STRING]; - char resp[SHORT_STRING]; + char prompt[STRING]; + char resp[STRING]; while (interaction->id != SASL_CB_LIST_END) { snprintf (prompt, sizeof (prompt), "%s: ", interaction->prompt); @@ -252,8 +268,8 @@ void mutt_sasl_setup_conn (CONNECTION * conn, sasl_conn_t * saslconn) conn->conn_write = mutt_sasl_conn_write; } -void mutt_sasl_done (void) { - sasl_done (); +void mutt_sasl_shutdown(void) { + sasl_done(); } /* mutt_sasl_cb_authname: callback to retrieve authname or user from ACCOUNT */ @@ -302,7 +318,7 @@ static int mutt_sasl_cb_pass(sasl_conn_t *conn __attribute__ ((unused)), *psecret = xmalloc(sizeof(sasl_secret_t) + len); (*psecret)->len = len; - m_strcpy((char*)(*psecret)->data, len, account->pass); + memcpy((char*)(*psecret)->data, account->pass, len); return SASL_OK; } @@ -434,9 +450,9 @@ mutt_sasl_conn_write(CONNECTION * conn, const char *buf, ssize_t len) goto fail; } - rc = (sasldata->msasl_write)(conn, pbuf, plen); + plen -= (sasldata->msasl_write)(conn, pbuf, plen); p_delete(&pbuf); - if (rc != plen) + if (plen) goto fail; len -= olen;