Annotation of embedaddon/sudo/plugins/group_file/plugin_test.c, revision 1.1

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: 

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