#include "k5-int.h"
#include <krb5/localauth_plugin.h>
struct krb5_localauth_moddata_st {
int a;
int b;
};
static krb5_error_code
init_test(krb5_context context, krb5_localauth_moddata *data_out)
{
krb5_localauth_moddata d;
*data_out = NULL;
d = malloc(sizeof(*d));
if (d == NULL)
return ENOMEM;
d->a = 3;
d->b = 4;
*data_out = d;
return 0;
}
static void
fini_test(krb5_context context, krb5_localauth_moddata data)
{
assert(data->a == 3);
assert(data->b == 4);
free(data);
}
static krb5_error_code
an2ln_test(krb5_context context, krb5_localauth_moddata data, const char *type,
const char *residual, krb5_const_principal aname, char **lname_out)
{
krb5_error_code ret;
char *lname = NULL;
*lname_out = NULL;
if (data != NULL) {
assert(data->a == 3);
assert(data->b == 4);
}
if (type == NULL) {
if (aname->length == 3 && data_eq_string(aname->data[0], "test")) {
lname = k5memdup0(aname->realm.data, aname->realm.length, &ret);
if (lname == NULL)
return ret;
}
} else if (strcmp(type, "TYPEA") == 0) {
if (aname->length == 2) {
lname = k5memdup0(aname->data[1].data, aname->data[1].length,
&ret);
if (lname == NULL)
return ret;
}
} else {
assert(strcmp(type, "TYPEB") == 0);
lname = strdup(residual == NULL ? "(null)" : residual);
if (lname == NULL)
return ENOMEM;
}
if (lname == NULL)
return KRB5_LNAME_NOTRANS;
*lname_out = lname;
return 0;
}
static krb5_error_code
userok_test(krb5_context context, krb5_localauth_moddata data,
krb5_const_principal aname, const char *lname)
{
if (data != NULL) {
assert(data->a == 3);
assert(data->b == 4);
}
if ((size_t)aname->length == strlen(lname))
return 0;
if (aname->length >= 1 && data_eq_string(aname->data[0], "pass"))
return KRB5_PLUGIN_NO_HANDLE;
return EPERM;
}
static void
freestr(krb5_context context, krb5_localauth_moddata data, char *str)
{
free(str);
}
krb5_error_code
localauth_test1_initvt(krb5_context context, int maj_ver, int min_ver,
krb5_plugin_vtable vtable);
krb5_error_code
localauth_test2_initvt(krb5_context context, int maj_ver, int min_ver,
krb5_plugin_vtable vtable);
krb5_error_code
localauth_test1_initvt(krb5_context context, int maj_ver, int min_ver,
krb5_plugin_vtable vtable)
{
krb5_localauth_vtable vt = (krb5_localauth_vtable)vtable;
vt->init = init_test;
vt->fini = fini_test;
vt->name = "test1";
vt->an2ln = an2ln_test;
vt->userok = userok_test;
vt->free_string = freestr;
return 0;
}
krb5_error_code
localauth_test2_initvt(krb5_context context, int maj_ver, int min_ver,
krb5_plugin_vtable vtable)
{
krb5_localauth_vtable vt = (krb5_localauth_vtable)vtable;
static const char *types[] = { "TYPEA", "TYPEB", NULL };
vt->name = "test2";
vt->an2ln_types = types;
vt->an2ln = an2ln_test;
vt->free_string = freestr;
return 0;
}