int (*spare_fptr1)();
- int chanbindingscrit;
+#define SASL_CB_FLAG_NONE 0 /* client did not support CB */
+#define SASL_CB_FLAG_USED 1 /* client supports and used CB */
+#define SASL_CB_FLAG_WANT 2 /* client supports CB, thinks server does not */
+
+ int chanbindingsflag;
int chanbindingslen;
int spare_int3;
}
/* If client requires channel binding, prefer -PLUS mech */
- if (c_conn->cparams->chanbindingscrit &&
- !sasl_is_plus_mech(name)) {
- break;
+ if (c_conn->cparams->chanbindingslen != 0) {
+ if (sasl_is_plus_mech(name))
+ c_conn->cparams->chanbindingsflag = SASL_CB_FLAG_USED;
+ else
+ c_conn->cparams->chanbindingsflag = SASL_CB_FLAG_WANT;
+ } else {
+ c_conn->cparams->chanbindingsflag = SASL_CB_FLAG_NONE;
}
-
+
#ifdef PREFER_MECH
if (strcasecmp(m->m.plug->mech_name, PREFER_MECH) &&
bestm && m->m.plug->max_ssf <= bestssf) {
struct sasl_channel_bindings *cb = (struct sasl_channel_bindings *)value;
if (conn->type == SASL_CONN_SERVER) {
+ int cb_flag;
+
((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;
}
if (r != SASL_OK) saslfail(r, "allocating connection state");
cb.type = "sasl-sample";
- cb.critical = 1;
+ cb.critical = 0;
cb.data = "this is a test of channel bindings";
cb.len = strlen(cb.data);
if (r != SASL_OK) saslfail(r, "allocating connection state");
cb.type = "sasl-sample";
- cb.critical = 1;
+ cb.critical = 0;
cb.data = "this is a test of channel bindings";
cb.len = strlen(cb.data);