X-Git-Url: https://mattmccutchen.net/rsync/rsync-patches.git/blobdiff_plain/4c15e80040f6ac2fc79d599d1722cf209cc30536..0ef5abcbbb95298fa9faf1d3eb275a9e76e1d951:/nameconverter.diff diff --git a/nameconverter.diff b/nameconverter.diff index 2f428c8..1d65549 100644 --- a/nameconverter.diff +++ b/nameconverter.diff @@ -23,7 +23,7 @@ To use this patch, run these commands for a successful build: diff --git a/clientserver.c b/clientserver.c --- a/clientserver.c +++ b/clientserver.c -@@ -59,6 +59,7 @@ char *auth_user; +@@ -67,6 +67,7 @@ char *auth_user; int read_only = 0; int module_id = -1; int munge_symlinks = 0; @@ -31,15 +31,15 @@ diff --git a/clientserver.c b/clientserver.c struct chmod_mode_struct *daemon_chmod_modes; /* module_dirlen is the length of the module_dir string when in daemon -@@ -67,6 +68,7 @@ char *module_dir = NULL; - unsigned int module_dirlen = 0; +@@ -78,6 +79,7 @@ unsigned int module_dirlen = 0; + char *full_module_path; static int rl_nulls = 0; +static int namecvt_fd_req = -1, namecvt_fd_ans = -1; #ifdef HAVE_SIGACTION static struct sigaction sigact; -@@ -508,7 +510,7 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) +@@ -565,7 +567,7 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) log_init(1); #ifdef HAVE_PUTENV @@ -47,8 +47,8 @@ diff --git a/clientserver.c b/clientserver.c + if (*lp_prexfer_exec(i) || *lp_postxfer_exec(i) || *lp_name_converter(i)) { char *modname, *modpath, *hostaddr, *hostname, *username; int status; - if (asprintf(&modname, "RSYNC_MODULE_NAME=%s", name) < 0 -@@ -595,6 +597,44 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) + +@@ -654,6 +656,44 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) set_blocking(fds[1]); pre_exec_fd = fds[1]; } @@ -93,7 +93,7 @@ diff --git a/clientserver.c b/clientserver.c umask(0); } #endif -@@ -789,6 +829,44 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) +@@ -877,6 +917,44 @@ static int rsync_module(int f_in, int f_out, int i, char *addr, char *host) return 0; } @@ -141,7 +141,7 @@ diff --git a/clientserver.c b/clientserver.c diff --git a/loadparm.c b/loadparm.c --- a/loadparm.c +++ b/loadparm.c -@@ -139,6 +139,7 @@ typedef struct +@@ -140,6 +140,7 @@ typedef struct char *log_file; char *log_format; char *name; @@ -149,7 +149,7 @@ diff --git a/loadparm.c b/loadparm.c char *outgoing_chmod; char *path; char *postxfer_exec; -@@ -188,6 +189,7 @@ static service sDefault = +@@ -191,6 +192,7 @@ static service sDefault = /* log_file; */ NULL, /* log_format; */ "%o %h [%a] %m (%u) %f %l", /* name; */ NULL, @@ -157,44 +157,46 @@ diff --git a/loadparm.c b/loadparm.c /* outgoing_chmod; */ NULL, /* path; */ NULL, /* postxfer_exec; */ NULL, -@@ -323,6 +325,7 @@ static struct parm_struct parm_table[] = +@@ -328,6 +330,7 @@ static struct parm_struct parm_table[] = {"max verbosity", P_INTEGER,P_LOCAL, &sDefault.max_verbosity, NULL,0}, {"munge symlinks", P_BOOL, P_LOCAL, &sDefault.munge_symlinks, NULL,0}, {"name", P_STRING, P_LOCAL, &sDefault.name, NULL,0}, + {"name converter", P_STRING, P_LOCAL, &sDefault.name_converter, NULL,0}, + {"numeric ids", P_BOOL, P_LOCAL, &sDefault.numeric_ids, NULL,0}, {"outgoing chmod", P_STRING, P_LOCAL, &sDefault.outgoing_chmod, NULL,0}, {"path", P_PATH, P_LOCAL, &sDefault.path, NULL,0}, - #ifdef HAVE_PUTENV -@@ -411,6 +414,7 @@ FN_LOCAL_STRING(lp_outgoing_chmod, outgoing_chmod) +@@ -418,6 +421,7 @@ FN_LOCAL_STRING(lp_outgoing_chmod, outgoing_chmod) FN_LOCAL_STRING(lp_path, path) FN_LOCAL_STRING(lp_postxfer_exec, postxfer_exec) FN_LOCAL_STRING(lp_prexfer_exec, prexfer_exec) +FN_LOCAL_STRING(lp_name_converter, name_converter) FN_LOCAL_STRING(lp_refuse_options, refuse_options) FN_LOCAL_STRING(lp_secrets_file, secrets_file) - FN_LOCAL_INTEGER(lp_syslog_facility, syslog_facility) + FN_LOCAL_STRING(lp_temp_dir, temp_dir) diff --git a/rsyncd.conf.yo b/rsyncd.conf.yo --- a/rsyncd.conf.yo +++ b/rsyncd.conf.yo -@@ -144,7 +144,10 @@ args if rsync believes they would escape the chroot. - The default for "use chroot" is true, and is the safer choice (especially - if the module is not read-only). +@@ -159,10 +159,11 @@ if the module is not read-only). --In order to preserve usernames and groupnames, rsync needs to be able to -+In order to preserve usernames and groupnames, you can use the -+bf(name converter) option to specify a name-converting program that the -+rsync daemon will start prior to enabling chroot (see the option for more -+details). If that option is not specified, the daemon needs to be able to + When this parameter is enabled, rsync will not attempt to map users and groups + by name (by default), but instead copy IDs as though bf(--numeric-ids) had +-been specified. In order to enable name-mapping, rsync needs to be able to ++been specified. In order to enable name-mapping, rsync needs either the ++bf(name converter) parameter to specify a conversion program, or it needs to use the standard library functions for looking up names and IDs (i.e. - code(getpwuid()), code(getgrgid()), code(getpwname()), and code(getgrnam())). This means a - process in the chroot namespace will need to have access to the resources -@@ -200,6 +203,27 @@ path elements that rsync believes will allow a symlink to escape the module's + code(getpwuid()), code(getgrgid()), code(getpwname()), and code(getgrnam())). +-This means the rsync ++The latter choice means the rsync + process in the chroot hierarchy will need to have access to the resources + used by these library functions (traditionally /etc/passwd and + /etc/group, but perhaps additional dynamic libraries as well). +@@ -227,6 +228,27 @@ path elements that rsync believes will allow a symlink to escape the module's hierarchy. There are tricky ways to work around this, though, so you had - better trust your users if you choose this combination of options. + better trust your users if you choose this combination of parameters. -+dit(bf(name converter)) The "name converter" option lets you specify a ++dit(bf(name converter)) This parameter lets you specify a +program that will be run by the rsync daemon (prior to bf(use chroot), if -+that option is enabled) to convert user/group names into numbers or visa ++that parameter is enabled) to convert user/group names into numbers or visa +versa. There is a sample perl script in the support directory named +"nameconvert" that you can use to enable the use of the normal passwd/group +lookup calls in a chroot daemon (which does not require any extra files @@ -213,15 +215,15 @@ diff --git a/rsyncd.conf.yo b/rsyncd.conf.yo +bf(RSYNC_USER_NAME). This is useful if you want to customize the +conversion using a single program invocation. + - dit(bf(max connections)) The "max connections" option allows you to - specify the maximum number of simultaneous connections you will allow. - Any clients connecting when the maximum has been reached will receive a + dit(bf(charset)) This specifies the name of the character set in which the + module's filenames are stored. If the client uses an bf(--iconv) option, + the daemon will use the value of the "charset" parameter regardless of the diff --git a/support/nameconvert b/support/nameconvert new file mode 100755 --- /dev/null +++ b/support/nameconvert -@@ -0,0 +1,42 @@ -+#!/usr/bin/perl -w +@@ -0,0 +1,43 @@ ++#!/usr/bin/perl +# This implements a simple protocol to do {user,group}-{name,id} +# conversions. All input and output consists of simple strings +# with a terminating null char (or newline for debugging). If @@ -240,6 +242,7 @@ new file mode 100755 +# "name converter" setting. + +use strict; ++use warnings; + +my $eol = grep(/^--debug$/, @ARGV) ? "\n" : "\0"; +$/ = $eol; @@ -266,15 +269,15 @@ new file mode 100755 diff --git a/t_stub.c b/t_stub.c --- a/t_stub.c +++ b/t_stub.c -@@ -29,6 +29,7 @@ int module_dirlen = 0; +@@ -30,6 +30,7 @@ int preserve_xattrs = 0; mode_t orig_umask = 002; char *partial_dir; char *module_dir; +pid_t namecvt_pid; - struct filter_list_struct server_filter_list; + struct filter_list_struct daemon_filter_list; void rprintf(UNUSED(enum logcode code), const char *format, ...) -@@ -69,6 +70,11 @@ struct filter_list_struct server_filter_list; +@@ -75,6 +76,11 @@ struct filter_list_struct daemon_filter_list; return -1; } @@ -330,19 +333,19 @@ diff --git a/uidlist.c b/uidlist.c diff --git a/util.c b/util.c --- a/util.c +++ b/util.c -@@ -30,9 +30,10 @@ extern int modify_window; - extern int relative_paths; +@@ -31,9 +31,10 @@ extern int relative_paths; extern int human_readable; + extern int preserve_xattrs; extern char *module_dir; -extern unsigned int module_dirlen; extern mode_t orig_umask; extern char *partial_dir; +extern pid_t namecvt_pid; +extern unsigned int module_dirlen; - extern struct filter_list_struct server_filter_list; + extern struct filter_list_struct daemon_filter_list; int sanitize_paths = 0; -@@ -468,24 +469,44 @@ void kill_all(int sig) +@@ -497,24 +498,44 @@ void kill_all(int sig) /** Turn a user name into a uid */ int name_to_uid(const char *name, uid_t *uid_p) {