f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina/*
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina Authors:
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina Pavel Březina <pbrezina@redhat.com>
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina Copyright (C) 2011 Red Hat
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina This program is free software; you can redistribute it and/or modify
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina it under the terms of the GNU General Public License as published by
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina the Free Software Foundation; either version 3 of the License, or
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina (at your option) any later version.
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina This program is distributed in the hope that it will be useful,
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina GNU General Public License for more details.
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina You should have received a copy of the GNU General Public License
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina*/
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#include <stdlib.h>
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#include <stdio.h>
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#include <errno.h>
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#include <string.h>
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#include <talloc.h>
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina#include <sys/types.h>
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina#include <pwd.h>
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#include "sss_client/sss_cli.h"
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#include "sss_client/sudo/sss_sudo.h"
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#include "sss_client/sudo/sss_sudo_private.h"
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#ifndef EOK
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#define EOK 0
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina#endif
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březinavoid print_sss_result(struct sss_sudo_result *result);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březinaint main(int argc, char **argv)
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina{
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina int ret = 0;
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina struct sss_sudo_result *result = NULL;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina struct passwd *passwd = NULL;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina const char *username = NULL;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina char *domainname = NULL;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina uid_t uid = 0;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina uint32_t error = 0;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
8e520758e2325c10d153bd2e3f57330b37545817Pavel Březina if (argc != 2 && argc != 3) {
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina fprintf(stderr, "Usage: sss_sudo_cli username [uid]\n");
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina goto fail;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina }
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina username = argv[1];
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina if (argc == 3) {
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina uid = atoi(argv[2]);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina } else {
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina passwd = getpwnam(username);
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina if (passwd == NULL) {
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina fprintf(stderr, "Unknown user\n");
e6092759dc4268b105b79478aa9b1398f21ed7a9Pavel Březina goto fail;
e6092759dc4268b105b79478aa9b1398f21ed7a9Pavel Březina }
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina uid = passwd->pw_uid;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina }
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina /* get sss_result - it will send new query to responder */
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina /* get default options */
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina ret = sss_sudo_send_recv_defaults(uid, username, &error,
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina &domainname, &result);
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina if (ret != EOK) {
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina fprintf(stderr, "sss_sudo_send_recv_defaults() failed: %s\n",
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina strerror(ret));
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina goto fail;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina }
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina printf("User [%s:%llu] found in domain: %s\n\n",
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina username, (unsigned long long)uid,
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina domainname != NULL ? domainname : "<NULL>");
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina printf("=== Printing response data [default options] ===\n");
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina printf("Response code: %d\n\n", error);
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina if (error == SSS_SUDO_ERROR_OK) {
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina print_sss_result(result);
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina }
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina sss_sudo_free_result(result);
7dcf7275974021848cdd57781abc7eb9aa77feedStephen Gallagher result = NULL;
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina /* get rules */
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina ret = sss_sudo_send_recv(uid, username, domainname, &error, &result);
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina if (ret != EOK) {
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina fprintf(stderr, "sss_sudo_send_recv() failed: %s\n", strerror(ret));
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina goto fail;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina }
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina printf("\n=== Printing response data [rules] ===\n");
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina printf("Response code: %d\n\n", error);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina if (error == SSS_SUDO_ERROR_OK) {
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina print_sss_result(result);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina }
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina free(domainname);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina sss_sudo_free_result(result);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina return 0;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březinafail:
46d3d2c731e8c7e138462e5b60a39a279dc77d81Pavel Březina free(domainname);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina sss_sudo_free_result(result);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina return 1;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina}
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březinavoid print_sss_result(struct sss_sudo_result *result)
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina{
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina struct sss_sudo_rule *rule = NULL;
968e2bc3bb28458b25c3b19868ea50f0325d8b0aPavel Březina struct sss_sudo_attr *attr = NULL;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina int i = 0;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina int j = 0;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina int k = 0;
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina printf("Number of rules: %d\n", result->num_rules);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina for (i = 0; i < result->num_rules; i++) {
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina rule = &result->rules[i];
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina printf("=== Rule %d has %d attributes\n", i, rule->num_attrs);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina for (j = 0; j < rule->num_attrs; j++) {
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina attr = &rule->attrs[j];
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina printf(" === Attribute named %s has %d values:\n", attr->name,
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina attr->num_values);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina for (k = 0; k < attr->num_values; k++) {
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina printf(" %s\n", attr->values[k]);
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina }
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina }
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina }
f8c829e72968b574e1c9bda96f4d5f206622358fPavel Březina}