home *** CD-ROM | disk | FTP | other *** search
- #ifndef lint
- static char *sccsid = "@(#)$Header: auth.c,v 1.2 90/08/10 22:59:08 sob Exp $";
- #endif
-
- /*
- * Simple user/password authentication
- *
- * client must supply "authinfo user <userid>"
- * followed by "authinfo pass <password>"
- * which will be looked up in the server machine's password file.
- * Password must match userid, userid must have gid matching the
- * /etc/group entry for "nntp"
- *
- * note that passwords travel over the network in plaintext. This
- * can be a problem but isn't easy to remedy. At least it's as safe
- * as logging in over the network would be
- *
- */
-
- #include "common.h"
- #include <grp.h>
-
- extern timeout();
- extern char *crypt();
-
- #ifdef AUTH
-
- extern int Needauth;
- extern char User[];
-
- doauth(argc,argv)
- int argc;
- char *argv[];
- {
- if (argc != 3)
- {
- printf("%d Syntax error\r\n", ERR_CMDSYN);
- fflush(stdout);
- return;
- }
-
- if (!strcasecmp(argv[0],"authcap"))
- {
- printf("%d authcap not implemented\r\n", ERR_COMMAND);
- fflush(stdout);
- return;
- }
-
- if (!strcasecmp(argv[0],"authsys"))
- {
- printf("%d authsys not implemented\r\n", ERR_COMMAND);
- fflush(stdout);
- return;
- }
-
- /* fall through into 'authinfo' */
- if (strcasecmp(argv[0],"authinfo"))
- {
- printf("%d command not recognized\r\n", ERR_COMMAND);
- fflush(stdout);
- return;
- }
-
- if (!Needauth)
- {
- printf("%d Authorization already completed\r\n", ERR_AUTHREJ);
- fflush(stdout);
- return;
- }
-
- if (!strcasecmp(argv[1],"user"))
- {
- if (strlen(User))
- {
- printf("%d USER already specified\r\n", ERR_AUTHREJ);
- fflush(stdout);
- return;
- }
- getuser(argv[2]);
- return;
- }
-
- if (!strcasecmp(argv[1],"pass"))
- {
- if (strlen(User) < 1)
- {
- printf("%d USER required first\r\n", ERR_AUTHREJ);
- fflush(stdout);
- return;
- }
- getpass(argv[2]);
- return;
- }
- }
-
- /* get userid and prompt for password */
- getuser(p)
- char *p;
- {
- strncpy(User,p,8);
- User[8] = 0;
- /* get the password */
- printf("%d PASS required\r\n", NEED_AUTHDATA);
- fflush(stdout);
- }
-
- /* password */
- getpass(p)
- char *p;
- {
- static char pass[10];
- char *cp, *namep;
- struct passwd *pwd;
- struct group *grp;
- int i;
- int nntpgid;
-
- strncpy(pass,p,8);
- pass[8] = 0;
- /* check for valid login */
- pwd = getpwnam(User);
- namep = NULL;
-
- if (pwd != NULL)
- namep = crypt(pass, pwd->pw_passwd);
-
- grp = getgrnam("nntp");
-
- if (grp == NULL || pwd == NULL || namep == NULL
- || strcmp(namep, pwd->pw_passwd)
- || pwd->pw_gid != grp->gr_gid)
- {
- #ifdef SYSLOG
- syslog(LOG_ERR, "AUTHENTICATION ERROR");
- #endif
- printf("%d Authentication error\r\n",ERR_ACCESS);
- (void) fflush(stdout);
- (void) fflush(stdout);
- exit(1);
- }
-
- #ifdef SYSLOG
- #ifdef LOG
- syslog(LOG_INFO, "user %s", User);
- #endif
- #endif
- printf("%d Authentication accepted\r\n",OK_AUTH);
- fflush(stdout);
- Needauth = 0;
- }
-
- #endif AUTH
-