⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 auth.c

📁 linux下ftpd服务器端的源码实现
💻 C
字号:
#ifdef HAVE_CONFIG_H#include <config.h>#endif#include <sys/types.h>#include <stdlib.h>#include <unistd.h>#include <stdio.h>#include <pwd.h>#ifdef HAVE_CRYPT_H# include <crypt.h>#endif#ifdef HAVE_SHADOW_H#include <shadow.h>#endif#ifdef TIME_WITH_SYS_TIME#  include <sys/time.h>#  include <time.h>#else#  ifdef HAVE_SYS_TIME_H#    include <sys/time.h>#  else#    include <time.h>#  endif#endif#include "extern.h"/* If name is "ftp" or "anonymous", the name is not in   PATH_FTPUSERS, and ftp account exists, set cred, then just return.   If account doesn't exist, ask for passwd anyway.  Otherwise, check user   requesting login privileges.  Disallow anyone who does not have a standard   shell as returned by getusershell().  Disallow anyone mentioned in the file   PATH_FTPUSERS to allow people such as root and uucp to be avoided.  */intauth_user (const char *name, struct credentials *pcred){  pcred->guest = 0;  switch (pcred->auth_type)    {#ifdef WITH_PAM    case AUTH_TYPE_PAM:      return pam_user (name, pcred);#endif#ifdef WITH_KERBEROS    case AUTH_TYPE_KERBEROS:      return -1;#endif#ifdef WITH_KERBEROS5    case AUTH_TYPE_KERBEROS5:      return -1;#endif#ifdef WITH_OPIE    case AUTH_TYPE_OPIE:      return -1;#endif    case AUTH_TYPE_PASSWD:    default:      {	size_t len;	if (pcred->message)	  free (pcred->message);	len = 64 + strlen (name);	pcred->message = malloc (len);	if (pcred->message == NULL)	  return -1;	/* check for anonymous logging */	if (strcmp (name, "ftp") == 0	    || strcmp (name, "anonymous") == 0)	  {	    int err = 0;	    if (checkuser (PATH_FTPUSERS , "ftp")		|| checkuser (PATH_FTPUSERS, "anonymous"))	      {		snprintf (pcred->message, len, "User %s access denied.", name);		err = 1;	      }	    else if (sgetcred ("ftp", pcred) == 0)	      {		pcred->guest = 1;		strcpy (pcred->message,			"Guest login ok, type your name as password.");	      }	    else	      {		snprintf (pcred->message, len, "User %s unknown.", name);		err = 1;	      }	    return err;	  }	if (sgetcred (name, pcred) == 0)	  {	    const char *cp;	    const char *shell;	    /* Check if the shell is allowed */	    shell = pcred->shell;	    if (shell == NULL || *shell == 0)	      shell = PATH_BSHELL;	    setusershell ();	    while ((cp = getusershell ()) != NULL)	      if (strcmp (cp, shell) == 0)		break;	    endusershell ();	    if (cp == NULL || checkuser (PATH_FTPUSERS, name))	      {		sprintf (pcred->message, "User %s access denied.", name);		return 1;	      }	  }	else	  {	    free (pcred->message);	    pcred->message = NULL;	    return 1;	  }	pcred->dochroot = checkuser(PATH_FTPCHROOT, pcred->name);	snprintf (pcred->message, len,		  "Password required for %s.", pcred->name);	return 0;      }    }   return -1;}intauth_pass (const char *passwd, struct credentials *pcred){  switch (pcred->auth_type)    {#ifdef WITH_PAM    case AUTH_TYPE_PAM:      return pam_pass (passwd, pcred);#endif#ifdef WITH_KERBEROS    case AUTH_TYPE_KERBEROS:      return -1;#endif#ifdef WITH_KERBEROS5    case AUTH_TYPE_KERBEROS5:      return -1;#endif#ifdef WITH_OPIE    case AUTH_TYPE_OPIE:      return -1;#endif    case AUTH_TYPE_PASSWD:    default:      {	char *xpasswd;	char *salt = pcred->passwd;	/* Try to authenticate the user.  */	if (pcred->passwd == NULL || *pcred->passwd == '\0')	  return 1; /* Failed. */	xpasswd = crypt (passwd, salt);	return  (!xpasswd || strcmp (xpasswd, pcred->passwd) != 0);      }    } /* switch (auth_type) */  return -1;}intsgetcred (const char *name, struct credentials *pcred){  struct passwd *p;  p = getpwnam (name);  if (p == NULL)    return 1;  if (pcred->name)    free (pcred->name);  if (pcred->passwd)    free (pcred->passwd);  if (pcred->homedir)    free (pcred->homedir);  if (pcred->rootdir)    free (pcred->rootdir);  if (pcred->shell)    free (pcred->shell);#if defined(HAVE_GETSPNAM) && defined(HAVE_SHADOW_H)  if (p->pw_passwd == NULL || strlen (p->pw_passwd) == 1)    {      struct  spwd *spw;      setspent ();      spw = getspnam (p->pw_name);      if (spw != NULL)	{	  time_t now;	  long today;	  now = time ((time_t *) 0);	  today = now / (60 * 60 * 24);	  if ((spw->sp_expire > 0 && spw->sp_expire < today)	      || (spw->sp_max > 0 && spw->sp_lstchg > 0		  && (spw->sp_lstchg + spw->sp_max < today)))	    {	      /*reply (530, "Login expired."); */	      p->pw_passwd = NULL;	    }	  else	    p->pw_passwd = spw->sp_pwdp;	}      endspent ();    }#endif  pcred->uid = p->pw_uid;  pcred->gid = p->pw_gid;  pcred->name = sgetsave (p->pw_name);  pcred->passwd = sgetsave (p->pw_passwd);  pcred->rootdir = sgetsave (p->pw_dir);  pcred->homedir = sgetsave ("/");  pcred->shell = sgetsave (p->pw_shell);  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -