[PATCH 2/2] Cygwin: implement case-insensitive Unicode user and group name matching
Darren Tucker
dtucker at dtucker.net
Fri Feb 22 16:02:54 AEDT 2019
On Fri, Feb 22, 2019 at 03:32:43PM +1100, Darren Tucker wrote:
> On Wed, 20 Feb 2019 at 23:54, Corinna Vinschen <vinschen at redhat.com> 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.
More information about the openssh-unix-dev
mailing list