krb5_child.c revision d3348f49260998880bb7cd3b2fb72d562b1b7a64
2N/A along with this program. If not, see <http://www.gnu.org/licenses/>.
2N/A#include "util/sss_krb5.h"
2N/A#include "util/user_info_msg.h"
2N/A#include "util/child_common.h"
2N/A#include "util/find_uid.h"
2N/A#include "src/util/util_errors.h"
2N/A#include "providers/krb5/krb5_auth.h"
2N/A#include "providers/krb5/krb5_utils.h"
2N/Aenum k5c_fast_opt {
2N/A bool password_prompting;
2N/A char *otp_vendor;
2N/A char *otp_token_id;
2N/A char *otp_challenge;
2N/A bool use_enterprise_princ;
2N/A char *fast_ccname;
2N/A char *old_ccname;
2N/A bool old_cc_valid;
2N/A bool old_cc_active;
2N/A char *lifetime_str;
2N/A int canonicalize = 0;
2N/A if (password_expiration == 0) {
2N/A case SSS_AUTHTOK_TYPE_2FA:
2N/A const char * const *question_list;
2N/A KRB5_RESPONDER_QUESTION_PASSWORD) == 0) {
2N/A if (num_prompts != 0) {
2N/A for (c = 0; c < num_prompts; c++) {
2N/A return KRB5_LIBOS_CANTREADPWD;
2N/A#ifdef HAVE_KRB5_CC_COLLECTION
2N/A bool switch_to_cc = false;
2N/A return ERR_INTERNAL;
2N/A#ifdef HAVE_KRB5_CC_COLLECTION
2N/A switch_to_cc = true;
2N/A#ifdef HAVE_KRB5_CC_COLLECTION
2N/A if (switch_to_cc) {
2N/A return ERR_INTERNAL;
2N/A bool realm_entry_found = false;
2N/A realm_entry_found = true;
2N/A if (!realm_entry_found) {
kerr = 0;
done:
return kerr;
char *ccname)
&options);
if (kerr != 0) {
return kerr;
if (kerr != 0) {
goto done;
kerr = 0;
done:
return kerr;
const char *password)
const char *realm_name;
int realm_length;
char *cc_name;
kr);
if (kerr != 0) {
if (realm_length == 0) {
return KRB5KRB_ERR_GENERIC;
kerr);
if (kerr != 0) {
return kerr;
if (kerr != 0) {
return kerr;
if (kerr != 0) {
goto done;
if (kerr) {
goto done;
if (kerr != 0) {
kerr = 0;
done:
return kerr;
if (kerr != 0) {
switch (kerr) {
return ERR_OK;
case KRB5_LIBOS_CANTREADPWD:
return ERR_NO_CREDS;
case KRB5_KDCREP_SKEW:
case KRB5KRB_AP_ERR_SKEW:
case KRB5KRB_AP_ERR_TKT_NYV:
case KRB5_KDC_UNREACH:
case KRB5_REALM_CANT_RESOLVE:
case KRB5_REALM_UNKNOWN:
return ERR_NETWORK_IO;
return ERR_ACCOUNT_LOCKED;
case KRB5KDC_ERR_NAME_EXP:
return ERR_ACCOUNT_EXPIRED;
case KRB5KDC_ERR_KEY_EXP:
return ERR_CREDS_EXPIRED;
return ERR_AUTH_FAILED;
case KRB5_PROG_ETYPE_NOSUPP:
case KRB5_PREAUTH_FAILED:
return ERR_CREDS_INVALID;
case KRB5KRB_ERR_GENERIC:
return ERR_INTERNAL;
int ret;
const char *realm_name;
int realm_length;
return ERR_NO_CREDS;
if (!prelim) {
if (realm_length == 0) {
return ERR_INTERNAL;
if (kerr != 0) {
msg);
return kerr;
if (prelim) {
return EOK;
return ERR_NO_CREDS;
return ERR_NETWORK_IO;
if (kerr != 0) {
return ERR_CHPASS_FAILED;
return ret;
if (kerr == 0) {
int ret;
switch (ret) {
case EOK:
case EACCES:
return ERR_INVALID_CRED_TYPE;
return ERR_NO_CREDS;
goto done;
if (kerr == 0) {
goto done;
if (kerr != 0) {
if (kerr == 0) {
done:
return ret;
if (kerr != 0) {
if (access_allowed) {
return EOK;
return ERR_AUTH_DENIED;
const char *ccname;
int ret;
return ERR_INVALID_CRED_TYPE;
if (kerr != 0) {
goto done;
if (kerr != 0) {
goto done;
if (kerr != 0) {
goto done;
if (kerr != 0) {
goto done;
if (kerr != 0) {
goto done;
if (kerr != 0) {
done:
if (kerr == 0) {
kerr = 0;
if (kerr == 0) {
return EINVAL;
switch (auth_token_type) {
case SSS_AUTHTOK_TYPE_EMPTY:
case SSS_AUTHTOK_TYPE_CCFILE:
case SSS_AUTHTOK_TYPE_2FA:
return EINVAL;
*p += auth_token_length;
return ret;
size_t p = 0;
return ENOMEM;
p += len;
p += len;
if (len > 0) {
p += len;
p += len;
if (ret) {
return ret;
if (ret) {
return ret;
p += len;
return EOK;
return EOK;
if (krberr != 0) {
goto done;
} else if (krberr != 0) {
krberr = 0;
goto done;
krberr = 0;
done:
return krberr;
const char *primary,
const char *realm,
const char *keytab_name,
char **fast_ccname)
char *ccname;
char *server_name;
int status;
return ENOMEM;
goto done;
if (kerr) {
goto done;
if (kerr != 0) {
goto done;
goto done;
if (kerr != 0) {
goto done;
if (kerr == 0) {
goto done;
switch (fchild_pid) {
goto done;
if (kerr != 0) {
if (kerr != 0) {
exit(0);
errno = 0;
if (kerr > 0) {
if (kerr != 0) {
if (kerr != 0) {
goto done;
goto done;
done:
if (kerr == 0) {
return kerr;
errno = 0;
return ret;
return ret;
char *fast_principal_realm;
char *fast_principal;
char *tmp_str;
char *new_ccname;
if (tmp_str) {
if (kerr) {
return kerr;
&tmp_str);
if (kerr) {
return kerr;
if (!fast_principal) {
return KRB5KRB_ERR_GENERIC;
if (!fast_principal_realm) {
return ENOMEM;
if (kerr != 0) {
return kerr;
if (kerr != 0) {
return kerr;
if (kerr != 0) {
return kerr;
if (demand) {
if (kerr != 0) {
return kerr;
return EOK;
char *use_fast_str;
return EINVAL;
return EOK;
bool valid;
valid = false;
switch (ret) {
case ERR_NOT_FOUND:
case ENOENT:
case EINVAL:
case EOK:
valid = true;
return ret;
return EOK;
return ret;
return ret;
return EOK;
return ret;
return EOK;
return EOK;
if (ret != 0) {
if (ret != 0) {
return ret;
return EOK;
int parse_flags;
if (kerr != 0) {
return kerr;
if (kerr != 0) {
return EIO;
* missing in krb5.conf or to allow SSSD to work with multiple unconnected
if (kerr != 0) {
if (kerr != 0) {
return kerr;
if (kerr != 0) {
return kerr;
return ENOMEM;
if (kerr != 0) {
return kerr;
if (kerr != 0) {
return kerr;
if (!offline) {
return kerr;
int ret;
char *mem_keytab;
if (kerr != 0) {
return kerr;
if (kerr != 0) {
return kerr;
return ret;;
return ret;
if (!(offline ||
NULL);
if (kerr != 0) {
return kerr;
return kerr;
static void try_open_krb5_conf(void)
int fd;
int ret;
int opt;
&debug_to_stderr, 0,
switch(opt) {
if (!debug_prg_name) {
goto done;
goto done;
goto done;
if (kerr != 0) {
goto done;
if (kerr != 0) {
goto done;
goto done;
case SSS_PAM_AUTHENTICATE:
if (offline) {
case SSS_PAM_CHAUTHTOK:
case SSS_PAM_CHAUTHTOK_PRELIM:
case SSS_PAM_ACCT_MGMT:
case SSS_CMD_RENEW:
if (offline) {
goto done;
case SSS_PAM_PREAUTH:
goto done;
done:
ret = 0;