From eaf59ab61214a746387fd0b1deb4b0f587069780 Mon Sep 17 00:00:00 2001 From: srittau Date: Wed, 13 Feb 2002 16:44:59 +0000 Subject: [PATCH] Tru64 SIA fixes and Eddie and Burkhard. --- etc/afpd/uam.c | 49 +++++++++++++++++++++++++++++++++++++- etc/uams/uams_dhx_passwd.c | 6 ++--- etc/uams/uams_passwd.c | 6 ++--- include/atalk/uam.h | 8 +++++++ 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/etc/afpd/uam.c b/etc/afpd/uam.c index d96b2f5e..76077fd4 100644 --- a/etc/afpd/uam.c +++ b/etc/afpd/uam.c @@ -1,5 +1,5 @@ /* - * $Id: uam.c,v 1.19 2002-01-19 21:29:55 jmarcus Exp $ + * $Id: uam.c,v 1.20 2002-02-13 16:44:59 srittau Exp $ * * Copyright (c) 1999 Adrian Sun (asun@zoology.washington.edu) * All Rights Reserved. See COPYRIGHT. @@ -58,6 +58,9 @@ char *strchr (), *strrchr (); #ifdef TRU64 #include +#include +#include +#include #endif /* TRU64 */ /* --- server uam functions -- */ @@ -427,6 +430,50 @@ void uam_afp_getcmdline( int *ac, char ***av ) { afp_get_cmdline( ac, av ); } + +int uam_sia_validate_user(sia_collect_func_t * collect, int argc, char **argv, + char *hostname, char *username, char *tty, + int colinput, char *gssapi, char *passphrase) +/* A clone of the Tru64 system function sia_validate_user() that calls + * sia_ses_authent() rather than sia_ses_reauthent() + * Added extra code to take into account suspected SIA bug whereby it clobbers + * the signal handler on SIGALRM (tickle) installed by Netatalk/afpd + */ +{ + SIAENTITY *entity = NULL; + struct sigaction act; + int rc; + + if ((rc=sia_ses_init(&entity, argc, argv, hostname, username, tty, + colinput, gssapi)) != SIASUCCESS) { + LOG(log_error, logtype_default, "cannot initialise SIA"); + return SIAFAIL; + } + + /* save old action for restoration later */ + if (sigaction(SIGALRM, NULL, &act)) + LOG(log_error, logtype_default, "cannot save SIGALRM handler"); + + if ((rc=sia_ses_authent(collect, passphrase, entity)) != SIASUCCESS) { + /* restore old action after clobbering by sia_ses_authent() */ + if (sigaction(SIGALRM, &act, NULL)) + LOG(log_error, logtype_default, "cannot restore SIGALRM handler"); + + LOG(log_info, logtype_default, "unsuccessful login for %s", +(hostname?hostname:"(null)")); + return SIAFAIL; + } + LOG(log_info, logtype_default, "successful login for %s", +(hostname?hostname:"(null)")); + + /* restore old action after clobbering by sia_ses_authent() */ + if (sigaction(SIGALRM, &act, NULL)) + LOG(log_error, logtype_default, "cannot restore SIGALRM handler"); + + sia_ses_release(&entity); + + return SIASUCCESS; +} #endif /* TRU64 */ /* --- papd-specific functions (just placeholders) --- */ diff --git a/etc/uams/uams_dhx_passwd.c b/etc/uams/uams_dhx_passwd.c index 0233bd6e..2a28f99f 100644 --- a/etc/uams/uams_dhx_passwd.c +++ b/etc/uams/uams_dhx_passwd.c @@ -1,5 +1,5 @@ /* - * $Id: uams_dhx_passwd.c,v 1.14 2002-01-04 04:45:48 sibaz Exp $ + * $Id: uams_dhx_passwd.c,v 1.15 2002-02-13 16:44:59 srittau Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu) @@ -270,8 +270,8 @@ static int passwd_logincont(void *obj, struct passwd **uam_pwd, uam_afp_getcmdline( &ac, &av ); sprintf( hostname, "%s@%s", dhxpwd->pw_name, clientname ); - if( sia_validate_user( NULL, ac, av, hostname, dhxpwd->pw_name, - NULL, FALSE, NULL, rbuf ) != SIASUCCESS ) + if( uam_sia_validate_user( NULL, ac, av, hostname, dhxpwd->pw_name, + NULL, FALSE, NULL, rbuf ) != SIASUCCESS ) return AFPERR_NOTAUTH; memset( rbuf, 0, PASSWDLEN ); diff --git a/etc/uams/uams_passwd.c b/etc/uams/uams_passwd.c index 44f8cac2..e423b674 100644 --- a/etc/uams/uams_passwd.c +++ b/etc/uams/uams_passwd.c @@ -1,5 +1,5 @@ /* - * $Id: uams_passwd.c,v 1.15 2002-01-24 16:31:20 jmarcus Exp $ + * $Id: uams_passwd.c,v 1.16 2002-02-13 16:44:59 srittau Exp $ * * Copyright (c) 1990,1993 Regents of The University of Michigan. * Copyright (c) 1999 Adrian Sun (asun@u.washington.edu) @@ -138,8 +138,8 @@ static int passwd_login(void *obj, struct passwd **uam_pwd, uam_afp_getcmdline( &ac, &av ); sprintf( hostname, "%s@%s", username, clientname ); - if( sia_validate_user( NULL, ac, av, hostname, username, - NULL, FALSE, NULL, ibuf ) != SIASUCCESS ) + if( uams_sia_validate_user( NULL, ac, av, hostname, username, + NULL, FALSE, NULL, ibuf ) != SIASUCCESS ) return AFPERR_NOTAUTH; return AFP_OK; diff --git a/include/atalk/uam.h b/include/atalk/uam.h index 060bc228..44847712 100644 --- a/include/atalk/uam.h +++ b/include/atalk/uam.h @@ -9,6 +9,11 @@ #include #include +#ifdef TRU64 +#include +#include +#endif /* TRU64 */ + /* just a label for exported bits */ #define UAM_MODULE_EXPORT @@ -64,6 +69,9 @@ extern int uam_afp_read __P((void *, char *, int *, extern int uam_afpserver_option __P((void *, const int, void *, int *)); #ifdef TRU64 extern void uam_afp_getcmdline __P((int *, char ***)); +extern int uam_sia_validate_user __P((sia_collect_func_t *, int, char **, + char *, char *, char *, int, char *, + char *)); #endif /* TRU64 */ /* switch.c */ -- 2.39.2