1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
|
/*
Glue code to support AIX loadable authentication modules.
Note: only information functions are supported, so you need to
specify "options = dbonly" in /usr/lib/security/methods.cfg
(Note: the is now experimental support for authentication
functions - getpasswd/authenticate. This has not been tested
as PADL do not have access to an AIX machine.)
*/
#include "config.h"
#ifdef _AIX
#include <stdlib.h>
#include <string.h>
#include <usersec.h>
#ifdef HAVE_LBER_H
#include <lber.h>
#endif
#ifdef HAVE_LDAP_H
#include <ldap.h>
#endif
#include "ldap-nss.h"
#include "ldap-grp.h"
#include "globals.h"
#include "util.h"
static struct irs_gr *grp_conn = NULL;
static struct irs_pw *pwd_conn = NULL;
/* Prototype definitions */
void *gr_pvtinit (void);
struct group *gr_byname (struct irs_gr *, const char *);
struct group *gr_bygid (struct irs_gr *, gid_t);
void gr_close (struct irs_gr *);
void *pw_pvtinit (void);
struct passwd *pw_byname (struct irs_pw *, const char *);
struct passwd *pw_byuid (struct irs_pw *, uid_t);
void pw_close (struct irs_pw *);
/* from ldap-grp.c */
char *_nss_ldap_getgrset (char *user);
static void *
_nss_ldap_open (const char *name, const char *domain,
const int mode, char *options)
{
/* Currently we do not use the above parameters */
grp_conn = (struct irs_gr *) gr_pvtinit ();
pwd_conn = (struct irs_pw *) pw_pvtinit ();
return NULL;
}
static int
_nss_ldap_close (void *token)
{
gr_close (grp_conn);
grp_conn = NULL;
pw_close (pwd_conn);
pwd_conn = NULL;
return AUTH_SUCCESS;
}
static struct group *
_nss_ldap_getgrgid (gid_t gid)
{
if (!grp_conn)
return NULL;
return gr_bygid (grp_conn, gid);
}
static struct group *
_nss_ldap_getgrnam (const char *name)
{
if (!grp_conn)
return NULL;
return gr_byname (grp_conn, name);
}
static struct passwd *
_nss_ldap_getpwuid (uid_t uid)
{
if (!pwd_conn)
return NULL;
return pw_byuid (pwd_conn, uid);
}
static struct passwd *
_nss_ldap_getpwnam (const char *name)
{
if (!pwd_conn)
return NULL;
return pw_byname (pwd_conn, name);
}
static struct group *
_nss_ldap_getgracct (void *id, int type)
{
if (type == SEC_INT)
return _nss_ldap_getgrgid (*(gid_t *) id);
else
return _nss_ldap_getgrnam ((char *) id);
}
#ifdef PROXY_AUTH
int
_nss_ldap_authenticate (char *user, char *response, int **reenter,
char **message)
{
NSS_STATUS stat;
int rc;
*reenter = 0;
stat = _nss_ldap_proxy_bind (user, response);
switch (stat)
{
case NSS_TRYAGAIN:
rc = AUTH_FAILURE;
*message = "Invalid Password.\n";
break;
case NSS_NOTFOUND:
rc = AUTH_NOTFOUND;
*message = "Unknown User.\n";
break;
case NSS_SUCCESS:
rc = AUTH_SUCCESS;
break;
default:
case NSS_UNAVAIL:
rc = AUTH_UNAVAIL;
*message = "LDAP Unavailable.\n";
break;
}
if (rc == AUTH_FAILURE)
*reenter = 1;
return rc;
}
#endif /* PROXY_AUTH */
/*
* Support this for when proxy authentication is disabled.
* There may be some re-entrancy issues here; not sure
* if we are supposed to return allocated memory or not,
* this is not documented. I am assuming not in line with
* the other APIs.
*/
char *
_nss_ldap_getpasswd (char *user)
{
struct passwd *pw;
static char pwdbuf[32];
char *p = NULL;
pw = _nss_ldap_getpwnam (user);
if (pw != NULL)
{
if (strlen (pw->pw_passwd) > sizeof (pwdbuf) - 1)
{
errno = ERANGE;
}
else
{
strcpy (pwdbuf, pw->pw_passwd);
p = pwdbuf;
}
}
return p;
}
int
nss_ldap_initialize (struct secmethod_table *meths)
{
bzero (meths, sizeof (*meths));
/* Identification methods */
meths->method_getpwnam = _nss_ldap_getpwnam;
meths->method_getpwuid = _nss_ldap_getpwuid;
meths->method_getgrnam = _nss_ldap_getgrnam;
meths->method_getgrgid = _nss_ldap_getgrgid;
meths->method_getgrset = _nss_ldap_getgrset;
meths->method_getgracct = _nss_ldap_getgracct;
/* Support methods */
meths->method_open = _nss_ldap_open;
meths->method_close = _nss_ldap_close;
/* Authentication methods */
#ifdef PROXY_AUTH
meths->method_authenticate = _nss_ldap_authenticate;
#endif
meths->method_getpasswd = _nss_ldap_getpasswd;
return AUTH_SUCCESS;
}
#endif /* _AIX */
|