2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina/*
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina Authors:
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina Pavel Březina <pbrezina@redhat.com>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina Copyright (C) 2011 Red Hat
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina This program is free software; you can redistribute it and/or modify
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina it under the terms of the GNU General Public License as published by
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina the Free Software Foundation; either version 3 of the License, or
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina (at your option) any later version.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina This program is distributed in the hope that it will be useful,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina GNU General Public License for more details.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina You should have received a copy of the GNU General Public License
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina*/
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include <string.h>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include <stdint.h>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include <errno.h>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include <talloc.h>
d38ffc9c92daeb62de7d28c409bdaeff98f82775Pavel Březina#include <tevent.h>
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "util/util.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina#include "responder/sudo/sudosrv_private.h"
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březinastatic int sudosrv_response_append_string(TALLOC_CTX *mem_ctx,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina const char *str,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina size_t str_len,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina uint8_t **_response_body,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina size_t *_response_len)
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina{
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina size_t response_len = *_response_len;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina uint8_t *response_body = *_response_body;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina response_body = talloc_realloc(mem_ctx, response_body, uint8_t,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina response_len + (str_len * sizeof(char)));
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (response_body == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_realloc() failed\n");
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return ENOMEM;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina memcpy(response_body + response_len, str, str_len);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina response_len += str_len;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *_response_body = response_body;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *_response_len = response_len;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return EOK;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina}
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březinastatic int sudosrv_response_append_uint32(TALLOC_CTX *mem_ctx,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina uint32_t number,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina uint8_t **_response_body,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina size_t *_response_len)
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina{
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina size_t response_len = *_response_len;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina uint8_t *response_body = *_response_body;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina response_body = talloc_realloc(mem_ctx, response_body, uint8_t,
1b3144586978c47506eaa39db505e6231e3b0c0aJakub Hrozek response_len + sizeof(uint32_t));
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (response_body == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_realloc() failed\n");
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return ENOMEM;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina SAFEALIGN_SET_UINT32(response_body + response_len, number, &response_len);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *_response_body = response_body;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *_response_len = response_len;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return EOK;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina}
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březinastatic int sudosrv_response_append_attr(TALLOC_CTX *mem_ctx,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina const char *name,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina unsigned int values_num,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina struct ldb_val *values,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina uint8_t **_response_body,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina size_t *_response_len)
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina{
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina uint8_t *response_body = *_response_body;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina size_t response_len = *_response_len;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina TALLOC_CTX *tmp_ctx = NULL;
573e86dc3156e481ce53d39ac901da2e99cfa0caJakub Hrozek unsigned int i = 0;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina int ret = EOK;
573e86dc3156e481ce53d39ac901da2e99cfa0caJakub Hrozek const char *strval;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina tmp_ctx = talloc_new(NULL);
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina if (tmp_ctx == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina return ENOMEM;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina }
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina /* attr name */
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina ret = sudosrv_response_append_string(tmp_ctx, name, strlen(name) + 1,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina &response_body, &response_len);
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina if (ret != EOK) {
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina goto done;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina }
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina /* values count */
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina ret = sudosrv_response_append_uint32(tmp_ctx, values_num,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina &response_body, &response_len);
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina if (ret != EOK) {
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina goto done;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina }
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina /* values */
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina for (i = 0; i < values_num; i++) {
573e86dc3156e481ce53d39ac901da2e99cfa0caJakub Hrozek strval = (const char *) values[i].data;
573e86dc3156e481ce53d39ac901da2e99cfa0caJakub Hrozek
573e86dc3156e481ce53d39ac901da2e99cfa0caJakub Hrozek if (strlen((strval)) != values[i].length) {
87f8bee53ee1b4ca87b602ff8536bc5fd5b5b595Lukas Slebodnik DEBUG(SSSDBG_CRIT_FAILURE, "value is not a string\n");
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina ret = EINVAL;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina goto done;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina }
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina ret = sudosrv_response_append_string(tmp_ctx,
573e86dc3156e481ce53d39ac901da2e99cfa0caJakub Hrozek strval,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina values[i].length + 1,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina &response_body, &response_len);
573e86dc3156e481ce53d39ac901da2e99cfa0caJakub Hrozek DEBUG(SSSDBG_TRACE_INTERNAL, "%s:%s\n", name, strval);
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina if (ret != EOK) {
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina goto done;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina }
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina }
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina *_response_body = talloc_steal(mem_ctx, response_body);
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina *_response_len = response_len;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina ret = EOK;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březinadone:
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina talloc_free(tmp_ctx);
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina return ret;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina}
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březinastatic int sudosrv_response_append_rule(TALLOC_CTX *mem_ctx,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina int attrs_num,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina struct ldb_message_element *attrs,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina uint8_t **_response_body,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina size_t *_response_len)
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina{
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina uint8_t *response_body = *_response_body;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina size_t response_len = *_response_len;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina TALLOC_CTX *tmp_ctx = NULL;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int i = 0;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina int ret = EOK;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina tmp_ctx = talloc_new(NULL);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (tmp_ctx == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return ENOMEM;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* attrs count */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ret = sudosrv_response_append_uint32(tmp_ctx, attrs_num,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina &response_body, &response_len);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret != EOK) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina goto done;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina /* attrs */
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina for (i = 0; i < attrs_num; i++) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ret = sudosrv_response_append_attr(tmp_ctx, attrs[i].name,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina attrs[i].num_values, attrs[i].values,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina &response_body, &response_len);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret != EOK) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina goto done;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *_response_body = talloc_steal(mem_ctx, response_body);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *_response_len = response_len;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ret = EOK;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březinadone:
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina talloc_free(tmp_ctx);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return ret;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina}
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina/*
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina * Response format:
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina * <error_code(uint32_t)><domain(char*)>\0<num_entries(uint32_t)><rule1><rule2>...
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina * <ruleN> = <num_attrs(uint32_t)><attr1><attr2>...
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina * <attrN> = <name(char*)>\0<num_values(uint32_t)><value1(char*)>\0<value2(char*)>\0...
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina *
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina * if <error_code> is not SSS_SUDO_ERROR_OK, the rest of the data is skipped.
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina */
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březinaerrno_t sudosrv_build_response(TALLOC_CTX *mem_ctx,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina uint32_t error,
5ff1c3c5a12930692cb6284d14f7fda3a974af8ePavel Březina uint32_t rules_num,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina struct sysdb_attrs **rules,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina uint8_t **_response_body,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina size_t *_response_len)
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina{
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina uint8_t *response_body = NULL;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina size_t response_len = 0;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina TALLOC_CTX *tmp_ctx = NULL;
5ff1c3c5a12930692cb6284d14f7fda3a974af8ePavel Březina uint32_t i = 0;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina errno_t ret = EOK;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina tmp_ctx = talloc_new(NULL);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (tmp_ctx == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "talloc_new() failed\n");
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina return ENOMEM;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina /* error code */
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina ret = sudosrv_response_append_uint32(tmp_ctx, error,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina &response_body, &response_len);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret != EOK) {
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina goto fail;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina }
573e86dc3156e481ce53d39ac901da2e99cfa0caJakub Hrozek DEBUG(SSSDBG_TRACE_INTERNAL, "error: [%"PRIu32"]\n", error);
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina if (error != SSS_SUDO_ERROR_OK) {
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina goto done;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
7379170a0860790f2739e07fffe3d6ec85264566Pavel Březina /* domain name - deprecated
7379170a0860790f2739e07fffe3d6ec85264566Pavel Březina * TODO: when possible change the protocol */
7379170a0860790f2739e07fffe3d6ec85264566Pavel Březina ret = sudosrv_response_append_string(tmp_ctx, "\0", 1,
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina &response_body, &response_len);
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina if (ret != EOK) {
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina goto fail;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina }
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina /* rules count */
5ff1c3c5a12930692cb6284d14f7fda3a974af8ePavel Březina ret = sudosrv_response_append_uint32(tmp_ctx, rules_num,
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina &response_body, &response_len);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret != EOK) {
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina goto fail;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
573e86dc3156e481ce53d39ac901da2e99cfa0caJakub Hrozek DEBUG(SSSDBG_TRACE_INTERNAL, "rules_num: [%"PRIu32"]\n", error);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina /* rules */
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina for (i = 0; i < rules_num; i++) {
573e86dc3156e481ce53d39ac901da2e99cfa0caJakub Hrozek DEBUG(SSSDBG_TRACE_INTERNAL, "rule [%"PRIu32"]/[%"PRIu32"]\n", i+1, rules_num);
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina ret = sudosrv_response_append_rule(tmp_ctx, rules[i]->num, rules[i]->a,
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina &response_body, &response_len);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina if (ret != EOK) {
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina goto fail;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina }
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březinadone:
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *_response_body = talloc_steal(mem_ctx, response_body);
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina *_response_len = response_len;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina ret = EOK;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březinafail:
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina talloc_free(tmp_ctx);
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina return ret;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina}
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březinaerrno_t sudosrv_parse_query(TALLOC_CTX *mem_ctx,
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina uint8_t *query_body,
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina size_t query_len,
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina char **_rawname,
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina uid_t *_uid)
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina{
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina size_t offset = 0;
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina size_t rawname_len;
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina char *rawname;
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina uid_t uid;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina /* uid */
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina if (query_len < sizeof(uid_t)) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Query is too small\n");
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina return EINVAL;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina }
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina safealign_memcpy(&uid, query_body, sizeof(uid_t), &offset);
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina /* username[@domain] */
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina rawname = (char*)(query_body + offset);
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina rawname_len = query_len - offset; /* strlen + zero */
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina if (rawname[rawname_len - 1] != '\0') {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Username is not zero terminated\n");
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina return EINVAL;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina }
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina if (rawname_len < 2) { /* at least one character and zero */
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Query does not contain username\n");
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina return EINVAL;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina }
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina if (!sss_utf8_check((uint8_t*)rawname, rawname_len - 1)) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Supplied data is not valid UTF-8 string\n");
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina return EINVAL;
d38ffc9c92daeb62de7d28c409bdaeff98f82775Pavel Březina }
d38ffc9c92daeb62de7d28c409bdaeff98f82775Pavel Březina
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina rawname = talloc_strdup(mem_ctx, rawname);
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina if (rawname == NULL) {
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina return ENOMEM;
d38ffc9c92daeb62de7d28c409bdaeff98f82775Pavel Březina }
d38ffc9c92daeb62de7d28c409bdaeff98f82775Pavel Březina
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina *_uid = uid;
15d41c8f28259061e39715acdbbbaea778b6ecc8Pavel Březina *_rawname = rawname;
710472d946f6c337a095699dfd79134fa8b9eab9Pavel Březina
d38ffc9c92daeb62de7d28c409bdaeff98f82775Pavel Březina return EOK;
2827b0d03f7b6bafa504d22a5d7ca39cbda048b3Pavel Březina}