Annotation of embedaddon/sudo/plugins/sample_group/plugin_test.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (c) 2010-2011 Todd C. Miller <Todd.Miller@courtesan.com>
! 3: *
! 4: * Permission to use, copy, modify, and distribute this software for any
! 5: * purpose with or without fee is hereby granted, provided that the above
! 6: * copyright notice and this permission notice appear in all copies.
! 7: *
! 8: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
! 9: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
! 10: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
! 11: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
! 12: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
! 13: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
! 14: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
! 15: */
! 16:
! 17: #include <sys/types.h>
! 18: #include <sys/param.h>
! 19:
! 20: #include <stdio.h>
! 21: #include <stdlib.h>
! 22: #include <stddef.h>
! 23: #include <stdarg.h>
! 24: #include <string.h>
! 25: #include <unistd.h>
! 26: #include <ctype.h>
! 27: #include <dlfcn.h>
! 28: #include <errno.h>
! 29: #include <limits.h>
! 30: #include <pwd.h>
! 31:
! 32: #include "sudo_plugin.h"
! 33:
! 34: /*
! 35: * Simple driver to test sudoer group plugins.
! 36: * usage: plugin_test [-p "plugin.so plugin_args ..."] user:group ...
! 37: */
! 38:
! 39: static void *group_handle;
! 40: static struct sudoers_group_plugin *group_plugin;
! 41:
! 42: static int
! 43: plugin_printf(int msg_type, const char *fmt, ...)
! 44: {
! 45: va_list ap;
! 46: FILE *fp;
! 47:
! 48: switch (msg_type) {
! 49: case SUDO_CONV_INFO_MSG:
! 50: fp = stdout;
! 51: break;
! 52: case SUDO_CONV_ERROR_MSG:
! 53: fp = stderr;
! 54: break;
! 55: default:
! 56: errno = EINVAL;
! 57: return -1;
! 58: }
! 59:
! 60: va_start(ap, fmt);
! 61: vfprintf(fp, fmt, ap);
! 62: va_end(ap);
! 63:
! 64: return 0;
! 65: }
! 66:
! 67: /*
! 68: * Load the specified plugin and run its init function.
! 69: * Returns -1 if unable to open the plugin, else it returns
! 70: * the value from the plugin's init function.
! 71: */
! 72: static int
! 73: group_plugin_load(char *plugin_info)
! 74: {
! 75: char *args, path[PATH_MAX], savedch;
! 76: char **argv = NULL;
! 77: int rc;
! 78:
! 79: /*
! 80: * Fill in .so path and split out args (if any).
! 81: */
! 82: if ((args = strpbrk(plugin_info, " \t")) != NULL) {
! 83: savedch = *args;
! 84: *args = '\0';
! 85: }
! 86: strncpy(path, plugin_info, sizeof(path) - 1);
! 87: path[sizeof(path) - 1] = '\0';
! 88: if (args != NULL)
! 89: *args++ = savedch;
! 90:
! 91: /* Open plugin and map in symbol. */
! 92: group_handle = dlopen(path, RTLD_LAZY);
! 93: if (!group_handle) {
! 94: fprintf(stderr, "unable to dlopen %s: %s\n", path, dlerror());
! 95: return -1;
! 96: }
! 97: group_plugin = dlsym(group_handle, "group_plugin");
! 98: if (group_plugin == NULL) {
! 99: fprintf(stderr, "unable to find symbol \"group_plugin\" in %s\n", path);
! 100: return -1;
! 101: }
! 102:
! 103: if (GROUP_API_VERSION_GET_MAJOR(group_plugin->version) != GROUP_API_VERSION_MAJOR) {
! 104: fprintf(stderr,
! 105: "%s: incompatible group plugin major version %d, expected %d\n",
! 106: path, GROUP_API_VERSION_GET_MAJOR(group_plugin->version),
! 107: GROUP_API_VERSION_MAJOR);
! 108: return -1;
! 109: }
! 110:
! 111: /*
! 112: * Split args into a vector if specified.
! 113: */
! 114: if (args != NULL) {
! 115: int ac = 0, wasblank = 1;
! 116: char *cp;
! 117:
! 118: for (cp = args; *cp != '\0'; cp++) {
! 119: if (isblank((unsigned char)*cp)) {
! 120: wasblank = 1;
! 121: } else if (wasblank) {
! 122: wasblank = 0;
! 123: ac++;
! 124: }
! 125: }
! 126: if (ac != 0) {
! 127: argv = malloc(ac * sizeof(char *));
! 128: if (argv == NULL) {
! 129: fprintf(stderr, "unable to allocate memory\n");
! 130: return -1;
! 131: }
! 132: ac = 0;
! 133: for ((cp = strtok(args, " \t")); cp; (cp = strtok(NULL, " \t")))
! 134: argv[ac++] = cp;
! 135: }
! 136: }
! 137:
! 138: rc = (group_plugin->init)(GROUP_API_VERSION, plugin_printf, argv);
! 139:
! 140: free(argv);
! 141:
! 142: return rc;
! 143: }
! 144:
! 145: static void
! 146: group_plugin_unload(void)
! 147: {
! 148: (group_plugin->cleanup)();
! 149: dlclose(group_handle);
! 150: group_handle = NULL;
! 151: }
! 152:
! 153: static int
! 154: group_plugin_query(const char *user, const char *group,
! 155: const struct passwd *pwd)
! 156: {
! 157: return group_plugin->query)(user, group, pwd;
! 158: }
! 159:
! 160: static void
! 161: usage(void)
! 162: {
! 163: fprintf(stderr,
! 164: "usage: plugin_test [-p \"plugin.so plugin_args ...\"] user:group ...\n");
! 165: exit(1);
! 166: }
! 167:
! 168: int
! 169: main(int argc, char *argv[])
! 170: {
! 171: int ch, i, found;
! 172: char *plugin = "sample_group.so";
! 173: char *user, *group;
! 174: struct passwd *pwd;
! 175:
! 176: while ((ch = getopt(argc, argv, "p:")) != -1) {
! 177: switch (ch) {
! 178: case 'p':
! 179: plugin = optarg;
! 180: break;
! 181: default:
! 182: usage();
! 183: }
! 184: }
! 185: argc -= optind;
! 186: argv += optind;
! 187:
! 188: if (argc < 1)
! 189: usage();
! 190:
! 191: if (group_plugin_load(plugin) != 1) {
! 192: fprintf(stderr, "unable to load plugin: %s\n", plugin);
! 193: exit(1);
! 194: }
! 195:
! 196: for (i = 0; argv[i] != NULL; i++) {
! 197: user = argv[i];
! 198: group = strchr(argv[i], ':');
! 199: if (group == NULL)
! 200: continue;
! 201: *group++ = '\0';
! 202: pwd = getpwnam(user);
! 203: found = group_plugin_query(user, group, pwd);
! 204: printf("user %s %s in group %s\n", user, found ? "is" : "NOT ", group);
! 205: }
! 206: group_plugin_unload();
! 207:
! 208: exit(0);
! 209: }
! 210:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>