auth->mech_modules = list;
}
-static bool auth_passdb_list_have_plain(struct auth *auth)
+static bool auth_passdb_list_have_verify_plain(struct auth *auth)
{
struct auth_passdb *passdb;
return FALSE;
}
-static bool auth_passdb_list_have_credentials(struct auth *auth)
+static bool auth_passdb_list_have_lookup_credentials(struct auth *auth)
{
struct auth_passdb *passdb;
return FALSE;
}
+static bool
+auth_mech_verify_passdb(struct auth *auth, struct mech_module_list *list)
+{
+ switch (list->module.passdb_need) {
+ case MECH_PASSDB_NEED_NOTHING:
+ break;
+ case MECH_PASSDB_NEED_VERIFY_PLAIN:
+ if (!auth_passdb_list_have_verify_plain(auth))
+ return FALSE;
+ break;
+ case MECH_PASSDB_NEED_VERIFY_RESPONSE:
+ case MECH_PASSDB_NEED_LOOKUP_CREDENTIALS:
+ if (!auth_passdb_list_have_lookup_credentials(auth))
+ return FALSE;
+ break;
+ case MECH_PASSDB_NEED_SET_CREDENTIALS:
+ if (!auth_passdb_list_have_lookup_credentials(auth))
+ return FALSE;
+ if (!auth_passdb_list_have_set_credentials(auth))
+ return FALSE;
+ break;
+ }
+ return TRUE;
+}
+
static void auth_mech_list_verify_passdb(struct auth *auth)
{
struct mech_module_list *list;
for (list = auth->mech_modules; list != NULL; list = list->next) {
- if (list->module.passdb_need_plain &&
- !auth_passdb_list_have_plain(auth))
- break;
- if (list->module.passdb_need_credentials &&
- !auth_passdb_list_have_credentials(auth))
+ if (!auth_mech_verify_passdb(auth, list))
break;
- if (list->module.passdb_need_set_credentials &&
- !auth_passdb_list_have_set_credentials(auth))
- break;
}
if (list != NULL) {
"ANONYMOUS",
MEMBER(flags) MECH_SEC_ANONYMOUS,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) FALSE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_NOTHING,
mech_anonymous_auth_new,
mech_generic_auth_initial,
"APOP",
MEMBER(flags) MECH_SEC_PRIVATE | MECH_SEC_DICTIONARY | MECH_SEC_ACTIVE,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) TRUE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_VERIFY_RESPONSE,
mech_apop_auth_new,
mech_apop_auth_initial,
"CRAM-MD5",
MEMBER(flags) MECH_SEC_DICTIONARY | MECH_SEC_ACTIVE,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) TRUE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_VERIFY_RESPONSE,
mech_cram_md5_auth_new,
mech_cram_md5_auth_initial,
MEMBER(flags) MECH_SEC_DICTIONARY | MECH_SEC_ACTIVE |
MECH_SEC_MUTUAL_AUTH,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) TRUE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_LOOKUP_CREDENTIALS,
mech_digest_md5_auth_new,
mech_digest_md5_auth_initial,
"GSSAPI",
MEMBER(flags) 0,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) FALSE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_NOTHING,
mech_gssapi_auth_new,
mech_gssapi_auth_initial,
"GSS-SPNEGO",
MEMBER(flags) 0,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) FALSE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_NOTHING,
mech_gssapi_auth_new,
mech_gssapi_auth_initial,
"LOGIN",
MEMBER(flags) MECH_SEC_PLAINTEXT,
-
- MEMBER(passdb_need_plain) TRUE,
- MEMBER(passdb_need_credentials) FALSE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_VERIFY_PLAIN,
mech_login_auth_new,
mech_login_auth_initial,
"NTLM",
MEMBER(flags) MECH_SEC_DICTIONARY | MECH_SEC_ACTIVE,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) TRUE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_LOOKUP_CREDENTIALS,
mech_ntlm_auth_new,
mech_generic_auth_initial,
"OTP",
MEMBER(flags) MECH_SEC_DICTIONARY | MECH_SEC_ACTIVE,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) TRUE,
- MEMBER(passdb_need_set_credentials) TRUE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_SET_CREDENTIALS,
mech_otp_auth_new,
mech_generic_auth_initial,
"PLAIN",
MEMBER(flags) MECH_SEC_PLAINTEXT,
-
- MEMBER(passdb_need_plain) TRUE,
- MEMBER(passdb_need_credentials) FALSE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_VERIFY_PLAIN,
mech_plain_auth_new,
mech_generic_auth_initial,
MEMBER(flags) MECH_SEC_DICTIONARY | MECH_SEC_ACTIVE |
MECH_SEC_MUTUAL_AUTH,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) TRUE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_LOOKUP_CREDENTIALS,
mech_rpa_auth_new,
mech_generic_auth_initial,
"SKEY",
MEMBER(flags) MECH_SEC_DICTIONARY | MECH_SEC_ACTIVE,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) TRUE,
- MEMBER(passdb_need_set_credentials) TRUE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_SET_CREDENTIALS,
mech_skey_auth_new,
mech_generic_auth_initial,
"NTLM",
MEMBER(flags) MECH_SEC_DICTIONARY | MECH_SEC_ACTIVE,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) FALSE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_NOTHING,
mech_winbind_ntlm_auth_new,
mech_generic_auth_initial,
"GSS-SPNEGO",
MEMBER(flags) 0,
-
- MEMBER(passdb_need_plain) FALSE,
- MEMBER(passdb_need_credentials) FALSE,
- MEMBER(passdb_need_set_credentials) FALSE,
+ MEMBER(passdb_need) MECH_PASSDB_NEED_NOTHING,
mech_winbind_spnego_auth_new,
mech_generic_auth_initial,
/* Used only for string sanitization. */
#define MAX_MECH_NAME_LEN 64
+enum mech_passdb_need {
+ /* Mechanism doesn't need a passdb at all */
+ MECH_PASSDB_NEED_NOTHING = 0,
+ /* Mechanism just needs to verify a given plaintext password */
+ MECH_PASSDB_NEED_VERIFY_PLAIN,
+ /* Mechanism needs to verify a given challenge+response combination,
+ i.e. there is only a single response from client.
+ (Currently implemented the same as _LOOKUP_CREDENTIALS) */
+ MECH_PASSDB_NEED_VERIFY_RESPONSE,
+ /* Mechanism needs to look up credentials with appropriate scheme */
+ MECH_PASSDB_NEED_LOOKUP_CREDENTIALS,
+ /* Mechanism needs to look up credentials and also modify them */
+ MECH_PASSDB_NEED_SET_CREDENTIALS
+};
+
struct mech_module {
const char *mech_name;
- enum mech_security_flags flags;
- unsigned int passdb_need_plain:1;
- unsigned int passdb_need_credentials:1;
- unsigned int passdb_need_set_credentials:1;
+ enum mech_security_flags flags;
+ enum mech_passdb_need passdb_need;
struct auth_request *(*auth_new)(void);
void (*auth_initial)(struct auth_request *request,