Long topic, but had to fit it all in :-). So that's what this
does. It's not thoroughly tested, but it seems to work atleast for
something.

Basically it changes the routines accessing cvsadmindir/passwd so that
if user has password "*SYS*", the password given by the user is
compared against the system password instead of the cvs-passwd-file.

This works even if the global SystemAuth would be 'no', thus allowing
the limiting of the allowed users and still using the system password
file - also allows grouping them to 'project users', but this I didn't
try, I'd imagine it works too. (Ie. I hope I didn't break it.)

-- 
  _____________________________________________________________________
     / __// /__ ____  __                              Erkki Sepp�l�\   \
    / /_ / // // /\ \/ //ircnet                Inside Informatics ry\  /
   /_/  /_/ \___/ /_/\_\@inside.org        http://www.inside.org/~flux/
--- cvs-1.11.1p1/src/server.c   Tue Jul 17 19:52:17 2001
+++ cvs-1.11.1p1-flux/src/server.c      Tue Jul 17 19:52:27 2001
@@ -5374,9 +5377,10 @@
 
 
 /* 
- * 0 means no entry found for this user.
+ * 0 means no entry found for this user - check with system
  * 1 means entry found and password matches (or found password is empty)
  * 2 means entry found, but password does not match.
+ * 3 means entry found, but password tagged specially - check with system!
  *
  * If 1, host_user_ptr will be set to point at the system
  * username (i.e., the "real" identity, which may or may not be the
@@ -5498,19 +5502,28 @@
         if (host_user_tmp == NULL)
             host_user_tmp = username;
 
-        /* Verify blank passwords directly, otherwise use crypt(). */
-        if ((found_password == NULL)
-            || ((strcmp (found_password, crypt (password, found_password))
-                 == 0)))
-        {
+        /* If a specially tagged password, use system authentication */
+        if (found_password && strcmp(found_password, "*SYS*") == 0) {
             /* Give host_user_ptr permanent storage. */
             *host_user_ptr = xstrdup (host_user_tmp);
-            retval = 1;
-        }
-        else
-        {
-            *host_user_ptr = NULL;
-            retval         = 2;
+
+            retval = 3;
+        } 
+        else 
+          {
+            /* Verify blank passwords directly, otherwise use crypt(). */
+            if (found_password == NULL ||
+                strcmp (found_password, crypt (password, found_password)) == 0)
+            {
+                /* Give host_user_ptr permanent storage. */
+                *host_user_ptr = xstrdup (host_user_tmp);
+                retval = 1;
+            }
+            else
+            {
+                *host_user_ptr = NULL;
+                retval         = 2;
+            }
         }
     }
     else     /* Didn't find this user, so deny access. */
@@ -5552,7 +5565,7 @@
         /* host_user already set by reference, so just return. */
         goto handle_return;
     }
-    else if (rc == 0 && system_auth)
+    else if ((rc == 0 && system_auth) || rc == 3)
     {
         /* No cvs password found, so try /etc/passwd. */
 
@@ -5593,10 +5606,24 @@
         
         if (*found_passwd)
         {
-            /* user exists and has a password */
-            host_user = ((! strcmp (found_passwd,
-                                    crypt (password, found_passwd)))
-                         ? xstrdup (username) : NULL);
+            /* if user has a valid password */
+            if (strcmp(found_passwd, crypt(password, found_passwd)) == 0) {
+                if (rc == 0) 
+                {
+                    /* if not found in cvs passwd-file, return users name */
+                    host_user = xstrdup(username);
+                } 
+                else
+                {
+                    /* if cvs passwd-file might've contained the name,
+                       return it instead */
+                    host_user = host_user ? host_user : xstrdup(username);
+                }
+            }
+            else
+            {
+                host_user = NULL;
+            }
             goto handle_return;
         }
         else if (password && *password)

Reply via email to