/*
* Dolda Connect - Modular multiuser Direct Connect-style client
- * Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com)
+ * Copyright (C) 2004 Fredrik Tolf <fredrik@dolda2000.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
-#include <ucontext.h>
-#include <security/pam_appl.h>
#include <errno.h>
#ifdef HAVE_CONFIG_H
#include "utils.h"
#include "conf.h"
#include "log.h"
+#include "module.h"
+
+#ifdef HAVE_PAM
+#include <ucontext.h>
+#include <security/pam_appl.h>
struct pamdata
{
}
if(data->converr)
{
- for(; i < nmsg; i++)
- {
- (*resp)[i].resp = sstrdup("");
- (*resp)[i].resp_retcode = PAM_SUCCESS;
- }
+ for(i--; i >= 0; i--)
+ free((*resp)[i].resp);
+ free(*resp);
+ *resp = NULL;
return(PAM_CONV_ERR);
}
+ (*resp)[i].resp_retcode = PAM_SUCCESS;
switch(msg[i]->msg_style)
{
case PAM_PROMPT_ECHO_OFF:
case PAM_PROMPT_ECHO_ON:
(*resp)[i].resp = sstrdup((char *)data->passdata);
memset((void *)data->passdata, 0, strlen((char *)data->passdata));
- (*resp)[i].resp_retcode = PAM_SUCCESS;
+ break;
+ default:
+ (*resp)[i].resp = NULL;
break;
}
}
data = newpamdata();
conv.conv = (int (*)(int, const struct pam_message **, struct pam_response **, void *))pamconv;
conv.appdata_ptr = auth;
- if((buf = icwcstombs(confgetstr("auth", "pamserv"), NULL)) == NULL)
+ if((buf = icwcstombs(confgetstr("auth-pam", "pamserv"), NULL)) == NULL)
{
- flog(LOG_ERR, "could not initialize pam since auth.pamserv cannot be translated into the current locale: %s", strerror(errno));
+ flog(LOG_ERR, "could not initialize pam since auth-pam.pamserv cannot be translated into the current locale: %s", strerror(errno));
releasepam(data);
return(1);
}
data->validctxt = 0;
}
-static int pamauth(struct authhandle *auth, char *passdata)
+static int pamauth(struct authhandle *auth, struct socket *sk, char *passdata)
{
struct pamdata *data;
return(rc);
}
-struct authmech authmech_pam =
+static struct authmech authmech_pam =
{
.inithandle = inithandle,
.release = release,
.name = L"pam",
.enabled = 1
};
+
+static int init(int hup)
+{
+ if(!hup)
+ regmech(&authmech_pam);
+ return(0);
+}
+
+static struct configvar myvars[] =
+{
+ /** The name of the PAM service file to use. */
+ {CONF_VAR_STRING, "pamserv", {.str = L"doldacond"}},
+ {CONF_VAR_END}
+};
+
+static struct module me =
+{
+ .conf =
+ {
+ .vars = myvars
+ },
+ .init = init,
+ .name = "auth-pam"
+};
+
+MODULE(me);
+
+#endif /* HAVE_PAM */