b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina/*
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina Authors:
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina Pavel Březina <pbrezina@redhat.com>
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina Copyright (C) 2015 Red Hat
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina This program is free software; you can redistribute it and/or modify
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina it under the terms of the GNU General Public License as published by
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina the Free Software Foundation; either version 3 of the License, or
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina (at your option) any later version.
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina This program is distributed in the hope that it will be useful,
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina GNU General Public License for more details.
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina You should have received a copy of the GNU General Public License
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina*/
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina#include <talloc.h>
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina#include <ldb.h>
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina#include "db/sysdb.h"
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina#include "providers/ipa/ipa_dn.h"
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březinastatic bool check_dn(struct ldb_dn *dn,
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina const char *rdn_attr,
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina va_list in_ap)
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina{
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina const struct ldb_val *ldbval;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina const char *strval;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina const char *ldbattr;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina const char *attr;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina const char *val;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina va_list ap;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina int num_comp;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina int comp;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina /* check RDN attribute */
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ldbattr = ldb_dn_get_rdn_name(dn);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (ldbattr == NULL || strcasecmp(ldbattr, rdn_attr) != 0) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina return false;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina /* Check DN components. First we check if all attr=value pairs match input.
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina * Then we check that the next attribute is a domain component.
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina */
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina comp = 1;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina num_comp = ldb_dn_get_comp_num(dn);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina va_copy(ap, in_ap);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina while ((attr = va_arg(ap, const char *)) != NULL) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina val = va_arg(ap, const char *);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (val == NULL) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto vafail;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (comp > num_comp) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto vafail;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ldbattr = ldb_dn_get_component_name(dn, comp);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (ldbattr == NULL || strcasecmp(ldbattr, attr) != 0) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto vafail;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ldbval = ldb_dn_get_component_val(dn, comp);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (ldbval == NULL) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto vafail;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina strval = (const char *)ldbval->data;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (strval == NULL || strncasecmp(strval, val, ldbval->length) != 0) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto vafail;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina comp++;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina va_end(ap);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ldbattr = ldb_dn_get_component_name(dn, comp);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (ldbattr == NULL || strcmp(ldbattr, "dc") != 0) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina return false;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina return true;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březinavafail:
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina va_end(ap);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina return false;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina}
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březinaerrno_t _ipa_get_rdn(TALLOC_CTX *mem_ctx,
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina struct sysdb_ctx *sysdb,
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina const char *obj_dn,
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina char **_rdn_val,
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina const char *rdn_attr,
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ...)
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina{
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina const struct ldb_val *val;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina struct ldb_dn *dn;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina errno_t ret;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina bool bret;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina va_list ap;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina char *rdn;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina dn = ldb_dn_new(mem_ctx, sysdb_ctx_get_ldb(sysdb), obj_dn);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (dn == NULL) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina return ENOMEM;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina va_start(ap, rdn_attr);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina bret = check_dn(dn, rdn_attr, ap);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina va_end(ap);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (bret == false) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ret = ENOENT;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto done;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (_rdn_val == NULL) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ret = EOK;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto done;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina val = ldb_dn_get_rdn_val(dn);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (val == NULL || val->data == NULL) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ret = EINVAL;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto done;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina rdn = talloc_strndup(mem_ctx, (const char*)val->data, val->length);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina if (rdn == NULL) {
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ret = ENOMEM;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina goto done;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina }
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina *_rdn_val = rdn;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina ret = EOK;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březinadone:
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina talloc_free(dn);
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina return ret;
b407fe0474a674bb42f0f42ab47c7f530a07a367Pavel Březina}