providers.c revision 8f2a34cc6964a1f80a1434e05315a7ae0bb5774e
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce/*
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce SSSD
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce Secrets Responder
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce Copyright (C) Simo Sorce <ssorce@redhat.com> 2016
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce This program is free software; you can redistribute it and/or modify
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce it under the terms of the GNU General Public License as published by
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce the Free Software Foundation; either version 3 of the License, or
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce (at your option) any later version.
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce This program is distributed in the hope that it will be useful,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce but WITHOUT ANY WARRANTY; without even the implied warranty of
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce GNU General Public License for more details.
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce You should have received a copy of the GNU General Public License
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce along with this program. If not, see <http://www.gnu.org/licenses/>.
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce*/
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce#include "responder/secrets/secsrv_private.h"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce#include "responder/secrets/secsrv_local.h"
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce#include "responder/secrets/secsrv_proxy.h"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce#include <jansson.h>
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorceint sec_map_url_to_user_path(struct sec_req_ctx *secreq, char **mapped_path)
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce{
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce uid_t c_euid;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce c_euid = client_euid(secreq->cctx->creds);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce /* change path to be user specific */
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce *mapped_path =
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce talloc_asprintf(secreq, SEC_BASEPATH"users/%"SPRIuid"/%s",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce c_euid,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce &secreq->parsed_url.path[sizeof(SEC_BASEPATH) - 1]);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!*mapped_path) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "Failed to map request to user specific url\n");
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return EOK;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce}
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorceint sec_req_routing(TALLOC_CTX *mem_ctx, struct sec_req_ctx *secreq,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce struct provider_handle **handle)
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce{
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce struct sec_ctx *sctx;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char **sections;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char *def_provider;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char *provider;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce int num_sections;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce int ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce sctx = talloc_get_type(secreq->cctx->rctx->pvt_ctx, struct sec_ctx);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce /* patch must start with /secrets/ for now */
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = strncasecmp(secreq->parsed_url.path,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce SEC_BASEPATH, sizeof(SEC_BASEPATH) - 1);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (ret != 0) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "Path [%s] does not start with "SEC_BASEPATH"\n",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce secreq->parsed_url.path);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return EPERM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = sec_map_url_to_user_path(secreq, &secreq->mapped_path);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (ret) return ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce /* source default provider */
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = confdb_get_string(secreq->cctx->rctx->cdb, mem_ctx,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce CONFDB_SEC_CONF_ENTRY, "provider", "LOCAL",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce &def_provider);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (ret) return EIO;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = confdb_get_sub_sections(mem_ctx, secreq->cctx->rctx->cdb,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce CONFDB_SEC_CONF_ENTRY, &sections,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce &num_sections);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (ret != EOK) return ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce provider = def_provider;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce // TODO order by length ?
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce for (int i = 0; i < num_sections; i++) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce int slen;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce secreq->base_path = talloc_asprintf(secreq, SEC_BASEPATH"%s/", sections[i]);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (!secreq->base_path) return ENOMEM;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce slen = strlen(secreq->base_path);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (strncmp(secreq->base_path, secreq->mapped_path, slen) == 0) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char *secname;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce secname = talloc_asprintf(mem_ctx, CONFDB_SEC_CONF_ENTRY"/%s",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce sections[i]);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!secname) return ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce provider = NULL;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = confdb_get_string(secreq->cctx->rctx->cdb, mem_ctx,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce secname, "provider", def_provider,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce &provider);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (ret || !provider) return EIO;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce secreq->cfg_section = talloc_steal(secreq, secname);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (!secreq->cfg_section) return ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce break;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce talloc_zfree(secreq->base_path);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (!secreq->base_path) secreq->base_path = SEC_BASEPATH;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce ret = sec_get_provider(sctx, provider, handle);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (ret == ENOENT) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (strcasecmp(provider, "LOCAL") == 0) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce ret = local_secrets_provider_handle(sctx, handle);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce } else if (strcasecmp(provider, "PROXY") == 0) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce ret = proxy_secrets_provider_handle(sctx, handle);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce } else {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce DEBUG(SSSDBG_FATAL_FAILURE,
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce "Unknown provider type: %s\n", provider);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce ret = EIO;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce }
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (ret == EOK) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce ret = sec_add_provider(sctx, *handle);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce return ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce}
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorceint sec_provider_recv(struct tevent_req *req) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce TEVENT_REQ_RETURN_ON_ERROR(req);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return EOK;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce}
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorcestatic struct sec_http_status_format_table {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce int status;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce const char *text;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce const char *description;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce} sec_http_status_format_table[] = {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce { 200, "OK", "Success" },
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce { 400, "Bad Request",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "The request format is invalid." },
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce { 401, "Unauthorized",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "Access to the requested resource requires authentication." },
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce { 403, "Forbidden",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "Access to the requested resource is forbidden." },
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce { 404, "Not Found",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "The requested resource was not found." },
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce { 405, "Method Not Allowed",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "Request method not allowed for this resource." },
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce { 406, "Not Acceptable",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "The request cannot be accepted." },
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce { 409, "Conflict",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "The requested resource already exists." },
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce { 500, "Internal Server Error",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "The server encountered an internal error." },
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce};
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorceint sec_http_status_reply(TALLOC_CTX *mem_ctx, struct sec_data *reply,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce enum sec_http_status_codes code)
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce{
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char *body = talloc_asprintf(mem_ctx,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "<html>\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "<head>\r\n<title>%d %s</title></head>\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "<body>\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "<h1>%s</h1>\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "<p>%s</p>\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "</body>",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce sec_http_status_format_table[code].status,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce sec_http_status_format_table[code].text,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce sec_http_status_format_table[code].text,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce sec_http_status_format_table[code].description);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!body) return ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce reply->data = talloc_asprintf(mem_ctx,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "HTTP/1.1 %d %s\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "Content-Length: %u\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "Content-Type: text/html\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "%s",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce sec_http_status_format_table[code].status,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce sec_http_status_format_table[code].text,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce (unsigned)strlen(body), body);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce talloc_free(body);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!reply->data) return ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce reply->length = strlen(reply->data);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return EOK;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce}
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorceint sec_http_reply_with_body(TALLOC_CTX *mem_ctx, struct sec_data *reply,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce enum sec_http_status_codes code,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce const char *content_type,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce struct sec_data *body)
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce{
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce int head_size;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce reply->data = talloc_asprintf(mem_ctx,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "HTTP/1.1 %d %s\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "Content-Type: %s\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "Content-Length: %lu\r\n"
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "\r\n",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce sec_http_status_format_table[code].status,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce sec_http_status_format_table[code].text,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce content_type, body->length);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!reply->data) return ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce head_size = strlen(reply->data);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce reply->data = talloc_realloc(mem_ctx, reply->data, char,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce head_size + body->length);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!reply->data) return ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce memcpy(&reply->data[head_size], body->data, body->length);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce reply->length = head_size + body->length;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return EOK;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce}
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorceint sec_http_append_header(TALLOC_CTX *mem_ctx, char **dest,
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce char *field, char *value)
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce{
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (*dest == NULL) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce *dest = talloc_asprintf(mem_ctx, "%s: %s\r\n", field, value);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce } else {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce *dest = talloc_asprintf_append_buffer(*dest, "%s: %s\r\n",
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce field, value);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce }
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (!*dest) return ENOMEM;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce return EOK;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce}
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorceint sec_http_reply_with_headers(TALLOC_CTX *mem_ctx, struct sec_data *reply,
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce int status_code, const char *reason,
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce struct sec_kvp *headers, int num_headers,
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce struct sec_data *body)
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce{
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce const char *reason_phrase = reason ? reason : "";
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce int ret;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce /* Status-Line */
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce reply->data = talloc_asprintf(mem_ctx, "HTTP/1.1 %d %s\r\n",
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce status_code, reason_phrase);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (!reply->data) return ENOMEM;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce /* Headers */
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce for (int i = 0; i < num_headers; i++) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce ret = sec_http_append_header(mem_ctx, &reply->data,
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce headers[i].name, headers[i].value);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (ret) return ret;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce }
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce /* CRLF separator before body */
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce reply->data = talloc_strdup_append_buffer(reply->data, "\r\n");
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce reply->length = strlen(reply->data);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce /* Message-Body */
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (body && body->length) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce reply->data = talloc_realloc(mem_ctx, reply->data, char,
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce reply->length + body->length);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (!reply->data) return ENOMEM;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce memcpy(&reply->data[reply->length], body->data, body->length);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce reply->length += body->length;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce }
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce return EOK;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce}
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorceenum sec_http_status_codes sec_errno_to_http_status(errno_t err)
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce{
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce switch (err) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce case EOK:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return STATUS_200;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce case EINVAL:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return STATUS_400;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce case EACCES:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return STATUS_401;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce case EPERM:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return STATUS_403;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce case ENOENT:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return STATUS_404;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce case EISDIR:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return STATUS_405;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce case EMEDIUMTYPE:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return STATUS_406;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce case EEXIST:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return STATUS_409;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce default:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return STATUS_500;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce}
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorceint sec_json_to_simple_secret(TALLOC_CTX *mem_ctx,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce const char *input,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char **secret)
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce{
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce json_t *root;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce json_t *element;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce json_error_t error;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce int ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce root = json_loads(input, 0, &error);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!root) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce "Failed to parse JSON payload on line %d: %s\n",
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce error.line, error.text);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return EINVAL;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!json_is_object(root)) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE, "Json data is not an object.\n");
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = EINVAL;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce element = json_object_get(root, "type");
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!element) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE, "Json data key 'type' not found.\n");
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = EINVAL;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!json_is_string(element)) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE, "Json object 'type' is not a string.\n");
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = EINVAL;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (strcmp(json_string_value(element), "simple") != 0) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE, "Token type is not 'simple'.\n");
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = EMEDIUMTYPE;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce element = json_object_get(root, "value");
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!element) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE, "Json key 'value' not found.\n");
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = EINVAL;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!json_is_string(element)) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce DEBUG(SSSDBG_CRIT_FAILURE, "Json object 'value' is not a string.\n");
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = EINVAL;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce *secret = talloc_strdup(mem_ctx, json_string_value(element));
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!*secret) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce } else {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = EOK;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorcedone:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce json_decref(root);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce}
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorceint sec_simple_secret_to_json(TALLOC_CTX *mem_ctx,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce const char *secret,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char **output)
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce{
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char *jsonized = NULL;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce json_t *root;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce int ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce root = json_pack("{s:s, s:s}", "type", "simple", "value", secret);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!root) return ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce jsonized = json_dumps(root, JSON_INDENT(4));
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!jsonized) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce *output = talloc_strdup(mem_ctx, jsonized);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!*output) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = EOK;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorcedone:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce json_decref(root);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce free(jsonized);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce}
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorceint sec_array_to_json(TALLOC_CTX *mem_ctx,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char **array, int count,
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char **output)
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce{
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce char *jsonized = NULL;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce json_t *root;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce int ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce root = json_array();
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce for (int i = 0; i < count; i++) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce // FIXME: json_string mem leak ?
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce // FIXME: Error checking
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce json_array_append_new(root, json_string(array[i]));
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce jsonized = json_dumps(root, JSON_INDENT(4));
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!jsonized) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce *output = talloc_strdup(mem_ctx, jsonized);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce if (!*output) {
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = ENOMEM;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce goto done;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce }
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce ret = EOK;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorcedone:
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce json_decref(root);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce free(jsonized);
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce return ret;
1dd679584241a0f9b29072c7eed1c5c5e4a577e4Simo Sorce}
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorceint sec_get_provider(struct sec_ctx *sctx, const char *name,
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce struct provider_handle **out_handle)
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce{
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce struct provider_handle *handle;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce for (int i = 0; sctx->providers && sctx->providers[i]; i++) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce handle = sctx->providers[i];
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (strcasecmp(handle->name, name) != 0) {
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce continue;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce }
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce *out_handle = handle;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce return EOK;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce }
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce return ENOENT;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce}
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorceint sec_add_provider(struct sec_ctx *sctx, struct provider_handle *handle)
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce{
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce int c;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce for (c = 0; sctx->providers && sctx->providers[c]; c++)
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce continue;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce sctx->providers = talloc_realloc(sctx, sctx->providers,
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce struct provider_handle *, c + 2);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce if (!sctx->providers) return ENOMEM;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce sctx->providers[c] = talloc_steal(sctx, handle);
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce sctx->providers[c + 1] = NULL;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce return EOK;
8f2a34cc6964a1f80a1434e05315a7ae0bb5774eSimo Sorce}