[1990] in Moira

home help back first fref pref prev next nref lref last post

more intelligence for libmrclient

daemon@ATHENA.MIT.EDU (Garry Zacheiss)
Tue Sep 24 18:32:10 2002

Message-Id: <200209242232.SAA27830@brad-majors.mit.edu>
To: moiradev@MIT.EDU
Date: Tue, 24 Sep 2002 18:32:08 -0400
From: Garry Zacheiss <zacheiss@MIT.EDU>

	This makes libmrclient reject KERBEROS members that contains
whitespace (as defined by the ctype.h isspace() macro) or commas, since
we've seen at least one user try to set a list owner to 
KERBEROS:"username, username2, username3", which, well, didn't work at
all.

	mrcl_validate_kerberos_member() could previously only return
MRCL_WARN or MRCL_SUCCESS, so no client was prepared to exit based on
its return value, so I had to patch the clients, too.

Garry

Index: blanche/blanche.c
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/blanche/blanche.c,v
retrieving revision 1.58
diff -u -r1.58 blanche.c
--- blanche.c	2002/03/03 10:19:15	1.58
+++ blanche.c	2002/09/24 05:51:17
@@ -391,6 +391,8 @@
 						     &argv[L_MEMACE_NAME]);
 	      if (mrcl_get_message())
 		mrcl_com_err(whoami);
+	      if (status == MRCL_REJECT)
+		exit(1);
 	    }
 	}
       else 
@@ -419,6 +421,8 @@
 						     &argv[L_ACE_NAME]);
 	      if (mrcl_get_message())
 		mrcl_com_err(whoami);
+	      if (status == MRCL_REJECT)
+		exit(1);
 	      status = mr_query("add_list", 13, argv, NULL, NULL);
 	      break;
 	    case M_NONE:
@@ -490,6 +494,8 @@
 						     &argv[L_MEMACE_NAME + 1]);
 	      if (mrcl_get_message())
 		mrcl_com_err(whoami);
+	      if (status == MRCL_REJECT)
+		exit(1);
 	    }
 	}
 
@@ -516,6 +522,8 @@
 						     &argv[L_ACE_NAME + 1]);
 	      if (mrcl_get_message())
 		mrcl_com_err(whoami);
+	      if (status == MRCL_REJECT)
+		exit(1);
 	      status = mr_query("update_list", 14, argv, NULL, NULL);
 	      break;
 	    case M_NONE:
@@ -729,6 +737,11 @@
 	  status = mrcl_validate_kerberos_member(membervec[2], &membervec[2]);
 	  if (mrcl_get_message())
 	    mrcl_com_err(whoami);
+	  if (status == MRCL_REJECT)
+	    {
+	      success = 0;
+	      break;
+	    }
 	  status = mr_query("add_tagged_member_to_list", 4, membervec,
 			    NULL, NULL);
 	  if (status != MR_SUCCESS)
Index: lib/member.c
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/lib/member.c,v
retrieving revision 1.4
diff -u -r1.4 member.c
--- member.c	2001/08/24 05:57:07	1.4
+++ member.c	2002/09/24 05:51:17
@@ -72,6 +72,16 @@
 
   mrcl_clear_message();
 
