Subject: Re: Updated partial auth patch against CVS
From: "Karl M" <[email-masked]>
To: [email-masked]
Cc: [email-masked]
Date: Sat, 05 May 2001 14:17:22 -0700

Hi Carson...

Here is what I have so far. This is a patch based on 2.5.2p2 with your 
patch. So this is a patch on top of your patch. This patch allows

AuthOrder2 publickey:uidmatch,publickey:password

for the CygWin environment. It also highlites a couple of minor things I 
found in your patch. When you have a 2.9p1 patch I will update this.

Thanks,

...Karl

_________________________________________________________________
Get your FREE download of MSN Explorer at http://explorer.msn.com
diff -u -r ./auth2.c /openssh-2.5.2p2/auth2.c
--- ./auth2.c	Sat May  5 13:52:11 2001
+++ /openssh-2.5.2p2/auth2.c	Sat May  5 13:59:52 2001
@@ -186,6 +186,8 @@
	Authorder *ao = NULL;
	char *user, *service, *method, *style = NULL;
	int authenticated = 0;
+	int r;
+	int tempuid;

	if (authctxt == NULL)
		fatal("input_userauth_request: no authctxt");
@@ -259,12 +261,37 @@
		authenticated = 0;
#endif /* USE_PAM */

+	authctxt->partial = 0;
+/* Karl-->Carson: We could change this to a while if we want to let 
matchuid
+		  have subauth methods. */
	if (authenticated && (ao->sub != NULL)) {
		authctxt->partial = 1;
		authenticated = 0;
		lastauth = ao;
+#ifdef HAVE_CYGWIN
+		ao = ao->sub;
+		while (((r = strcmp("matchuid",ao->name)) != 0) && (ao->next != NULL))
+			ao = ao->next;
+		if ((r == 0) && (getuid() == authctxt->pw->pw_uid)) {
+			authctxt->partial = 0;
+			authenticated = 1;
+		}
+#endif
	}

+#ifdef HAVE_CYGWIN
+/* Karl-->Corinna: I have removed the check_nt_calls from everything but
+		   userauth_passwd. I want to make sure that we have a
+		   password if we need it. Is there a better way to do this? */
+	if (authenticated) {
+		tempuid = getuid();
+		setuid(authctxt->pw->pw_uid);
+		if (getuid() != authctxt->pw->pw_uid)
+			authenticated = 0;
+		setuid(tempuid);
+	}
+#endif
+
	/* Log before sending the reply */
	auth_log(authctxt, authenticated, method, " ssh2");

@@ -381,10 +408,6 @@
	if (authctxt->valid == 0)
		return(0);

-#ifdef HAVE_CYGWIN
-	if (check_nt_auth(1, authctxt->pw->pw_uid) == 0)
-		return(0);
-#endif
#ifdef USE_PAM
	return auth_pam_password(authctxt->pw, "");
#elif defined(HAVE_OSF_SIA)
@@ -445,10 +468,6 @@
#endif
	xfree(lang);
	xfree(devs);
-#ifdef HAVE_CYGWIN
-	if (check_nt_auth(0, authctxt->pw->pw_uid) == 0)
-		return(0);
-#endif
	return authenticated;
}

@@ -551,10 +570,6 @@
	debug2("userauth_pubkey: authenticated %d pkalg %s", authenticated, pkalg);
	xfree(pkalg);
	xfree(pkblob);
-#ifdef HAVE_CYGWIN
-	if (check_nt_auth(0, authctxt->pw->pw_uid) == 0)
-		return(0);
-#endif
	return authenticated;
}

