[1990] in Moira
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;