+  for (p = str; *p; p++)
+    {
+      if (isspace(*p) || *p == ',')
+	{
+	  mrcl_set_message("KERBEROS member \"%s\" may not contain whitespace "
+			   "or commas.", str);
+	  return MRCL_REJECT;
+	}
+    }
+
   p = strchr(str, '@');
   if (!p)
     {
Index: moira/cluster.c
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/cluster.c,v
retrieving revision 1.64
diff -u -r1.64 cluster.c
--- cluster.c	2002/08/02 10:32:25	1.64
+++ cluster.c	2002/09/24 05:51:17
@@ -562,6 +562,7 @@
 char **AskMCDInfo(char **info, int type, Bool name)
 {
   char temp_buf[BUFSIZ], *newname, *oldnewname;
+  int status;
 
   switch (type)
     {
@@ -712,9 +713,11 @@
 	  {
 	    char *canon;
 
-	    mrcl_validate_kerberos_member(info[13], &canon);
+	    status = mrcl_validate_kerberos_member(info[13], &canon);
 	    if (mrcl_get_message())
 	      Put_message(mrcl_get_message());
+	    if (status == MRCL_REJECT)
+	      return NULL;
 	    free(info[13]);
 	    info[13] = canon;
 	  }
@@ -794,9 +797,11 @@
 	  {
 	    char *canon;
 
-	    mrcl_validate_kerberos_member(info[SN_ACE_NAME], &canon);
+	    status = mrcl_validate_kerberos_member(info[SN_ACE_NAME], &canon);
 	    if (mrcl_get_message())
 	      Put_message(mrcl_get_message());
+	    if (status == MRCL_REJECT)
+	      return NULL;
 	    free(info[SN_ACE_NAME]);
 	    info[SN_ACE_NAME] = canon;
 	  }
@@ -848,6 +853,8 @@
 	  mrcl_validate_kerberos_member(info[CON_OWNER_NAME], &canon);
 	  if (mrcl_get_message())
 	    Put_message(mrcl_get_message());
+	  if (status == MRCL_REJECT)
+	    return NULL;
 	  free(info[CON_OWNER_NAME]);
 	  info[CON_OWNER_NAME] = canon;
 	}
@@ -865,6 +872,8 @@
 	  mrcl_validate_kerberos_member(info[CON_MEMACE_NAME], &canon);
 	  if (mrcl_get_message())
 	    Put_message(mrcl_get_message());
+	  if (status == MRCL_REJECT)
+	    return NULL;
 	  free(info[CON_MEMACE_NAME]);
 	  info[CON_MEMACE_NAME] = canon;
 	}
Index: moira/lists.c
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/moira/lists.c,v
retrieving revision 1.49
diff -u -r1.49 lists.c
--- lists.c	2002/08/06 22:08:31	1.49
+++ lists.c	2002/09/24 05:51:17
@@ -192,6 +192,7 @@
 char **AskListInfo(char **info, Bool name)
 {
   char temp_buf[BUFSIZ], *newname;
+  int status;
 
   Put_message(" ");
   sprintf(temp_buf, "Setting information of list %s.", info[L_NAME]);
@@ -258,9 +259,11 @@
     {
       char *canon;
       
-      mrcl_validate_kerberos_member(info[L_ACE_NAME], &canon);
+      status = mrcl_validate_kerberos_member(info[L_ACE_NAME], &canon);
       if (mrcl_get_message())
 	Put_message(mrcl_get_message());
+      if (status == MRCL_REJECT)
+	return NULL;
       free(info[L_ACE_NAME]);
       info[L_ACE_NAME] = canon;
     }
@@ -278,9 +281,11 @@
     {
       char *canon;
 
-      mrcl_validate_kerberos_member(info[L_MEMACE_NAME], &canon);
+      status = mrcl_validate_kerberos_member(info[L_MEMACE_NAME], &canon);
       if (mrcl_get_message())
 	Put_message(mrcl_get_message());
+      if (status == MRCL_REJECT)
+	return NULL;
       free(info[L_MEMACE_NAME]);
       info[L_MEMACE_NAME] = canon;
     }
@@ -721,9 +726,11 @@
     {
       char *canon;
 
-      mrcl_validate_kerberos_member(args[LM_MEMBER], &canon);
+      status = mrcl_validate_kerberos_member(args[LM_MEMBER], &canon);
       if (mrcl_get_message())
 	Put_message(mrcl_get_message());
+      if (status == MRCL_REJECT)
+	return DM_NORMAL;
       free(args[LM_MEMBER]);
       args[LM_MEMBER] = canon;
     }
Index: stella/stella.c
===================================================================
RCS file: /afs/athena.mit.edu/astaff/project/moiradev/repository/moira/clients/stella/stella.c,v
retrieving revision 1.18
diff -u -r1.18 stella.c
--- stella.c	2002/01/16 21:40:47	1.18
+++ stella.c	2002/09/24 05:51:17
@@ -423,6 +423,8 @@
 	      status = mrcl_validate_kerberos_member(argv[13], &argv[13]);
 	      if (mrcl_get_message())
 		mrcl_com_err(whoami);
+	      if (status == MRCL_REJECT)
+		exit(1);
 	      status = wrap_mr_query("add_host", 16, argv, NULL, NULL);
 	      break;
 
@@ -530,6 +532,8 @@
 	      status = mrcl_validate_kerberos_member(argv[14], &argv[14]);
 	      if (mrcl_get_message())
 		mrcl_com_err(whoami);
+	      if (status == MRCL_REJECT)
+		exit(1);
 	      status = wrap_mr_query("update_host", 17, argv, NULL, NULL);
 	      break;
 

home help back first fref pref prev next nref lref last post