135 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			135 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* access.c Copyright 1992-2000 by Michael Temari All Rights Reserved
 | 
						|
 *
 | 
						|
 * This file is part of ftpd.
 | 
						|
 *
 | 
						|
 * This file handles:
 | 
						|
 *
 | 
						|
 *      USER PASS QUIT
 | 
						|
 *
 | 
						|
 *
 | 
						|
 * 01/25/96 Initial Release	Michael Temari, <Michael@TemWare.Com>
 | 
						|
 */
 | 
						|
 | 
						|
#include <sys/types.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <string.h>
 | 
						|
#include <pwd.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <net/gen/in.h>
 | 
						|
#include <net/gen/tcp.h>
 | 
						|
 | 
						|
#include "ftpd.h"
 | 
						|
#include "access.h"
 | 
						|
 | 
						|
_PROTOTYPE(static int AreWeIn, (char *name, struct passwd *pwd));
 | 
						|
 | 
						|
static char *msg530 = "530 Not logged in.\r\n";
 | 
						|
 | 
						|
/* Returns -1 = not logged in, 0 = loggedin */
 | 
						|
int ChkLoggedIn()
 | 
						|
{
 | 
						|
   if(!loggedin) {
 | 
						|
	printf(msg530);
 | 
						|
	return(-1);
 | 
						|
   } else
 | 
						|
	return(0);
 | 
						|
}
 | 
						|
 | 
						|
/* what a USER! */
 | 
						|
int doUSER(buff)
 | 
						|
char *buff;
 | 
						|
{
 | 
						|
   loggedin = 0;
 | 
						|
   gotuser = 0;
 | 
						|
   strncpy(username, buff, sizeof(username));
 | 
						|
   username[sizeof(username)-1] = '\0';
 | 
						|
 | 
						|
   if(*username == '\0') {
 | 
						|
	printf("501 Bad user name.\r\n");
 | 
						|
	return(GOOD);
 | 
						|
   }
 | 
						|
 | 
						|
   gotuser = 1;
 | 
						|
 | 
						|
   printf("331 Password required for %s.\r\n", username);
 | 
						|
 | 
						|
   return(GOOD);
 | 
						|
}
 | 
						|
 | 
						|
/* secret, secret, secret */
 | 
						|
int doPASS(buff)
 | 
						|
char *buff;
 | 
						|
{
 | 
						|
char *name;
 | 
						|
struct passwd *pwd;
 | 
						|
int bad=0;
 | 
						|
 | 
						|
   name = username;
 | 
						|
 | 
						|
   if(!strcmp(name, "anonymous"))
 | 
						|
	name = "ftp";
 | 
						|
 | 
						|
   if(!gotuser || ((pwd = getpwnam(name)) == (struct passwd *)0))
 | 
						|
	bad = 1;
 | 
						|
   else
 | 
						|
	if(strcmp(name, "ftp")) {
 | 
						|
		if(!strcmp(pwd->pw_passwd, crypt("", pwd->pw_passwd)))
 | 
						|
			bad = 1;
 | 
						|
		if(strcmp(pwd->pw_passwd, crypt(buff, pwd->pw_passwd)))
 | 
						|
			bad = 1;
 | 
						|
	} else {
 | 
						|
		strncpy(anonpass, buff, sizeof(anonpass));
 | 
						|
		anonpass[sizeof(anonpass)-1] = '\0';
 | 
						|
	}
 | 
						|
 | 
						|
   if(bad) {
 | 
						|
	logit("LOGIN", "FAIL");
 | 
						|
	printf(msg530);
 | 
						|
	return(GOOD);
 | 
						|
   }
 | 
						|
 | 
						|
   return(AreWeIn(name, pwd));
 | 
						|
}
 | 
						|
 | 
						|
/* bye, bye don't let the door hit you in the butt on the way out */
 | 
						|
int doQUIT(buff)
 | 
						|
char *buff;
 | 
						|
{
 | 
						|
   printf("221 Service closing, don't be a stranger.\r\n");
 | 
						|
 | 
						|
   return(BAD);
 | 
						|
}
 | 
						|
 | 
						|
/* see if this user is okay */
 | 
						|
static int AreWeIn(name, pwd)
 | 
						|
char *name;
 | 
						|
struct passwd *pwd;
 | 
						|
{
 | 
						|
   if(!strcmp(name, "ftp")) {
 | 
						|
	if(chroot(pwd->pw_dir)) {
 | 
						|
		logit("LOGIN", "FAIL");
 | 
						|
		printf("530 Not logged in, could not chroot.\r\n");
 | 
						|
		return(GOOD);
 | 
						|
	}
 | 
						|
	strncpy(newroot, pwd->pw_dir, sizeof(newroot));
 | 
						|
	newroot[sizeof(newroot)-1] = '\0';
 | 
						|
	anonymous = 1;
 | 
						|
	strcpy(pwd->pw_dir, "/");
 | 
						|
   }
 | 
						|
 | 
						|
   if(setgid(pwd->pw_gid) || setuid(pwd->pw_uid) || chdir(pwd->pw_dir)) {
 | 
						|
	logit("LOGIN", "FAIL");
 | 
						|
	printf(msg530);
 | 
						|
	anonymous = 0;
 | 
						|
   } else {
 | 
						|
	logit("LOGIN", "PASS");
 | 
						|
	showmsg("230", (char *)NULL);
 | 
						|
	printf("230 User %s logged in, directory %s.\r\n",
 | 
						|
		username, pwd->pw_dir);
 | 
						|
	loggedin = 1;
 | 
						|
   }
 | 
						|
 | 
						|
   return(GOOD);
 | 
						|
}
 |