sss_sudo.c revision 6f701a4dc295ddc997ba5190a3cd72d948d799dc
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/*
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Authors:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Pavel Březina <pbrezina@redhat.com>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster Copyright (C) 2011 Red Hat
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster This program is free software; you can redistribute it and/or modify
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster it under the terms of the GNU General Public License as published by
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster the Free Software Foundation; either version 3 of the License, or
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster (at your option) any later version.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster This program is distributed in the hope that it will be useful,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster but WITHOUT ANY WARRANTY; without even the implied warranty of
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster GNU General Public License for more details.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster You should have received a copy of the GNU General Public License
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster along with this program. If not, see <http://www.gnu.org/licenses/>.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster*/
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <stdlib.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <string.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include <errno.h>
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include "sss_client/sss_cli.h"
f948ca04a28ccfeed9633bf4b0fb0d2c59c37478David Luna#include "sss_client/sudo/sss_sudo.h"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#include "sss_client/sudo/sss_sudo_private.h"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int sss_sudo_create_query(const char *username,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster char **_query,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int *_query_len);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void sss_sudo_free_rules(unsigned int num_rules,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct sss_rule *rules);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void sss_sudo_free_attrs(unsigned int num_attrs,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct sss_attr *attrs);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterint sss_sudo_get_result(const char *username,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster uint32_t *_error,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct sss_result **_result)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster{
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct sss_result *result = NULL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct sss_cli_req_data request;
f948ca04a28ccfeed9633bf4b0fb0d2c59c37478David Luna char *query = NULL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int query_len = 0;
f948ca04a28ccfeed9633bf4b0fb0d2c59c37478David Luna uint8_t *reply_buf = NULL;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster size_t reply_len = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster uint32_t responder_error = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int errnop = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster int ret = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* create query */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ret = sss_sudo_create_query(username, &query, &query_len);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ret != EOK) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster goto done;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster request.len = query_len;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster request.data = (const void*)query;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* send query and recieve response */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster errnop = 0;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ret = sss_sudo_make_request(SSS_SUDO_GET_SUDORULES, &request,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &reply_buf, &reply_len, &errnop);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (errnop != EOK) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ret = errnop;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster goto done;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster /* parse and print structure */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ret = sss_sudo_parse_response((const char*)reply_buf, reply_len,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster &result, &responder_error);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if (ret != EOK) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster goto done;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster }
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *_error = responder_error;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster *_result = result;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ret = EOK;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterdone:
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster free(query);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster return ret;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster}
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterint sss_sudo_create_query(const char *username, char **_query, int *_query_len)
{
char *data = NULL;
int data_len = strlen(username) + 1;
if (data_len <= 1) {
return EINVAL;
}
data = (char*)malloc(data_len * sizeof(char));
if (data == NULL) {
return ENOMEM;
}
memcpy(data, username, data_len);
*_query = data;
*_query_len = data_len;
return EOK;
}
int sss_sudo_get_values(struct sss_rule *e,
const char *attrname, char ***_values)
{
struct sss_attr *attr = NULL;
char **values = NULL;
int i, j;
for (i = 0; i < e->num_attrs; i++) {
attr = e->attrs + i;
if (strcasecmp(attr->name, attrname) == 0) {
values = calloc(attr->num_values + 1, sizeof(char*));
if (values == NULL) {
return ENOMEM;
}
for (j = 0; j < attr->num_values; j++) {
values[j] = strdup(attr->values[j]);
if (values[j] == NULL) {
return ENOMEM;
}
}
values[attr->num_values] = NULL;
}
}
if (values == 0) {
return ENOENT;
}
*_values = values;
return EOK;
}
void sss_sudo_free_values(char **values)
{
char **value = NULL;
if (values == NULL) {
return;
}
for (value = values; *value != NULL; value++) {
free(*value);
}
free(values);
}
void sss_sudo_free_result(struct sss_result *result)
{
if (result == NULL) {
return;
}
sss_sudo_free_rules(result->num_rules, result->rules);
free(result);
}
void sss_sudo_free_rules(unsigned int num_rules, struct sss_rule *rules)
{
struct sss_rule *rule = NULL;
int i;
if (rules == NULL) {
return;
}
for (i = 0; i < num_rules; i++) {
rule = rules + i;
if (rule == NULL) {
continue;
}
sss_sudo_free_attrs(rule->num_attrs, rule->attrs);
rule->attrs = NULL;
}
free(rules);
}
void sss_sudo_free_attrs(unsigned int num_attrs, struct sss_attr *attrs)
{
struct sss_attr *attr = NULL;;
int i, j;
if (attrs == NULL) {
return;
}
for (i = 0; i < num_attrs; i++) {
attr = attrs + i;
if (attr == NULL) {
continue;
}
free(attr->name);
attr->name = NULL;
for (j = 0; j < attr->num_values; j++) {
free(attr->values[j]);
attr->values[j] = NULL;
}
free(attr->values);
}
free(attrs);
}