From ea5f0b6e4d7e5cd4041a54adc1c034d5debe216c Mon Sep 17 00:00:00 2001 From: Pavel Reichl Date: Thu, 15 Oct 2015 23:46:58 +0200 Subject: [PATCH 04/12] PAM: refac. pam_reply: extract func. produce_packet --- src/responder/pam/pamsrv_cmd.c | 124 +++++++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 53 deletions(-) diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c index b30864c0b18e50644f5cd371693478afb9c82ead..91bc231e5d5a822cd814d16c93080ecae2680c2f 100644 --- a/src/responder/pam/pamsrv_cmd.c +++ b/src/responder/pam/pamsrv_cmd.c @@ -231,21 +231,82 @@ static errno_t get_password_for_cache_auth(struct sss_auth_token *authtok, return EOK; } -static int pam_forwarder(struct cli_ctx *cctx, int pam_cmd); -static void pam_handle_cached_login(struct pam_auth_req *preq, int ret, - time_t expire_date, time_t delayed_until, bool cached_auth); - -static void pam_reply(struct pam_auth_req *preq) +static errno_t produce_packet(TALLOC_CTX *mem_ctx, + struct pam_data *pd, + enum sss_cli_command cmd, + struct sss_packet **_out) { - struct cli_ctx *cctx; - struct cli_protocol *prctx; + errno_t ret; uint8_t *body; size_t blen; - int ret; int32_t resp_c; int32_t resp_size; struct response_data *resp; int p; + struct sss_packet *out; + + ret = sss_packet_new(mem_ctx, 0, cmd, &out); + if (ret != EOK) { + goto done; + } + + resp_c = 0; + resp_size = 0; + resp = pd->resp_list; + while(resp != NULL) { + if (!resp->do_not_send_to_client) { + resp_c++; + resp_size += resp->len; + } + resp = resp->next; + } + + ret = sss_packet_grow(out, sizeof(int32_t) + sizeof(int32_t) + + resp_c * 2 * sizeof(int32_t) + resp_size); + if (ret != EOK) { + goto done; + } + + sss_packet_get_body(out, &body, &blen); + DEBUG(SSSDBG_FUNC_DATA, "blen: %zu\n", blen); + p = 0; + + memcpy(&body[p], &pd->pam_status, sizeof(int32_t)); + p += sizeof(int32_t); + + memcpy(&body[p], &resp_c, sizeof(int32_t)); + p += sizeof(int32_t); + + resp = pd->resp_list; + while(resp != NULL) { + if (!resp->do_not_send_to_client) { + memcpy(&body[p], &resp->type, sizeof(int32_t)); + p += sizeof(int32_t); + memcpy(&body[p], &resp->len, sizeof(int32_t)); + p += sizeof(int32_t); + memcpy(&body[p], resp->data, resp->len); + p += resp->len; + } + + resp = resp->next; + } + + *_out = out; + ret = EOK; + +done: + return ret; +} + +static int pam_forwarder(struct cli_ctx *cctx, int pam_cmd); +static void pam_handle_cached_login(struct pam_auth_req *preq, int ret, + time_t expire_date, time_t delayed_until, bool cached_auth); + +static void pam_reply(struct pam_auth_req *preq) +{ + struct cli_ctx *cctx; + struct cli_protocol *prctx; + int ret; struct timeval tv; struct tevent_timer *te; struct pam_data *pd; @@ -391,12 +452,6 @@ static void pam_reply(struct pam_auth_req *preq) pamsrv_lock_warn(pd, pctx->warn_msgs.pam_account_locked_message); - ret = sss_packet_new(prctx->creq, 0, sss_packet_get_cmd(prctx->creq->in), - &prctx->creq->out); - if (ret != EOK) { - goto done; - } - ret = filter_responses(pctx->warn_msgs.pam_verbosity, pd->resp_list); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, "filter_responses failed, not fatal.\n"); @@ -411,49 +466,12 @@ static void pam_reply(struct pam_auth_req *preq) } } - resp_c = 0; - resp_size = 0; - resp = pd->resp_list; - while(resp != NULL) { - if (!resp->do_not_send_to_client) { - resp_c++; - resp_size += resp->len; - } - resp = resp->next; - } - - ret = sss_packet_grow(prctx->creq->out, sizeof(int32_t) + - sizeof(int32_t) + - resp_c * 2* sizeof(int32_t) + - resp_size); + ret = produce_packet(prctx->creq, pd, sss_packet_get_cmd(prctx->creq->in), + &prctx->creq->out); if (ret != EOK) { goto done; } - sss_packet_get_body(prctx->creq->out, &body, &blen); - DEBUG(SSSDBG_FUNC_DATA, "blen: %zu\n", blen); - p = 0; - - memcpy(&body[p], &pd->pam_status, sizeof(int32_t)); - p += sizeof(int32_t); - - memcpy(&body[p], &resp_c, sizeof(int32_t)); - p += sizeof(int32_t); - - resp = pd->resp_list; - while(resp != NULL) { - if (!resp->do_not_send_to_client) { - memcpy(&body[p], &resp->type, sizeof(int32_t)); - p += sizeof(int32_t); - memcpy(&body[p], &resp->len, sizeof(int32_t)); - p += sizeof(int32_t); - memcpy(&body[p], resp->data, resp->len); - p += resp->len; - } - - resp = resp->next; - } - done: sss_cmd_done(cctx, preq); } -- 2.7.4