static int _sx_sasl_rio(sx_t s, sx_plugin_t p, sx_buf_t buf) { sasl_conn_t *sasl; sx_error_t sxe; int *x, len; char *out; sasl = ((_sx_sasl_data_t) s->plugin_data[p->index])->sasl; /* if there's no security layer, don't bother */ sasl_getprop(sasl, SASL_SSF, (const void **) &x); if(*x == 0) return 1; _sx_debug(ZONE, "doing sasl decode"); /* decode the input */ if (sasl_decode(sasl, buf->data, buf->len, (const char **) &out, &len) != SASL_OK) { /* Fatal error */ _sx_gen_error(sxe, SX_ERR_STREAM, "Stream error", "sasl_decode failed, closing stream"); _sx_event(s, event_ERROR, (void *) &sxe); _sx_state(s, state_CLOSING); return -1; } /* replace the buffer */ _sx_buffer_set(buf, out, len, NULL); _sx_debug(ZONE, "%d bytes decoded from sasl channel", len); return 1; }
static int _sx_sasl_rio(sx_t s, sx_plugin_t p, sx_buf_t buf) { sx_error_t sxe; int len, ret; char *out; Gsasl_session *sd = (Gsasl_session *) s->plugin_data[p->index]; _sx_debug(ZONE, "doing sasl decode"); /* decode the input */ ret = gsasl_decode(sd, buf->data, buf->len, &out, &len); if (ret != GSASL_OK) { _sx_debug(ZONE, "gsasl_decode failed (%d): %s", ret, gsasl_strerror (ret)); /* Fatal error */ _sx_gen_error(sxe, SX_ERR_AUTH, "SASL Stream decoding failed", (char*) gsasl_strerror (ret)); _sx_event(s, event_ERROR, (void *) &sxe); return -1; } /* replace the buffer */ _sx_buffer_set(buf, out, len, NULL); free(out); _sx_debug(ZONE, "%d bytes decoded from sasl channel", len); return 1; }
static int _sx_sasl_wio(sx_t s, sx_plugin_t p, sx_buf_t buf) { sasl_conn_t *sasl; int *x, len, pos, reslen, maxbuf; char *out, *result; int sasl_ret; sx_error_t sxe; sasl = ((_sx_sasl_data_t) s->plugin_data[p->index])->sasl; /* if there's no security layer, don't bother */ sasl_getprop(sasl, SASL_SSF, (const void **) &x); if(*x == 0) return 1; _sx_debug(ZONE, "doing sasl encode"); /* can only encode x bytes at a time */ sasl_getprop(sasl, SASL_MAXOUTBUF, (const void **) &x); maxbuf = *x; /* encode the output */ pos = 0; result = NULL; reslen = 0; while(pos < buf->len) { if((buf->len - pos) < maxbuf) maxbuf = buf->len - pos; sasl_ret = sasl_encode(sasl, &buf->data[pos], maxbuf, (const char **) &out, &len); if (sasl_ret != SASL_OK) { _sx_gen_error(sxe, SX_ERR_STREAM, "Stream error", "sasl_encode failed, closing stream"); _sx_event(s, event_ERROR, (void *) &sxe); _sx_state(s, state_CLOSING); return 1; } result = (char *) realloc(result, sizeof(char) * (reslen + len)); memcpy(&result[reslen], out, len); reslen += len; pos += maxbuf; } /* replace the buffer */ _sx_buffer_set(buf, result, reslen, result); _sx_debug(ZONE, "%d bytes encoded for sasl channel", buf->len); return 1; }