123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- /*
- * $Id: local.c,v 1.5 2007/01/06 20:15:35 pnixon Exp $
- *
- * Copyright (C) 1996 Lars Fenneberg
- *
- * See the file COPYRIGHT for the respective terms and conditions.
- * If the file is missing contact me at lf@elemental.net
- * and I'll send you a copy.
- *
- */
- #include <config.h>
- #include <includes.h>
- #include <freeradius-client.h>
- #include <messages.h>
- #include <radlogin.h>
- extern ENV *env;
- LFUNC auth_local(char const *username, char const *passwd)
- {
- struct passwd *pw;
- char *xpasswd;
- #ifdef SHADOW_PASSWORD
- struct spwd *spw;
- #endif
- if ((pw = getpwnam(username)) == NULL) {
- endpwent();
- rc_log(LOG_NOTICE, "authentication FAILED, type local, username %s", username);
- printf(SC_LOCAL_FAILED);
- return NULL;
- }
- endpwent();
- #ifdef SHADOW_PASSWORD
- if((spw = getspnam(pw->pw_name)) == NULL) {
- endspent();
- rc_log(LOG_NOTICE, "authentication FAILED, type local, username %s", username);
- printf(SC_LOCAL_FAILED);
- return NULL;
- }
- else
- {
- pw->pw_passwd = spw->sp_pwdp;
- }
- endspent();
- #endif /* SHADOW_PASSWORD */
- xpasswd = crypt(passwd, pw->pw_passwd);
- if (*pw->pw_passwd == '\0' || !xpasswd || strcmp(xpasswd, pw->pw_passwd)) {
- rc_log(LOG_NOTICE, "authentication FAILED, type local, username %s", username);
- printf(SC_LOCAL_FAILED);
- return NULL;
- }
- rc_log(LOG_NOTICE, "authentication OK, type local, username %s", username);
- printf(SC_LOCAL_OK);
- return local_login;
- }
- void
- local_login(rc_handle *rh, char const *username)
- {
- char *login_local = rc_conf_str(rh, "login_local");
- /* login should spot this... but who knows what old /bin/logins
- * may be still around
- */
- if (*username == '-') {
- rc_log(LOG_WARNING, "username can't start with a dash");
- exit(ERROR_RC);
- }
- /* the new shadow login seems to require either a -r or a -h
- * flag for -f to work (so source code, lmain.c) so we supply
- * it here. shouldn't hurt on other systems, -lf, 03/13/96
- */
- execle(login_local, login_local, "-h", "localhost", "-f", username, NULL, env->env);
- rc_log(LOG_ERR, "couldn't execute %s: %s", login_local, strerror(errno));
- sleep(1); /* give the user time to read */
- exit(ERROR_RC);
- }
|