17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina/*
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina Authors:
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina Pavel Březina <pbrezina@redhat.com>
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina Copyright (C) 2013 Red Hat
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina This program is free software; you can redistribute it and/or modify
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina it under the terms of the GNU General Public License as published by
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina the Free Software Foundation; either version 3 of the License, or
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina (at your option) any later version.
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina This program is distributed in the hope that it will be useful,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina GNU General Public License for more details.
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina You should have received a copy of the GNU General Public License
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina*/
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina#include "util/util.h"
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina#include "db/sysdb.h"
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina#include "tests/cmocka/common_mock.h"
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina#include "tests/cmocka/common_mock_sysdb_objects.h"
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březinaenum sysdb_attr_type {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina SYSDB_ATTR_TYPE_BOOL,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina SYSDB_ATTR_TYPE_LONG,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina SYSDB_ATTR_TYPE_UINT32,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina SYSDB_ATTR_TYPE_TIME,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina SYSDB_ATTR_TYPE_STRING
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina};
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březinastatic enum sysdb_attr_type
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březinaget_attr_type(const char *attr)
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina{
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina /* Most attributes in sysdb are strings. Since this is only for the purpose
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina * of unit tests, we can safe ourselves some time and handle all attributes
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina * that are not listed amongst other types as string instead of invalid
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina * or unknown.
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina */
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina static const char *table_bool[] = {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina SYSDB_POSIX,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina NULL
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina };
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina static const char *table_long[] = {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina NULL
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina };
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina static const char *table_uint32[] = {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina SYSDB_UIDNUM, SYSDB_GIDNUM,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina NULL
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina };
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina static const char *table_time[] = {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina SYSDB_CACHE_EXPIRE,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina NULL
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina };
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina static const char **tables[SYSDB_ATTR_TYPE_STRING] = {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina table_bool, table_long, table_uint32, table_time
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina };
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina enum sysdb_attr_type type;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina int i;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina for (type = 0; type < SYSDB_ATTR_TYPE_STRING; type++) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina for (i = 0; tables[type][i] != NULL; i++) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina if (strcmp(attr, tables[type][i]) == 0) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina return type;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina /* we didn't find the attribute, consider it as string */
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina return SYSDB_ATTR_TYPE_STRING;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina}
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březinastatic errno_t
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březinafill_attrs(struct sysdb_attrs *attrs, va_list in_ap)
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina{
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina va_list ap;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina const char *attr = NULL;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina errno_t ret;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina va_copy(ap, in_ap);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina while ((attr = va_arg(ap, const char *)) != NULL) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina switch (get_attr_type(attr)) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina case SYSDB_ATTR_TYPE_STRING:
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina ret = sysdb_attrs_add_string(attrs, attr, va_arg(ap, const char *));
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina break;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina case SYSDB_ATTR_TYPE_BOOL:
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina /* _Bool is implicitly promoted to int in variadic functions */
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina ret = sysdb_attrs_add_bool(attrs, attr, va_arg(ap, int));
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina break;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina case SYSDB_ATTR_TYPE_LONG:
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina ret = sysdb_attrs_add_long(attrs, attr, va_arg(ap, long int));
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina break;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina case SYSDB_ATTR_TYPE_UINT32:
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina ret = sysdb_attrs_add_uint32(attrs, attr, va_arg(ap, uint32_t));
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina break;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina case SYSDB_ATTR_TYPE_TIME:
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina ret = sysdb_attrs_add_time_t(attrs, attr, va_arg(ap, time_t));
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina break;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina if (ret != EOK) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina return ret;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina va_end(ap);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina return EOK;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina}
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březinastruct sysdb_attrs *
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina_mock_sysdb_object(TALLOC_CTX *mem_ctx,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina const char *base_dn,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina const char *name,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina ...)
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina{
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina va_list ap;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina struct sysdb_attrs *attrs = NULL;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina char *orig_dn = NULL;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina errno_t ret;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina attrs = sysdb_new_attrs(mem_ctx);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina if (attrs == NULL) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina goto fail;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina orig_dn = talloc_asprintf(attrs, "cn=%s,%s", name, base_dn);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina if (orig_dn == NULL) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina goto fail;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina ret = sysdb_attrs_add_string(attrs, SYSDB_ORIG_DN, orig_dn);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina if (ret != EOK) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina goto fail;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina ret = sysdb_attrs_add_string(attrs, SYSDB_NAME, name);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina if (ret != EOK) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina goto fail;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina va_start(ap, name);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina ret = fill_attrs(attrs, ap);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina va_end(ap);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina if (ret != EOK) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina goto fail;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina talloc_free(orig_dn);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina return attrs;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březinafail:
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina talloc_free(attrs);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina return NULL;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina}
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březinastruct sysdb_attrs *
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březinamock_sysdb_group_rfc2307bis(TALLOC_CTX *mem_ctx,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina const char *base_dn,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina gid_t gid,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina const char *name,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina const char **members)
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina{
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina struct sysdb_attrs *attrs = NULL;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina errno_t ret;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina int i;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina attrs = mock_sysdb_object(mem_ctx, base_dn, name,
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina SYSDB_GIDNUM, gid);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina if (attrs == NULL) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina return NULL;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina if (members != NULL) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina for (i = 0; members[i] != NULL; i++) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina ret = sysdb_attrs_add_string(attrs, SYSDB_MEMBER, members[i]);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina if (ret != EOK) {
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina talloc_zfree(attrs);
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina return NULL;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina }
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina return attrs;
17d37aecdf397fcb7a1d0c75adebdb25d7be112ePavel Březina}
b0fb84bb4a98d3086b78550c737ef20f63cbac26Jakub Hrozek
b0fb84bb4a98d3086b78550c737ef20f63cbac26Jakub Hrozekstruct sysdb_attrs *
b0fb84bb4a98d3086b78550c737ef20f63cbac26Jakub Hrozekmock_sysdb_user(TALLOC_CTX *mem_ctx,
b0fb84bb4a98d3086b78550c737ef20f63cbac26Jakub Hrozek const char *base_dn,
b0fb84bb4a98d3086b78550c737ef20f63cbac26Jakub Hrozek uid_t uid,
b0fb84bb4a98d3086b78550c737ef20f63cbac26Jakub Hrozek const char *name)
b0fb84bb4a98d3086b78550c737ef20f63cbac26Jakub Hrozek{
b0fb84bb4a98d3086b78550c737ef20f63cbac26Jakub Hrozek return mock_sysdb_object(mem_ctx, base_dn, name,
b0fb84bb4a98d3086b78550c737ef20f63cbac26Jakub Hrozek SYSDB_UIDNUM, uid);
b0fb84bb4a98d3086b78550c737ef20f63cbac26Jakub Hrozek}