X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/d1b3a4bfd613d84e0afcc3ba2f33bd585f3ebbe6..200545fb5b96f63266e1b27195edd02217592671:/server/qvalidate.pc diff --git a/server/qvalidate.pc b/server/qvalidate.pc index a49f7eb5..2d7a35ae 100644 --- a/server/qvalidate.pc +++ b/server/qvalidate.pc @@ -37,7 +37,6 @@ int validate_type(char *argv[], struct valobj *vo); int validate_typedata(struct query *, char *argv[], struct valobj *vo); int validate_len(char *argv[], struct valobj *vo); int validate_num(char *argv[], struct valobj *vo); -int convert_wildcards_uppercase(char *arg); extern SQLDA *sqlald(int, int, int); SQLDA *mr_alloc_sqlda(void); @@ -49,17 +48,18 @@ EXEC SQL WHENEVER SQLERROR DO dbmserr(); int validate_row(struct query *q, char *argv[], struct validate *v) { EXEC SQL BEGIN DECLARE SECTION; - char qual[128]; int rowcount; EXEC SQL END DECLARE SECTION; + char *qual; /* build where clause */ - build_qual(v->qual, v->argc, argv, qual); + qual = build_qual(v->qual, v->argc, argv); /* look for the record */ sprintf(stmt_buf, "SELECT COUNT (*) FROM %s WHERE %s", table_name[q->rtable], qual); dosql(sqlbuffer); + free(qual); if (dbms_errno) return mr_errcode; @@ -110,15 +110,6 @@ int validate_fields(struct query *q, char *argv[], struct valobj *vo, int n) case V_NUM: status = validate_num(argv, vo); break; - - case V_WILD: - status = convert_wildcards(argv[vo->index]); - break; - - case V_UPWILD: - status = convert_wildcards_uppercase(argv[vo->index]); - break; - } if (status != MR_EXISTS) @@ -198,51 +189,33 @@ int validate_id(struct query *q, char *argv[], struct valobj *vo) namefield = vo->namefield; idfield = vo->idfield; - if ((tbl == USERS_TABLE && !strcmp(namefield, "login")) || - tbl == MACHINE_TABLE || tbl == SUBNET_TABLE || tbl == FILESYS_TABLE || - tbl == LIST_TABLE || tbl == CLUSTERS_TABLE || tbl == STRINGS_TABLE) + if (tbl == MACHINE_TABLE || tbl == SUBNET_TABLE) { - if (tbl == MACHINE_TABLE || tbl == SUBNET_TABLE) - { - for (c = name; *c; c++) - { - if (islower(*c)) - *c = toupper(*c); - } - } - status = name_to_id(name, tbl, &id); - if (status == 0) - { - *(int *)argv[vo->index] = id; - return MR_EXISTS; - } - else if (status == MR_NO_MATCH && tbl == STRINGS_TABLE && - (q->type == APPEND || q->type == UPDATE)) + for (c = name; *c; c++) { - id = add_string(name); - cache_entry(name, STRINGS_TABLE, id); - *(int *)argv[vo->index] = id; - return MR_EXISTS; + if (islower(*c)) + *c = toupper(*c); } - else if (status == MR_NO_MATCH || status == MR_NOT_UNIQUE) - return vo->error; - else - return status; } - else + status = name_to_id(name, tbl, &id); + if (status == 0) { - /* else, it's `dubu', which uses unix_uid from users */ - EXEC SQL SELECT COUNT(*) INTO :rowcount FROM users - WHERE unix_uid = :name; - if (dbms_errno) - return mr_errcode; - if (rowcount != 1) - return vo->error; - EXEC SQL SELECT users_id INTO :id FROM users - WHERE unix_uid = :name; *(int *)argv[vo->index] = id; return MR_EXISTS; } + else if (status == MR_NO_MATCH && tbl == STRINGS_TABLE && + (q->type == MR_Q_APPEND || q->type == MR_Q_UPDATE)) + { + if (strlen(name) >= STRINGS_STRING_SIZE) + return MR_ARG_TOO_LONG; + id = add_string(name); + *(int *)argv[vo->index] = id; + return MR_EXISTS; + } + else if (status == MR_NO_MATCH || status == MR_NOT_UNIQUE) + return vo->error; + else + return status; } int validate_name(char *argv[], struct valobj *vo) @@ -260,6 +233,8 @@ int validate_name(char *argv[], struct valobj *vo) *c = toupper(*c); } } + if (!*name) + return MR_RESERVED; sprintf(stmt_buf, "SELECT DISTINCT COUNT(*) FROM %s WHERE %s.%s = '%s'", table_name[vo->table], table_name[vo->table], namefield, name); dosql(sqlbuffer); @@ -291,6 +266,8 @@ int validate_rename(char *argv[], struct valobj *vo) *c = toupper(*c); } } + if (!*name) + return MR_RESERVED; namefield = vo->namefield; idfield = vo->idfield; id = -1; @@ -401,7 +378,7 @@ int validate_typedata(struct query *q, char *argv[], struct valobj *vo) * that we're trying to resolve, we should get the value of * numvalues.[idfield] for the id. */ - if (vo->idfield && !strcmp(argv[0], argv[vo->index])) + if (vo->idfield && (*(int *)argv[0] == *(int *)argv[vo->index])) { set_next_object_id(q->validate->object_id, q->rtable, 0); name = vo->idfield; @@ -438,15 +415,16 @@ int validate_typedata(struct query *q, char *argv[], struct valobj *vo) return MR_STRING; if (status == MR_NO_MATCH) { - if (q->type != APPEND && q->type != UPDATE) + if (q->type != MR_Q_APPEND && q->type != MR_Q_UPDATE) return MR_STRING; + if (strlen(name) >= STRINGS_STRING_SIZE) + return MR_ARG_TOO_LONG; id = add_string(name); - cache_entry(name, STRINGS_TABLE, id); } else if (status) return status; } - else if (!strcmp(data_type, "none")) + else if (!strcmp(data_type, "none") || !strcmp(data_type, "all")) id = 0; else return MR_TYPE; @@ -491,6 +469,9 @@ int validate_num(char *argv[], struct valobj *vo) if (*p == '-') p++; + if (!*p) + return MR_INTEGER; + for (; *p; p++) { if (*p < '0' || *p > '9') @@ -549,90 +530,6 @@ SQLDA *mr_alloc_sqlda(void) return it; } - -/* Convert normal Unix-style wildcards to SQL voodoo */ -int convert_wildcards(char *arg) -{ - static char buffer[ARGLEN]; - char *s, *d; - - for (d = buffer, s = arg; *s; s++) - { - switch (*s) - { - case '*': - *d++ = '%'; - *d++ = '%'; - break; - case '?': - *d++ = '_'; - break; - case '_': - *d++ = '*'; - *d++ = *s; - break; - case '%': - *d++ = '*'; - *d++ = '%'; - *d++ = '%'; - break; - default: - *d++ = *s; - break; - } - } - *d = '\0'; - - /* Copy back into argv */ - strcpy(arg, buffer); - - return MR_EXISTS; -} - -/* This version includes uppercase conversion, for things like gmac. - * This is necessary because "LIKE" doesn't work with "uppercase()". - * Including it in a wildcard routine saves making two passes over - * the argument string. - */ -int convert_wildcards_uppercase(char *arg) -{ - static char buffer[ARGLEN]; - char *s, *d; - - for (d = buffer, s = arg; *s; s++) - { - switch (*s) - { - case '*': - *d++ = '%'; - *d++ = '%'; - break; - case '?': - *d++ = '_'; - break; - case '_': - *d++ = '*'; - *d++ = *s; - break; - case '%': - *d++ = '*'; - *d++ = '%'; - *d++ = '%'; - break; - default: - *d++ = toupper(*s); /* This is the only diff. */ - break; - } - } - *d = '\0'; - - /* Copy back into argv */ - strcpy(arg, buffer); - - return MR_EXISTS; -} - - /* Adds a string to the string table. Returns the id number. * */