Annotation of embedaddon/sudo/plugins/group_file/plugin_test.c, revision 1.1.1.2
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: {
1.1.1.2 ! misho 158: return (group_plugin->query)(user, group, pwd);
1.1 misho 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:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>