File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / sudo / plugins / group_file / plugin_test.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Mon Jul 22 00:51:38 2013 UTC (10 years, 11 months ago) by misho
Branches: sudo, MAIN
CVS tags: v1_8_8p0, v1_8_8, v1_8_7, HEAD
1.8.7

    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: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>