else
row = 1;
- if (strlen(argv[row + 2]) + strlen(argv[row + 3]) +
- strlen(argv[row + 4]) + 2 > USERS_FULLNAME_SIZE)
- return MR_ARG_TOO_LONG;
+ if (q->version > 2)
+ {
+ if (strlen(argv[row + 3]) + strlen(argv[row + 4]) +
+ strlen(argv[row + 5]) + 2 > USERS_FULLNAME_SIZE)
+ return MR_ARG_TOO_LONG;
+ }
+ else
+ {
+ if (strlen(argv[row + 2]) + strlen(argv[row + 3]) +
+ strlen(argv[row + 4]) + 2 > USERS_FULLNAME_SIZE)
+ return MR_ARG_TOO_LONG;
+ }
if (!strcmp(argv[row], UNIQUE_UID) || atoi(argv[row]) == -1)
{
{
EXEC SQL BEGIN DECLARE SECTION;
int flag, id, cnt;
+ char resv[USERS_RESERVATIONS_SIZE];
EXEC SQL END DECLARE SECTION;
id = *(int *)argv[0];
- /* For now, only allow users to be deleted if their status is 0 */
- EXEC SQL SELECT status INTO :flag FROM users WHERE users_id = :id;
- if (flag != 0 && flag != 4)
+ /* For now, only allow users to be deleted if their status is 0
+ * and we have no reservations about deleting them.
+ */
+ EXEC SQL SELECT status, reservations INTO :flag, :resv
+ FROM users WHERE users_id = :id;
+ if ((flag != 0 && flag != 4) || *resv)
return MR_IN_USE;
- EXEC SQL DELETE FROM quota WHERE entity_id = :id AND type = 'USER';
- EXEC SQL DELETE FROM krbmap WHERE users_id = :id;
EXEC SQL SELECT COUNT(member_id) INTO :cnt FROM imembers
WHERE member_id = :id AND member_type = 'USER';
if (cnt > 0)
return MR_IN_USE;
if (dbms_errno)
return mr_errcode;
- return MR_SUCCESS;
-}
-
-/* setup_spop: verify that there is already a valid POP machine_id in the
- * pop_id field. Also take care of keeping track of the post office usage.
- */
-int setup_spop(struct query *q, char *argv[], client *cl)
-{
- EXEC SQL BEGIN DECLARE SECTION;
- int id, mid;
- char type[USERS_POTYPE_SIZE];
- EXEC SQL END DECLARE SECTION;
-
- id = *(int *)argv[0];
- EXEC SQL SELECT potype, pop_id INTO :type, :mid FROM users
- WHERE users_id = :id;
- if (sqlca.sqlerrd[2] == 0)
- return MR_MACHINE;
- EXEC SQL SELECT mach_id INTO :mid FROM machine
- WHERE mach_id = :mid;
- if (sqlca.sqlerrd[2] == 0)
- return MR_MACHINE;
- if (strcmp(strtrim(type), "POP"))
- set_pop_usage(mid, 1);
+ EXEC SQL DELETE FROM quota WHERE entity_id = :id AND type = 'USER';
+ EXEC SQL DELETE FROM krbmap WHERE users_id = :id;
return MR_SUCCESS;
}
* a -1 there. Remember that this is also used for ulis, with the indexes
* at 6 & 7. Also check that the list name does not contain uppercase
* characters, control characters, @, or :.
+ *
+ * Newlines in list descriptions do bad things to the aliases file
+ * moira generates, so make sure the description doesn't contain any, too.
*/
static int badlistchars[] = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^@ - ^O */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* ^P - ^_ */
- 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, /* SPACE - / */
+ 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, /* SPACE - / */
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, /* 0 - ? */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* @ - O */
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* P - _ */
{
EXEC SQL BEGIN DECLARE SECTION;
int ngid, cnt;
- char *name;
+ char *name, *desc;
EXEC SQL END DECLARE SECTION;
unsigned char *p;
int idx, err;
idx = 1;
name = argv[idx];
+ if (q->version == 2)
+ desc = argv[9 + idx];
+ else if (q->version == 3)
+ desc = argv[10 + idx];
+ else if (q->version >= 4)
+ desc = argv[12 + idx];
+
if (idx == 1)
{
EXEC SQL BEGIN DECLARE SECTION;
return MR_BAD_CHAR;
}
+ for (p = (unsigned char *) desc; *p; p++)
+ {
+ if (*p == '\n')
+ return MR_BAD_CHAR;
+ }
+
/* Check that it doesn't conflict with a pre-existing weirdly-cased
* name. */
EXEC SQL SELECT COUNT(name) INTO :cnt FROM list
if (cnt > 0)
return MR_IN_USE;
+ EXEC SQL SELECT COUNT(name) INTO :cnt FROM list
+ WHERE memacl_id = :id AND memacl_type = 'LIST' AND list_id != :id;
+ if (cnt > 0)
+ return MR_IN_USE;
+
EXEC SQL SELECT COUNT(name) INTO :cnt FROM servers
WHERE acl_id = :id AND acl_type = 'LIST';
if (cnt > 0)
WHERE z.xmt_type = 'LIST' AND z.xmt_id = :id
OR z.sub_type = 'LIST' AND z.sub_id = :id
OR z.iws_type = 'LIST' AND z.iws_id = :id
- OR z.iui_type = 'LIST' AND z.iui_id = :id;
+ OR z.iui_type = 'LIST' AND z.iui_id = :id
+ OR z.owner_type = 'LIST' and z.owner_id = :id;
if (cnt > 0)
return MR_IN_USE;
int value, id, ssaddr, smask, shigh, slow, cnt;
unsigned int saddr, mask, high, low;
EXEC SQL END DECLARE SECTION;
- int row;
+ int row, idx;
struct in_addr addr;
id = *(int *)argv[0];
else
row = 0;
+ if (q->version < 6)
+ idx = 0;
+ else
+ idx = 1;
+
/* Sanity check name, vendor, model, and os. */
if ((row == 0 || strcasecmp(argv[1], oldname)) &&
!hostname_check(argv[row]))
return MR_EXISTS;
/* check address */
- if (!strcmp(argv[9 + row], "unassigned"))
+ if (!strcmp(argv[9 + row + idx], "unassigned"))
value = -1;
- else if (!strcmp(argv[9 + row], "unique"))
+ else if (!strcmp(argv[9 + row + idx], "unique"))
{
- if (*(int *)argv[8 + row] == 0)
+ if (*(int *)argv[8 + row + idx] == 0)
value = -1;
else
value = -2;
}
else
{
- value = ntohl(inet_addr(argv[9 + row]));
+ value = ntohl(inet_addr(argv[9 + row + idx]));
if (value == -1)
return MR_ADDRESS;
}
/*
* an address or unique was specified.
*/
- id = *(int *)argv[8 + row];
+ id = *(int *)argv[8 + row + idx];
EXEC SQL SELECT saddr, mask, high, low INTO :ssaddr, :smask,
:shigh, :slow FROM subnet WHERE snet_id = :id;
if (dbms_errno)
* link in an inet_addr() that returns an error for
* this case.
*/
- addr.s_addr = inet_addr(argv[9 + row]);
+ addr.s_addr = inet_addr(argv[9 + row + idx]);
name = inet_ntoa(addr);
EXEC SQL SELECT count(mach_id) INTO :cnt FROM machine
WHERE address = :name;
* we have an address in value. Convert it to a string and store it.
*/
addr.s_addr = htonl(value);
- strcpy(argv[9 + row], inet_ntoa(addr));
+ strcpy(argv[9 + row + idx], inet_ntoa(addr));
}
else
- strcpy(argv[9 + row], "unassigned");
+ strcpy(argv[9 + row + idx], "unassigned");
/* status checking */
- value = atoi(argv[7 + row]);
+ value = atoi(argv[7 + row + idx]);
if (row == 0 && !(value == 1 || value == 0))
return MR_TYPE;
if (row == 1)