25f72e2845c89a153ca9d3279d7feccbc912524ematthew Secrets Responder
25f72e2845c89a153ca9d3279d7feccbc912524ematthew Copyright (C) Simo Sorce <ssorce@redhat.com> 2016
25f72e2845c89a153ca9d3279d7feccbc912524ematthew This program is free software; you can redistribute it and/or modify
25f72e2845c89a153ca9d3279d7feccbc912524ematthew it under the terms of the GNU General Public License as published by
25f72e2845c89a153ca9d3279d7feccbc912524ematthew the Free Software Foundation; either version 3 of the License, or
25f72e2845c89a153ca9d3279d7feccbc912524ematthew (at your option) any later version.
25f72e2845c89a153ca9d3279d7feccbc912524ematthew This program is distributed in the hope that it will be useful,
25f72e2845c89a153ca9d3279d7feccbc912524ematthew but WITHOUT ANY WARRANTY; without even the implied warranty of
25f72e2845c89a153ca9d3279d7feccbc912524ematthew MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25f72e2845c89a153ca9d3279d7feccbc912524ematthew GNU General Public License for more details.
25f72e2845c89a153ca9d3279d7feccbc912524ematthew You should have received a copy of the GNU General Public License
25f72e2845c89a153ca9d3279d7feccbc912524ematthew along with this program. If not, see <http://www.gnu.org/licenses/>.
25f72e2845c89a153ca9d3279d7feccbc912524ematthew/* ##### Request Handling ##### */
25f72e2845c89a153ca9d3279d7feccbc912524ematthewstatic void sec_http_request_pipeline_done(struct tevent_req *subreq);
25f72e2845c89a153ca9d3279d7feccbc912524ematthewstatic struct tevent_req *sec_http_request_send(TALLOC_CTX *mem_ctx,
25f72e2845c89a153ca9d3279d7feccbc912524ematthew req = tevent_req_create(mem_ctx, &state, struct sec_http_request_state);
25f72e2845c89a153ca9d3279d7feccbc912524ematthew /* Go through the pipeline */
25f72e2845c89a153ca9d3279d7feccbc912524ematthew /* 1. mapping and path conversion */
25f72e2845c89a153ca9d3279d7feccbc912524ematthew ret = sec_req_routing(state, secreq, &provider_handle);
25f72e2845c89a153ca9d3279d7feccbc912524ematthew "sec_req_routing failed [%d]: %s\n", ret, sss_strerror(ret));
25f72e2845c89a153ca9d3279d7feccbc912524ematthew /* 2. backend invocation */
25f72e2845c89a153ca9d3279d7feccbc912524ematthew tevent_req_set_callback(subreq, sec_http_request_pipeline_done, req);
8890d0c686adc8442c156956735470bf289ba2d8markstatic void sec_http_request_pipeline_done(struct tevent_req *subreq)
8890d0c686adc8442c156956735470bf289ba2d8mark req = tevent_req_callback_data(subreq, struct tevent_req);
8890d0c686adc8442c156956735470bf289ba2d8mark /* 3. reply construction */
8890d0c686adc8442c156956735470bf289ba2d8mark DEBUG(SSSDBG_TRACE_LIBS, "Did not find the requested data\n");
25f72e2845c89a153ca9d3279d7feccbc912524ematthew "sec request failed [%d]: %s\n", ret, sss_strerror(ret));
25f72e2845c89a153ca9d3279d7feccbc912524ematthewstatic int sec_http_request_recv(struct tevent_req *req)
25f72e2845c89a153ca9d3279d7feccbc912524ematthew secreq = tevent_req_callback_data(req, struct sec_req_ctx);
25f72e2845c89a153ca9d3279d7feccbc912524ematthew DEBUG(SSSDBG_TRACE_LIBS, "Did not find the requested data\n");
8890d0c686adc8442c156956735470bf289ba2d8mark "sec_http_request_recv failed [%d]: %s\n",
8890d0c686adc8442c156956735470bf289ba2d8mark /* Always return an error if we get here */
8890d0c686adc8442c156956735470bf289ba2d8mark "Failed to find reply, aborting client!\n");
c474d6853192b277a73b133d56970bbf118d3fe3mark /* Turn writable on so we can write back the reply */
c474d6853192b277a73b133d56970bbf118d3fe3mark secreq = talloc_get_type(cctx->state_ctx, struct sec_req_ctx);
c474d6853192b277a73b133d56970bbf118d3fe3mark "Failed to schedule secret retrieval\n.");
c474d6853192b277a73b133d56970bbf118d3fe3mark tevent_req_set_callback(req, sec_http_request_done, secreq);
820ed286b08eac25f26a4904ca06e9d600b612aemark/* ##### HTTP Parsing Callbacks ##### */
c474d6853192b277a73b133d56970bbf118d3fe3markstatic void sec_append_string(TALLOC_CTX *memctx, char **dest,
25f72e2845c89a153ca9d3279d7feccbc912524ematthew *dest = talloc_strndup_append_buffer(*dest, src, len);
5ffeac9af157b599c7fb34a23d6c50161fbd6a6cmatthewstatic bool sec_too_much_data(struct sec_req_ctx *req, size_t length)
5ffeac9af157b599c7fb34a23d6c50161fbd6a6cmatthew "Request too big, aborting client!\n");
25f72e2845c89a153ca9d3279d7feccbc912524ematthew return true;
25f72e2845c89a153ca9d3279d7feccbc912524ematthew return false;
5ffeac9af157b599c7fb34a23d6c50161fbd6a6cmatthew DEBUG(SSSDBG_TRACE_INTERNAL, "HTTP Message parsing begins\n");
5ffeac9af157b599c7fb34a23d6c50161fbd6a6cmatthew sec_append_string(req, &req->request_url, at, length);
25f72e2845c89a153ca9d3279d7feccbc912524ematthew "Failed to store URL, aborting client!\n");
503c353d31964b01e67395d3b1207f3e408dd774matthew req->headers = talloc_zero_array(req, struct sec_kvp, 10);
503c353d31964b01e67395d3b1207f3e408dd774matthew } else if ((n % 10 == 0) &&
503c353d31964b01e67395d3b1207f3e408dd774matthew memset(&req->headers[n], 0, sizeof(struct sec_kvp) * 10);
503c353d31964b01e67395d3b1207f3e408dd774matthew "Failed to store headers, aborting client!\n");
503c353d31964b01e67395d3b1207f3e408dd774matthew /* new field */
503c353d31964b01e67395d3b1207f3e408dd774matthew sec_append_string(req->headers, &req->headers[n - 1].name, at, length);
503c353d31964b01e67395d3b1207f3e408dd774matthew "Failed to store header name, aborting client!\n");
char *source_buf,
char **dest)
if (!*dest) {
return ENOMEM;
return EOK;
0, &parsed);
if (ret) {
return ret;
if (ret) {
if (ret) {
if (ret) {
if (ret) {
if (ret) {
if (ret) {
errno = 0;
return EAGAIN;
return ret;
if (len == 0) {
return EIO;
return EOK;
errno = 0;
return EAGAIN;
return ret;
if (len == 0) {
return ENODATA;
return EOK;
if (!req) {
if (!req) {
switch (ret) {
case ENODATA:
case EAGAIN:
case EOK:
return EOK;
return NULL;