@@ -638,7 +653,8 @@
					r = 1;
				} else {
					as = ao->sub;
-					while ((r = strncmp(as->name, cp, i)) != 0) {
+/* Karl-->Carson: Needs to be case insensitive for the way servconf.c is 
now. */
+					while ((r = strncasecmp(as->name, cp, i)) != 0) {
						if (as->next != NULL) {
							as = as->next;
						} else {
@@ -664,7 +680,8 @@
				break;
			case ',':
				ao = authorder;
-				while(((r = strncmp(ao->name, cp, i)) != 0) && (ao->next != NULL)) {
+/* Karl-->Carson: Needs to be case insensitive for the way servconf.c is 
now. */
+				while(((r = strncasecmp(ao->name, cp, i)) != 0) && (ao->next != NULL)) 
{
					ao = ao->next;
				}
				if (r != 0) {
@@ -704,18 +721,39 @@
	}

	as = ao;
+#ifdef HAVE_CYGWIN
+	if (strcmp("matchuid",as->name) != 0)
+#endif
	size = strlen(as->name) + 1;
	while (as->next != NULL) {
		as = as->next;
+#ifdef HAVE_CYGWIN
+		if (strcmp("matchuid",as->name) != 0)
+#endif
		size += strlen(as->name) + 1;
	}
+#ifdef HAVE_CYGWIN
+	if (size == 0)
+		fatal("authmethods_get_new: no authmethods");
+#endif
+/* Karl-->Carson: No need for "size++;" here, is there? */
	size++;			/* trailing '\0' */
	list = xmalloc(size);
+#ifdef HAVE_CYGWIN
+	if (strcmp("matchuid",ao->name) == 0)
+		ao = ao->next;
+#endif
	strlcpy(list, ao->name, size);
	while(ao->next != NULL) {
		ao = ao->next;
+#ifdef HAVE_CYGWIN
+		if (strcmp("matchuid",ao->name) != 0) {
+#endif
		strlcat(list, DELIM, size);
		strlcat(list, ao->name, size);
+#ifdef HAVE_CYGWIN
+		}
+#endif
	}
	return list;
}
diff -u -r ./defines.h /openssh-2.5.2p2/defines.h
--- ./defines.h	Mon Mar 19 17:49:22 2001
+++ /openssh-2.5.2p2/defines.h	Fri May  4 20:49:04 2001
@@ -436,7 +436,7 @@
  * configure.in sets this for a few OS's which are known to have problems
  * but you may need to set it yourself
  */
-/* #define USE_PIPES 1 */
+#define USE_PIPES 1

/**
  ** login recorder definitions
diff -u -r ./openbsd-compat/strmode.c 
/openssh-2.5.2p2/openbsd-compat/strmode.c
--- ./openbsd-compat/strmode.c	Wed Jan 31 12:52:04 2001
+++ /openssh-2.5.2p2/openbsd-compat/strmode.c	Fri May  4 20:34:46 2001
@@ -42,6 +42,15 @@
#include <sys/stat.h>
#include <string.h>

+#ifdef HAVE_CYGWIN
+#undef S_IXUSR
+#undef S_IXGRP
+#undef S_IXOTH
+#define S_IXUSR 0100
+#define S_IXGRP 0010
+#define S_IXOTH 0001
+#endif
+
void
strmode(mode, p)
	register mode_t mode;
diff -u -r ./servconf.c /openssh-2.5.2p2/servconf.c
--- ./servconf.c	Sat May  5 13:52:11 2001
+++ /openssh-2.5.2p2/servconf.c	Sat May  5 13:36:09 2001
@@ -759,11 +759,25 @@

		case sAuthOrder:
			arg = strdelim(&cp);
+/* Karl-->Carson: Should whitespace be removed before processing? */
+/* Karl-->Carson: Perhaps we should just remove whitespace and convert
+		  everything to lowercase to simplify the remaining code
+		  here and in auth2.c? */
+/* Karl-->Carson: These comparisons need to be case insensitive somehow. */
			if ((strstr(arg,":none") != NULL) || (strstr(arg,"none:") != NULL)){
				fprintf(stderr, "%s line %d: none may not be or have a subauth 
method\n",
					filename, linenum);
				exit(1);
			}
+#ifdef HAVE_CYGWIN
+/* Karl-->Carson: These comparisons need to be case insensitive somehow. */
+			if ((strncasecmp(arg,"matchuid",8) == 0) || (strstr(arg,",matchuid") != 
NULL) ||
+			    (strstr(arg,"matchuid:") != NULL)){
+				fprintf(stderr, "%s line %d: matchuid must be and not have a subauth 
method\n",
+					filename, linenum);
+				exit(1);
+			}
+#endif
			{
				int i, match;
				char *mycp;
@@ -778,6 +792,10 @@
						match = 1;
					} else if (strncasecmp(mycp,"keyboard-interactive",i) == 0) {
						match = 1;
+#ifdef HAVE_CYGWIN
+					} else if (strncasecmp(mycp,"matchuid",i) == 0) {
+						match = 1;
+#endif
					}
					if (match == 0) {
						mycp[i]='\0';

--
Want to unsubscribe from this list?
Check out: http://cygwin.com/ml/#unsubscribe-simple