The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Патч для vsftpd (*umask, ftpd_banner, WITH_DIE_DEBUG) (ftp patch)


<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>
Ключевые слова: ftp, patch,  (найти похожие документы)
From: butcher <bu7cher[at]yandex.ru> Newsgroups: email Date: Mon, 21 Jun 2004 14:31:37 +0000 (UTC) Subject: Патч для vsftpd (*umask, ftpd_banner, WITH_DIE_DEBUG) Более новые версии патча: http://butcher.heavennet.ru/patches/other/vsftpd/ Собственно, решив перейти с proftpd на vsftpd обнаружились некоторые недостатки в последнем, которые пришлось устранить руками :) Сабж немного расширяет возможности vsftpd-1.2.2, что именно он включает: 1. Две опции со значениями по умолчанию: * anon_dirs_umask = 077 * local_dirs_umask = 077 устанавливают значение umask соответсвенно для анонимных и локальных пользователей. Пример: есть каталог incoming, доступный всем для записи и есть домашние каталоги пользователей. anon_umask=0111 anon_dirs_umask=0 local_umask=0137 local_dirs_umask=027 каталоги будут создаваться с правами - rwxrwxrwx, а файлы - rw-rw-rw- а для локальных пользователей: каталоги - rwxr-x---, файлы - rw-r----- 2. Из вывода команды STAT убрано сообщение "vsFTPd - secure, fast, stable", если в конфиге задан параметр ftpd_banner 3. При "нестандартных" ситуациях, когда демон "валится" он пишет отладочную информацию в ответ клиенту, например: "500 OOPS: bla-bla-bla" Это тоже отключил, пусть молча валится :) Если кому-то это нужно, можно включить, при компиляции указав в параметрах make WITH_DIE_DEBUG=yes Пару слов об установке. Во FreeBSD из портов: * создать каталог /usr/ports/ftp/vsftpd/files * скопировать туда патч под именем patch-aa * (пере)установить порт При установке из сырцов, скопировать патч в катлог с исходниками, и выполнить patch < имя_пайла_с_патчем, далее как обычно. PS. патч послан атору, так что возможно, что в следующих релизах что-то из этого будет уже включено.
--- Makefile Mon Sep 15 15:41:58 2003 +++ Makefile Sat Jun 19 13:39:05 2004 @@ -16,6 +16,10 @@ tcpwrap.o ipv6parse.o access.o \ sysutil.o sysdeputil.o +.if defined ( WITH_DIE_DEBUG ) +CFLAGS += -DDIE_DEBUG +.endif + .c.o: $(CC) -c $*.c $(CFLAGS) $(IFLAGS) --- parseconf.c Tue Apr 20 04:25:30 2004 +++ parseconf.c Fri Jun 18 23:43:24 2004 @@ -99,6 +99,8 @@ { "connect_timeout", &tunable_connect_timeout }, { "local_umask", &tunable_local_umask }, { "anon_umask", &tunable_anon_umask }, + { "anon_dirs_umask", &tunable_anon_dirs_umask }, + { "local_dirs_umask", &tunable_local_dirs_umask }, { "ftp_data_port", &tunable_ftp_data_port }, { "idle_session_timeout", &tunable_idle_session_timeout }, { "data_connection_timeout", &tunable_data_connection_timeout }, --- postlogin.c Wed Apr 21 03:31:05 2004 +++ postlogin.c Fri Jun 18 23:49:21 2004 @@ -34,7 +34,7 @@ static void handle_type(struct vsf_session* p_sess); static void handle_port(struct vsf_session* p_sess); static void handle_stor(struct vsf_session* p_sess); -static void handle_mkd(struct vsf_session* p_sess); +static void handle_mkd(struct vsf_session* p_sess, unsigned int dirs_umask); static void handle_rmd(struct vsf_session* p_sess); static void handle_dele(struct vsf_session* p_sess); static void handle_rest(struct vsf_session* p_sess); @@ -215,7 +215,10 @@ (str_equal_text(&p_sess->ftp_cmd_str, "MKD") || str_equal_text(&p_sess->ftp_cmd_str, "XMKD"))) { - handle_mkd(p_sess); + if(p_sess->is_anonymous) + handle_mkd(p_sess, tunable_anon_dirs_umask); + else + handle_mkd(p_sess, tunable_local_dirs_umask); } else if (tunable_write_enable && (tunable_anon_other_write_enable || !p_sess->is_anonymous) && @@ -1047,7 +1050,7 @@ } static void -handle_mkd(struct vsf_session* p_sess) +handle_mkd(struct vsf_session* p_sess, unsigned int dirs_umask) { int retval; if (!vsf_access_check_file(&p_sess->ftp_arg_str)) @@ -1066,6 +1069,8 @@ vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Create directory operation failed."); return; + } else { + str_chmod(&p_sess->ftp_arg_str, (~dirs_umask) & 0777); } vsf_log_do_log(p_sess, 1); { @@ -1604,7 +1609,10 @@ vsf_cmdio_write_raw(p_sess, vsf_sysutil_ulong_to_str(p_sess->num_clients)); vsf_cmdio_write_raw(p_sess, "\r\n"); } + if (tunable_ftpd_banner == 0) + { vsf_cmdio_write_raw(p_sess, " vsFTPd - secure, fast, stable\r\n"); + } vsf_cmdio_write(p_sess, FTP_STATOK, "End of status"); } --- tunables.c Tue Apr 20 04:25:05 2004 +++ tunables.c Fri Jun 18 23:43:24 2004 @@ -62,6 +62,8 @@ unsigned int tunable_connect_timeout = 60; unsigned int tunable_local_umask = 077; unsigned int tunable_anon_umask = 077; +unsigned int tunable_local_dirs_umask = 077; +unsigned int tunable_anon_dirs_umask = 077; unsigned int tunable_ftp_data_port = 20; unsigned int tunable_idle_session_timeout = 300; unsigned int tunable_data_connection_timeout = 300; --- tunables.h Tue Apr 20 04:24:47 2004 +++ tunables.h Fri Jun 18 23:43:24 2004 @@ -59,6 +59,8 @@ extern unsigned int tunable_connect_timeout; extern unsigned int tunable_local_umask; extern unsigned int tunable_anon_umask; +extern unsigned int tunable_local_dirs_umask; +extern unsigned int tunable_anon_dirs_umask; extern unsigned int tunable_ftp_data_port; extern unsigned int tunable_idle_session_timeout; extern unsigned int tunable_data_connection_timeout; --- utility.c Fri Apr 16 02:47:05 2004 +++ utility.c Sat Jun 19 12:54:10 2004 @@ -10,7 +10,6 @@ #include "str.h" #include "defs.h" -#define DIE_DEBUG void die(const char* p_text) --- vsftpd.conf.5 Wed Apr 21 03:51:37 2004 +++ vsftpd.conf.5 Fri Jun 18 23:43:24 2004 @@ -445,6 +445,12 @@ Default: 60 .TP +.B anon_dirs_umask +The value that the umask for directory creation is set to for anonymous users. NOTE! If you want to specify octal values, remember the "0" prefix otherwise the +value will be treated as a base 10 integer! + +Default: 077 +.TP .B anon_max_rate The maximum data transfer rate permitted, in bytes per second, for anonymous clients. @@ -497,6 +503,13 @@ incoming FTP connections. Default: 21 +.TP +.B local_dirs_umask +The value that the umask for directory creation is set to for local users. NOTE! If +you want to specify octal values, remember the "0" prefix otherwise the value +will be treated as a base 10 integer! + +Default: 077 .TP .B local_max_rate The maximum data transfer rate permitted, in bytes per second, for local
patch-ab: Патч добавляет две новых опции: filenames_windows_compat и filenames_deny_leadspaces. * filenames_windows_compat = YES запрещает клиентам FTP сервера использовать в именах файлов некорректные для ОС Windows символы. Это *|\/?<>", а так же символ точки в конце имени и управляющие символы с кодом < 32. * filenames_deny_leadspaces = YES запрещает использовать в качестве начального символа имени пробельные символы. В основном это предназначено для более комфортной работы файловых хранилищ в связках vsftpd+samba. Лидирующие пробельные символы делают невозможным доступ к файлам и каталогом для некоторых FTP-клиентов.
--- parseconf.c Sat Jan 13 16:00:16 2007 +++ parseconf.c Sat Jan 13 20:22:54 2007 @@ -99,6 +99,8 @@ { "mdtm_write", &tunable_mdtm_write }, { "lock_upload_files", &tunable_lock_upload_files }, { "pasv_addr_resolve", &tunable_pasv_addr_resolve }, + { "filenames_windows_compat", &tunable_filenames_windows_compat }, + { "filenames_deny_leadspaces", &tunable_filenames_deny_leadspaces }, { 0, 0 } }; --- postlogin.c Sat Jan 13 16:00:16 2007 +++ postlogin.c Sat Jan 13 21:06:04 2007 @@ -958,6 +958,18 @@ { return; } + if (tunable_filenames_windows_compat && + !str_windows_compat(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } + if (tunable_filenames_deny_leadspaces && + str_have_leadspace(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } resolve_tilde(&p_sess->ftp_arg_str, p_sess); p_filename = &p_sess->ftp_arg_str; if (is_unique) @@ -1086,6 +1098,18 @@ handle_mkd(struct vsf_session* p_sess) { int retval; + if (tunable_filenames_windows_compat && + !str_windows_compat(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } + if (tunable_filenames_deny_leadspaces && + str_have_leadspace(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } resolve_tilde(&p_sess->ftp_arg_str, p_sess); vsf_log_start_entry(p_sess, kVSFLogEntryMkdir); str_copy(&p_sess->log_str, &p_sess->ftp_arg_str); @@ -1123,6 +1147,18 @@ handle_rmd(struct vsf_session* p_sess) { int retval; + if (tunable_filenames_windows_compat && + !str_windows_compat(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } + if (tunable_filenames_deny_leadspaces && + str_have_leadspace(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } resolve_tilde(&p_sess->ftp_arg_str, p_sess); vsf_log_start_entry(p_sess, kVSFLogEntryRmdir); str_copy(&p_sess->log_str, &p_sess->ftp_arg_str); @@ -1150,6 +1186,18 @@ handle_dele(struct vsf_session* p_sess) { int retval; + if (tunable_filenames_windows_compat && + !str_windows_compat(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } + if (tunable_filenames_deny_leadspaces && + str_have_leadspace(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } resolve_tilde(&p_sess->ftp_arg_str, p_sess); vsf_log_start_entry(p_sess, kVSFLogEntryDelete); str_copy(&p_sess->log_str, &p_sess->ftp_arg_str); @@ -1193,6 +1241,18 @@ static struct vsf_sysutil_statbuf* p_statbuf; int retval; /* Clear old value */ + if (tunable_filenames_windows_compat && + !str_windows_compat(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } + if (tunable_filenames_deny_leadspaces && + str_have_leadspace(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } str_free(&p_sess->rnfr_filename_str); resolve_tilde(&p_sess->ftp_arg_str, p_sess); if (!vsf_access_check_file(&p_sess->ftp_arg_str)) @@ -1232,6 +1292,18 @@ "RNFR required first."); return; } + if (tunable_filenames_windows_compat && + !str_windows_compat(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } + if (tunable_filenames_deny_leadspaces && + str_have_leadspace(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } resolve_tilde(&p_sess->ftp_arg_str, p_sess); vsf_log_start_entry(p_sess, kVSFLogEntryRename); str_copy(&p_sess->log_str, &p_sess->rnfr_filename_str); @@ -1449,6 +1521,18 @@ vsf_cmdio_write(p_sess, FTP_BADCMD, "SITE CHMOD needs 2 arguments."); return; } + if (tunable_filenames_windows_compat && + !str_windows_compat(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } + if (tunable_filenames_deny_leadspaces && + str_have_leadspace(&p_sess->ftp_arg_str)) + { + vsf_cmdio_write(p_sess, FTP_FILEFAIL, "Incorrect directory or file name"); + return; + } resolve_tilde(&s_chmod_file_str, p_sess); vsf_log_start_entry(p_sess, kVSFLogEntryChmod); str_copy(&p_sess->log_str, &s_chmod_file_str); @@ -1827,4 +1911,3 @@ } } } - --- str.c Sat Jan 13 16:00:16 2007 +++ str.c Sat Jan 13 20:49:18 2007 @@ -666,3 +666,24 @@ } } +int +str_windows_compat(const struct mystr *p_str) +{ + unsigned int i; + for (i = 0; i < p_str->len; i++) + { + if (!vsf_sysutil_iswindowscompat(p_str->p_buf[i])) + { + return 0; + } + } + if ((unsigned char)p_str->p_buf[i-1] == '.') + return 0; + return 1; +} + +int +str_have_leadspace(const struct mystr *p_str) +{ + return vsf_sysutil_isspace(p_str->p_buf[0]); +} --- str.h Sat Jan 13 16:00:16 2007 +++ str.h Sat Jan 13 20:49:05 2007 @@ -99,6 +99,8 @@ int str_atoi(const struct mystr* p_str); filesize_t str_a_to_filesize_t(const struct mystr* p_str); unsigned int str_octal_to_uint(const struct mystr* p_str); +int str_windows_compat(const struct mystr* p_str); +int str_have_leadspace(const struct mystr* p_str); /* PURPOSE: Extract a line of text (delimited by \n or EOF) from a string * buffer, starting at character position 'p_pos'. The extracted line will --- sysutil.c Sat Jan 13 16:00:16 2007 +++ sysutil.c Sat Jan 13 16:41:08 2007 @@ -902,6 +902,24 @@ return isprint(the_char); } +int vsf_sysutil_iswindowscompat(int the_char) +{ + unsigned char uc = (unsigned char) the_char; + switch (uc) { + case '\\': + case '|': +/* case '/':*/ + case ':': + case '?': + case '"': + case '>': + case '<': + case '*': + return 0; + }; + return (uc > 31); +} + int vsf_sysutil_isalnum(int the_char) { --- sysutil.h Sat Jan 13 16:00:16 2007 +++ sysutil.h Sat Jan 13 16:21:17 2007 @@ -199,6 +199,7 @@ int vsf_sysutil_isprint(int the_char); int vsf_sysutil_isalnum(int the_char); int vsf_sysutil_isdigit(int the_char); +int vsf_sysutil_iswindowscompat(int the_char); /* Socket handling */ struct vsf_sysutil_sockaddr; --- tunables.c Sat Jan 13 16:00:16 2007 +++ tunables.c Sat Jan 13 20:21:25 2007 @@ -71,6 +71,8 @@ int tunable_mdtm_write = 1; int tunable_lock_upload_files = 1; int tunable_pasv_addr_resolve = 0; +int tunable_filenames_windows_compat = 0; +int tunable_filenames_deny_leadspaces = 0; unsigned int tunable_accept_timeout = 60; unsigned int tunable_connect_timeout = 60; --- tunables.h Sat Jan 13 16:00:16 2007 +++ tunables.h Sat Jan 13 20:22:17 2007 @@ -67,6 +67,8 @@ extern int tunable_mdtm_write; /* Allow MDTM to set timestamps */ extern int tunable_lock_upload_files; /* Lock uploading files */ extern int tunable_pasv_addr_resolve; /* DNS resolve pasv_addr */ +extern int tunable_filenames_windows_compat; /* Allow create only windows compatible filenames */ +extern int tunable_filenames_deny_leadspaces; /* Restrict leading spaces in filenames */ /* Integer/numeric defines */ extern unsigned int tunable_accept_timeout;

<< Предыдущая ИНДЕКС Правка src / Печать Следующая >>

Обсуждение [ RSS ]
  • 2, Avari (?), 11:33, 08/09/2011 [ответить]  
  • +/
    Я так понял, в vsftpd file_open_mode выполняет функцию, ради которой тут приделали отдельный umask для директорий (фактически ведь надо только обязательно включать бит x для директорий и опционально для файлов - file_open_mode это позволяет). Впрочем, с 2004 до 2011 года могло поменяться очень многое =)
     

    игнорирование участников | лог модерирования

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2020 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру