/*
- * $Id: auth.c,v 1.44.2.3 2003-07-21 05:50:53 didg Exp $
+ * $Id: auth.c,v 1.44.2.3.2.1 2003-09-11 23:49:30 bfernhomberg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
LOG(log_info, logtype_afpd, "changing password for <%s>", username);
- if (( pwd = uam_getname( username, sizeof(username))) == NULL )
+ if (( pwd = uam_getname( obj, username, sizeof(username))) == NULL )
return AFPERR_PARAM;
/* send it off to the uam. we really don't use ibuflen right now. */
/*
- * $Id: uam.c,v 1.24 2003-04-16 22:45:11 samnoble Exp $
+ * $Id: uam.c,v 1.24.6.1 2003-09-11 23:49:30 bfernhomberg Exp $
*
* Copyright (c) 1999 Adrian Sun (asun@zoology.washington.edu)
* All Rights Reserved. See COPYRIGHT.
#include "auth.h"
#include "uam_auth.h"
+#ifdef AFP3x
+#define utf8_encoding() (afp_version >= 30)
+#else
+#define utf8_encoding() (0)
+#endif
+
#ifdef TRU64
#include <netdb.h>
#include <sia.h>
/* --- helper functions for plugin uams --- */
-struct passwd *uam_getname(char *name, const int len)
+struct passwd *uam_getname(void *private, char *name, const int len)
{
+ AFPObj *obj = private;
struct passwd *pwent;
- char *user;
- int i;
+ static char username[256];
+ static char user[256];
+ static char pwname[256];
+ char *p;
+ size_t ulen;
+ u_int16_t flags = CONV_PRECOMPOSE;
if ((pwent = getpwnam(name)))
return pwent;
#ifndef NO_REAL_USER_NAME
- for (i = 0; i < len; i++)
- name[i] = tolower(name[i]);
+
+ if ( (size_t) -1 == (ulen = convert_charset((utf8_encoding())?CH_UTF8_MAC:obj->options.maccharset, 0,
+ CH_UCS2, name, len, username, 256, &flags)))
+ return NULL;
setpwent();
while ((pwent = getpwent())) {
- if ((user = strchr(pwent->pw_gecos, ',')))
- *user = '\0';
- user = pwent->pw_gecos;
+ if ((p = strchr(pwent->pw_gecos, ',')))
+ *p = '\0';
+
+ if ((size_t)-1 == ( ulen = convert_string(obj->options.unixcharset, CH_UCS2,
+ pwent->pw_gecos, strlen(pwent->pw_gecos), user, 256)) )
+ continue;
+ if ((size_t)-1 == ( ulen = convert_string(obj->options.unixcharset, CH_UCS2,
+ pwent->pw_name, strlen(pwent->pw_name), pwname, 256)) )
+ continue;
+
/* check against both the gecos and the name fields. the user
* might have just used a different capitalization. */
- if ((strncasecmp(user, name, len) == 0) ||
- (strncasecmp(pwent->pw_name, name, len) == 0)) {
+
+ if ( (strncasecmp_w((ucs2_t*)user, (ucs2_t*)username, len) == 0) ||
+ ( strncasecmp_w ( (ucs2_t*) pwname, (ucs2_t*) username, len) == 0)) {
strncpy(name, pwent->pw_name, len);
name[len - 1] = '\0';
break;
if (len)
*len = strlen(obj->options.k5service);
break;
+ case UAM_OPTION_MACCHARSET:
+ *((int *) option) = obj->options.maccharset;
+ *len = sizeof(obj->options.maccharset);
+ break;
+ case UAM_OPTION_UNIXCHARSET:
+ *((int *) option) = obj->options.unixcharset;
+ *len = sizeof(obj->options.unixcharset);
+ break;
default:
return -1;
break;
/*
- * $Id: uam.c,v 1.9 2003-02-17 01:35:57 srittau Exp $
+ * $Id: uam.c,v 1.9.6.1 2003-09-11 23:49:30 bfernhomberg Exp $
*
* Copyright (c) 1999 Adrian Sun (asun@zoology.washington.edu)
* All Rights Reserved. See COPYRIGHT.
/* --- helper functions for plugin uams --- */
-struct passwd *uam_getname(char *name, const int len)
+struct passwd *uam_getname(void *dummy, char *name, const int len)
{
struct passwd *pwent;
char *user;
/*
- * $Id: uams_dhx_pam.c,v 1.24.6.1 2003-09-09 16:42:20 didg Exp $
+ * $Id: uams_dhx_pam.c,v 1.24.6.2 2003-09-11 23:49:30 bfernhomberg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* Copyright (c) 1999 Adrian Sun (asun@u.washington.edu)
#include <atalk/afp.h>
#include <atalk/uam.h>
-#include <atalk/unicode.h>
#define KEYSIZE 16
#define PASSWDLEN 64
char *ibuf, int ibuflen,
char *rbuf, int *rbuflen)
{
- if (( dhxpwd = uam_getname(username, ulen)) == NULL ) {
+ if (( dhxpwd = uam_getname(obj, username, ulen)) == NULL ) {
LOG(log_info, logtype_uams, "uams_dhx_pam.c: unknown username");
return AFPERR_PARAM;
}
memcpy(username, ibuf, len );
ibuf += len;
username[ len ] = '\0';
- len = convert_charset(CH_MAC, CH_UNIX, username, len, username, ulen, 0);
if ((unsigned long) ibuf & 1) /* pad to even boundary */
++ibuf;
}
memcpy(username, uname +2, len );
username[ len ] = '\0';
- len = convert_charset(CH_UTF8_MAC, CH_UNIX, username, len, username, ulen, 0);
return (login(obj, username, ulen, uam_pwd, ibuf, ibuflen, rbuf, rbuflen));
}
/*
- * $Id: uams_dhx_passwd.c,v 1.18 2003-02-11 16:41:56 didg Exp $
+ * $Id: uams_dhx_passwd.c,v 1.18.6.1 2003-09-11 23:49:30 bfernhomberg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* Copyright (c) 1999 Adrian Sun (asun@u.washington.edu)
return AFPERR_PARAM;
#endif /* TRU64 */
- if (( dhxpwd = uam_getname(username, ulen)) == NULL ) {
+ if (( dhxpwd = uam_getname(obj, username, ulen)) == NULL ) {
return AFPERR_PARAM;
}
* uname format :
byte 3
2 bytes len (network order)
- len bytes unicode name
+ len bytes utf8 name
*/
static int passwd_login_ext(void *obj, char *uname, struct passwd **uam_pwd,
char *ibuf, int ibuflen,
/*\r
- * $Id: uams_gss.c,v 1.2.2.1 2003-09-09 16:42:20 didg Exp $\r
+ * $Id: uams_gss.c,v 1.2.2.2 2003-09-11 23:49:30 bfernhomberg Exp $\r
*\r
* Copyright (c) 1990,1993 Regents of The University of Michigan.\r
* Copyright (c) 1999 Adrian Sun (asun@u.washington.edu) \r
// Chop off the realm name\r
if (at)\r
*at = '\0';\r
- if((pwd = uam_getname( username, userlen )) == NULL) {\r
+ if((pwd = uam_getname( obj, username, userlen )) == NULL) {\r
LOG(log_info, logtype_uams, "uam_getname() failed for %s", username);\r
return AFPERR_PARAM;\r
}\r
/*
- * $Id: uams_krb4.c,v 1.6 2002-01-04 04:45:48 sibaz Exp $
+ * $Id: uams_krb4.c,v 1.6.10.1 2003-09-11 23:49:30 bfernhomberg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
*p = KRB4RPL_DONE; /* XXX */
*rbuflen = 1;
- if (( pwd = uam_getname( ad.pname, strlen(ad.pname) )) == NULL ) {
+ if (( pwd = uam_getname( obj, ad.pname, strlen(ad.pname) )) == NULL ) {
return AFPERR_PARAM;
}
/*
*p = KRB4RPL_DONE; /* XXX */
*rbuflen = 1;
- if (( pwd = uam_getname( username, strlen(username) ) ) == NULL ) {
+ if (( pwd = uam_getname( obj, username, strlen(username) ) ) == NULL ) {
return( AFPERR_NOTAUTH );
}
/*
*p = KRB4RPL_DONE; /* XXX */
*rbuflen = 1;
- if (( pwd = uam_getname( ad.pname, strlen(ad.pname) ))
+ if (( pwd = uam_getname( obj, ad.pname, strlen(ad.pname) ))
== NULL ) {
return( AFPERR_PARAM );
}
*p = KRB4RPL_DONE; /* XXX */
*rbuflen = 1;
- if (( pwd = uam_getname( ad.pname, strlen(ad.pname) ))
+ if (( pwd = uam_getname( obj, ad.pname, strlen(ad.pname) ))
== NULL ) {
return( AFPERR_PARAM );
}
return ( AFPERR_BADUAM );
}
- if (( pwd = uam_getname( username )) == NULL ) {
+ if (( pwd = uam_getname( obj, username, strlen(username) )) == NULL ) {
return ( AFPERR_PARAM );
}
/*
- * $Id: uams_pam.c,v 1.15.2.1.2.1 2003-09-09 16:42:20 didg Exp $
+ * $Id: uams_pam.c,v 1.15.2.1.2.2 2003-09-11 23:49:30 bfernhomberg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* Copyright (c) 1999 Adrian Sun (asun@u.washington.edu)
#include <atalk/logger.h>
#include <security/pam_appl.h>
-#include <atalk/unicode.h>
#include <atalk/afp.h>
#include <atalk/uam.h>
ibuf[ PASSWDLEN ] = '\0';
- if (( pwd = uam_getname(username, ulen)) == NULL ) {
+ if (( pwd = uam_getname(obj, username, ulen)) == NULL ) {
return AFPERR_PARAM;
}
username[ len ] = '\0';
- len = convert_charset(CH_MAC, CH_UNIX, username, len, username, ulen, 0);
-
-
if ((unsigned long) ibuf & 1) /* pad character */
++ibuf;
return (login(obj, username, ulen, uam_pwd, ibuf, ibuflen, rbuf, rbuflen));
memcpy(username, uname +2, len );
username[ len ] = '\0';
- len = convert_charset(CH_UTF8_MAC, CH_UNIX, username, len, username, ulen, 0);
-
return (login(obj, username, ulen, uam_pwd, ibuf, ibuflen, rbuf, rbuflen));
}
/* Done copying username and password, clean up */
free(data);
- if (( pwd = uam_getname(username, strlen(username))) == NULL ) {
+ if (( pwd = uam_getname(NULL, username, strlen(username))) == NULL ) {
LOG(log_info, logtype_uams, "Bad Login ClearTxtUAM: ( %s ) not found ",
username);
return(-1);
/*
- * $Id: uams_passwd.c,v 1.19.2.1 2003-09-03 20:40:50 didg Exp $
+ * $Id: uams_passwd.c,v 1.19.2.1.2.1 2003-09-11 23:49:30 bfernhomberg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* Copyright (c) 1999 Adrian Sun (asun@u.washington.edu)
}
ibuf[ PASSWDLEN ] = '\0';
- if (( pwd = uam_getname(username, ulen)) == NULL ) {
+ if (( pwd = uam_getname(obj, username, ulen)) == NULL ) {
return AFPERR_PARAM;
}
ulen = strlen(username);
- if (( pwd = uam_getname(username, ulen)) == NULL ) {
+ if (( pwd = uam_getname(NULL, username, ulen)) == NULL ) {
LOG(log_info, logtype_uams, "Bad Login ClearTxtUAM: ( %s ) not found ",
username);
return(-1);
/*
- * $Id: uams_pgp.c,v 1.9 2003-01-26 16:54:46 srittau Exp $
+ * $Id: uams_pgp.c,v 1.9.6.1 2003-09-11 23:49:30 bfernhomberg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* Copyright (c) 1999 Adrian Sun (asun@u.washington.edu)
if ((unsigned long) ibuf & 1) /* padding */
++ibuf;
- if (( pgppwd = uam_getname(name, i)) == NULL ) {
+ if (( pgppwd = uam_getname(obj, name, i)) == NULL ) {
return AFPERR_PARAM;
}
/*
- * $Id: uams_randnum.c,v 1.12 2003-01-21 16:31:39 srittau Exp $
+ * $Id: uams_randnum.c,v 1.12.6.1 2003-09-11 23:49:30 bfernhomberg Exp $
*
* Copyright (c) 1990,1993 Regents of The University of Michigan.
* Copyright (c) 1999 Adrian Sun (asun@u.washington.edu)
if ((unsigned long) ibuf & 1) /* padding */
++ibuf;
- if (( randpwd = uam_getname(username, ulen)) == NULL )
+ if (( randpwd = uam_getname(obj, username, ulen)) == NULL )
return AFPERR_PARAM; /* unknown user */
LOG(log_info, logtype_uams, "randnum/rand2num login: %s", username);
#define UAM_OPTION_PROTOCOL (1 << 7) /* DSI or ASP */
#define UAM_OPTION_CLIENTNAME (1 << 8) /* get client IP address */
#define UAM_OPTION_KRB5SERVICE (1 << 9) /* service name for krb5 principal */
+#define UAM_OPTION_MACCHARSET (1 << 10) /* mac charset handle */
+#define UAM_OPTION_UNIXCHARSET (1 << 11) /* unix charset handle */
/* some password options. you pass these in the length parameter and
* get back the corresponding option. not all of these are implemented. */
extern void uam_unregister __P((const int, const char *));
/* helper functions */
-extern struct passwd *uam_getname __P((char *, const int));
+extern struct passwd *uam_getname __P((void*, char *, const int));
extern int uam_checkuser __P((const struct passwd *));
/* afp helper functions */