break;
}
case M_STRING:
- if (memberstruct->type == M_ANY &&
- !strchr(memberstruct->name, '@') &&
- !strchr(memberstruct->name, '!') &&
- !strchr(memberstruct->name, '%'))
+ status = mrcl_validate_string_member(memberstruct->name);
+ if (status == MRCL_REJECT)
+ {
+ mrcl_com_err(whoami);
+ success = 0;
+ break;
+ }
+ else if (memberstruct->type == M_ANY && status != MR_SUCCESS)
{
/* if user is trying to add something which isn't a
remote string, or a list, or a user, and didn't
break;
case M_KERBEROS:
membervec[1] = "KERBEROS";
+ status = mrcl_validate_kerberos_member(membervec[2], &membervec[2]);
+ if (mrcl_get_message())
+ mrcl_com_err(whoami);
status = mr_query("add_tagged_member_to_list", 4, membervec,
NULL, NULL);
if (status != MR_SUCCESS)
memberstruct->name, listname);
success = 0;
}
+ free(membervec[2]);
}
}
membervec[1] = "KERBEROS";
status = mr_query("delete_member_from_list", 3, membervec,
NULL, NULL);
+ if (status == MR_STRING || status == MR_NO_MATCH)
+ {
+ /* Try canonicalizing the Kerberos principal and trying
+ * again. If we succeed, print the message from mrcl.
+ * Otherwise, just pretend we never did this and print
+ * the original error message.
+ */
+ mrcl_validate_kerberos_member(membervec[2], &membervec[2]);
+ if (mrcl_get_message())
+ {
+ if (mr_query("delete_member_from_list", 3, membervec,
+ NULL, NULL) == MR_SUCCESS)
+ mrcl_com_err(whoami);
+ status = MR_SUCCESS;
+ }
+ }
if (status != MR_SUCCESS)
{
com_err(whoami, status, "while deleting member %s from %s",
membervec[1] = "KERBEROS";
status = mr_query("tag_member_of_list", 4, membervec,
NULL, NULL);
+ if (status == MR_STRING || status == MR_NO_MATCH)
+ {
+ /* Try canonicalizing the Kerberos principal and trying
+ * again. If we succeed, print the message from mrcl.
+ * Otherwise, just pretend we never did this and print
+ * the original error message.
+ */
+ mrcl_validate_kerberos_member(membervec[2], &membervec[2]);
+ if (mrcl_get_message())
+ {
+ if (mr_query("tag_member_of_list", 4, membervec,
+ NULL, NULL) == MR_SUCCESS)
+ mrcl_com_err(whoami);
+ status = MR_SUCCESS;
+ }
+ }
if (status != MR_SUCCESS)
{
com_err(whoami, status, "while changing tag on member %s of %s",
}
}
-
/* Display the members of the list now, if requested */
if (memberflg)
{
#include <mit-copyright.h>
#include <moira.h>
+#include <mrclient.h>
#include <moira_site.h>
#include "defs.h"
#include "f_defs.h"
if (!strcmp(args[LM_TYPE], "STRING"))
{
- if ((p = strchr(args[LM_MEMBER], '@')))
+ if (mrcl_validate_string_member(args[LM_MEMBER]) != MRCL_SUCCESS)
{
- char *host = canonicalize_hostname(strdup(++p));
- mailhubs = GetTypeValues("mailhub");
- for (elem = mailhubs; elem; elem = elem->q_forw)
- {
- if (!strcasecmp(host, elem->q_data))
- {
- free(host);
- host = strdup(args[LM_MEMBER]);
- *(--p) = 0;
- sprintf(temp_buf, "String \"%s\" should be USER or LIST "
- "\"%s\" because it is a local name.", host,
- args[LM_MEMBER]);
- Put_message(temp_buf);
- free(args[LM_TYPE]);
- free(host);
- return DM_NORMAL;
- }
- }
- free(host);
- }
- else if (!strchr(args[LM_MEMBER], '!'))
- {
- Put_message("Member which is not a foreign mail address "
- "should not be type STRING.");
+ Put_message(mrcl_get_message());
return DM_NORMAL;
}
}
+ else if (!strcmp(args[LM_TYPE], "KERBEROS"))
+ {
+ char *canon;
+
+ mrcl_validate_kerberos_member(args[LM_MEMBER], &canon);
+ if (mrcl_get_message())
+ Put_message(mrcl_get_message());
+ free(args[LM_MEMBER]);
+ args[LM_MEMBER] = canon;
+ }
if ((status = do_mr_query("add_member_to_list", CountArgs(args), args,
NULL, NULL)) != MR_SUCCESS)
{
if ((status = do_mr_query("delete_member_from_list", CountArgs(args),
args, NULL, NULL)))
+ {
+ if ((status == MR_STRING || status == MR_NO_MATCH) &&
+ !strcmp(args[LM_TYPE], "KERBEROS"))
+ {
+ char *canon;
+ mrcl_validate_kerberos_member(args[LM_MEMBER], &canon);
+ if (mrcl_get_message())
+ {
+ free(args[LM_MEMBER]);
+ args[LM_MEMBER] = canon;
+ if (do_mr_query("delete_member_from_list", CountArgs(args),
+ args, NULL, NULL) == MR_SUCCESS)
+ {
+ Put_message(mrcl_get_message());
+ status = MR_SUCCESS;
+ }
+ }
+ }
+ }
+ if (status)
com_err(program_name, status, " in DeleteMember");
else
Put_message("Deletion Completed.");