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 "util/crypto/sss_crypto.h"
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina#include "responder/nss/nss_protocol.h"
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinastatic errno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinafind_sss_id_type(struct ldb_message *msg,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina bool mpg,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina enum sss_id_type *id_type)
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina{
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t c;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct ldb_message_element *el;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct ldb_val *val = NULL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
0e238c259c066cf997aaa940d33d6bda96c15925Sumit Bose el = ldb_msg_find_element(msg, SYSDB_OBJECTCATEGORY);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (el == NULL) {
0e238c259c066cf997aaa940d33d6bda96c15925Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "Objectcategory attribute not found.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EINVAL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina for (c = 0; c < el->num_values; c++) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina val = &(el->values[c]);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (strncasecmp(SYSDB_USER_CLASS,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina (char *)val->data, val->length) == 0) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina break;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (c == el->num_values) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *id_type = SSS_ID_TYPE_GID;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina } else {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (mpg) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *id_type = SSS_ID_TYPE_BOTH;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina } else {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *id_type = SSS_ID_TYPE_UID;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinastatic errno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_get_id_type(struct nss_cmd_ctx *cmd_ctx,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct cache_req_result *result,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina enum sss_id_type *_type)
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina{
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina errno_t ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (cmd_ctx->sid_id_type != SSS_ID_TYPE_NOT_SPECIFIED) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *_type = cmd_ctx->sid_id_type;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina /* Well known objects are always groups. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (result->well_known_object) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *_type = SSS_ID_TYPE_GID;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = find_sss_id_type(result->msgs[0], result->domain->mpg, _type);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina "Unable to find ID type [%d]: %s\n", ret, sss_strerror(ret));
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinaerrno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_protocol_fill_sid(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 ldb_message *msg = result->msgs[0];
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string sz_sid;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina enum sss_id_type id_type;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina const char *sid;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t rp = 0;
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 ret = nss_get_id_type(cmd_ctx, result, &id_type);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina sid = ldb_msg_find_attr_as_string(msg, SYSDB_SID_STR, NULL);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (sid == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Missing SID.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EINVAL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina to_sized_string(&sz_sid, sid);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sss_packet_grow(packet, sz_sid.len + 3 * sizeof(uint32_t));
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "sss_packet_grow failed.\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], 1, &rp); /* Num results. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_UINT32(&body[rp], 0, &rp); /* Reserved. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_UINT32(&body[rp], id_type, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_STRING(&body[rp], sz_sid.str, sz_sid.len, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinastatic errno_t process_attr_list(TALLOC_CTX *mem_ctx, struct ldb_message *msg,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina const char **attr_list,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string **_keys,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string **_vals,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t *array_size, size_t *sum,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t *found)
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina{
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t c;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t d;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string *keys;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string *vals;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct ldb_val val;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct ldb_message_element *el;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina bool use_base64;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina keys = *_keys;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina vals = *_vals;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina for (c = 0; attr_list[c] != NULL; c++) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina el = ldb_msg_find_element(msg, attr_list[c]);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (el != NULL && el->num_values > 0) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (el->num_values > 1) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *array_size += el->num_values;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina keys = talloc_realloc(mem_ctx, keys, struct sized_string,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *array_size);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina vals = talloc_realloc(mem_ctx, vals, struct sized_string,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *array_size);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (keys == NULL || vals == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "talloc_array failed.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ENOMEM;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina use_base64 = false;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (strcmp(attr_list[c], SYSDB_USER_CERT) == 0) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina use_base64 = true;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina for (d = 0; d < el->num_values; d++) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina to_sized_string(&keys[*found], attr_list[c]);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *sum += keys[*found].len;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (use_base64) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina val.data = (uint8_t *)sss_base64_encode(vals,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina el->values[d].data,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina el->values[d].length);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (val.data != NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina val.length = strlen((char *)val.data);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina } else {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina val = el->values[d];
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (val.data == NULL || val.data[val.length] != '\0') {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina "Unexpected attribute value found for [%s].\n",
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina attr_list[c]);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EINVAL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina to_sized_string(&vals[*found], (const char *)val.data);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *sum += vals[*found].len;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina (*found)++;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *_keys = keys;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *_vals = vals;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinaerrno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_protocol_fill_orig(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 TALLOC_CTX *tmp_ctx;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct ldb_message *msg = result->msgs[0];
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina const char **extra_attrs = NULL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina enum sss_id_type id_type;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string *keys;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string *vals;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t extra_attrs_count = 0;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t array_size;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t sum;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t found;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t i;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t rp = 0;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t body_len;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina uint8_t *body;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina errno_t ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina const char *orig_attrs[] = { SYSDB_SID_STR,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ORIGINALAD_PREFIX SYSDB_NAME,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ORIGINALAD_PREFIX SYSDB_UIDNUM,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ORIGINALAD_PREFIX SYSDB_GIDNUM,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ORIGINALAD_PREFIX SYSDB_HOMEDIR,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ORIGINALAD_PREFIX SYSDB_GECOS,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ORIGINALAD_PREFIX SYSDB_SHELL,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SYSDB_UPN,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SYSDB_DEFAULT_OVERRIDE_NAME,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SYSDB_AD_ACCOUNT_EXPIRES,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SYSDB_AD_USER_ACCOUNT_CONTROL,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SYSDB_SSH_PUBKEY,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SYSDB_USER_CERT,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SYSDB_USER_EMAIL,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SYSDB_ORIG_DN,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SYSDB_ORIG_MEMBEROF,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina NULL };
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina tmp_ctx = talloc_new(NULL);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (tmp_ctx == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ENOMEM;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = nss_get_id_type(cmd_ctx, result, &id_type);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (nss_ctx->extra_attributes != NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina extra_attrs = nss_ctx->extra_attributes;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina for (extra_attrs_count = 0;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina extra_attrs[extra_attrs_count] != NULL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina extra_attrs_count++);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina array_size = sizeof(orig_attrs) + extra_attrs_count;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina keys = talloc_array(tmp_ctx, struct sized_string, array_size);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina vals = talloc_array(tmp_ctx, struct sized_string, array_size);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (keys == NULL || vals == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "talloc_array failed.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = ENOMEM;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina goto done;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina sum = 0;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina found = 0;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = process_attr_list(tmp_ctx, msg, orig_attrs, &keys, &vals,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina &array_size, &sum, &found);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "process_attr_list failed.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina goto done;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (extra_attrs_count != 0) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = process_attr_list(tmp_ctx, msg, extra_attrs, &keys, &vals,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina &array_size, &sum, &found);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "process_attr_list failed.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina goto done;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sss_packet_grow(packet, sum + 3 * sizeof(uint32_t));
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "sss_packet_grow failed.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina goto done;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina sss_packet_get_body(packet, &body, &body_len);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SETMEM_UINT32(&body[rp], 1, &rp); /* Num results */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SETMEM_UINT32(&body[rp], 0, &rp); /* reserved */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_COPY_UINT32(&body[rp], &id_type, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina for (i = 0; i < found; i++) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_STRING(&body[rp], keys[i].str, keys[i].len, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_STRING(&body[rp], vals[i].str, vals[i].len, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinadone:
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina talloc_free(tmp_ctx);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinastatic errno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_get_well_known_name(TALLOC_CTX *mem_ctx,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct resp_ctx *rctx,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct cache_req_result *result,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string **_sz_name)
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina{
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string *sz_name;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina const char *fq_name = NULL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina const char *domname;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina const char *name;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina name = result->lookup_name;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (name == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Missing name.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EINVAL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina sz_name = talloc_zero(mem_ctx, struct sized_string);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (sz_name == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ENOMEM;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina domname = result->domain != NULL
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ? result->domain->name
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina : result->well_known_domain;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (domname != NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina fq_name = sss_tc_fqname2(sz_name, rctx->global_names,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina domname, domname, name);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (fq_name == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "Conversion to fqname failed.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina talloc_free(sz_name);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ENOMEM;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina name = fq_name;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina to_sized_string(sz_name, name);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina *_sz_name = sz_name;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinastatic errno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_get_ad_name(TALLOC_CTX *mem_ctx,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct resp_ctx *rctx,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct cache_req_result *result,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct sized_string **_sz_name)
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina{
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina struct ldb_message *msg = result->msgs[0];
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina const char *name;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina errno_t ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (result->well_known_object) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return nss_get_well_known_name(mem_ctx, rctx, result, _sz_name);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina name = ldb_msg_find_attr_as_string(msg, ORIGINALAD_PREFIX SYSDB_NAME,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina NULL);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (name == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina name = ldb_msg_find_attr_as_string(msg, SYSDB_NAME, NULL);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (name == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Missing name.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EINVAL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sized_output_name(mem_ctx, rctx, name, result->domain, _sz_name);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE,
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina "Unable to create sized name [%d]: %s\n",
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret, sss_strerror(ret));
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Boseerrno_t
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bosenss_protocol_fill_single_name(struct nss_ctx *nss_ctx,
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose struct nss_cmd_ctx *cmd_ctx,
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose struct sss_packet *packet,
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose struct cache_req_result *result)
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose{
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose if (result->ldb_result->count > 1) {
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose DEBUG(SSSDBG_TRACE_FUNC, "Lookup returned more than one result "
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose "but only one was expected.\n");
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose return EEXIST;
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose }
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose return nss_protocol_fill_name(nss_ctx, cmd_ctx, packet, result);
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose}
7aadfa5454e436e4c36ede00434ff9687a6c48e2Sumit Bose
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinaerrno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_protocol_fill_name(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 sized_string *sz_name;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina enum sss_id_type id_type;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t rp = 0;
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 ret = nss_get_id_type(cmd_ctx, result, &id_type);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = nss_get_ad_name(cmd_ctx, nss_ctx->rctx, result, &sz_name);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sss_packet_grow(packet, sz_name->len + 3 * sizeof(uint32_t));
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "sss_packet_grow failed.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina talloc_free(sz_name);
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], 1, &rp); /* Num results. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_UINT32(&body[rp], 0, &rp); /* Reserved. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_UINT32(&body[rp], id_type, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_STRING(&body[rp], sz_name->str, sz_name->len, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina talloc_free(sz_name);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinaerrno_t
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březinanss_protocol_fill_id(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 ldb_message *msg = result->msgs[0];
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina enum sss_id_type id_type;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina uint64_t id64;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina uint32_t id;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina size_t rp = 0;
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 (result->ldb_result == NULL) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina /* This was a well known SID. This is currently unsupported with id. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EINVAL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = nss_get_id_type(cmd_ctx, result, &id_type);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return ret;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (id_type == SSS_ID_TYPE_GID) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina id64 = ldb_msg_find_attr_as_uint64(msg, SYSDB_GIDNUM, 0);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina } else {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina id64 = ldb_msg_find_attr_as_uint64(msg, SYSDB_UIDNUM, 0);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (id64 == 0 || id64 >= UINT32_MAX) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid POSIX ID.\n");
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EINVAL;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina }
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina id = (uint32_t)id64;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina ret = sss_packet_grow(packet, 4 * sizeof(uint32_t));
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina if (ret != EOK) {
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina DEBUG(SSSDBG_OP_FAILURE, "sss_packet_grow failed.\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], 1, &rp); /* Num results. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_UINT32(&body[rp], 0, &rp); /* Reserved. */
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_UINT32(&body[rp], id_type, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina SAFEALIGN_SET_UINT32(&body[rp], id, &rp);
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina return EOK;
4049b63f8c67ada17b453463b0451ca6be3d5de4Pavel Březina}
440797cba931aa491bf418035f55935943e22b4bSumit Bose
440797cba931aa491bf418035f55935943e22b4bSumit Boseerrno_t
440797cba931aa491bf418035f55935943e22b4bSumit Bosenss_protocol_fill_name_list(struct nss_ctx *nss_ctx,
440797cba931aa491bf418035f55935943e22b4bSumit Bose struct nss_cmd_ctx *cmd_ctx,
440797cba931aa491bf418035f55935943e22b4bSumit Bose struct sss_packet *packet,
440797cba931aa491bf418035f55935943e22b4bSumit Bose struct cache_req_result *result)
440797cba931aa491bf418035f55935943e22b4bSumit Bose{
440797cba931aa491bf418035f55935943e22b4bSumit Bose enum sss_id_type *id_types;
440797cba931aa491bf418035f55935943e22b4bSumit Bose size_t rp = 0;
440797cba931aa491bf418035f55935943e22b4bSumit Bose size_t body_len;
440797cba931aa491bf418035f55935943e22b4bSumit Bose uint8_t *body;
440797cba931aa491bf418035f55935943e22b4bSumit Bose errno_t ret;
440797cba931aa491bf418035f55935943e22b4bSumit Bose struct sized_string *sz_names;
440797cba931aa491bf418035f55935943e22b4bSumit Bose size_t len;
440797cba931aa491bf418035f55935943e22b4bSumit Bose size_t c;
440797cba931aa491bf418035f55935943e22b4bSumit Bose const char *tmp_str;
440797cba931aa491bf418035f55935943e22b4bSumit Bose
440797cba931aa491bf418035f55935943e22b4bSumit Bose sz_names = talloc_array(cmd_ctx, struct sized_string, result->count);
440797cba931aa491bf418035f55935943e22b4bSumit Bose if (sz_names == NULL) {
440797cba931aa491bf418035f55935943e22b4bSumit Bose return ENOMEM;
440797cba931aa491bf418035f55935943e22b4bSumit Bose }
440797cba931aa491bf418035f55935943e22b4bSumit Bose
440797cba931aa491bf418035f55935943e22b4bSumit Bose id_types = talloc_array(cmd_ctx, enum sss_id_type, result->count);
440797cba931aa491bf418035f55935943e22b4bSumit Bose if (id_types == NULL) {
440797cba931aa491bf418035f55935943e22b4bSumit Bose return ENOMEM;
440797cba931aa491bf418035f55935943e22b4bSumit Bose }
440797cba931aa491bf418035f55935943e22b4bSumit Bose
440797cba931aa491bf418035f55935943e22b4bSumit Bose len = 0;
440797cba931aa491bf418035f55935943e22b4bSumit Bose for (c = 0; c < result->count; c++) {
440797cba931aa491bf418035f55935943e22b4bSumit Bose ret = nss_get_id_type(cmd_ctx, result, &(id_types[c]));
440797cba931aa491bf418035f55935943e22b4bSumit Bose if (ret != EOK) {
440797cba931aa491bf418035f55935943e22b4bSumit Bose return ret;
440797cba931aa491bf418035f55935943e22b4bSumit Bose }
440797cba931aa491bf418035f55935943e22b4bSumit Bose
a012a71f21bf1a4687e58085f19c18cc5b2bbaddNikolai Kondrashov tmp_str = sss_get_name_from_msg(result->domain, result->msgs[c]);
440797cba931aa491bf418035f55935943e22b4bSumit Bose if (tmp_str == NULL) {
440797cba931aa491bf418035f55935943e22b4bSumit Bose return EINVAL;
440797cba931aa491bf418035f55935943e22b4bSumit Bose }
440797cba931aa491bf418035f55935943e22b4bSumit Bose to_sized_string(&(sz_names[c]), tmp_str);
440797cba931aa491bf418035f55935943e22b4bSumit Bose
440797cba931aa491bf418035f55935943e22b4bSumit Bose len += sz_names[c].len;
440797cba931aa491bf418035f55935943e22b4bSumit Bose }
440797cba931aa491bf418035f55935943e22b4bSumit Bose
440797cba931aa491bf418035f55935943e22b4bSumit Bose len += (2 + result->count) * sizeof(uint32_t);
440797cba931aa491bf418035f55935943e22b4bSumit Bose
440797cba931aa491bf418035f55935943e22b4bSumit Bose ret = sss_packet_grow(packet, len);
440797cba931aa491bf418035f55935943e22b4bSumit Bose if (ret != EOK) {
440797cba931aa491bf418035f55935943e22b4bSumit Bose DEBUG(SSSDBG_OP_FAILURE, "sss_packet_grow failed.\n");
440797cba931aa491bf418035f55935943e22b4bSumit Bose return ret;
440797cba931aa491bf418035f55935943e22b4bSumit Bose }
440797cba931aa491bf418035f55935943e22b4bSumit Bose
440797cba931aa491bf418035f55935943e22b4bSumit Bose sss_packet_get_body(packet, &body, &body_len);
440797cba931aa491bf418035f55935943e22b4bSumit Bose
440797cba931aa491bf418035f55935943e22b4bSumit Bose SAFEALIGN_SET_UINT32(&body[rp], result->count, &rp); /* Num results. */
440797cba931aa491bf418035f55935943e22b4bSumit Bose SAFEALIGN_SET_UINT32(&body[rp], 0, &rp); /* Reserved. */
440797cba931aa491bf418035f55935943e22b4bSumit Bose for (c = 0; c < result->count; c++) {
440797cba931aa491bf418035f55935943e22b4bSumit Bose SAFEALIGN_SET_UINT32(&body[rp], id_types[c], &rp);
440797cba931aa491bf418035f55935943e22b4bSumit Bose SAFEALIGN_SET_STRING(&body[rp], sz_names[c].str, sz_names[c].len,
440797cba931aa491bf418035f55935943e22b4bSumit Bose &rp);
440797cba931aa491bf418035f55935943e22b4bSumit Bose }
440797cba931aa491bf418035f55935943e22b4bSumit Bose
440797cba931aa491bf418035f55935943e22b4bSumit Bose return EOK;
440797cba931aa491bf418035f55935943e22b4bSumit Bose}
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Boseerrno_t
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bosenss_protocol_fill_name_list_all_domains(struct nss_ctx *nss_ctx,
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose struct nss_cmd_ctx *cmd_ctx,
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose struct sss_packet *packet,
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose struct cache_req_result **results)
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose{
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose enum sss_id_type *id_types;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose size_t rp = 0;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose size_t body_len;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose uint8_t *body;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose errno_t ret;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose struct sized_string *sz_names;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose size_t len;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose size_t c;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose const char *tmp_str;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose size_t d;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose size_t total = 0;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose size_t iter = 0;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose if (results == NULL) {
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose return EINVAL;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose }
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose for (d = 0; results[d] != NULL; d++) {
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose total += results[d]->count;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose }
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose sz_names = talloc_array(cmd_ctx, struct sized_string, total);
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose if (sz_names == NULL) {
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose return ENOMEM;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose }
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose id_types = talloc_array(cmd_ctx, enum sss_id_type, total);
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose if (id_types == NULL) {
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose return ENOMEM;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose }
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose len = 0;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose for (d = 0; results[d] != NULL; d++) {
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose for (c = 0; c < results[d]->count; c++) {
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose ret = nss_get_id_type(cmd_ctx, results[d], &(id_types[iter]));
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose if (ret != EOK) {
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose return ret;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose }
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose tmp_str = sss_get_name_from_msg(results[d]->domain,
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose results[d]->msgs[c]);
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose if (tmp_str == NULL) {
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose return EINVAL;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose }
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose to_sized_string(&(sz_names[iter]), tmp_str);
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose len += sz_names[iter].len;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose iter++;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose }
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose }
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose len += (2 + total) * sizeof(uint32_t);
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose ret = sss_packet_grow(packet, len);
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose if (ret != EOK) {
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "sss_packet_grow failed.\n");
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose return ret;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose }
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose sss_packet_get_body(packet, &body, &body_len);
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose SAFEALIGN_SET_UINT32(&body[rp], total, &rp); /* Num results. */
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose SAFEALIGN_SET_UINT32(&body[rp], 0, &rp); /* Reserved. */
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose for (c = 0; c < total; c++) {
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose SAFEALIGN_SET_UINT32(&body[rp], id_types[c], &rp);
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose SAFEALIGN_SET_STRING(&body[rp], sz_names[c].str, sz_names[c].len,
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose &rp);
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose }
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose return EOK;
71731d26dc4f2c36989779f327b0e9a399486e14Sumit Bose}