New SASL_BADBINDING error code; cleanup error handling
[cyrus-sasl.git] / lib / common.c
index 9df3217..2481697 100644 (file)
@@ -1208,20 +1208,13 @@ int sasl_setprop(sasl_conn_t *conn, int propnum, const void *value)
     else
         ((sasl_client_conn_t *)conn)->cparams->gss_creds = (void *)value;
     break;
-  case SASL_CHANNEL_BINDINGS: {
-    struct sasl_channel_bindings *cb = (struct sasl_channel_bindings *)value;
-
-    if (conn->type == SASL_CONN_SERVER) {
-        ((sasl_server_conn_t *)conn)->sparams->chanbindingstype = cb->type;
-        ((sasl_server_conn_t *)conn)->sparams->chanbindingscrit = cb->critical;
-        ((sasl_server_conn_t *)conn)->sparams->chanbindingsdata = cb->data;
-        ((sasl_server_conn_t *)conn)->sparams->chanbindingslen = cb->len;
-    } else {
-        ((sasl_client_conn_t *)conn)->cparams->chanbindingstype = cb->type;
-        ((sasl_client_conn_t *)conn)->cparams->chanbindingscrit = cb->critical;
-        ((sasl_client_conn_t *)conn)->cparams->chanbindingsdata = cb->data;
-        ((sasl_client_conn_t *)conn)->cparams->chanbindingslen = cb->len;
-    }
+  case SASL_CHANNEL_BINDING: {
+    const struct sasl_channel_binding *cb = (const struct sasl_channel_binding *)value;
+
+    if (conn->type == SASL_CONN_SERVER)
+        ((sasl_server_conn_t *)conn)->sparams->cbinding = cb;
+    else
+        ((sasl_client_conn_t *)conn)->cparams->cbinding = cb;
     break;
   }
   default:
@@ -1283,6 +1276,7 @@ const char *sasl_errstring(int saslerr,
     case SASL_NOCHANGE:   return "requested change was not needed";
     case SASL_WEAKPASS:   return "passphrase is too weak for security policy";
     case SASL_NOUSERPASS: return "user supplied passwords are not permitted";
+    case SASL_BADBINDING: return "channel binding failure";
 
     default:   return "undefined error!";
     }
@@ -2332,6 +2326,24 @@ int sasl_listmech(sasl_conn_t *conn,
     PARAMERROR(conn);
 }
 
+int _sasl_is_equal_mech(const char *req_mech,
+                        const char *plug_mech,
+                        int *plus)
+{
+    size_t len = strlen(req_mech);
+    size_t n;
+
+    if (len > 5 &&
+        strcasecmp(&req_mech[len - 5], "-PLUS") == 0) {
+        n = len - 5;
+        *plus = 1;
+    } else {
+        n = len;
+        *plus = 0;
+    }
+
+    return (strncasecmp(req_mech, plug_mech, n) == 0);
+}
 
 #ifndef WIN32
 static char *