I would like to suggest a feature that I believe would help out one
usability aspect of rysnc. The patch I am suggesting will allow the
rysnc module to return 1 of multiple secrets from the password file,
essentially allowing you to check ANY user's (whom belong to a team)
secret to see if it matches.

For example: For 2 users (user1 and user2) belonging to team1, it
would check all users passwords when they authenticates to their team
share

- User1 - password '123'
- User2 - password 'abc'
- Team1 - password '890'

When authenticating for team1 (as user1, user2, or team1), either of
the 3 passwords would work since any matching secret is returned. This
allows the admin to create teams where all users can log in using
their own password.

This would allow the following command to succeed

rsync -zavP * user1@servername::team1

So user1 could use his/her own password when transmitting files to the
team1 folder/share.

The patch attached to this email is against the 2.6.6 source. I would
perhaps suggest that another piece be added to have this be
implemented as a command-line switch.

--
Jeff Klink

--- rsync-2.6.6/authenticate.c 2005-04-10 13:09:10.000000000 -0400
+++ rsync-2.6.6.patched/authenticate.c 2005-09-12 14:44:59.091055616
-0400
@@ -76,7 +76,7 @@

/* Return the secret for a user from the secret file, null terminated.
* Maximum length is len (not counting the null). */
-static int get_secret(int module, char *user, char *secret, int len)
+static int get_secret(int module, char *user, char *secret, int len,
int skip_how_many)
{
char *fname = lp_secrets_file(module);
STRUCT_STAT st;
@@ -125,8 +125,13 @@
else if (p) {
if (*p == ch)
p++;
- else if (!*p && ch == ':')
- break;
+ else if (!*p && ch == ':') {
+ if (skip_how_many == 0)
+ break;
+
+ skip_how_many--;
+ p = NULL;
+ }
else
p = NULL;
}
@@ -262,23 +267,29 @@
}

memset(secret, 0, sizeof secret);
- if (!get_secret(module, line, secret, sizeof secret - 1)) {
- memset(secret, 0, sizeof secret);
- rprintf(FLOG, "auth failed on module %s from %s (%s): "
- "missing secret for user \"%s\"\n",
- lp_name(module), host, addr, line);
- return NULL;
- }
-
- generate_hash(secret, challenge, pass2);
- memset(secret, 0, sizeof secret);

- if (strcmp(pass, pass2) != 0) {
- rprintf(FLOG, "auth failed on module %s from %s (%s): "
- "password mismatch\n",
- lp_name(module), host, addr);
- return NULL;
- }
+ {
+ int skip = 0;
+ for (; {
+ if (!get_secret(module, line,
+ secret, sizeof(secret)-1, skip)) {
+ memset(secret, 0, sizeof secret);
+ rprintf(FLOG, "auth failed on module %s from
%s (%s): "
+ "password mismatch\n",
+ lp_name(module), host, addr);
+
+ return NULL;
+ }
+
+ generate_hash(secret, challenge, pass2);
+ memset(secret, 0, sizeof(secret));
+
+ if (strcmp(pass, pass2) == 0)
+ break;
+
+ skip++;
+ }
+ }

return strdup(line);
}


--
Please use reply-all for most replies to avoid omitting the mailing list.
To unsubscribe or change options: https://lists.samba.org/mailman/listinfo/rsync
Before posting, read: http://www.catb.org/~esr/faqs/smart-questions.html