diff options
| author | David M. Syzdek <david@syzdek.net> | 2019-11-27 00:14:12 -0900 |
|---|---|---|
| committer | David M. Syzdek <david@syzdek.net> | 2019-11-27 00:19:51 -0900 |
| commit | eed2629737878e137e9c27d42f046271d5f5aaf9 (patch) | |
| tree | 44ddd264f49b04867371c1708b4bdcd491a97c50 | |
| parent | 1f61f562d52a7ca91e9b0028f30c2fd748728b0b (diff) | |
| download | ldap-utils-eed2629737878e137e9c27d42f046271d5f5aaf9.tar.gz ldap-utils-eed2629737878e137e9c27d42f046271d5f5aaf9.tar.bz2 ldap-utils-eed2629737878e137e9c27d42f046271d5f5aaf9.tar.xz ldap-utils-eed2629737878e137e9c27d42f046271d5f5aaf9.zip | |
libldapschema: adding syntax checks for objectClasses
| -rw-r--r-- | lib/libldapschema/lldap.c | 3 | ||||
| -rw-r--r-- | lib/libldapschema/llexer.c | 39 |
2 files changed, 35 insertions, 7 deletions
diff --git a/lib/libldapschema/lldap.c b/lib/libldapschema/lldap.c index c980daf..886d76d 100644 --- a/lib/libldapschema/lldap.c +++ b/lib/libldapschema/lldap.c | |||
| @@ -248,9 +248,6 @@ int ldapschema_fetch(LDAPSchema * lsd, LDAP * ld) | |||
| 248 | if (attr->model.type != LDAPSCHEMA_ATTRIBUTETYPE) | 248 | if (attr->model.type != LDAPSCHEMA_ATTRIBUTETYPE) |
| 249 | continue; | 249 | continue; |
| 250 | 250 | ||
| 251 | if (!(attr->names)) | ||
| 252 | ldapschema_schema_err(lsd, (LDAPSchemaModel *)attr, "missing NAME"); | ||
| 253 | |||
| 254 | if (!(attr->syntax)) | 251 | if (!(attr->syntax)) |
| 255 | ldapschema_schema_err(lsd, (LDAPSchemaModel *)attr, "missing or unknown SYNTAX"); | 252 | ldapschema_schema_err(lsd, (LDAPSchemaModel *)attr, "missing or unknown SYNTAX"); |
| 256 | }; | 253 | }; |
diff --git a/lib/libldapschema/llexer.c b/lib/libldapschema/llexer.c index 19a8672..488ed9b 100644 --- a/lib/libldapschema/llexer.c +++ b/lib/libldapschema/llexer.c | |||
| @@ -719,6 +719,9 @@ LDAPSchemaAttributeType * ldapschema_parse_attributetype(LDAPSchema * lsd, const | |||
| 719 | }; | 719 | }; |
| 720 | ldapschema_value_free(argv); | 720 | ldapschema_value_free(argv); |
| 721 | 721 | ||
| 722 | if (!(attr->names)) | ||
| 723 | ldapschema_schema_err(lsd, (LDAPSchemaModel *)attr, "missing NAME"); | ||
| 724 | |||
| 722 | // register attributeType | 725 | // register attributeType |
| 723 | if ((err = ldapschema_model_register(lsd, &attr->model)) != LDAP_SUCCESS) | 726 | if ((err = ldapschema_model_register(lsd, &attr->model)) != LDAP_SUCCESS) |
| 724 | { | 727 | { |
| @@ -1053,6 +1056,11 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str | |||
| 1053 | else if (!(strcasecmp(argv[pos], "NAME"))) | 1056 | else if (!(strcasecmp(argv[pos], "NAME"))) |
| 1054 | { | 1057 | { |
| 1055 | pos++; | 1058 | pos++; |
| 1059 | if ((objcls->model.desc)) | ||
| 1060 | { | ||
| 1061 | ldapschema_schema_err_kw_dup(lsd, (LDAPSchemaModel *)objcls, "NAME"); | ||
| 1062 | continue; | ||
| 1063 | }; | ||
| 1056 | if (argv[pos][0] == '(') | 1064 | if (argv[pos][0] == '(') |
| 1057 | { | 1065 | { |
| 1058 | if ((err = ldapschema_definition_split(lsd, &objcls->model, argv[pos], strlen(argv[pos]), &objcls->names)) == -1) | 1066 | if ((err = ldapschema_definition_split(lsd, &objcls->model, argv[pos], strlen(argv[pos]), &objcls->names)) == -1) |
| @@ -1088,6 +1096,11 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str | |||
| 1088 | else if (!(strcasecmp(argv[pos], "DESC"))) | 1096 | else if (!(strcasecmp(argv[pos], "DESC"))) |
| 1089 | { | 1097 | { |
| 1090 | pos++; | 1098 | pos++; |
| 1099 | if ((objcls->model.desc)) | ||
| 1100 | { | ||
| 1101 | ldapschema_schema_err_kw_dup(lsd, (LDAPSchemaModel *)objcls, "DESC"); | ||
| 1102 | continue; | ||
| 1103 | }; | ||
| 1091 | if (pos >= argc) | 1104 | if (pos >= argc) |
| 1092 | { | 1105 | { |
| 1093 | lsd->errcode = LDAPSCHEMA_SCHEMA_ERROR; | 1106 | lsd->errcode = LDAPSCHEMA_SCHEMA_ERROR; |
| @@ -1117,6 +1130,11 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str | |||
| 1117 | { | 1130 | { |
| 1118 | pos++; | 1131 | pos++; |
| 1119 | if ((objcls->sup_name)) | 1132 | if ((objcls->sup_name)) |
| 1133 | { | ||
| 1134 | ldapschema_schema_err_kw_dup(lsd, (LDAPSchemaModel *)objcls, "SUP"); | ||
| 1135 | continue; | ||
| 1136 | }; | ||
| 1137 | if ((objcls->sup_name)) | ||
| 1120 | free(objcls->sup_name); | 1138 | free(objcls->sup_name); |
| 1121 | if ((objcls->sup_name = strdup(argv[pos])) == NULL) | 1139 | if ((objcls->sup_name = strdup(argv[pos])) == NULL) |
| 1122 | { | 1140 | { |
| @@ -1145,6 +1163,11 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str | |||
| 1145 | else if (!(strcasecmp(argv[pos], "MUST"))) | 1163 | else if (!(strcasecmp(argv[pos], "MUST"))) |
| 1146 | { | 1164 | { |
| 1147 | pos++; | 1165 | pos++; |
| 1166 | if ((objcls->must)) | ||
| 1167 | { | ||
| 1168 | ldapschema_schema_err_kw_dup(lsd, (LDAPSchemaModel *)objcls, "MUST"); | ||
| 1169 | continue; | ||
| 1170 | }; | ||
| 1148 | if ((err = ldapschema_parse_objectclass_attrs(lsd, "MUST", objcls, argv[pos], 1)) > 0) | 1171 | if ((err = ldapschema_parse_objectclass_attrs(lsd, "MUST", objcls, argv[pos], 1)) > 0) |
| 1149 | { | 1172 | { |
| 1150 | ldapschema_value_free(argv); | 1173 | ldapschema_value_free(argv); |
| @@ -1157,6 +1180,11 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str | |||
| 1157 | else if (!(strcasecmp(argv[pos], "MAY"))) | 1180 | else if (!(strcasecmp(argv[pos], "MAY"))) |
| 1158 | { | 1181 | { |
| 1159 | pos++; | 1182 | pos++; |
| 1183 | if ((objcls->may)) | ||
| 1184 | { | ||
| 1185 | ldapschema_schema_err_kw_dup(lsd, (LDAPSchemaModel *)objcls, "MAY"); | ||
| 1186 | continue; | ||
| 1187 | }; | ||
| 1160 | if ((err = ldapschema_parse_objectclass_attrs(lsd, "MAY", objcls, argv[pos], 0)) > 0) | 1188 | if ((err = ldapschema_parse_objectclass_attrs(lsd, "MAY", objcls, argv[pos], 0)) > 0) |
| 1161 | { | 1189 | { |
| 1162 | ldapschema_value_free(argv); | 1190 | ldapschema_value_free(argv); |
| @@ -1168,14 +1196,17 @@ LDAPSchemaObjectclass * ldapschema_parse_objectclass(LDAPSchema * lsd, const str | |||
| 1168 | // handle unknown parameters | 1196 | // handle unknown parameters |
| 1169 | else | 1197 | else |
| 1170 | { | 1198 | { |
| 1171 | ldapschema_schema_err(lsd, &objcls->model, "invalid term '%s' in definition", argv[pos]); | 1199 | ldapschema_schema_err_kw_unknown(lsd, (LDAPSchemaModel *)objcls, argv[pos]); |
| 1172 | ldapschema_value_free(argv); | ||
| 1173 | ldapschema_objectclass_free(objcls); | ||
| 1174 | return(NULL); | ||
| 1175 | }; | 1200 | }; |
| 1176 | }; | 1201 | }; |
| 1177 | ldapschema_value_free(argv); | 1202 | ldapschema_value_free(argv); |
| 1178 | 1203 | ||
| 1204 | if (!(objcls->names)) | ||
| 1205 | ldapschema_schema_err(lsd, (LDAPSchemaModel *)objcls, "missing 'NAME'"); | ||
| 1206 | |||
| 1207 | if ( (!(objcls->may)) && (!(objcls->must)) ) | ||
| 1208 | ldapschema_schema_err(lsd, (LDAPSchemaModel *)objcls, "missing 'MUST' and 'MAY'"); | ||
| 1209 | |||
| 1179 | // register objectClass | 1210 | // register objectClass |
| 1180 | if ((err = ldapschema_model_register(lsd, &objcls->model)) != LDAP_SUCCESS) | 1211 | if ((err = ldapschema_model_register(lsd, &objcls->model)) != LDAP_SUCCESS) |
| 1181 | { | 1212 | { |
