134 lines
2.5 KiB
C
134 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);
|
|
}
|