Return to plugin_test.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / plugins / group_file |
1.1 ! misho 1: /* ! 2: * Copyright (c) 2010-2013 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: ! 19: #include <stdio.h> ! 20: #include <stdlib.h> ! 21: #include <stddef.h> ! 22: #include <stdarg.h> ! 23: #include <string.h> ! 24: #include <unistd.h> ! 25: #include <ctype.h> ! 26: #include <dlfcn.h> ! 27: #include <errno.h> ! 28: #include <limits.h> ! 29: #include <pwd.h> ! 30: ! 31: #include "sudo_plugin.h" ! 32: ! 33: __dso_public int main(int argc, char *argv[]); ! 34: ! 35: /* ! 36: * Simple driver to test sudoer group plugins. ! 37: * usage: plugin_test [-p "plugin.so plugin_args ..."] user:group ... ! 38: */ ! 39: ! 40: static void *group_handle; ! 41: static struct sudoers_group_plugin *group_plugin; ! 42: ! 43: static int ! 44: plugin_printf(int msg_type, const char *fmt, ...) ! 45: { ! 46: va_list ap; ! 47: FILE *fp; ! 48: ! 49: switch (msg_type) { ! 50: case SUDO_CONV_INFO_MSG: ! 51: fp = stdout; ! 52: break; ! 53: case SUDO_CONV_ERROR_MSG: ! 54: fp = stderr; ! 55: break; ! 56: default: ! 57: errno = EINVAL; ! 58: return -1; ! 59: } ! 60: ! 61: va_start(ap, fmt); ! 62: vfprintf(fp, fmt, ap); ! 63: va_end(ap); ! 64: ! 65: return 0; ! 66: } ! 67: ! 68: /* ! 69: * Load the specified plugin and run its init function. ! 70: * Returns -1 if unable to open the plugin, else it returns ! 71: * the value from the plugin's init function. ! 72: */ ! 73: static int ! 74: group_plugin_load(char *plugin_info) ! 75: { ! 76: char *args, path[PATH_MAX], savedch; ! 77: char **argv = NULL; ! 78: int rc; ! 79: ! 80: /* ! 81: * Fill in .so path and split out args (if any). ! 82: */ ! 83: if ((args = strpbrk(plugin_info, " \t")) != NULL) { ! 84: savedch = *args; ! 85: *args = '\0'; ! 86: } ! 87: strncpy(path, plugin_info, sizeof(path) - 1); ! 88: path[sizeof(path) - 1] = '\0'; ! 89: if (args != NULL) ! 90: *args++ = savedch; ! 91: ! 92: /* Open plugin and map in symbol. */ ! 93: group_handle = dlopen(path, RTLD_LAZY); ! 94: if (!group_handle) { ! 95: fprintf(stderr, "unable to dlopen %s: %s\n", path, dlerror()); ! 96: return -1; ! 97: } ! 98: group_plugin = dlsym(group_handle, "group_plugin"); ! 99: if (group_plugin == NULL) { ! 100: fprintf(stderr, "unable to find symbol \"group_plugin\" in %s\n", path); ! 101: return -1; ! 102: } ! 103: ! 104: if (GROUP_API_VERSION_GET_MAJOR(group_plugin->version) != GROUP_API_VERSION_MAJOR) { ! 105: fprintf(stderr, ! 106: "%s: incompatible group plugin major version %d, expected %d\n", ! 107: path, GROUP_API_VERSION_GET_MAJOR(group_plugin->version), ! 108: GROUP_API_VERSION_MAJOR); ! 109: return -1; ! 110: } ! 111: ! 112: /* ! 113: * Split args into a vector if specified. ! 114: */ ! 115: if (args != NULL) { ! 116: int ac = 0, wasblank = 1; ! 117: char *cp; ! 118: ! 119: for (cp = args; *cp != '\0'; cp++) { ! 120: if (isblank((unsigned char)*cp)) { ! 121: wasblank = 1; ! 122: } else if (wasblank) { ! 123: wasblank = 0; ! 124: ac++; ! 125: } ! 126: } ! 127: if (ac != 0) { ! 128: argv = malloc(ac * sizeof(char *)); ! 129: if (argv == NULL) { ! 130: perror(NULL); ! 131: return -1; ! 132: } ! 133: ac = 0; ! 134: for ((cp = strtok(args, " \t")); cp; (cp = strtok(NULL, " \t"))) ! 135: argv[ac++] = cp; ! 136: } ! 137: } ! 138: ! 139: rc = (group_plugin->init)(GROUP_API_VERSION, plugin_printf, argv); ! 140: ! 141: free(argv); ! 142: ! 143: return rc; ! 144: } ! 145: ! 146: static void ! 147: group_plugin_unload(void) ! 148: { ! 149: (group_plugin->cleanup)(); ! 150: dlclose(group_handle); ! 151: group_handle = NULL; ! 152: } ! 153: ! 154: static int ! 155: group_plugin_query(const char *user, const char *group, ! 156: const struct passwd *pwd) ! 157: { ! 158: return group_plugin->query)(user, group, pwd; ! 159: } ! 160: ! 161: static void ! 162: usage(void) ! 163: { ! 164: fprintf(stderr, ! 165: "usage: plugin_test [-p \"plugin.so plugin_args ...\"] user:group ...\n"); ! 166: exit(1); ! 167: } ! 168: ! 169: int ! 170: main(int argc, char *argv[]) ! 171: { ! 172: int ch, i, found; ! 173: char *plugin = "group_file.so"; ! 174: char *user, *group; ! 175: struct passwd *pwd; ! 176: ! 177: while ((ch = getopt(argc, argv, "p:")) != -1) { ! 178: switch (ch) { ! 179: case 'p': ! 180: plugin = optarg; ! 181: break; ! 182: default: ! 183: usage(); ! 184: } ! 185: } ! 186: argc -= optind; ! 187: argv += optind; ! 188: ! 189: if (argc < 1) ! 190: usage(); ! 191: ! 192: if (group_plugin_load(plugin) != 1) { ! 193: fprintf(stderr, "unable to load plugin: %s\n", plugin); ! 194: exit(1); ! 195: } ! 196: ! 197: for (i = 0; argv[i] != NULL; i++) { ! 198: user = argv[i]; ! 199: group = strchr(argv[i], ':'); ! 200: if (group == NULL) ! 201: continue; ! 202: *group++ = '\0'; ! 203: pwd = getpwnam(user); ! 204: found = group_plugin_query(user, group, pwd); ! 205: printf("user %s %s in group %s\n", user, found ? "is" : "NOT ", group); ! 206: } ! 207: group_plugin_unload(); ! 208: ! 209: exit(0); ! 210: } ! 211: