summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/ldap_server/ldap_parse.c323
-rw-r--r--source4/ldap_server/ldap_parse.h41
2 files changed, 0 insertions, 364 deletions
diff --git a/source4/ldap_server/ldap_parse.c b/source4/ldap_server/ldap_parse.c
deleted file mode 100644
index d411b26c1a..0000000000
--- a/source4/ldap_server/ldap_parse.c
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
- LDAP server
- Copyright (C) Simo Sorce 2004
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-#include "includes.h"
-#include "ldap_parse.h"
-
-static char char_from_hex(char a, char b) {
- char m, l;
-
- if ('0' <= a && a <= '9') {
- m = a - '0';
- } else if ('A' <= a && a <= 'F') {
- m = 10 + (a - 'A');
- } else if ('a' <= a && a <= 'f') {
- m = 10 + (a - 'a');
- } else {
- return a;
- }
-
- if ('0' <= b && b <= '9') {
- l = b - '0';
- } else if ('A' <= b && b <= 'F') {
- l = 10 + (b - 'A');
- } else if ('a' <= b && b <= 'f') {
- l = 10 + (b - 'a');
- } else {
- return a;
- }
-
- return ((m << 4) + l);
-}
-
-static char *parse_slash(char *p, char *end) {
- switch (*(p + 1)) {
- case ',':
- case '=':
- case '\n':
- case '+':
- case '<':
- case '>':
- case '#':
- case ';':
- case '\\':
- case '"':
- memmove(p, p + 1, end - (p + 1));
- return (end - 1);
- default:
- *p = char_from_hex(*(p + 1), *(p + 2));
- memmove(p + 1, p + 3, end - (p + 3));
- return (end - 2);
- }
-}
-
-#define LDAP_PARSE_DN_INVALID(x) do {\
- if (x) { \
- dn->comp_num = -1; \
- return dn; \
- } \
-} while(0)
-
-#if 0
-static void ldap_parse_attributetypedescription(struct ldap_schema *schema, DATA_BLOB *data)
-{
- char *desc;
-
- desc = talloc_array(schema, char, data->lenght + 1);
- memcpy(desc, data->data, data->lenght);
- desc[data->lenght] = '\0';
-
-}
-
-static void ldap_parse_objectclassdescription(struct ldap_schema *schema, DATA_BLOB *data)
-{
- char *desc;
-
- desc = talloc_array(schema, char, data->lenght + 1);
- memcpy(desc, data->data, data->lenght);
- desc[data->lenght] = '\0';
-
-}
-
-static struct ldap_schema *ldap_get_schema(void *mem_ctx, struct ldap_schema *schema, struct ldb_context *ldb)
-{
- NTSTATUS status;
- struct ldap_schema *local_schema;
- struct ldb_message **res;
- const char *errstr;
- const char *schema_dn = "cn=schema";
- const char *attr_filter = "attributeTypeDescription=*";
- const char *class_filter = "objectClassDescription=*";
- const char *attrs = "attributeTypeDescription";
- const char *classes = "objectClassDescription";
- enum ldb_scope scope = LDAP_SCOPE_SUBTREE;
- int count, i, j, k;
-
- local_schema = schema;
- if (local_schema == NULL) {
- local_schema = talloc(mem_ctx, struct ldap_schema);
- ALLOC_CHECK(local_schema);
- }
-
- count = ldb_search(ldb, schema_dn, scope, attr_filter, attrs, &res);
-
- for (i = 0; i < count; i++) {
- if (res[i]->num_elements == 0) {
- goto attr_done;
- }
- for (j = 0; j < res[i]->num_elements; j++) {
- for (k = 0; res[i]->elements[j].num_values; k++) {
- ldap_parse_attributetypedescription(local_schema, &(res[i]->elements[j].values[k]));
- }
- }
-attr_done:
- }
-
- count = ldb_search(ldb, schema_dn, scope, class_filter, classes, &res);
-
- for (i = 0; i < count; i++) {
- if (res[i]->num_elements == 0) {
- goto class_done;
- }
- for (j = 0; j < res[i]->num_elements; j++) {
- for (k = 0; res[i]->elements[j].num_values; k++) {
- ldap_parse_objectclassdescription(local_schema, &(res[i]->elements[j].values[k]));
- }
- }
-class_done:
- }
-
- return local_schema;
-}
-#endif
-
-struct ldap_dn *ldap_parse_dn(void *mem_ctx, const char *orig_dn)
-{
- struct ldap_dn *dn;
- struct dn_component *component;
- struct dn_attribute *attribute;
- char *p, *start, *separator, *src, *dest, *dn_copy, *dn_end;
- int i, size, orig_len;
-
- dn = talloc(mem_ctx, struct ldap_dn);
- dn->comp_num = 0;
- dn->components = talloc_array(dn, struct dn_component *, 1);
- component = talloc(dn, struct dn_component);
- component->attr_num = 0;
-
- orig_len = strlen(orig_dn);
- if (orig_len == 0) {
- dn->dn = talloc_strdup(dn, orig_dn);
- return dn;
- }
-
- dn_copy = p = talloc_strdup(mem_ctx, orig_dn);
- dn_end = dn_copy + orig_len + 1;
- do {
- component->attributes = talloc_array(component, struct dn_attribute *, 1);
- attribute = talloc(component, struct dn_attribute);
-
- /* skip "spaces" */
- while (*p == ' ' || *p == '\n') {
- p++;
- }
-
- /* start parsing this component */
- do {
- start = p;
-
- /* find out key separator '=' */
- while (*p && *p != '=') {
- if (*p == '\\') {
- dn_end = parse_slash(p, dn_end);
- }
- p++;
- }
- separator = p;
-
- /* remove spaces */
- while (*(p - 1) == ' ' || *(p - 1) == '\n') {
- p--;
- }
-
- /* save key name */
- LDAP_PARSE_DN_INVALID((p - start) < 1);
- attribute->name = talloc_strndup(attribute, start, p - start);
- DEBUG(10, ("attribute name: [%s]\n", attribute->name));
-
- p = separator + 1;
-
- /* skip spaces past the separator */
- p = separator + strspn(p, " \n") + 1;
- start = p;
-
- /* check if the value is enclosed in QUOTATION */
- if (*p == '"') {
- start = p + 1;
- while (*p && *p != '"') {
- if (*p == '\\') {
- dn_end = parse_slash(p, dn_end);
- }
- p++;
- }
-
- /* skip spaces until the separator */
- separator = p + strspn(p, " \n");
-
- if (*separator != ',' && *separator != ';' && *separator != '+') { /* there must be a separator here */
- /* Error Malformed DN */
- DEBUG (0, ("Error: Malformed DN!\n"));
- break;
- }
- } else {
- while (*p && !(*p == ',' || *p == ';' || *p == '+')) {
- if (*p == '\\') {
- dn_end = parse_slash(p, dn_end);
- }
- p++;
- } /* found separator */
-
- separator = p;
-
- /* remove spaces */
- while (*(p - 1) == ' ' || *(p - 1) == '\n') {
- p--;
- }
- }
-
- /* save the value */
- LDAP_PARSE_DN_INVALID((p - start) < 1);
- attribute->value = talloc_strndup(attribute, start, p - start);
- DEBUG(10, ("attribute value: [%s]\n", attribute->value));
-
- attribute->attribute = talloc_asprintf(attribute,"%s=%s", attribute->name, attribute->value);
- DEBUG(10, ("attribute: [%s]\n", attribute->attribute));
-
- /* save the attribute */
- component->attributes[component->attr_num] = attribute;
- component->attr_num++;
-
- if (*separator == '+') { /* expect other attributes in this component */
- component->attributes = talloc_realloc(component, component->attributes, struct dn_attribute *, component->attr_num + 1);
-
- /* allocate new attribute structure */
- attribute = talloc(component, struct dn_attribute);
-
- /* skip spaces past the separator */
- p = separator + strspn(p, " \n");
- }
-
- } while (*separator == '+');
-
- /* found component bounds */
- for (i = 0, size = 0; i < component->attr_num; i++) {
- size = size + strlen(component->attributes[i]->attribute) + 1;
- }
-
- /* rebuild the normlaized component and put it here */
- component->component = dest = talloc_size(component, size);
- for (i = 0; i < component->attr_num; i++) {
- if (i != 0) {
- *dest = '+';
- dest++;
- }
- src = component->attributes[i]->attribute;
- do {
- *(dest++) = *(src++);
- } while(*src);
- *dest = '\0';
- }
- DEBUG(10, ("component: [%s]\n", component->component));
-
- dn->components[dn->comp_num] = component;
- dn->comp_num++;
-
- if (*separator == ',' || *separator == ';') {
- dn->components = talloc_realloc(dn, dn->components, struct dn_component *, dn->comp_num + 1);
- component = talloc(dn, struct dn_component);
- component->attr_num = 0;
- }
- p = separator + 1;
-
- } while(*separator == ',' || *separator == ';');
-
- for (i = 0, size = 0; i < dn->comp_num; i++) {
- size = size + strlen(dn->components[i]->component) + 1;
- }
-
- /* rebuild the normlaized dn and put it here */
- dn->dn = dest = talloc_size(dn, size);
- for (i = 0; i < dn->comp_num; i++) {
- if (i != 0) {
- *dest = ',';
- dest++;
- }
- src = dn->components[i]->component;
- do {
- *(dest++) = *(src++);
- } while(*src);
- *dest = '\0';
- }
- DEBUG(10, ("dn: [%s]\n", dn->dn));
-
- talloc_free(dn_copy);
-
- return dn;
-}
diff --git a/source4/ldap_server/ldap_parse.h b/source4/ldap_server/ldap_parse.h
deleted file mode 100644
index 5b870896c4..0000000000
--- a/source4/ldap_server/ldap_parse.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- Unix SMB/CIFS implementation.
- LDAP server
- Copyright (C) Simo Sorce 2004
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-*/
-
-struct dn_attribute {
- char *attribute;
- char *name;
- char *value;
-};
-
-struct dn_component {
- char *component;
- int attr_num;
- struct dn_attribute **attributes;
-};
-
-struct ldap_dn {
- char *dn;
- int comp_num;
- struct dn_component **components;
-};
-
-struct ldap_schema {
- int dummy;
-};