pamsrv_cmd.c revision e039f1aefecc65a7b3c2d4a13a612bff1dd367c8
29d4c6eac14a0b3d79656eb6b206a102fd09d24aTimo Sirainen PAM Responder
29d4c6eac14a0b3d79656eb6b206a102fd09d24aTimo Sirainen Copyright (C) Simo Sorce <ssorce@redhat.com> 2009
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen Copyright (C) Sumit Bose <sbose@redhat.com> 2009
5cda7e699876c1de203c30777924c899d2a20221Timo Sirainen This program is free software; you can redistribute it and/or modify
419baa2c17c63ae516b2df6cc5695f15aaccbff8Timo Sirainen it under the terms of the GNU General Public License as published by
419baa2c17c63ae516b2df6cc5695f15aaccbff8Timo Sirainen the Free Software Foundation; either version 3 of the License, or
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen (at your option) any later version.
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen This program is distributed in the hope that it will be useful,
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen but WITHOUT ANY WARRANTY; without even the implied warranty of
8eefc42b2559db19d06d7ad7b8ad9d1cd2a09178Timo Sirainen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen GNU General Public License for more details.
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen You should have received a copy of the GNU General Public License
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen along with this program. If not, see <http://www.gnu.org/licenses/>.
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen#define DEFAULT_PAM_VERBOSITY PAM_VERBOSITY_IMPORTANT
29d4c6eac14a0b3d79656eb6b206a102fd09d24aTimo Sirainenstatic void pam_reply(struct pam_auth_req *preq);
c96a1bff0db10e7f7e1d50bc434c95bf1f071805Timo Sirainenstatic errno_t pack_user_info_account_expired(TALLOC_CTX *mem_ctx,
c96a1bff0db10e7f7e1d50bc434c95bf1f071805Timo Sirainen uint32_t resp_type = SSS_PAM_USER_INFO_ACCOUNT_EXPIRED;
c96a1bff0db10e7f7e1d50bc434c95bf1f071805Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "talloc_size failed.\n");
c96a1bff0db10e7f7e1d50bc434c95bf1f071805Timo Sirainen SAFEALIGN_SET_UINT32(&resp[p], resp_type, &p);
c96a1bff0db10e7f7e1d50bc434c95bf1f071805Timo Sirainen safealign_memcpy(&resp[p], user_error_message, err_len, &p);
c96a1bff0db10e7f7e1d50bc434c95bf1f071805Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, "Size mismatch\n");
d85f713cc9f9ddaa2b591169f79df70e764fbe05Timo Sirainenstatic void inform_account_expired(struct pam_data* pd,
657afb33796f8216c568ad813627da89970760beTimo Sirainen ret = pack_user_info_account_expired(pd, pam_message, &msg_len, &msg);
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen "pack_user_info_account_expired failed.\n");
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen ret = pam_add_response(pd, SSS_PAM_USER_INFO, msg_len, msg);
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "pam_add_response failed.\n");
419baa2c17c63ae516b2df6cc5695f15aaccbff8Timo Sirainenstatic bool is_domain_requested(struct pam_data *pd, const char *domain_name)
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen /* If none specific domains got requested via pam, all domains are allowed.
9261dbf0675204898c6557591c7aa376e23a52b2Timo Sirainen * Which mimics the default/original behaviour.
3281669db44d09a087a203201248abbc81b3cc1aTimo Sirainen if (strcasecmp(domain_name, pd->requested_domains[i])) {
d176f84ce5ca2073f4dfbafb457b9c74f6bf0d76Timo Sirainen return false;
657afb33796f8216c568ad813627da89970760beTimo Sirainenstatic int extract_authtok_v2(struct sss_auth_token *tok,
ab90f702ceedb7ba445a9a592be0b213b27cbafaStephan Bosch if (data_size < sizeof(uint32_t) || *c+data_size > blen ||
daa7e7459749ae8f82cd3eed9c44522d81c609a3Timo Sirainen SIZE_T_OVERFLOW(*c, data_size)) return EINVAL;
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen SAFEALIGN_COPY_UINT32_CHECK(&auth_token_type, &body[*c], blen, c);
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen auth_token_length = data_size - sizeof(uint32_t);
39dcbe101c4538ee25d8b196eab30e5f0faa22eeTimo Sirainen ret = sss_authtok_set_password(tok, (const char *)auth_token_data,
39dcbe101c4538ee25d8b196eab30e5f0faa22eeTimo Sirainenstatic int extract_string(char **var, size_t size, uint8_t *body, size_t blen,
39dcbe101c4538ee25d8b196eab30e5f0faa22eeTimo Sirainen if (*c+size > blen || SIZE_T_OVERFLOW(*c, size)) return EINVAL;
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen /* If the string isn't valid UTF-8, fail */
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainenstatic int extract_uint32_t(uint32_t *var, size_t size, uint8_t *body,
9ed2951bd0bb1878a27437d7c00611b2baadd614Timo Sirainen if (size != sizeof(uint32_t) || *c+size > blen || SIZE_T_OVERFLOW(*c, size))
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen SAFEALIGN_COPY_UINT32_CHECK(var, &body[*c], blen, c);
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainenstatic int pd_set_primary_name(const struct ldb_message *msg,struct pam_data *pd)
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "A user with no name?\n");
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen DEBUG(SSSDBG_TRACE_FUNC, "User's primary name is %s\n", name);
b8a6abfd2bc86118f54f59ee71005f634f45cdfcTimo Sirainenstatic int pam_parse_in_data_v2(struct pam_data *pd,
ee6df9526e9716b3f1734d85b566e00fc41208bcTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "Received data is invalid.\n");
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen SAFEALIGN_COPY_UINT32(&terminator, body + blen - sizeof(uint32_t), NULL);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "Received data is invalid.\n");
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen SAFEALIGN_COPY_UINT32_CHECK(&type, &body[c], blen, &c);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen SAFEALIGN_COPY_UINT32_CHECK(&size, &body[c], blen, &c);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen /* the uint32_t end maker SSS_END_OF_PAM_REQUEST does not count to
4240acc84d065472e5b21becd6481553fc38fe38Timo Sirainen * the remaining buffer */
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "Invalid data size.\n");
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen ret = extract_string(&pd->logon_name, size, body, blen, &c);
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen ret = extract_string(&pd->service, size, body, blen, &c);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen ret = extract_string(&pd->tty, size, body, blen, &c);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen ret = extract_string(&pd->ruser, size, body, blen, &c);
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen ret = extract_string(&pd->rhost, size, body, blen, &c);
3313a51ef9b245248d672c20f930c52a577a42f7Timo Sirainen ret = extract_string(&requested_domains, size, body, blen,
0f39a57760d93cddbce3ca43096d78e0fe2f42fdTimo Sirainen ret = split_on_separator(pd, requested_domains, ',', true,
548193b7d6c19a14eff810202cd334f364b75e36Timo Sirainen "Failed to parse requested_domains list!\n");
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen } while(c < blen);
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainenstatic int pam_parse_in_data_v3(struct pam_data *pd,
9398c0935613ba038cf2275ff66c43b25092cfd0Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "pam_parse_in_data_v2 failed.\n");
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "Missing client PID.\n");
bbdd683dd23641dca779bffdf22c089b57fe5066Timo Sirainenstatic int extract_authtok_v1(struct sss_auth_token *tok,
76830cda2eddcb36736bbb349dcbc2e9ca032483Timo Sirainen SAFEALIGN_COPY_UINT32_CHECK(&auth_token_type, &body[*c], blen, c);
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen SAFEALIGN_COPY_UINT32_CHECK(&auth_token_length, &body[*c], blen, c);
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen ret = sss_authtok_set_password(tok, (const char *)auth_token_data,
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainenstatic int pam_parse_in_data(struct pam_data *pd,
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen /* user name */
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen for (start = end; end < last; end++) if (body[end] == '\0') break;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen for (start = end; end < last; end++) if (body[end] == '\0') break;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen for (start = end; end < last; end++) if (body[end] == '\0') break;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen for (start = end; end < last; end++) if (body[end] == '\0') break;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen for (start = end; end < last; end++) if (body[end] == '\0') break;
91233a89f0060f95542ed661683e5d99a50f1778Timo Sirainen ret = extract_authtok_v1(pd->authtok, body, blen, &end);
86a58337862c546aa489f07e8e6d242f0180e4a0Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "Invalid auth token\n");
8eefc42b2559db19d06d7ad7b8ad9d1cd2a09178Timo Sirainen ret = extract_authtok_v1(pd->newauthtok, body, blen, &end);
8eefc42b2559db19d06d7ad7b8ad9d1cd2a09178Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "Invalid new auth token\n");
86a58337862c546aa489f07e8e6d242f0180e4a0Timo Sirainen/*=Save-Last-Login-State===================================================*/
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainenstatic errno_t set_last_login(struct pam_auth_req *preq)
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_ONLINE_AUTH, time(NULL));
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_LOGIN, time(NULL));
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen ret = sysdb_set_user_attr(preq->domain, preq->pd->user, attrs,
1862352e2ef8ed1ef824368d9c0c2c0fce89962eTimo Sirainen DEBUG(SSSDBG_OP_FAILURE, "set_last_login failed.\n");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic errno_t filter_responses(struct confdb_ctx *cdb,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen ret = confdb_get_int(cdb, CONFDB_PAM_CONF_ENTRY,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "Failed to read PAM verbosity, not fatal.\n");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "User info entry is too short.\n");
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen if (pam_verbosity == PAM_VERBOSITY_NO_MESSAGES) {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen memcpy(&user_info_type, resp->data, sizeof(uint32_t));
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen if (resp->len != sizeof(uint32_t) + sizeof(int64_t)) {
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "User info offline auth entry is "
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "too short.\n");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen memcpy(&expire_date, resp->data + sizeof(uint32_t),
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "User info type [%d] not filtered.\n",
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void pam_reply_delay(struct tevent_context *ev, struct tevent_timer *te,
5afc76d0215c5f7631dec06ef864d59f0686a0a8Timo Sirainen DEBUG(SSSDBG_CONF_SETTINGS, "pam_reply_delay get called.\n");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen preq = talloc_get_type(pvt, struct pam_auth_req);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic int pam_forwarder(struct cli_ctx *cctx, int pam_cmd);
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainenstatic void pam_handle_cached_login(struct pam_auth_req *preq, int ret,
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainenstatic void pam_reply(struct pam_auth_req *preq)
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen pctx = talloc_get_type(preq->cctx->rctx->pvt_ctx, struct pam_ctx);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "pam_reply called with result [%d].\n", pd->pam_status);
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen /* do auth with offline credentials */
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen "Fatal: Sysdb CTX not found for domain"
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen ret = sss_authtok_get_password(pd->authtok, &password, NULL);
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen DEBUG(SSSDBG_FATAL_FAILURE, "Failed to get password.\n");
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen pam_handle_cached_login(preq, ret, exp_date, delay_until);
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen "Password change not possible while offline.\n");
e9371f899a3d4207a0ffd3923ea5ec7250cf5e75Timo Sirainen user_info_type = SSS_PAM_USER_INFO_OFFLINE_CHPASS;
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen ret = pam_add_response(pd, SSS_PAM_USER_INFO, sizeof(uint32_t),
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "pam_add_response failed.\n");
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen/* TODO: we need the pam session cookie here to make sure that cached
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen * authentication was successful */
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk "Assuming offline authentication setting status for "
43d3ea2780b5f8557ede7b4c039e8f56cb8d357dTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "Unknown PAM call [%d].\n", pd->cmd);
39dcbe101c4538ee25d8b196eab30e5f0faa22eeTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "gettimeofday failed [%d][%s].\n",
3278289d240da169166de8aa785273c5df904e64Timo Sirainen te = tevent_add_timer(cctx->ev, cctx, tv, pam_reply_delay, preq);
3278289d240da169166de8aa785273c5df904e64Timo Sirainen "Failed to add event pam_reply_delay.\n");
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen /* If this was a successful login, save the lastLogin time */
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen NEED_CHECK_PROVIDER(preq->domain->provider)) {
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen ret = sss_packet_new(cctx->creq, 0, sss_packet_get_cmd(cctx->creq->in),
b0df0e9a8ed8889ad4bf032043ab245ce8851fdeTimo Sirainen if (pd->pam_status == PAM_ACCT_EXPIRED && pd->service != NULL &&
b0df0e9a8ed8889ad4bf032043ab245ce8851fdeTimo Sirainen ret = confdb_get_string(pctx->rctx->cdb, pd, CONFDB_PAM_CONF_ENTRY,
b0df0e9a8ed8889ad4bf032043ab245ce8851fdeTimo Sirainen inform_account_expired(pd, pam_account_expired_message);
b0df0e9a8ed8889ad4bf032043ab245ce8851fdeTimo Sirainen ret = filter_responses(pctx->rctx->cdb, pd->resp_list);
b0df0e9a8ed8889ad4bf032043ab245ce8851fdeTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "filter_responses failed, not fatal.\n");
19e8adccba16ff419f5675b1575358c2956dce83Timo Sirainen ret = pam_add_response(pd, SSS_PAM_DOMAIN_NAME, strlen(pd->domain)+1,
73bfdbe28c2ce6d143eadf0bab8ccfbe4cab0faeTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "pam_add_response failed.\n");
e5a776932f62d971766d55b6bcc42d2824fa05a3Timo Sirainen ret = sss_packet_grow(cctx->creq->out, sizeof(int32_t) +
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen sss_packet_get_body(cctx->creq->out, &body, &blen);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen memcpy(&body[p], &pd->pam_status, sizeof(int32_t));
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen p += sizeof(int32_t);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen p += sizeof(int32_t);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen memcpy(&body[p], &resp->type, sizeof(int32_t));
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen p += sizeof(int32_t);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen memcpy(&body[p], &resp->len, sizeof(int32_t));
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen p += sizeof(int32_t);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainenstatic void pam_handle_cached_login(struct pam_auth_req *preq, int ret,
6b46a500174ace25494b8f0547283eb60dc13756Timo Sirainen preq->pd->pam_status = cached_login_pam_status(ret);
86a58337862c546aa489f07e8e6d242f0180e4a0Timo Sirainen resp_len = sizeof(uint32_t) + sizeof(int64_t);
86a58337862c546aa489f07e8e6d242f0180e4a0Timo Sirainen "talloc_size failed, cannot prepare user info.\n");
e2a88d59c0d47d63ce1ad5b1fd95e487124a3fd4Timo Sirainen memcpy(resp+sizeof(uint32_t), &dummy, sizeof(int64_t));
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ret = pam_add_response(preq->pd, SSS_PAM_USER_INFO, resp_len,
6b46a500174ace25494b8f0547283eb60dc13756Timo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "pam_add_response failed.\n");
29d4c6eac14a0b3d79656eb6b206a102fd09d24aTimo Sirainen resp_type = SSS_PAM_USER_INFO_OFFLINE_AUTH_DELAYED;
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen resp_len = sizeof(uint32_t) + sizeof(int64_t);
c95b7ce6c3ebf84a9ef20320b9f11ef2129e1f1aTimo Sirainen "talloc_size failed, cannot prepare user info.\n");
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen memcpy(resp+sizeof(uint32_t), &dummy, sizeof(int64_t));
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainen ret = pam_add_response(preq->pd, SSS_PAM_USER_INFO, resp_len,
76213404317a7ed17bec0beadb5137c82785d816Timo Sirainen "pam_add_response failed.\n");
47b5ef748f34ca194419befab4f7450002f4e85dTimo Sirainen "cached login returned: %d\n", preq->pd->pam_status);
62d1665ff7842b61bc99be238ede3921ec08ccc5Timo Sirainenstatic void pam_forwarder_cb(struct tevent_req *req);
62d1665ff7842b61bc99be238ede3921ec08ccc5Timo Sirainenstatic void pam_check_user_dp_callback(uint16_t err_maj, uint32_t err_min,
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainenstatic int pam_check_user_search(struct pam_auth_req *preq);
62d1665ff7842b61bc99be238ede3921ec08ccc5Timo Sirainenstatic int pam_check_user_done(struct pam_auth_req *preq, int ret);
2a90d8a14b0e7cc1508814bc87d3dfa598ef46a8Timo Sirainenstatic void pam_dom_forwarder(struct pam_auth_req *preq);
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainen/* TODO: we should probably return some sort of cookie that is set in the
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainen * PAM_ENVIRONMENT, so that we can save performing some calls and cache
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainenstatic errno_t pam_forwarder_parse_data(struct cli_ctx *cctx, struct pam_data *pd)
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainen sss_packet_get_body(cctx->creq->in, &body, &blen);
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "Received data not terminated.\n");
ecb1b2d6236942bf82f822e8d0167f0e160b206dTimo Sirainen switch (cctx->cli_protocol_version->version) {
29d4c6eac14a0b3d79656eb6b206a102fd09d24aTimo Sirainen DEBUG(SSSDBG_CRIT_FAILURE, "Illegal protocol version [%d].\n",
goto done;
done:
return ret;
size_t i;
if (uid == 0) {
if (trusted_uids_count == 0) {
for(i = 0; i < trusted_uids_count; i++) {
char **public_dom_names,
size_t i;
for(i=0; i < public_dom_names_count; i++) {
int ret;
if (!preq) {
return ENOMEM;
return ENOMEM;
goto done;
goto done;
goto done;
goto done;
dom;
if (!dom) {
goto done;
goto done;
done:
struct pam_auth_req);
goto done;
goto done;
goto done;
goto done;
goto done;
done:
int ret;
while (dom) {
if (!dom) break;
if (!name) {
return ENOMEM;
return ENOMEM;
return EIO;
return EFAULT;
return ENOENT;
return EIO;
return ENOENT;
SYSDB_CACHE_EXPIRE, 0);
return ret;
return EOK;
if (!dom) {
if (!dpreq) {
return ENOMEM;
if(!cb_ctx) {
return ENOMEM;
return EAGAIN;
return ENOENT;
char *err_msg;
&err_msg);
switch (ret) {
case EOK:
case EAGAIN:
case ENOENT:
return EOK;
int ret;
char *name;
if (err_maj) {
if (!name) {
goto done;
done:
if (ret) {
int ret;
return pam_cli_protocol_version;
return sss_cmds;