]> diplodocus.org Git - nmh/blobdiff - uip/popsbr.c
showfile.c: Move interface to own file.
[nmh] / uip / popsbr.c
index f913fce2ef5733e02818d879df4ee62c008de3b6..02e10e6e6a3776b12bf67d81d3b94896c1ba0164 100644 (file)
@@ -5,13 +5,16 @@
  * complete copyright information.
  */
 
-#include <h/mh.h>
-#include <h/utils.h>
-#include <h/oauth.h>
-#include <h/netsec.h>
-
-#include <h/popsbr.h>
-#include <h/signals.h>
+#include "h/mh.h"
+#include "sbr/credentials.h"
+#include "sbr/client.h"
+#include "sbr/error.h"
+#include "h/utils.h"
+#include "h/oauth.h"
+#include "h/netsec.h"
+
+#include "h/popsbr.h"
+#include "h/signals.h"
 #include "sbr/base64.h"
 
 #define        TRM     "."
@@ -34,12 +37,13 @@ static int vcommand(const char *, va_list) CHECK_PRINTF(1, 0);
 static int pop_getline (char *, int, netsec_context *);
 static int pop_sasl_callback(enum sasl_message_type, unsigned const char *,
                             unsigned int, unsigned char **, unsigned int *,
-                            char **);
+                            void *, char **);
 
 static int
 check_mech(char *server_mechs, size_t server_mechs_size)
 {
-  int status, sasl_capability = 0;
+  int status;
+  bool sasl_capability = false;
 
     /*
      * First off, we're going to send the CAPA command to see if we can
@@ -62,7 +66,7 @@ check_mech(char *server_mechs, size_t server_mechs_size)
 
         if (strncasecmp(response, "SASL ", 5) == 0) {
             /* We've seen the SASL capability.  Grab the mech list. */
-            sasl_capability++;
+            sasl_capability = true;
             strncpy(server_mechs, response + 5, server_mechs_size);
         }
     }
@@ -108,7 +112,7 @@ parse_proxy(char *proxy, char *host)
 
    /* put together list of arguments */
     p = pargv = mh_xmalloc(pargc * sizeof(char *));
-    c = *pargv = mh_xmalloc(plen * sizeof(char));
+    c = *pargv = mh_xmalloc(plen);
     for (cur = pro; *cur; cur++) {
         if (isspace(*cur) && cur[1] && !isspace(cur[1])) {
            *c++ = '\0';
@@ -223,7 +227,7 @@ pop_init (char *host, char *port, char *user, char *proxy, int snoop,
 
     if (sasl) {
        if (netsec_set_sasl_params(nsc, "pop", mech, pop_sasl_callback,
-                                  &errstr) != OK) {
+                                  NULL, &errstr) != OK) {
            snprintf(response, sizeof(response), "%s", errstr);
            free(errstr);
            return NOTOK;
@@ -292,11 +296,12 @@ pop_init (char *host, char *port, char *user, char *proxy, int snoop,
 static int
 pop_sasl_callback(enum sasl_message_type mtype, unsigned const char *indata,
                  unsigned int indatalen, unsigned char **outdata,
-                 unsigned int *outdatalen, char **errstr)
+                 unsigned int *outdatalen, void *context, char **errstr)
 {
     int rc, snoopoffset;
     char *mech, *line;
     size_t len, b64len;
+    NMH_UNUSED(context);
 
     switch (mtype) {
     case NETSEC_SASL_START:
@@ -338,25 +343,27 @@ pop_sasl_callback(enum sasl_message_type mtype, unsigned const char *indata,
                               "for initial challenge response");
                    return NOTOK;
                }
-               netsec_set_snoop_callback(nsc, netsec_b64_snoop_decoder, NULL);
                rc = netsec_printf(nsc, errstr, "%s\r\n", b64data);
-               netsec_set_snoop_callback(nsc, NULL, NULL);
                free(b64data);
                if (rc != OK)
                    return NOTOK;
-               if (netsec_flush(nsc, errstr) != OK)
+               netsec_set_snoop_callback(nsc, netsec_b64_snoop_decoder, NULL);
+               rc = netsec_flush(nsc, errstr);
+               netsec_set_snoop_callback(nsc, NULL, NULL);
+               if (rc != OK)
                    return NOTOK;
            } else {
-               netsec_set_snoop_callback(nsc, netsec_b64_snoop_decoder,
-                                         &snoopoffset);
-               snoopoffset = 6 + strlen(mech);
                rc = netsec_printf(nsc, errstr, "AUTH %s %s\r\n", mech,
                                   b64data);
                free(b64data);
-               netsec_set_snoop_callback(nsc, NULL, NULL);
                if (rc != OK)
                    return NOTOK;
-               if (netsec_flush(nsc, errstr) != OK)
+               netsec_set_snoop_callback(nsc, netsec_b64_snoop_decoder,
+                                         &snoopoffset);
+               snoopoffset = 6 + strlen(mech);
+               rc = netsec_flush(nsc, errstr);
+               netsec_set_snoop_callback(nsc, NULL, NULL);
+               if (rc != OK)
                    return NOTOK;
            }
        } else {
@@ -409,16 +416,18 @@ pop_sasl_callback(enum sasl_message_type mtype, unsigned const char *indata,
            unsigned char *b64data;
            b64data = mh_xmalloc(BASE64SIZE(indatalen));
            writeBase64raw(indata, indatalen, b64data);
-           netsec_set_snoop_callback(nsc, netsec_b64_snoop_decoder, NULL);
            rc = netsec_printf(nsc, errstr, "%s\r\n", b64data);
-           netsec_set_snoop_callback(nsc, NULL, NULL);
            free(b64data);
        }
 
        if (rc != OK)
            return NOTOK;
 
-       if (netsec_flush(nsc, errstr) != OK)
+       if (indatalen > 0)
+           netsec_set_snoop_callback(nsc, netsec_b64_snoop_decoder, NULL);
+       rc = netsec_flush(nsc, errstr);
+       netsec_set_snoop_callback(nsc, NULL, NULL);
+       if (rc != OK)
            return NOTOK;
        break;