restrict.c
上传用户:zibowangxu
上传日期:2007-01-04
资源大小:331k
文件大小:5k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. /****************************************************************************    
  2.   Copyright (c) 1999 WU-FTPD Development Group.  
  3.   All rights reserved.
  4.    
  5.   Portions Copyright (c) 1980, 1985, 1988, 1989, 1990, 1991, 1993, 1994  
  6.     The Regents of the University of California. 
  7.   Portions Copyright (c) 1993, 1994 Washington University in Saint Louis.  
  8.   Portions Copyright (c) 1996, 1998 Berkeley Software Design, Inc.  
  9.   Portions Copyright (c) 1989 Massachusetts Institute of Technology.  
  10.   Portions Copyright (c) 1998 Sendmail, Inc.  
  11.   Portions Copyright (c) 1983, 1995, 1996, 1997 Eric P.  Allman.  
  12.   Portions Copyright (c) 1997 by Stan Barber.  
  13.   Portions Copyright (c) 1997 by Kent Landfield.  
  14.   Portions Copyright (c) 1991, 1992, 1993, 1994, 1995, 1996, 1997  
  15.     Free Software Foundation, Inc.    
  16.    
  17.   Use and distribution of this software and its source code are governed   
  18.   by the terms and conditions of the WU-FTPD Software License ("LICENSE").  
  19.    
  20.   If you did not receive a copy of the license, it may be obtained online  
  21.   at http://www.wu-ftpd.org/license.html.  
  22.    
  23.   $Id: restrict.c,v 1.13 1999/10/08 03:42:12 wuftpd Exp $  
  24.    
  25. ****************************************************************************/
  26. /*
  27.  * Contributed by Glenn Nielsen <glenn@more.net>
  28.  * Mon, 18 Jan 1999 20:04:07 -0600
  29.  */
  30. #include "config.h"
  31. #include <sys/param.h>
  32. #include <stdlib.h>
  33. #include <string.h>
  34. #include <syslog.h>
  35. #include "proto.h"
  36. #ifdef HAVE_GETCWD
  37. extern char *getcwd(char *, size_t);
  38. #else
  39. extern char *getwd(char *);
  40. #endif
  41. #ifndef TRUE
  42. #define TRUE 1
  43. #define FALSE 0
  44. #endif
  45. extern char *home;
  46. extern int restricted_user;
  47. /*
  48.  * name is the function parameter
  49.  * home is a global string containing the user's home directory
  50.  *
  51.  * rhome is the resolved home directory
  52.  * rname is the resolved requested filename
  53.  * curwd is the current working directory
  54.  * path is name, possibly prepended by the current working directory
  55.  */
  56. int restrict_check(char *name)
  57. {
  58.     if (!test_restriction(name))
  59. return 0;
  60.     reply(550, "Permission denied on server.  You are restricted to your account.");
  61.     return 1;
  62. }
  63. int test_restriction(char *name)
  64. {
  65.     char rhome[MAXPATHLEN + 1], rname[MAXPATHLEN + 1], path[MAXPATHLEN + 1];
  66.     /* we're not in restrict mode so all access is OK */
  67.     if (restricted_user == FALSE)
  68. return 0;
  69.     /* get resolved equivalent of user's home directory */
  70.     fb_realpath(home, rhome);
  71.     path[0] = '';
  72.     /* a relative path is specified, so resolve it w.r.t. current working directory */
  73.     if ((name)[0] != '/') {
  74. char curwd[MAXPATHLEN + 1];
  75. /* determine current working directory */
  76. #ifdef HAVE_GETCWD
  77. if (getcwd(curwd, MAXPATHLEN) == (char *) NULL) {
  78. #else
  79. if (getwd(curwd) == (char *) NULL) {
  80. #endif
  81.     return 1;
  82. } /* if */
  83. strcpy(path, curwd);
  84. strcat(path, "/");
  85.     } /* if */
  86.     if ((strlen(path) + strlen(name) + 2) > sizeof(path)) {
  87. return 1;
  88.     }
  89.     strcat(path, name);
  90.     fb_realpath(path, rname);
  91.     strcat(rname, "/");
  92.     if (strncmp(rhome, rname, strlen(rhome))) {
  93. return 1;
  94.     } /* if */
  95.     return 0;
  96. } /* restrict_check */
  97. int restrict_list_check(char *name)
  98. {
  99.     char *beg, *copy, *end;
  100.     int flag;
  101.     beg = name;
  102.     while (*beg != '') {
  103. flag = 0;
  104. end = beg;
  105. while (*end && !isspace(*end))
  106.     ++end;
  107. if (!*end)
  108.     flag = 1;
  109. if (!flag)
  110.     *end = '';
  111. copy = strdup(beg);
  112. if (!flag)
  113.     *end = ' ';
  114. if (!copy) {
  115.     reply(550, "Permission denied on server.  Out of memory.");
  116.     return 1;
  117. } /* if */
  118. if (restrict_check(copy)) {
  119.     free(copy);
  120.     return 1;
  121. }
  122. free(copy);
  123. beg = end;
  124. if (!flag)
  125.     ++beg;
  126.     } /* while */
  127.     return 0;
  128. } /* restrict_list_check */
  129. /*
  130.  * $Log: restrict.c,v $
  131.  * Revision 1.13  1999/10/08 03:42:12  wuftpd
  132.  * Fixed a bug in restrict_check which could allow access outside the users home
  133.  *
  134.  * Revision 1.12  1999/09/05 02:31:50  wuftpd
  135.  * Add virtual and defaultserver support for email notification
  136.  *
  137.  * Revision 1.11  1999/09/02 19:35:48  wuftpd
  138.  * CDUP was leaking information about restrictions.
  139.  *
  140.  * Revision 1.10  1999/09/02 14:04:29  wuftpd
  141.  * Cleaning up.  Indented and removed some STDC checks
  142.  *
  143.  * Revision 1.9  1999/08/24 23:41:39  wuftpd
  144.  * wu-ftpd-2.4.x RCS Ids removed and new Ids added for wu-ftpd.org usage.
  145.  * WU-FTPD Development Group copyright headers added.
  146.  * Original Copyright headers moved into the COPYRIGHT file.
  147.  * COPYPRIGHT.c added to build for ftpshut and ftpd.
  148.  *
  149.  * Revision 1.2  1996/02/20 04:54:04  root
  150.  * added #define to make gcc use HAVE_GETCWD
  151.  *
  152.  * Revision 1.1  1996/02/20 03:52:48  root
  153.  * Initial revision
  154.  *
  155.  */