Патч для vsftpd (*umask, ftpd_banner, WITH_DIE_DEBUG) (ftp patch)
Ключевые слова: 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;
2 , Avari (? ), 11:33, 08/09/2011 [ответить ]
+ /–
Я так понял, в vsftpd file_open_mode выполняет функцию, ради которой тут приделали отдельный umask для директорий (фактически ведь надо только обязательно включать бит x для директорий и опционально для файлов - file_open_mode это позволяет). Впрочем, с 2004 до 2011 года могло поменяться очень многое =)