return MR_ARG_TOO_LONG;
}
+ if (q->version > 10)
+ {
+ /* For both winhomedir and winprofiledir, we allow values of the
+ * following forms:
+ *
+ * [AFS] - Magic token for AFS home directory.
+ * [LOCAL] - Magic token for AD default local values, i.e. C:\<mumble>
+ * [DFS] - Magic token for DFS home directory
+ * UNC pathname - \\<something>
+ * local pathname - <drive letter>:<something>
+ */
+
+ if ((strcasecmp(argv[row + 12], "[AFS]")) &&
+ (strcasecmp(argv[row + 12], "[LOCAL]")) &&
+ (strcasecmp(argv[row + 12], "[DFS]")) &&
+ (!(argv[row + 12][0] == '\\' && argv[row + 12][1] == '\\')) &&
+ (!(isalpha(*argv[row + 12]) && (argv[row + 12][1] == ':'))))
+ return MR_BAD_CHAR;
+
+ if ((strcasecmp(argv[row + 13], "[AFS]")) &&
+ (strcasecmp(argv[row + 13], "[LOCAL]")) &&
+ (strcasecmp(argv[row + 13], "[DFS]")) &&
+ (!(argv[row + 13][0] == '\\' && argv[row + 13][1] == '\\')) &&
+ (!(isalpha(*argv[row + 13]) && (argv[row + 13][1] == ':'))))
+ return MR_BAD_CHAR;
+ }
+
if (!strcmp(argv[row], UNIQUE_UID) || atoi(argv[row]) == -1)
{
if ((err = set_next_object_id("unix_uid", USERS_TABLE, 1)))
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
};
+static const char *mailman_suffixes[] = { "-admin", "-owner", "-request",
+ "-bounces", "-confirm", "-join",
+ "-leave", "-subscribe",
+ "-unsubscribe", NULL };
+
int setup_alis(struct query *q, char *argv[], client *cl)
{
EXEC SQL BEGIN DECLARE SECTION;
- int ngid, cnt, mailman, mailman_id;
+ int ngid, cnt, mailman, mailman_id, lid;
char *name, *desc;
EXEC SQL END DECLARE SECTION;
unsigned char *p;
- int idx, err, best = -1, usage;
+ int idx, err, best = -1, usage, i;
if (!strcmp(q->shortname, "alis"))
idx = 0;
if (idx == 1)
{
- EXEC SQL BEGIN DECLARE SECTION;
- int lid = *(int *)argv[0];
- EXEC SQL END DECLARE SECTION;
+ lid = *(int *)argv[0];
if (acl_access_check(lid, cl))
return MR_PERM;
/* Don't let someone rename a list to one of the magic mailman names
* (foo-admin, etc) if foo already exists as a mailman list.
*/
- if ((err = check_mailman_listname(name, "-admin")) != MR_SUCCESS)
- return err;
- if ((err = check_mailman_listname(name, "-owner")) != MR_SUCCESS)
- return err;
- if ((err = check_mailman_listname(name, "-request")) != MR_SUCCESS)
- return err;
+ for (i = 0; mailman_suffixes[i]; i++)
+ {
+ if ((err = check_mailman_listname(name, mailman_suffixes[i]))
+ != MR_SUCCESS)
+ return err;
+ }
if (q->version >= 10)
{
{
/* Client too old to know about the mailman code.
* Use existing value of mailman boolean in the table.
+ * Don't do this for add_list from an old client, since the row
+ * they're creating won't exist yet, and there's no way for them to
+ * create a list with the mailman bit set, anyway.
*/
- EXEC SQL SELECT mailman INTO :mailman FROM list WHERE name = :name;
- if (mailman)
+ if (idx == 1)
{
- EXEC SQL SELECT COUNT(name) INTO :cnt FROM list
- WHERE (name = :name || '-admin' OR name = :name || '-owner' OR
- name = :name || '-request');
- if (cnt)
- return MR_EXISTS;
+ EXEC SQL SELECT mailman INTO :mailman FROM list WHERE list_id = :lid;
+ if (mailman)
+ {
+ EXEC SQL SELECT COUNT(name) INTO :cnt FROM list
+ WHERE (name = :name || '-admin' OR name = :name || '-owner' OR
+ name = :name || '-request');
+ if (cnt)
+ return MR_EXISTS;
+ }
}
}
}
+/* setup_ghst():
+ */
+
+int setup_ghst(struct query *q, char **argv, client *cl)
+{
+ if (strcmp(argv[0], "*") || strcmp(argv[1], "*") ||
+ strcmp(argv[2], "*") || strcmp(argv[3], "*"))
+ return MR_SUCCESS;
+ else
+ return MR_PERM;
+}
+
/* setup_ahst():
*/