ad2olschema.c
来自「samba最新软件」· C语言 代码 · 共 699 行 · 第 1/2 页
C
699 行
/* ldb database library Copyright (C) Andrew Bartlett 2006 ** NOTE! The following LGPL license applies to the ldb ** library. This does NOT imply that all of Samba is released ** under the LGPL This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, see <http://www.gnu.org/licenses/>.*//* * Name: ldb * * Component: ad2oLschema * * Description: utility to convert an AD schema into the format required by OpenLDAP * * Author: Andrew Bartlett */#include "includes.h"#include "ldb_includes.h"#include "system/locale.h"#include "tools/cmdline.h"#include "tools/convert.h"#include "param/param.h"#include "lib/cmdline/popt_common.h"struct schema_conv { int count; int skipped; int failures;};enum convert_target { TARGET_OPENLDAP, TARGET_FEDORA_DS}; static void usage(void){ printf("Usage: ad2oLschema <options>\n"); printf("\nConvert AD-like LDIF to OpenLDAP schema format\n\n"); printf("Options:\n"); printf(" -I inputfile inputfile of mapped OIDs and skipped attributes/ObjectClasses"); printf(" -H url LDB or LDAP server to read schmea from\n"); printf(" -O outputfile outputfile otherwise STDOUT\n"); printf(" -o options pass options like modules to activate\n"); printf(" e.g: -o modules:timestamps\n"); printf("\n"); printf("Converts records from an AD-like LDIF schema into an openLdap formatted schema\n\n"); exit(1);}static int fetch_attrs_schema(struct ldb_context *ldb, struct ldb_dn *schemadn, TALLOC_CTX *mem_ctx, struct ldb_result **attrs_res){ TALLOC_CTX *local_ctx = talloc_new(mem_ctx); int ret; const char *attrs[] = { "lDAPDisplayName", "isSingleValued", "attributeID", "attributeSyntax", "description", NULL }; if (!local_ctx) { return LDB_ERR_OPERATIONS_ERROR; } /* Downlaod schema */ ret = ldb_search(ldb, schemadn, LDB_SCOPE_SUBTREE, "objectClass=attributeSchema", attrs, attrs_res); if (ret != LDB_SUCCESS) { printf("Search failed: %s\n", ldb_errstring(ldb)); return LDB_ERR_OPERATIONS_ERROR; } return ret;}static const char *oc_attrs[] = { "lDAPDisplayName", "mayContain", "mustContain", "systemMayContain", "systemMustContain", "objectClassCategory", "governsID", "description", "subClassOf", NULL};static int fetch_oc_recursive(struct ldb_context *ldb, struct ldb_dn *schemadn, TALLOC_CTX *mem_ctx, struct ldb_result *search_from, struct ldb_result *res_list){ int i; int ret = 0; for (i=0; i < search_from->count; i++) { struct ldb_result *res; const char *name = ldb_msg_find_attr_as_string(search_from->msgs[i], "lDAPDisplayname", NULL); ret = ldb_search_exp_fmt(ldb, mem_ctx, &res, schemadn, LDB_SCOPE_SUBTREE, oc_attrs, "(&(&(objectClass=classSchema)(subClassOf=%s))(!(lDAPDisplayName=%s)))", name, name); if (ret != LDB_SUCCESS) { printf("Search failed: %s\n", ldb_errstring(ldb)); return ret; } res_list->msgs = talloc_realloc(res_list, res_list->msgs, struct ldb_message *, res_list->count + 2); if (!res_list->msgs) { return LDB_ERR_OPERATIONS_ERROR; } res_list->msgs[res_list->count] = talloc_move(res_list, &search_from->msgs[i]); res_list->count++; res_list->msgs[res_list->count] = NULL; if (res->count > 0) { ret = fetch_oc_recursive(ldb, schemadn, mem_ctx, res, res_list); } if (ret != LDB_SUCCESS) { return ret; } } return ret;}static int fetch_objectclass_schema(struct ldb_context *ldb, struct ldb_dn *schemadn, TALLOC_CTX *mem_ctx, struct ldb_result **objectclasses_res){ TALLOC_CTX *local_ctx = talloc_new(mem_ctx); struct ldb_result *top_res, *ret_res; int ret; if (!local_ctx) { return LDB_ERR_OPERATIONS_ERROR; } /* Downlaod 'top' */ ret = ldb_search(ldb, schemadn, LDB_SCOPE_SUBTREE, "(&(objectClass=classSchema)(lDAPDisplayName=top))", oc_attrs, &top_res); if (ret != LDB_SUCCESS) { printf("Search failed: %s\n", ldb_errstring(ldb)); return LDB_ERR_OPERATIONS_ERROR; } talloc_steal(local_ctx, top_res); if (top_res->count != 1) { return LDB_ERR_OPERATIONS_ERROR; } ret_res = talloc_zero(local_ctx, struct ldb_result); if (!ret_res) { return LDB_ERR_OPERATIONS_ERROR; } ret = fetch_oc_recursive(ldb, schemadn, local_ctx, top_res, ret_res); if (ret != LDB_SUCCESS) { printf("Search failed: %s\n", ldb_errstring(ldb)); return LDB_ERR_OPERATIONS_ERROR; } *objectclasses_res = talloc_move(mem_ctx, &ret_res); return ret;}static struct ldb_dn *find_schema_dn(struct ldb_context *ldb, TALLOC_CTX *mem_ctx) { const char *rootdse_attrs[] = {"schemaNamingContext", NULL}; const char *no_attrs[] = { NULL }; struct ldb_dn *schemadn; struct ldb_dn *basedn = ldb_dn_new(mem_ctx, ldb, NULL); struct ldb_result *rootdse_res; struct ldb_result *schema_res; int ldb_ret; if (!basedn) { return NULL; } /* Search for rootdse */ ldb_ret = ldb_search(ldb, basedn, LDB_SCOPE_BASE, NULL, rootdse_attrs, &rootdse_res); if (ldb_ret != LDB_SUCCESS) { ldb_ret = ldb_search(ldb, basedn, LDB_SCOPE_SUBTREE, "(&(objectClass=dMD)(cn=Schema))", no_attrs, &schema_res); if (ldb_ret) { printf("cn=Schema Search failed: %s\n", ldb_errstring(ldb)); return NULL; } talloc_steal(mem_ctx, schema_res); if (schema_res->count != 1) { printf("Failed to find rootDSE"); return NULL; } schemadn = talloc_steal(mem_ctx, schema_res->msgs[0]->dn); talloc_free(schema_res); return schemadn; } talloc_steal(mem_ctx, rootdse_res); if (rootdse_res->count != 1) { printf("Failed to find rootDSE"); return NULL; } /* Locate schema */ schemadn = ldb_msg_find_attr_as_dn(ldb, mem_ctx, rootdse_res->msgs[0], "schemaNamingContext"); if (!schemadn) { return NULL; } talloc_free(rootdse_res); return schemadn;}#define IF_NULL_FAIL_RET(x) do { \ if (!x) { \ ret.failures++; \ return ret; \ } \ } while (0) static struct schema_conv process_convert(struct ldb_context *ldb, enum convert_target target, FILE *in, FILE *out) { /* Read list of attributes to skip, OIDs to map */ TALLOC_CTX *mem_ctx = talloc_new(ldb); char *line; const char **attrs_skip = NULL; int num_skip = 0; struct oid_map { char *old_oid; char *new_oid; } *oid_map = NULL; int num_oid_maps = 0; struct attr_map { char *old_attr; char *new_attr; } *attr_map = NULL; int num_attr_maps = 0; struct ldb_result *attrs_res, *objectclasses_res; struct ldb_dn *schemadn; struct schema_conv ret; int ldb_ret, i; ret.count = 0; ret.skipped = 0; ret.failures = 0; while ((line = afdgets(fileno(in), mem_ctx, 0))) { /* Blank Line */ if (line[0] == '\0') { continue; } /* Comment */ if (line[0] == '#') { continue; } if (isdigit(line[0])) { char *p = strchr(line, ':'); IF_NULL_FAIL_RET(p); p[0] = '\0'; p++; oid_map = talloc_realloc(mem_ctx, oid_map, struct oid_map, num_oid_maps + 2); trim_string(line, " ", " "); oid_map[num_oid_maps].old_oid = talloc_move(oid_map, &line); trim_string(p, " ", " "); oid_map[num_oid_maps].new_oid = p; num_oid_maps++; oid_map[num_oid_maps].old_oid = NULL; } else { char *p = strchr(line, ':'); if (p) { /* remap attribute/objectClass */ p[0] = '\0'; p++; attr_map = talloc_realloc(mem_ctx, attr_map, struct attr_map, num_attr_maps + 2); trim_string(line, " ", " "); attr_map[num_attr_maps].old_attr = talloc_move(attr_map, &line); trim_string(p, " ", " "); attr_map[num_attr_maps].new_attr = p; num_attr_maps++; attr_map[num_attr_maps].old_attr = NULL; } else { /* skip attribute/objectClass */ attrs_skip = talloc_realloc(mem_ctx, attrs_skip, const char *, num_skip + 2); trim_string(line, " ", " "); attrs_skip[num_skip] = talloc_move(attrs_skip, &line); num_skip++; attrs_skip[num_skip] = NULL; } } } schemadn = find_schema_dn(ldb, mem_ctx); if (!schemadn) { printf("Failed to find schema DN: %s\n", ldb_errstring(ldb)); ret.failures = 1; return ret; } ldb_ret = fetch_attrs_schema(ldb, schemadn, mem_ctx, &attrs_res); if (ldb_ret != LDB_SUCCESS) { printf("Failed to fetch attribute schema: %s\n", ldb_errstring(ldb)); ret.failures = 1; return ret; } switch (target) { case TARGET_OPENLDAP: break; case TARGET_FEDORA_DS: fprintf(out, "dn: cn=schema\n"); break; }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?