On Fri, Feb 22, 2019 at 03:32:43PM +1100, Darren Tucker wrote: > On Wed, 20 Feb 2019 at 23:54, Corinna Vinschen <vinschen@xxxxxxxxxx> wrote: > > The previous revert enabled case-insensitive user names again. This > > patch implements the case-insensitive user and group name matching. > > To allow Unicode chars, implement the matcher using wchar_t chars in > > Cygwin-specific code. Keep the generic code changes as small as possible. > > Cygwin: implement case-insensitive Unicode user and group name matching > > Applied, thanks. > > I think it might be possible to make this less intrusive by adding a > match_user_pattern_list() function that just calls match_pattern_list > on Unix-alikes and the Cygwin specific function there. I'll take a > look. How's this? If we push the match_usergroup_pattern_list() function up to OpenBSD it should mean most future diffs will apply cleanly. diff --git a/groupaccess.c b/groupaccess.c index 43367990..1a498d16 100644 --- a/groupaccess.c +++ b/groupaccess.c @@ -103,11 +103,8 @@ ga_match_pattern_list(const char *group_pattern) int i, found = 0; for (i = 0; i < ngroups; i++) { -#ifndef HAVE_CYGWIN - switch (match_pattern_list(groups_byname[i], group_pattern, 0)) { -#else - switch (match_pattern_list(groups_byname[i], group_pattern, 1)) { -#endif + switch (match_usergroup_pattern_list(groups_byname[i], + group_pattern)) { case -1: return 0; /* Negated match wins */ case 0: diff --git a/match.c b/match.c index b50ae405..1976a704 100644 --- a/match.c +++ b/match.c @@ -111,8 +111,6 @@ match_pattern(const char *s, const char *pattern) /* NOTREACHED */ } -#ifndef HAVE_CYGWIN /* Cygwin version in openbsd-compat/bsd-cygwin_util.c */ - /* * Tries to match the string against the * comma-separated sequence of subpatterns (each possibly preceded by ! to @@ -172,7 +170,17 @@ match_pattern_list(const char *string, const char *pattern, int dolower) return got_positive; } +int +match_usergroup_pattern_list(const char *string, const char *pattern) +{ +#ifdef HAVE_CYGWIN + /* Windows usernames may be Unicode are not case sensitive */ + return cygwin_match_pattern_list(string, pattern, 1); +#else + /* On most systems usernames are case sensitive. */ + return match_pattern_list(string, pattern, 0); #endif +} /* * Tries to match the host name (which must be in all lowercase) against the diff --git a/match.h b/match.h index 852b1a5c..d98b0cb8 100644 --- a/match.h +++ b/match.h @@ -16,6 +16,7 @@ int match_pattern(const char *, const char *); int match_pattern_list(const char *, const char *, int); +int match_usergroup_pattern_list(const char *, const char *); int match_hostname(const char *, const char *); int match_host_and_ip(const char *, const char *, const char *); int match_user(const char *, const char *, const char *, const char *); diff --git a/openbsd-compat/bsd-cygwin_util.c b/openbsd-compat/bsd-cygwin_util.c index f721fca9..b39e1389 100644 --- a/openbsd-compat/bsd-cygwin_util.c +++ b/openbsd-compat/bsd-cygwin_util.c @@ -212,7 +212,8 @@ _match_pattern(const char *s, const char *pattern, int caseinsensitive) * a positive match, 0 if there is no match at all. */ int -match_pattern_list(const char *string, const char *pattern, int caseinsensitive) +cygwin_match_pattern_list(const char *string, const char *pattern, + int caseinsensitive) { char sub[1024]; int negated; diff --git a/openbsd-compat/bsd-cygwin_util.h b/openbsd-compat/bsd-cygwin_util.h index 202c055d..b1fa37b0 100644 --- a/openbsd-compat/bsd-cygwin_util.h +++ b/openbsd-compat/bsd-cygwin_util.h @@ -55,6 +55,7 @@ int binary_open(const char *, int , ...); int check_ntsec(const char *); char **fetch_windows_environment(void); void free_windows_environment(char **); +int cygwin_match_pattern_list(const char *, const char *, int); #ifndef NO_BINARY_OPEN #define open binary_open diff --git a/servconf.c b/servconf.c index 4fa896fd..2365e15b 100644 --- a/servconf.c +++ b/servconf.c @@ -1049,11 +1049,7 @@ match_cfg_line(char **condition, int line, struct connection_info *ci) } if (ci->user == NULL) match_test_missing_fatal("User", "user"); -#ifndef HAVE_CYGWIN - if (match_pattern_list(ci->user, arg, 0) != 1) -#else - if (match_pattern_list(ci->user, arg, 1) != 1) -#endif + if (match_usergroup_pattern_list(ci->user, arg) != 1) result = 0; else debug("user %.100s matched 'User %.100s' at " -- Darren Tucker (dtucker at dtucker.net) GPG key 11EAA6FA / A86E 3E07 5B19 5880 E860 37F4 9357 ECEF 11EA A6FA (new) Good judgement comes with experience. Unfortunately, the experience usually comes from bad judgement. _______________________________________________ openssh-unix-dev mailing list openssh-unix-dev@xxxxxxxxxxx https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev