Annotation of embedaddon/sudo/plugins/sample_group/plugin_test.c, revision 1.1.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>