From: didg Date: Wed, 8 Jan 2003 22:16:24 +0000 (+0000) Subject: AFP 3.x add dhx pam uam, not tested! X-Git-Tag: netatalk-2-0-alpha1~281 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=netatalk.git;a=commitdiff_plain;h=d7c1ee14c81a3c6496e6285fd3e1aab275f224d4 AFP 3.x add dhx pam uam, not tested! --- diff --git a/etc/uams/uams_dhx_pam.c b/etc/uams/uams_dhx_pam.c index be1f1a59..0e7eed43 100644 --- a/etc/uams/uams_dhx_pam.c +++ b/etc/uams/uams_dhx_pam.c @@ -1,5 +1,5 @@ /* - * $Id: uams_dhx_pam.c,v 1.23 2003-01-01 13:19:24 srittau Exp $ + * $Id: uams_dhx_pam.c,v 1.24 2003-01-08 22:16:24 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu) @@ -307,55 +307,93 @@ pam_fail: return AFPERR_PARAM; } +/* -------------------------------- */ +static int login(void *obj, char *username, int ulen, struct passwd **uam_pwd, + char *ibuf, int ibuflen, + char *rbuf, int *rbuflen) +{ + if (( dhxpwd = uam_getname(username, ulen)) == NULL ) { + LOG(log_info, logtype_uams, "uams_dhx_pam.c: unknown username"); + return AFPERR_PARAM; + } + PAM_username = username; + LOG(log_info, logtype_uams, "dhx login: %s", username); + return dhx_setup(obj, ibuf, ibuflen, rbuf, rbuflen); +} + +/* -------------------------------- */ /* dhx login: things are done in a slightly bizarre order to avoid * having to clean things up if there's an error. */ static int pam_login(void *obj, struct passwd **uam_pwd, char *ibuf, int ibuflen, char *rbuf, int *rbuflen) { - char *buf; - int len, i; + char *username; + int len, ulen; *rbuflen = 0; /* grab some of the options */ - if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, (void *) &buf, - &i) < 0) { - /* Log Entry */ - LOG(log_info, logtype_uams, "uams_dhx_pam.c :PAM: uam_afpserver_option didn't meet uam_option_username -- %s", + if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, (void *) &username, &ulen) < 0) { + LOG(log_info, logtype_uams, "uams_dhx_pam.c :PAM: uam_afpserver_option didn't meet uam_option_username -- %s", strerror(errno)); - /* Log Entry */ - return AFPERR_PARAM; + return AFPERR_PARAM; } len = (unsigned char) *ibuf++; - if ( len > i ) { - /* Log Entry */ - LOG(log_info, logtype_uams, "uams_dhx_pam.c :PAM: Signature Retieval Failure -- %s", + if ( len > ulen ) { + LOG(log_info, logtype_uams, "uams_dhx_pam.c :PAM: Signature Retieval Failure -- %s", strerror(errno)); - /* Log Entry */ - return( AFPERR_PARAM ); + return AFPERR_PARAM; } - memcpy(buf, ibuf, len ); + memcpy(username, ibuf, len ); ibuf += len; - buf[ len ] = '\0'; + username[ len ] = '\0'; + if ((unsigned long) ibuf & 1) /* pad to even boundary */ ++ibuf; - if (( dhxpwd = uam_getname(buf, i)) == NULL ) { - /* Log Entry */ - LOG(log_info, logtype_uams, "uams_dhx_pam.c: unknown username"); - /* Log Entry */ + return (login(obj, username, ulen, uam_pwd, ibuf, ibuflen, rbuf, rbuflen)); +} + +/* ----------------------------- */ +static int pam_login_ext(void *obj, char *uname, struct passwd **uam_pwd, + char *ibuf, int ibuflen, + char *rbuf, int *rbuflen) +{ + char *username; + int len, ulen; + u_int16_t temp16; + + *rbuflen = 0; + + /* grab some of the options */ + if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, (void *) &username, &ulen) < 0) { + LOG(log_info, logtype_uams, "uams_dhx_pam.c :PAM: uam_afpserver_option didn't meet uam_option_username -- %s", + strerror(errno)); + return AFPERR_PARAM; + } + + if (*uname != 3) + return AFPERR_PARAM; + uname++; + memcpy(&temp16, uname, sizeof(temp16)); + len = ntohs(temp16); + + if ( !len || len > ulen ) { + LOG(log_info, logtype_uams, "uams_dhx_pam.c :PAM: Signature Retrieval Failure -- %s", + strerror(errno)); return AFPERR_PARAM; } + memcpy(username, uname +2, len ); + username[ len ] = '\0'; - PAM_username = buf; - LOG(log_info, logtype_uams, "dhx login: %s", buf); - return dhx_setup(obj, ibuf, ibuflen, rbuf, rbuflen); + return (login(obj, username, ulen, uam_pwd, ibuf, ibuflen, rbuf, rbuflen)); } +/* -------------------------------- */ static int pam_logincont(void *obj, struct passwd **uam_pwd, char *ibuf, int ibuflen, @@ -661,8 +699,8 @@ static int pam_changepw(void *obj, char *username, static int uam_setup(const char *path) { - if (uam_register(UAM_SERVER_LOGIN, path, "DHCAST128", pam_login, - pam_logincont, pam_logout) < 0) + if (uam_register(UAM_SERVER_LOGIN_EXT, path, "DHCAST128", pam_login, + pam_logincont, pam_logout, pam_login_ext) < 0) return -1; if (uam_register(UAM_SERVER_CHANGEPW, path, "DHCAST128", diff --git a/etc/uams/uams_pam.c b/etc/uams/uams_pam.c index 461ac0ef..25b86753 100644 --- a/etc/uams/uams_pam.c +++ b/etc/uams/uams_pam.c @@ -1,5 +1,5 @@ /* - * $Id: uams_pam.c,v 1.14 2002-10-17 18:01:54 didg Exp $ + * $Id: uams_pam.c,v 1.15 2003-01-08 22:16:25 didg Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu) @@ -194,7 +194,6 @@ login_err: pam_end(pamh, PAM_error); pamh = NULL; return err; - } /* -------------------------- @@ -209,10 +208,9 @@ static int pam_login(void *obj, struct passwd **uam_pwd, *rbuflen = 0; - if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, - (void *) &username, &ulen) < 0) - return AFPERR_MISC; - + if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, (void *) &username, &ulen) < 0) { + return AFPERR_MISC; + } len = (unsigned char) *ibuf++; if ( len > ulen ) { @@ -228,6 +226,7 @@ static int pam_login(void *obj, struct passwd **uam_pwd, return (login(obj, username, ulen, uam_pwd, ibuf, ibuflen, rbuf, rbuflen)); } +/* ----------------------------- */ static int pam_login_ext(void *obj, char *uname, struct passwd **uam_pwd, char *ibuf, int ibuflen, char *rbuf, int *rbuflen) @@ -238,8 +237,7 @@ static int pam_login_ext(void *obj, char *uname, struct passwd **uam_pwd, *rbuflen = 0; - if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, - (void *) &username, &ulen) < 0) + if (uam_afpserver_option(obj, UAM_OPTION_USERNAME, (void *) &username, &ulen) < 0) return AFPERR_MISC; if (*uname != 3) @@ -253,11 +251,7 @@ static int pam_login_ext(void *obj, char *uname, struct passwd **uam_pwd, } memcpy(username, uname +2, len ); username[ len ] = '\0'; -#if 0 - if ((unsigned long) ibuf & 1) { /* pad character */ - ++ibuf; - } -#endif + return (login(obj, username, ulen, uam_pwd, ibuf, ibuflen, rbuf, rbuflen)); }