4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina/*
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina Authors:
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina Pavel Březina <pbrezina@redhat.com>
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina Copyright (C) 2016 Red Hat
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina This program is free software; you can redistribute it and/or modify
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina it under the terms of the GNU General Public License as published by
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina the Free Software Foundation; either version 3 of the License, or
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina (at your option) any later version.
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina This program is distributed in the hope that it will be useful,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina GNU General Public License for more details.
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina You should have received a copy of the GNU General Public License
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina*/
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina#include "db/sysdb.h"
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina#include "db/sysdb_services.h"
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina#include "responder/nss/nss_protocol.h"
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinastatic errno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_protocol_fill_netgr_triple(struct sss_packet *packet,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sysdb_netgroup_ctx *entry,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t *_rp)
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina{
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string host;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string user;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string domain;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t body_len;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina uint8_t *body;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina errno_t ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina to_sized_string(&host, entry->value.triple.hostname);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina to_sized_string(&user, entry->value.triple.username);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina to_sized_string(&domain, entry->value.triple.domainname);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (host.len == 0) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina host.len = 1;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina host.str = "";
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (user.len == 0) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina user.len = 1;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina user.str = "";
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (domain.len == 0) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina domain.len = 1;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina domain.str = "";
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sss_packet_grow(packet, sizeof(uint32_t)
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina + host.len + user.len + domain.len);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to grow packet!\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina sss_packet_get_body(packet, &body, &body_len);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_UINT32(&body[*_rp], SSS_NETGR_REP_TRIPLE, _rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_STRING(&body[*_rp], host.str, host.len, _rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_STRING(&body[*_rp], user.str, user.len, _rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_STRING(&body[*_rp], domain.str, domain.len, _rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinastatic errno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_protocol_fill_netgr_member(struct sss_packet *packet,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sysdb_netgroup_ctx *entry,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t *_rp)
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina{
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string group;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t body_len;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina uint8_t *body;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina errno_t ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (entry->value.groupname == NULL || entry->value.groupname[0] == '\0') {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Empty netgroup member!\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EINVAL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina to_sized_string(&group, entry->value.groupname);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sss_packet_grow(packet, sizeof(uint32_t) + group.len);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to grow packet!\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina sss_packet_get_body(packet, &body, &body_len);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_UINT32(&body[*_rp], SSS_NETGR_REP_GROUP, _rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_STRING(&body[*_rp], group.str, group.len, _rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinaerrno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_protocol_fill_netgrent(struct nss_ctx *nss_ctx,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct nss_cmd_ctx *cmd_ctx,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sss_packet *packet,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct cache_req_result *result)
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina{
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sysdb_netgroup_ctx **entries;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sysdb_netgroup_ctx *entry;
39e300314cb43e534179a6950274e1e9c9a48465Lukas Slebodnik struct nss_enum_index *idx;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina uint32_t num_results;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t rp;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t body_len;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina uint8_t *body;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina errno_t ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina unsigned int start;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
39e300314cb43e534179a6950274e1e9c9a48465Lukas Slebodnik idx = cmd_ctx->enum_index;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina entries = cmd_ctx->enum_ctx->netgroup;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
08db22b1b1a2e742edbca92e35087294d963addaSumit Bose if (idx->result > cmd_ctx->enum_ctx->netgroup_count) {
08db22b1b1a2e742edbca92e35087294d963addaSumit Bose DEBUG(SSSDBG_CRIT_FAILURE,
08db22b1b1a2e742edbca92e35087294d963addaSumit Bose "Unconsistent state while processing netgroups.\n");
08db22b1b1a2e742edbca92e35087294d963addaSumit Bose ret = EINVAL;
08db22b1b1a2e742edbca92e35087294d963addaSumit Bose goto done;
08db22b1b1a2e742edbca92e35087294d963addaSumit Bose }
08db22b1b1a2e742edbca92e35087294d963addaSumit Bose
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina /* First two fields (length and reserved), filled up later. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sss_packet_grow(packet, 2 * sizeof(uint32_t));
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina rp = 2 * sizeof(uint32_t);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (entries == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina num_results = 0;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina goto done;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina num_results = 0;
39e300314cb43e534179a6950274e1e9c9a48465Lukas Slebodnik start = idx->result;
39e300314cb43e534179a6950274e1e9c9a48465Lukas Slebodnik for (; entries[idx->result] != NULL; idx->result++) {
39e300314cb43e534179a6950274e1e9c9a48465Lukas Slebodnik if ((idx->result - start) >= cmd_ctx->enum_limit) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina /* We have reached result limit. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina break;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
39e300314cb43e534179a6950274e1e9c9a48465Lukas Slebodnik entry = entries[idx->result];
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina switch (entry->type) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina case SYSDB_NETGROUP_TRIPLE_VAL:
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = nss_protocol_fill_netgr_triple(packet, entry, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina break;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina case SYSDB_NETGROUP_GROUP_VAL:
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = nss_protocol_fill_netgr_member(packet, entry, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina break;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina default:
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unexpected value type!\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = ERR_INTERNAL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina break;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina goto done;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina num_results++;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinadone:
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina sss_packet_set_size(packet, 0);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina sss_packet_get_body(packet, &body, &body_len);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_COPY_UINT32(body, &num_results, NULL);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SETMEM_UINT32(body + sizeof(uint32_t), 0, NULL); /* reserved */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinaerrno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_protocol_fill_setnetgrent(struct nss_ctx *nss_ctx,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct nss_cmd_ctx *cmd_ctx,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sss_packet *packet,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct cache_req_result *result)
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina{
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t body_len;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina uint8_t *body;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina errno_t ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina /* Two fields (length and reserved). */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sss_packet_grow(packet, 2 * sizeof(uint32_t));
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina sss_packet_get_body(packet, &body, &body_len);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_UINT32(body, 1, NULL); /* Netgroup was found. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SETMEM_UINT32(body + sizeof(uint32_t), 0, NULL); /* reserved */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}