From e73f7643ad6fc4ab23fc9e67a4c782779a3c150c Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Fri, 16 Oct 2015 12:10:54 +0200 Subject: [PATCH 05/11] PAM: Move the function to produce reply packet to pamsrv_reply.c The mocked PAM responder in pam_sss tests needs to be able to respond with packets to the client. This patch moves the required functions to the pamsrv_reply.c module. --- src/responder/pam/pamsrv.h | 5 +++ src/responder/pam/pamsrv_cmd.c | 71 ++-------------------------------------- src/responder/pam/pamsrv_reply.c | 67 +++++++++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 69 deletions(-) diff --git a/src/responder/pam/pamsrv.h b/src/responder/pam/pamsrv.h index 753b30a0112a8ab3adccf7ede6fc857b95cc5ccd..2f47e8dfe797104d9d453eea9b9db26176af01b9 100644 --- a/src/responder/pam/pamsrv.h +++ b/src/responder/pam/pamsrv.h @@ -130,4 +130,9 @@ void pamsrv_exp_warn(struct pam_data *pd, void pamsrv_lock_warn(struct pam_data *pd, const char *pam_account_locked_message); +errno_t pamsrv_reply_packet(TALLOC_CTX *mem_ctx, + struct pam_data *pd, + enum sss_cli_command cmd, + struct sss_packet **_out); + #endif /* __PAMSRV_H__ */ diff --git a/src/responder/pam/pamsrv_cmd.c b/src/responder/pam/pamsrv_cmd.c index 11254af48da8754894e02036852baebc8237b826..311dfe1e0d91008c4667233e2baf5d6f68ab15f3 100644 --- a/src/responder/pam/pamsrv_cmd.c +++ b/src/responder/pam/pamsrv_cmd.c @@ -231,73 +231,6 @@ static errno_t get_password_for_cache_auth(struct sss_auth_token *authtok, return EOK; } -static errno_t produce_packet(TALLOC_CTX *mem_ctx, - struct pam_data *pd, - enum sss_cli_command cmd, - struct sss_packet **_out) -{ - errno_t ret; - uint8_t *body; - size_t blen; - 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); @@ -464,8 +397,8 @@ static void pam_reply(struct pam_auth_req *preq) } } - ret = produce_packet(cctx->creq, pd, sss_packet_get_cmd(cctx->creq->in), - &cctx->creq->out); + ret = pamsrv_reply_packet(cctx->creq, pd, sss_packet_get_cmd(cctx->creq->in), + &cctx->creq->out); if (ret != EOK) { goto done; } diff --git a/src/responder/pam/pamsrv_reply.c b/src/responder/pam/pamsrv_reply.c index 829b1b35aa7e095e727d20e961a541d1f215f477..73fe66a936af395e27af2feaf82607755c79ba22 100644 --- a/src/responder/pam/pamsrv_reply.c +++ b/src/responder/pam/pamsrv_reply.c @@ -91,3 +91,70 @@ void pamsrv_lock_warn(struct pam_data *pd, inform_user(pd, pam_account_locked_message); } } + +errno_t pamsrv_reply_packet(TALLOC_CTX *mem_ctx, + struct pam_data *pd, + enum sss_cli_command cmd, + struct sss_packet **_out) +{ + errno_t ret; + uint8_t *body; + size_t blen; + 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; +} -- 2.4.11