pamsrv_cmd.c revision 6e24ec9a44cd78cfc6aedc2eff6bfa5e82202411
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa PAM Responder
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa Copyright (C) Simo Sorce <ssorce@redhat.com> 2009
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa Copyright (C) Sumit Bose <sbose@redhat.com> 2009
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa This program is free software; you can redistribute it and/or modify
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa it under the terms of the GNU General Public License as published by
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa the Free Software Foundation; either version 3 of the License, or
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa (at your option) any later version.
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa This program is distributed in the hope that it will be useful,
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa but WITHOUT ANY WARRANTY; without even the implied warranty of
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa GNU General Public License for more details.
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa You should have received a copy of the GNU General Public License
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa along with this program. If not, see <http://www.gnu.org/licenses/>.
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa#define DEFAULT_PAM_VERBOSITY PAM_VERBOSITY_IMPORTANT
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksastatic void pam_reply(struct pam_auth_req *preq);
78c1cf25949b565eefa81e71c241c4aafd17b7f2Eugen Kuksastatic int extract_authtok(uint32_t *type, uint32_t *size, uint8_t **tok,
78c1cf25949b565eefa81e71c241c4aafd17b7f2Eugen Kuksa if (data_size < sizeof(uint32_t) || *c+data_size > blen ||
78c1cf25949b565eefa81e71c241c4aafd17b7f2Eugen Kuksa SAFEALIGN_COPY_UINT32_CHECK(type, &body[*c], blen, c);
78c1cf25949b565eefa81e71c241c4aafd17b7f2Eugen Kuksastatic int extract_string(char **var, size_t size, uint8_t *body, size_t blen,
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa if (*c+size > blen || SIZE_T_OVERFLOW(*c, size)) return EINVAL;
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa /* If the string isn't valid UTF-8, fail */
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksastatic int extract_uint32_t(uint32_t *var, size_t size, uint8_t *body,
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa if (size != sizeof(uint32_t) || *c+size > blen || SIZE_T_OVERFLOW(*c, size))
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa SAFEALIGN_COPY_UINT32_CHECK(var, &body[*c], blen, c);
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksastatic int pd_set_primary_name(const struct ldb_message *msg,struct pam_data *pd)
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa const char *name;
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
e3aacba5227cf71454ef8b00910650c3dbb9927dEugen Kuksa DEBUG(SSSDBG_CRIT_FAILURE, ("A user with no name?\n"));
return EOK;
size_t c;
char *pam_user;
int ret;
return EINVAL;
c = sizeof(uint32_t);
return EINVAL;
switch(type) {
case SSS_PAM_ITEM_USER:
case SSS_PAM_ITEM_SERVICE:
case SSS_PAM_ITEM_TTY:
case SSS_PAM_ITEM_RUSER:
case SSS_PAM_ITEM_RHOST:
case SSS_PAM_ITEM_CLI_PID:
case SSS_PAM_ITEM_AUTHTOK:
case SSS_PAM_ITEM_NEWAUTHTOK:
c += size;
} while(c < blen);
return EOK;
int ret;
return ret;
return EINVAL;
return EOK;
int start;
int end;
int last;
int ret;
end = 0;
return EINVAL;
return EINVAL;
return EOK;
if (!attrs) {
goto fail;
goto fail;
goto fail;
&dbctx);
goto fail;
goto fail;
return EOK;
fail:
return ret;
int ret;
int pam_verbosity;
return ENOMEM;
return EINVAL;
switch (user_info_type) {
return EINVAL;
sizeof(int64_t));
if ((expire_date == 0 &&
(expire_date > 0 &&
return EINVAL;
sizeof(uint32_t));
return EOK;
int ret;
case SSS_PAM_AUTHENTICATE:
goto done;
case SSS_PAM_CHAUTHTOK_PRELIM:
case SSS_PAM_CHAUTHTOK:
goto done;
case SSS_PAM_SETCRED:
case SSS_PAM_ACCT_MGMT:
case SSS_PAM_OPEN_SESSION:
case SSS_PAM_CLOSE_SESSION:
goto done;
goto done;
goto done;
goto done;
goto done;
resp_c = 0;
resp_size = 0;
resp_c++;
sizeof(int32_t) +
goto done;
p += sizeof(int32_t);
p += sizeof(int32_t);
p += sizeof(int32_t);
p += sizeof(int32_t);
done:
switch (ret) {
case EOK:
case ENOENT:
case EINVAL:
case EACCES:
if (delayed_until >= 0) {
int ret;
if (!preq) {
return ENOMEM;
return ENOMEM;
goto done;
goto done;
goto done;
if (!dom) {
goto done;
goto done;
done:
int ret;
while (dom) {
if (!dom) break;
if (!name) {
return ENOMEM;
return EIO;
return EFAULT;
return EIO;
return ENOENT;
return ENOENT;
SYSDB_CACHE_EXPIRE, 0);
return ret;
return EOK;
if (!dom) {
name, 0);
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;