Annotation of embedaddon/sudo/doc/sudo_plugin.cat, revision 1.1.1.1

1.1       misho       1: SUDO_PLUGIN(1m)              MAINTENANCE COMMANDS              SUDO_PLUGIN(1m)
                      2: 
                      3: 
                      4: 
                      5: NNAAMMEE
                      6:        sudo_plugin - Sudo Plugin API
                      7: 
                      8: DDEESSCCRRIIPPTTIIOONN
                      9:        Starting with version 1.8, ssuuddoo supports a plugin API for policy and
                     10:        session logging.  By default, the _s_u_d_o_e_r_s policy plugin and an
                     11:        associated I/O logging plugin are used.  Via the plugin API, ssuuddoo can
                     12:        be configured to use alternate policy and/or I/O logging plugins
                     13:        provided by third parties.  The plugins to be used are specified via
                     14:        the _/_e_t_c_/_s_u_d_o_._c_o_n_f file.
                     15: 
                     16:        The API is versioned with a major and minor number.  The minor version
                     17:        number is incremented when additions are made.  The major number is
                     18:        incremented when incompatible changes are made.  A plugin should be
                     19:        check the version passed to it and make sure that the major version
                     20:        matches.
                     21: 
                     22:        The plugin API is defined by the sudo_plugin.h header file.
                     23: 
                     24:    TThhee ssuuddoo..ccoonnff FFiillee
                     25:        The _/_e_t_c_/_s_u_d_o_._c_o_n_f file contains plugin configuration directives.
                     26:        Currently, the only supported keyword is the Plugin directive, which
                     27:        causes a plugin plugin to be loaded.
                     28: 
                     29:        A Plugin line consists of the Plugin keyword, followed by the
                     30:        _s_y_m_b_o_l___n_a_m_e and the _p_a_t_h to the shared object containing the plugin.
                     31:        The _s_y_m_b_o_l___n_a_m_e is the name of the struct policy_plugin or struct
                     32:        io_plugin in the plugin shared object.  The _p_a_t_h may be fully qualified
                     33:        or relative.  If not fully qualified it is relative to the
                     34:        _/_u_s_r_/_l_o_c_a_l_/_l_i_b_e_x_e_c directory.  Any additional parameters after the _p_a_t_h
                     35:        are ignored.  Lines that don't begin with Plugin or Path are silently
                     36:        ignored.
                     37: 
                     38:        The same shared object may contain multiple plugins, each with a
                     39:        different symbol name.  The shared object file must be owned by uid 0
                     40:        and only writable by its owner.  Because of ambiguities that arise from
                     41:        composite policies, only a single policy plugin may be specified.  This
                     42:        limitation does not apply to I/O plugins.
                     43: 
                     44:         #
                     45:         # Default /etc/sudo.conf file
                     46:         #
                     47:         # Format:
                     48:         #   Plugin plugin_name plugin_path
                     49:         #   Path askpass /path/to/askpass
                     50:         #
                     51:         # The plugin_path is relative to /usr/local/libexec unless
                     52:         #   fully qualified.
                     53:         # The plugin_name corresponds to a global symbol in the plugin
                     54:         #   that contains the plugin interface structure.
                     55:         #
                     56:         Plugin sudoers_policy sudoers.so
                     57:         Plugin sudoers_io sudoers.so
                     58: 
                     59:    PPoolliiccyy PPlluuggiinn AAPPII
                     60:        A policy plugin must declare and populate a policy_plugin struct in the
                     61:        global scope.  This structure contains pointers to the functions that
                     62:        implement the ssuuddoo policy checks.  The name of the symbol should be
                     63:        specified in _/_e_t_c_/_s_u_d_o_._c_o_n_f along with a path to the plugin so that
                     64:        ssuuddoo can load it.
                     65: 
                     66:         struct policy_plugin {
                     67:         #define SUDO_POLICY_PLUGIN     1
                     68:             unsigned int type; /* always SUDO_POLICY_PLUGIN */
                     69:             unsigned int version; /* always SUDO_API_VERSION */
                     70:             int (*open)(unsigned int version, sudo_conv_t conversation,
                     71:                         sudo_printf_t plugin_printf, char * const settings[],
                     72:                         char * const user_info[], char * const user_env[]);
                     73:             void (*close)(int exit_status, int error);
                     74:             int (*show_version)(int verbose);
                     75:             int (*check_policy)(int argc, char * const argv[],
                     76:                                 char *env_add[], char **command_info[],
                     77:                                 char **argv_out[], char **user_env_out[]);
                     78:             int (*list)(int argc, char * const argv[], int verbose,
                     79:                         const char *list_user);
                     80:             int (*validate)(void);
                     81:             void (*invalidate)(int remove);
                     82:             int (*init_session)(struct passwd *pwd);
                     83:         };
                     84: 
                     85:        The policy_plugin struct has the following fields:
                     86: 
                     87:        type
                     88:            The type field should always be set to SUDO_POLICY_PLUGIN.
                     89: 
                     90:        version
                     91:            The version field should be set to SUDO_API_VERSION.
                     92: 
                     93:            This allows ssuuddoo to determine the API version the plugin was built
                     94:            against.
                     95: 
                     96:        open
                     97:             int (*open)(unsigned int version, sudo_conv_t conversation,
                     98:                         sudo_printf_t plugin_printf, char * const settings[],
                     99:                         char * const user_info[], char * const user_env[]);
                    100: 
                    101:            Returns 1 on success, 0 on failure, -1 if a general error occurred,
                    102:            or -2 if there was a usage error.  In the latter case, ssuuddoo will
                    103:            print a usage message before it exits.  If an error occurs, the
                    104:            plugin may optionally call the conversation or plugin_printf
                    105:            function with SUDO_CONF_ERROR_MSG to present additional error
                    106:            information to the user.
                    107: 
                    108:            The function arguments are as follows:
                    109: 
                    110:            version
                    111:                The version passed in by ssuuddoo allows the plugin to determine
                    112:                the major and minor version number of the plugin API supported
                    113:                by ssuuddoo.
                    114: 
                    115:            conversation
                    116:                A pointer to the conversation function that can be used by the
                    117:                plugin to interact with the user (see below).  Returns 0 on
                    118:                success and -1 on failure.
                    119: 
                    120:            plugin_printf
                    121:                A pointer to a printf-style function that may be used to
                    122:                display informational or error messages (see below).  Returns
                    123:                the number of characters printed on success and -1 on failure.
                    124: 
                    125:            settings
                    126:                A vector of user-supplied ssuuddoo settings in the form of
                    127:                "name=value" strings.  The vector is terminated by a NULL
                    128:                pointer.  These settings correspond to flags the user specified
                    129:                when running ssuuddoo.  As such, they will only be present when the
                    130:                corresponding flag has been specified on the command line.
                    131: 
                    132:                When parsing _s_e_t_t_i_n_g_s, the plugin should split on the ffiirrsstt
                    133:                equal sign ('=') since the _n_a_m_e field will never include one
                    134:                itself but the _v_a_l_u_e might.
                    135: 
                    136:                debug_level=number
                    137:                    A numeric debug level, from 1-9, if specified via the -D
                    138:                    flag.
                    139: 
                    140:                runas_user=string
                    141:                    The user name or uid to to run the command as, if specified
                    142:                    via the -u flag.
                    143: 
                    144:                runas_group=string
                    145:                    The group name or gid to to run the command as, if
                    146:                    specified via the -g flag.
                    147: 
                    148:                prompt=string
                    149:                    The prompt to use when requesting a password, if specified
                    150:                    via the -p flag.
                    151: 
                    152:                set_home=bool
                    153:                    Set to true if the user specified the -H flag.  If true,
                    154:                    set the HOME environment variable to the target user's home
                    155:                    directory.
                    156: 
                    157:                preserve_environment=bool
                    158:                    Set to true if the user specified the -E flag, indicating
                    159:                    that the user wishes to preserve the environment.
                    160: 
                    161:                run_shell=bool
                    162:                    Set to true if the user specified the -s flag, indicating
                    163:                    that the user wishes to run a shell.
                    164: 
                    165:                login_shell=bool
                    166:                    Set to true if the user specified the -i flag, indicating
                    167:                    that the user wishes to run a login shell.
                    168: 
                    169:                implied_shell=bool
                    170:                    If the user does not specify a program on the command line,
                    171:                    ssuuddoo will pass the plugin the path to the user's shell and
                    172:                    set _i_m_p_l_i_e_d___s_h_e_l_l to true.  This allows ssuuddoo with no
                    173:                    arguments to be used similarly to _s_u(1).  If the plugin
                    174:                    does not to support this usage, it may return a value of -2
                    175:                    from the check_policy function, which will cause ssuuddoo to
                    176:                    print a usage message and exit.
                    177: 
                    178:                preserve_groups=bool
                    179:                    Set to true if the user specified the -P flag, indicating
                    180:                    that the user wishes to preserve the group vector instead
                    181:                    of setting it based on the runas user.
                    182: 
                    183:                ignore_ticket=bool
                    184:                    Set to true if the user specified the -k flag along with a
                    185:                    command, indicating that the user wishes to ignore any
                    186:                    cached authentication credentials.
                    187: 
                    188:                noninteractive=bool
                    189:                    Set to true if the user specified the -n flag, indicating
                    190:                    that ssuuddoo should operate in non-interactive mode.  The
                    191:                    plugin may reject a command run in non-interactive mode if
                    192:                    user interaction is required.
                    193: 
                    194:                login_class=string
                    195:                    BSD login class to use when setting resource limits and
                    196:                    nice value, if specified by the -c flag.
                    197: 
                    198:                selinux_role=string
                    199:                    SELinux role to use when executing the command, if
                    200:                    specified by the -r flag.
                    201: 
                    202:                selinux_type=string
                    203:                    SELinux type to use when executing the command, if
                    204:                    specified by the -t flag.
                    205: 
                    206:                bsdauth_type=string
                    207:                    Authentication type, if specified by the -a flag, to use on
                    208:                    systems where BSD authentication is supported.
                    209: 
                    210:                network_addrs=list
                    211:                    A space-separated list of IP network addresses and netmasks
                    212:                    in the form "addr/netmask", e.g.
                    213:                    "192.168.1.2/255.255.255.0".  The address and netmask pairs
                    214:                    may be either IPv4 or IPv6, depending on what the operating
                    215:                    system supports.  If the address contains a colon (':'), it
                    216:                    is an IPv6 address, else it is IPv4.
                    217: 
                    218:                progname=string
                    219:                    The command name that sudo was run as, typically "sudo" or
                    220:                    "sudoedit".
                    221: 
                    222:                sudoedit=bool
                    223:                    Set to true when the -e flag is is specified or if invoked
                    224:                    as ssuuddooeeddiitt.  The plugin shall substitute an editor into
                    225:                    _a_r_g_v in the _c_h_e_c_k___p_o_l_i_c_y function or return -2 with a usage
                    226:                    error if the plugin does not support _s_u_d_o_e_d_i_t.  For more
                    227:                    information, see the _c_h_e_c_k___p_o_l_i_c_y section.
                    228: 
                    229:                closefrom=number
                    230:                    If specified, the user has requested via the -C flag that
                    231:                    ssuuddoo close all files descriptors with a value of _n_u_m_b_e_r or
                    232:                    higher.  The plugin may optionally pass this, or another
                    233:                    value, back in the _c_o_m_m_a_n_d___i_n_f_o list.
                    234: 
                    235:                Additional settings may be added in the future so the plugin
                    236:                should silently ignore settings that it does not recognize.
                    237: 
                    238:            user_info
                    239:                A vector of information about the user running the command in
                    240:                the form of "name=value" strings.  The vector is terminated by
                    241:                a NULL pointer.
                    242: 
                    243:                When parsing _u_s_e_r___i_n_f_o, the plugin should split on the ffiirrsstt
                    244:                equal sign ('=') since the _n_a_m_e field will never include one
                    245:                itself but the _v_a_l_u_e might.
                    246: 
                    247:                user=string
                    248:                    The name of the user invoking ssuuddoo.
                    249: 
                    250:                uid=uid_t
                    251:                    The real user ID of the user invoking ssuuddoo.
                    252: 
                    253:                gid=gid_t
                    254:                    The real group ID of the user invoking ssuuddoo.
                    255: 
                    256:                groups=list
                    257:                    The user's supplementary group list formatted as a string
                    258:                    of comma-separated group IDs.
                    259: 
                    260:                cwd=string
                    261:                    The user's current working directory.
                    262: 
                    263:                tty=string
                    264:                    The path to the user's terminal device.  If the user has no
                    265:                    terminal device associated with the session, the value will
                    266:                    be empty, as in tty=.
                    267: 
                    268:                host=string
                    269:                    The local machine's hostname as returned by the
                    270:                    gethostname() system call.
                    271: 
                    272:                lines=int
                    273:                    The number of lines the user's terminal supports.  If there
                    274:                    is no terminal device available, a default value of 24 is
                    275:                    used.
                    276: 
                    277:                cols=int
                    278:                    The number of columns the user's terminal supports.  If
                    279:                    there is no terminal device available, a default value of
                    280:                    80 is used.
                    281: 
                    282:            user_env
                    283:                The user's environment in the form of a NULL-terminated vector
                    284:                of "name=value" strings.
                    285: 
                    286:                When parsing _u_s_e_r___e_n_v, the plugin should split on the ffiirrsstt
                    287:                equal sign ('=') since the _n_a_m_e field will never include one
                    288:                itself but the _v_a_l_u_e might.
                    289: 
                    290:        close
                    291:             void (*close)(int exit_status, int error);
                    292: 
                    293:            The close function is called when the command being run by ssuuddoo
                    294:            finishes.
                    295: 
                    296:            The function arguments are as follows:
                    297: 
                    298:            exit_status
                    299:                The command's exit status, as returned by the _w_a_i_t(2) system
                    300:                call.  The value of exit_status is undefined if error is non-
                    301:                zero.
                    302: 
                    303:            error
                    304:                If the command could not be executed, this is set to the value
                    305:                of errno set by the _e_x_e_c_v_e(2) system call.  The plugin is
                    306:                responsible for displaying error information via the
                    307:                conversation or plugin_printf function.  If the command was
                    308:                successfully executed, the value of error is 0.
                    309: 
                    310:        show_version
                    311:             int (*show_version)(int verbose);
                    312: 
                    313:            The show_version function is called by ssuuddoo when the user specifies
                    314:            the -V option.  The plugin may display its version information to
                    315:            the user via the conversation or plugin_printf function using
                    316:            SUDO_CONV_INFO_MSG.  If the user requests detailed version
                    317:            information, the verbose flag will be set.
                    318: 
                    319:        check_policy
                    320:             int (*check_policy)(int argc, char * const argv[]
                    321:                                 char *env_add[], char **command_info[],
                    322:                                 char **argv_out[], char **user_env_out[]);
                    323: 
                    324:            The _c_h_e_c_k___p_o_l_i_c_y function is called by ssuuddoo to determine whether
                    325:            the user is allowed to run the specified commands.
                    326: 
                    327:            If the _s_u_d_o_e_d_i_t option was enabled in the _s_e_t_t_i_n_g_s array passed to
                    328:            the _o_p_e_n function, the user has requested _s_u_d_o_e_d_i_t mode.  _s_u_d_o_e_d_i_t
                    329:            is a mechanism for editing one or more files where an editor is run
                    330:            with the user's credentials instead of with elevated privileges.
                    331:            ssuuddoo achieves this by creating user-writable temporary copies of
                    332:            the files to be edited and then overwriting the originals with the
                    333:            temporary copies after editing is complete.  If the plugin supports
                    334:            ssuuddooeeddiitt, it should choose the editor to be used, potentially from
                    335:            a variable in the user's environment, such as EDITOR, and include
                    336:            it in _a_r_g_v___o_u_t (note that environment variables may include command
                    337:            line flags).  The files to be edited should be copied from _a_r_g_v
                    338:            into _a_r_g_v___o_u_t, separated from the editor and its arguments by a
                    339:            "--" element.  The "--" will be removed by ssuuddoo before the editor
                    340:            is executed.  The plugin should also set _s_u_d_o_e_d_i_t_=_t_r_u_e in the
                    341:            _c_o_m_m_a_n_d___i_n_f_o list.
                    342: 
                    343:            The _c_h_e_c_k___p_o_l_i_c_y function returns 1 if the command is allowed, 0 if
                    344:            not allowed, -1 for a general error, or -2 for a usage error or if
                    345:            ssuuddooeeddiitt was specified but is unsupported by the plugin.  In the
                    346:            latter case, ssuuddoo will print a usage message before it exits.  If
                    347:            an error occurs, the plugin may optionally call the conversation or
                    348:            plugin_printf function with SUDO_CONF_ERROR_MSG to present
                    349:            additional error information to the user.
                    350: 
                    351:            The function arguments are as follows:
                    352: 
                    353:            argc
                    354:                The number of elements in _a_r_g_v, not counting the final NULL
                    355:                pointer.
                    356: 
                    357:            argv
                    358:                The argument vector describing the command the user wishes to
                    359:                run, in the same form as what would be passed to the _e_x_e_c_v_e_(_)
                    360:                system call.  The vector is terminated by a NULL pointer.
                    361: 
                    362:            env_add
                    363:                Additional environment variables specified by the user on the
                    364:                command line in the form of a NULL-terminated vector of
                    365:                "name=value" strings.  The plugin may reject the command if one
                    366:                or more variables are not allowed to be set, or it may silently
                    367:                ignore such variables.
                    368: 
                    369:                When parsing _e_n_v___a_d_d, the plugin should split on the ffiirrsstt
                    370:                equal sign ('=') since the _n_a_m_e field will never include one
                    371:                itself but the _v_a_l_u_e might.
                    372: 
                    373:            command_info
                    374:                Information about the command being run in the form of
                    375:                "name=value" strings.  These values are used by ssuuddoo to set the
                    376:                execution environment when running a command.  The plugin is
                    377:                responsible for creating and populating the vector, which must
                    378:                be terminated with a NULL pointer.  The following values are
                    379:                recognized by ssuuddoo:
                    380: 
                    381:                command=string
                    382:                    Fully qualified path to the command to be executed.
                    383: 
                    384:                runas_uid=uid
                    385:                    User ID to run the command as.
                    386: 
                    387:                runas_euid=uid
                    388:                    Effective user ID to run the command as.  If not specified,
                    389:                    the value of _r_u_n_a_s___u_i_d is used.
                    390: 
                    391:                runas_gid=gid
                    392:                    Group ID to run the command as.
                    393: 
                    394:                runas_egid=gid
                    395:                    Effective group ID to run the command as.  If not
                    396:                    specified, the value of _r_u_n_a_s___g_i_d is used.
                    397: 
                    398:                runas_groups=list
                    399:                    The supplementary group vector to use for the command in
                    400:                    the form of a comma-separated list of group IDs.  If
                    401:                    _p_r_e_s_e_r_v_e___g_r_o_u_p_s is set, this option is ignored.
                    402: 
                    403:                login_class=string
                    404:                    BSD login class to use when setting resource limits and
                    405:                    nice value (optional).  This option is only set on systems
                    406:                    that support login classes.
                    407: 
                    408:                preserve_groups=bool
                    409:                    If set, ssuuddoo will preserve the user's group vector instead
                    410:                    of initializing the group vector based on runas_user.
                    411: 
                    412:                cwd=string
                    413:                    The current working directory to change to when executing
                    414:                    the command.
                    415: 
                    416:                noexec=bool
                    417:                    If set, prevent the command from executing other programs.
                    418: 
                    419:                chroot=string
                    420:                    The root directory to use when running the command.
                    421: 
                    422:                nice=int
                    423:                    Nice value (priority) to use when executing the command.
                    424:                    The nice value, if specified, overrides the priority
                    425:                    associated with the _l_o_g_i_n___c_l_a_s_s on BSD systems.
                    426: 
                    427:                umask=octal
                    428:                    The file creation mask to use when executing the command.
                    429: 
                    430:                selinux_role=string
                    431:                    SELinux role to use when executing the command.
                    432: 
                    433:                selinux_type=string
                    434:                    SELinux type to use when executing the command.
                    435: 
                    436:                timeout=int
                    437:                    Command timeout.  If non-zero then when the timeout expires
                    438:                    the command will be killed.
                    439: 
                    440:                sudoedit=bool
                    441:                    Set to true when in _s_u_d_o_e_d_i_t mode.  The plugin may enable
                    442:                    _s_u_d_o_e_d_i_t mode even if ssuuddoo was not invoked as ssuuddooeeddiitt.
                    443:                    This allows the plugin to perform command substitution and
                    444:                    transparently enable _s_u_d_o_e_d_i_t when the user attempts to run
                    445:                    an editor.
                    446: 
                    447:                closefrom=number
                    448:                    If specified, ssuuddoo will close all files descriptors with a
                    449:                    value of _n_u_m_b_e_r or higher.
                    450: 
                    451:                iolog_compress=bool
                    452:                    Set to true if the I/O logging plugins, if any, should
                    453:                    compress the log data.  This is a hint to the I/O logging
                    454:                    plugin which may choose to ignore it.
                    455: 
                    456:                iolog_path=string
                    457:                    Fully qualified path to the file or directory in which I/O
                    458:                    log is to be stored.  This is a hint to the I/O logging
                    459:                    plugin which may choose to ignore it.  If no I/O logging
                    460:                    plugin is loaded, this setting has no effect.
                    461: 
                    462:                iolog_stdin=bool
                    463:                    Set to true if the I/O logging plugins, if any, should log
                    464:                    the standard input if it is not connected to a terminal
                    465:                    device.  This is a hint to the I/O logging plugin which may
                    466:                    choose to ignore it.
                    467: 
                    468:                iolog_stdout=bool
                    469:                    Set to true if the I/O logging plugins, if any, should log
                    470:                    the standard output if it is not connected to a terminal
                    471:                    device.  This is a hint to the I/O logging plugin which may
                    472:                    choose to ignore it.
                    473: 
                    474:                iolog_stderr=bool
                    475:                    Set to true if the I/O logging plugins, if any, should log
                    476:                    the standard error if it is not connected to a terminal
                    477:                    device.  This is a hint to the I/O logging plugin which may
                    478:                    choose to ignore it.
                    479: 
                    480:                iolog_ttyin=bool
                    481:                    Set to true if the I/O logging plugins, if any, should log
                    482:                    all terminal input.  This only includes input typed by the
                    483:                    user and not from a pipe or redirected from a file.  This
                    484:                    is a hint to the I/O logging plugin which may choose to
                    485:                    ignore it.
                    486: 
                    487:                iolog_ttyout=bool
                    488:                    Set to true if the I/O logging plugins, if any, should log
                    489:                    all terminal output.  This only includes output to the
                    490:                    screen, not output to a pipe or file.  This is a hint to
                    491:                    the I/O logging plugin which may choose to ignore it.
                    492: 
                    493:                use_pty=bool
                    494:                    Allocate a pseudo-tty to run the command in, regardless of
                    495:                    whether or not I/O logging is in use.  By default, ssuuddoo
                    496:                    will only run the command in a pty when an I/O log plugin
                    497:                    is loaded.
                    498: 
                    499:                set_utmp=bool
                    500:                    Create a utmp (or utmpx) entry when a pseudo-tty is
                    501:                    allocated.  By default, the new entry will be a copy of the
                    502:                    user's existing utmp entry (if any), with the tty, time,
                    503:                    type and pid fields updated.
                    504: 
                    505:                utmp_user=string
                    506:                    User name to use when constructing a new utmp (or utmpx)
                    507:                    entry when _s_e_t___u_t_m_p is enabled.  This option can be used to
                    508:                    set the user field in the utmp entry to the user the
                    509:                    command runs as rather than the invoking user.  If not set,
                    510:                    ssuuddoo will base the new entry on the invoking user's
                    511:                    existing entry.
                    512: 
                    513:                Unsupported values will be ignored.
                    514: 
                    515:            argv_out
                    516:                The NULL-terminated argument vector to pass to the _e_x_e_c_v_e_(_)
                    517:                system call when executing the command.  The plugin is
                    518:                responsible for allocating and populating the vector.
                    519: 
                    520:            user_env_out
                    521:                The NULL-terminated environment vector to use when executing
                    522:                the command.  The plugin is responsible for allocating and
                    523:                populating the vector.
                    524: 
                    525:        list
                    526:             int (*list)(int verbose, const char *list_user,
                    527:                         int argc, char * const argv[]);
                    528: 
                    529:            List available privileges for the invoking user.  Returns 1 on
                    530:            success, 0 on failure and -1 on error.  On error, the plugin may
                    531:            optionally call the conversation or plugin_printf function with
                    532:            SUDO_CONF_ERROR_MSG to present additional error information to the
                    533:            user.
                    534: 
                    535:            Privileges should be output via the conversation or plugin_printf
                    536:            function using SUDO_CONV_INFO_MSG.
                    537: 
                    538:            verbose
                    539:                Flag indicating whether to list in verbose mode or not.
                    540: 
                    541:            list_user
                    542:                The name of a different user to list privileges for if the
                    543:                policy allows it.  If NULL, the plugin should list the
                    544:                privileges of the invoking user.
                    545: 
                    546:            argc
                    547:                The number of elements in _a_r_g_v, not counting the final NULL
                    548:                pointer.
                    549: 
                    550:            argv
                    551:                If non-NULL, an argument vector describing a command the user
                    552:                wishes to check against the policy in the same form as what
                    553:                would be passed to the _e_x_e_c_v_e_(_) system call.  If the command is
                    554:                permitted by the policy, the fully-qualified path to the
                    555:                command should be displayed along with any command line
                    556:                arguments.
                    557: 
                    558:        validate
                    559:             int (*validate)(void);
                    560: 
                    561:            The validate function is called when ssuuddoo is run with the -v flag.
                    562:            For policy plugins such as _s_u_d_o_e_r_s that cache authentication
                    563:            credentials, this function will validate and cache the credentials.
                    564: 
                    565:            The validate function should be NULL if the plugin does not support
                    566:            credential caching.
                    567: 
                    568:            Returns 1 on success, 0 on failure and -1 on error.  On error, the
                    569:            plugin may optionally call the conversation or plugin_printf
                    570:            function with SUDO_CONF_ERROR_MSG to present additional error
                    571:            information to the user.
                    572: 
                    573:        invalidate
                    574:             void (*invalidate)(int remove);
                    575: 
                    576:            The invalidate function is called when ssuuddoo is called with the -k
                    577:            or -K flag.  For policy plugins such as _s_u_d_o_e_r_s that cache
                    578:            authentication credentials, this function will invalidate the
                    579:            credentials.  If the _r_e_m_o_v_e flag is set, the plugin may remove the
                    580:            credentials instead of simply invalidating them.
                    581: 
                    582:            The invalidate function should be NULL if the plugin does not
                    583:            support credential caching.
                    584: 
                    585:        init_session
                    586:             int (*init_session)(struct passwd *pwd);
                    587: 
                    588:            The init_session function is called when ssuuddoo sets up the execution
                    589:            environment for the command, immediately before the contents of the
                    590:            _c_o_m_m_a_n_d___i_n_f_o list are applied (before the uid changes).  This can
                    591:            be used to do session setup that is not supported by _c_o_m_m_a_n_d___i_n_f_o,
                    592:            such as opening the PAM session.
                    593: 
                    594:            The _p_w_d argument points to a passwd struct for the user the command
                    595:            will be run as if the uid the command will run as was found in the
                    596:            password database, otherwise it will be NULL.
                    597: 
                    598:            Returns 1 on success, 0 on failure and -1 on error.  On error, the
                    599:            plugin may optionally call the conversation or plugin_printf
                    600:            function with SUDO_CONF_ERROR_MSG to present additional error
                    601:            information to the user.
                    602: 
                    603:        _V_e_r_s_i_o_n _m_a_c_r_o_s
                    604: 
                    605:         #define SUDO_API_VERSION_GET_MAJOR(v) ((v) >> 16)
                    606:         #define SUDO_API_VERSION_GET_MINOR(v) ((v) & 0xffff)
                    607:         #define SUDO_API_VERSION_SET_MAJOR(vp, n) do { \
                    608:             *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \
                    609:         } while(0)
                    610:         #define SUDO_VERSION_SET_MINOR(vp, n) do { \
                    611:             *(vp) = (*(vp) & 0xffff0000) | (n); \
                    612:         } while(0)
                    613: 
                    614:         #define SUDO_API_VERSION_MAJOR 1
                    615:         #define SUDO_API_VERSION_MINOR 0
                    616:         #define SUDO_API_VERSION ((SUDO_API_VERSION_MAJOR << 16) | \
                    617:                                   SUDO_API_VERSION_MINOR)
                    618: 
                    619:    II//OO PPlluuggiinn AAPPII
                    620:         struct io_plugin {
                    621:         #define SUDO_IO_PLUGIN         2
                    622:             unsigned int type; /* always SUDO_IO_PLUGIN */
                    623:             unsigned int version; /* always SUDO_API_VERSION */
                    624:             int (*open)(unsigned int version, sudo_conv_t conversation
                    625:                         sudo_printf_t plugin_printf, char * const settings[],
                    626:                         char * const user_info[], int argc, char * const argv[],
                    627:                         char * const user_env[]);
                    628:             void (*close)(int exit_status, int error); /* wait status or error */
                    629:             int (*show_version)(int verbose);
                    630:             int (*log_ttyin)(const char *buf, unsigned int len);
                    631:             int (*log_ttyout)(const char *buf, unsigned int len);
                    632:             int (*log_stdin)(const char *buf, unsigned int len);
                    633:             int (*log_stdout)(const char *buf, unsigned int len);
                    634:             int (*log_stderr)(const char *buf, unsigned int len);
                    635:         };
                    636: 
                    637:        When an I/O plugin is loaded, ssuuddoo runs the command in a pseudo-tty.
                    638:        This makes it possible to log the input and output from the user's
                    639:        session.  If any of the standard input, standard output or standard
                    640:        error do not correspond to a tty, ssuuddoo will open a pipe to capture the
                    641:        I/O for logging before passing it on.
                    642: 
                    643:        The log_ttyin function receives the raw user input from the terminal
                    644:        device (note that this will include input even when echo is disabled,
                    645:        such as when a password is read). The log_ttyout function receives
                    646:        output from the pseudo-tty that is suitable for replaying the user's
                    647:        session at a later time.  The log_stdin, log_stdout and log_stderr
                    648:        functions are only called if the standard input, standard output or
                    649:        standard error respectively correspond to something other than a tty.
                    650: 
                    651:        Any of the logging functions may be set to the NULL pointer if no
                    652:        logging is to be performed.  If the open function returns 0, no I/O
                    653:        will be sent to the plugin.
                    654: 
                    655:        The io_plugin struct has the following fields:
                    656: 
                    657:        type
                    658:            The type field should always be set to SUDO_IO_PLUGIN
                    659: 
                    660:        version
                    661:            The version field should be set to SUDO_API_VERSION.
                    662: 
                    663:            This allows ssuuddoo to determine the API version the plugin was built
                    664:            against.
                    665: 
                    666:        open
                    667:             int (*open)(unsigned int version, sudo_conv_t conversation
                    668:                         sudo_printf_t plugin_printf, char * const settings[],
                    669:                         char * const user_info[], int argc, char * const argv[],
                    670:                         char * const user_env[]);
                    671: 
                    672:            The _o_p_e_n function is run before the _l_o_g___i_n_p_u_t, _l_o_g___o_u_t_p_u_t or
                    673:            _s_h_o_w___v_e_r_s_i_o_n functions are called.  It is only called if the
                    674:            version is being requested or the _c_h_e_c_k___p_o_l_i_c_y function has
                    675:            returned successfully.  It returns 1 on success, 0 on failure, -1
                    676:            if a general error occurred, or -2 if there was a usage error.  In
                    677:            the latter case, ssuuddoo will print a usage message before it exits.
                    678:            If an error occurs, the plugin may optionally call the conversation
                    679:            or plugin_printf function with SUDO_CONF_ERROR_MSG to present
                    680:            additional error information to the user.
                    681: 
                    682:            The function arguments are as follows:
                    683: 
                    684:            version
                    685:                The version passed in by ssuuddoo allows the plugin to determine
                    686:                the major and minor version number of the plugin API supported
                    687:                by ssuuddoo.
                    688: 
                    689:            conversation
                    690:                A pointer to the conversation function that may be used by the
                    691:                _s_h_o_w___v_e_r_s_i_o_n function to display version information (see
                    692:                show_version below).  The conversation function may also be
                    693:                used to display additional error message to the user.  The
                    694:                conversation function returns 0 on success and -1 on failure.
                    695: 
                    696:            plugin_printf
                    697:                A pointer to a printf-style function that may be used by the
                    698:                _s_h_o_w___v_e_r_s_i_o_n function to display version information (see
                    699:                show_version below).  The plugin_printf function may also be
                    700:                used to display additional error message to the user.  The
                    701:                plugin_printf function returns number of characters printed on
                    702:                success and -1 on failure.
                    703: 
                    704:            settings
                    705:                A vector of user-supplied ssuuddoo settings in the form of
                    706:                "name=value" strings.  The vector is terminated by a NULL
                    707:                pointer.  These settings correspond to flags the user specified
                    708:                when running ssuuddoo.  As such, they will only be present when the
                    709:                corresponding flag has been specified on the command line.
                    710: 
                    711:                When parsing _s_e_t_t_i_n_g_s, the plugin should split on the ffiirrsstt
                    712:                equal sign ('=') since the _n_a_m_e field will never include one
                    713:                itself but the _v_a_l_u_e might.
                    714: 
                    715:                See the "Policy Plugin API" section for a list of all possible
                    716:                settings.
                    717: 
                    718:            user_info
                    719:                A vector of information about the user running the command in
                    720:                the form of "name=value" strings.  The vector is terminated by
                    721:                a NULL pointer.
                    722: 
                    723:                When parsing _u_s_e_r___i_n_f_o, the plugin should split on the ffiirrsstt
                    724:                equal sign ('=') since the _n_a_m_e field will never include one
                    725:                itself but the _v_a_l_u_e might.
                    726: 
                    727:                See the "Policy Plugin API" section for a list of all possible
                    728:                strings.
                    729: 
                    730:            argc
                    731:                The number of elements in _a_r_g_v, not counting the final NULL
                    732:                pointer.
                    733: 
                    734:            argv
                    735:                If non-NULL, an argument vector describing a command the user
                    736:                wishes to run in the same form as what would be passed to the
                    737:                _e_x_e_c_v_e_(_) system call.
                    738: 
                    739:            user_env
                    740:                The user's environment in the form of a NULL-terminated vector
                    741:                of "name=value" strings.
                    742: 
                    743:                When parsing _u_s_e_r___e_n_v, the plugin should split on the ffiirrsstt
                    744:                equal sign ('=') since the _n_a_m_e field will never include one
                    745:                itself but the _v_a_l_u_e might.
                    746: 
                    747:        close
                    748:             void (*close)(int exit_status, int error);
                    749: 
                    750:            The close function is called when the command being run by ssuuddoo
                    751:            finishes.
                    752: 
                    753:            The function arguments are as follows:
                    754: 
                    755:            exit_status
                    756:                The command's exit status, as returned by the _w_a_i_t(2) system
                    757:                call.  The value of exit_status is undefined if error is non-
                    758:                zero.
                    759: 
                    760:            error
                    761:                If the command could not be executed, this is set to the value
                    762:                of errno set by the _e_x_e_c_v_e(2) system call.  If the command was
                    763:                successfully executed, the value of error is 0.
                    764: 
                    765:        show_version
                    766:             int (*show_version)(int verbose);
                    767: 
                    768:            The show_version function is called by ssuuddoo when the user specifies
                    769:            the -V option.  The plugin may display its version information to
                    770:            the user via the conversation or plugin_printf function using
                    771:            SUDO_CONV_INFO_MSG.  If the user requests detailed version
                    772:            information, the verbose flag will be set.
                    773: 
                    774:        log_ttyin
                    775:             int (*log_ttyin)(const char *buf, unsigned int len);
                    776: 
                    777:            The _l_o_g___t_t_y_i_n function is called whenever data can be read from the
                    778:            user but before it is passed to the running command.  This allows
                    779:            the plugin to reject data if it chooses to (for instance if the
                    780:            input contains banned content).  Returns 1 if the data should be
                    781:            passed to the command, 0 if the data is rejected (which will
                    782:            terminate the command) or -1 if an error occurred.
                    783: 
                    784:            The function arguments are as follows:
                    785: 
                    786:            buf The buffer containing user input.
                    787: 
                    788:            len The length of _b_u_f in bytes.
                    789: 
                    790:        log_ttyout
                    791:             int (*log_ttyout)(const char *buf, unsigned int len);
                    792: 
                    793:            The _l_o_g___t_t_y_o_u_t function is called whenever data can be read from
                    794:            the command but before it is written to the user's terminal.  This
                    795:            allows the plugin to reject data if it chooses to (for instance if
                    796:            the output contains banned content).  Returns 1 if the data should
                    797:            be passed to the user, 0 if the data is rejected (which will
                    798:            terminate the command) or -1 if an error occurred.
                    799: 
                    800:            The function arguments are as follows:
                    801: 
                    802:            buf The buffer containing command output.
                    803: 
                    804:            len The length of _b_u_f in bytes.
                    805: 
                    806:        log_stdin
                    807:             int (*log_stdin)(const char *buf, unsigned int len);
                    808: 
                    809:            The _l_o_g___s_t_d_i_n function is only used if the standard input does not
                    810:            correspond to a tty device.  It is called whenever data can be read
                    811:            from the standard input but before it is passed to the running
                    812:            command.  This allows the plugin to reject data if it chooses to
                    813:            (for instance if the input contains banned content).  Returns 1 if
                    814:            the data should be passed to the command, 0 if the data is rejected
                    815:            (which will terminate the command) or -1 if an error occurred.
                    816: 
                    817:            The function arguments are as follows:
                    818: 
                    819:            buf The buffer containing user input.
                    820: 
                    821:            len The length of _b_u_f in bytes.
                    822: 
                    823:        log_stdout
                    824:             int (*log_stdout)(const char *buf, unsigned int len);
                    825: 
                    826:            The _l_o_g___s_t_d_o_u_t function is only used if the standard output does
                    827:            not correspond to a tty device.  It is called whenever data can be
                    828:            read from the command but before it is written to the standard
                    829:            output.  This allows the plugin to reject data if it chooses to
                    830:            (for instance if the output contains banned content).  Returns 1 if
                    831:            the data should be passed to the user, 0 if the data is rejected
                    832:            (which will terminate the command) or -1 if an error occurred.
                    833: 
                    834:            The function arguments are as follows:
                    835: 
                    836:            buf The buffer containing command output.
                    837: 
                    838:            len The length of _b_u_f in bytes.
                    839: 
                    840:        log_stderr
                    841:             int (*log_stderr)(const char *buf, unsigned int len);
                    842: 
                    843:            The _l_o_g___s_t_d_e_r_r function is only used if the standard error does not
                    844:            correspond to a tty device.  It is called whenever data can be read
                    845:            from the command but before it is written to the standard error.
                    846:            This allows the plugin to reject data if it chooses to (for
                    847:            instance if the output contains banned content).  Returns 1 if the
                    848:            data should be passed to the user, 0 if the data is rejected (which
                    849:            will terminate the command) or -1 if an error occurred.
                    850: 
                    851:            The function arguments are as follows:
                    852: 
                    853:            buf The buffer containing command output.
                    854: 
                    855:            len The length of _b_u_f in bytes.
                    856: 
                    857:        _V_e_r_s_i_o_n _m_a_c_r_o_s
                    858: 
                    859:        Same as for the "Policy Plugin API".
                    860: 
                    861:    CCoonnvveerrssaattiioonn AAPPII
                    862:        If the plugin needs to interact with the user, it may do so via the
                    863:        conversation function.  A plugin should not attempt to read directly
                    864:        from the standard input or the user's tty (neither of which are
                    865:        guaranteed to exist).  The caller must include a trailing newline in
                    866:        msg if one is to be printed.
                    867: 
                    868:        A printf-style function is also available that can be used to display
                    869:        informational or error messages to the user, which is usually more
                    870:        convenient for simple messages where no use input is required.
                    871: 
                    872:         struct sudo_conv_message {
                    873:         #define SUDO_CONV_PROMPT_ECHO_OFF  0x0001 /* do not echo user input */
                    874:         #define SUDO_CONV_PROMPT_ECHO_ON   0x0002 /* echo user input */
                    875:         #define SUDO_CONV_ERROR_MSG        0x0003 /* error message */
                    876:         #define SUDO_CONV_INFO_MSG         0x0004 /* informational message */
                    877:         #define SUDO_CONV_PROMPT_MASK      0x0005 /* mask user input */
                    878:         #define SUDO_CONV_PROMPT_ECHO_OK   0x1000 /* flag: allow echo if no tty */
                    879:             int msg_type;
                    880:             int timeout;
                    881:             const char *msg;
                    882:         };
                    883: 
                    884:         struct sudo_conv_reply {
                    885:             char *reply;
                    886:         };
                    887: 
                    888:         typedef int (*sudo_conv_t)(int num_msgs,
                    889:                      const struct sudo_conv_message msgs[],
                    890:                      struct sudo_conv_reply replies[]);
                    891: 
                    892:         typedef int (*sudo_printf_t)(int msg_type, const char *fmt, ...);
                    893: 
                    894:        Pointers to the conversation and printf-style functions are passed in
                    895:        to the plugin's open function when the plugin is initialized.
                    896: 
                    897:        To use the conversation function, the plugin must pass an array of
                    898:        sudo_conv_message and sudo_conv_reply structures.  There must be a
                    899:        struct sudo_conv_message and struct sudo_conv_reply for each message in
                    900:        the conversation.  The plugin is responsible for freeing the reply
                    901:        buffer filled in to the struct sudo_conv_reply, if any.
                    902: 
                    903:        The printf-style function uses the same underlying mechanism as the
                    904:        conversation function but only supports SUDO_CONV_INFO_MSG and
                    905:        SUDO_CONV_ERROR_MSG for the _m_s_g___t_y_p_e parameter.  It can be more
                    906:        convenient than using the conversation function if no user reply is
                    907:        needed and supports standard _p_r_i_n_t_f_(_) escape sequences.
                    908: 
                    909:        See the sample plugin for an example of the conversation function
                    910:        usage.
                    911: 
                    912:    SSuuddooeerrss GGrroouupp PPlluuggiinn AAPPII
                    913:        The _s_u_d_o_e_r_s module supports a plugin interface to allow non-Unix group
                    914:        lookups.  This can be used to query a group source other than the
                    915:        standard Unix group database.  A sample group plugin is bundled with
                    916:        ssuuddoo that implements file-based lookups.  Third party group plugins
                    917:        include a QAS AD plugin available from Quest Software.
                    918: 
                    919:        A group plugin must declare and populate a sudoers_group_plugin struct
                    920:        in the global scope.  This structure contains pointers to the functions
                    921:        that implement plugin initialization, cleanup and group lookup.
                    922: 
                    923:         struct sudoers_group_plugin {
                    924:            unsigned int version;
                    925:            int (*init)(int version, sudo_printf_t sudo_printf,
                    926:                        char *const argv[]);
                    927:            void (*cleanup)(void);
                    928:            int (*query)(const char *user, const char *group,
                    929:                         const struct passwd *pwd);
                    930:        };
                    931: 
                    932:        The sudoers_group_plugin struct has the following fields:
                    933: 
                    934:        version
                    935:            The version field should be set to GROUP_API_VERSION.
                    936: 
                    937:            This allows _s_u_d_o_e_r_s to determine the API version the group plugin
                    938:            was built against.
                    939: 
                    940:        init
                    941:             int (*init)(int version, sudo_printf_t plugin_printf,
                    942:                         char *const argv[]);
                    943: 
                    944:            The _i_n_i_t function is called after _s_u_d_o_e_r_s has been parsed but
                    945:            before any policy checks.  It returns 1 on success, 0 on failure
                    946:            (or if the plugin is not configured), and -1 if a error occurred.
                    947:            If an error occurs, the plugin may call the plugin_printf function
                    948:            with SUDO_CONF_ERROR_MSG to present additional error information to
                    949:            the user.
                    950: 
                    951:            The function arguments are as follows:
                    952: 
                    953:            version
                    954:                The version passed in by _s_u_d_o_e_r_s allows the plugin to determine
                    955:                the major and minor version number of the group plugin API
                    956:                supported by _s_u_d_o_e_r_s.
                    957: 
                    958:            plugin_printf
                    959:                A pointer to a printf-style function that may be used to
                    960:                display informational or error message to the user.  Returns
                    961:                the number of characters printed on success and -1 on failure.
                    962: 
                    963:            argv
                    964:                A NULL-terminated array of arguments generated from the
                    965:                _g_r_o_u_p___p_l_u_g_i_n option in _s_u_d_o_e_r_s.  If no arguments were given,
                    966:                _a_r_g_v will be NULL.
                    967: 
                    968:        cleanup
                    969:             void (*cleanup)();
                    970: 
                    971:            The _c_l_e_a_n_u_p function is called when _s_u_d_o_e_r_s has finished its group
                    972:            checks.  The plugin should free any memory it has allocated and
                    973:            close open file handles.
                    974: 
                    975:        query
                    976:             int (*query)(const char *user, const char *group,
                    977:                          const struct passwd *pwd);
                    978: 
                    979:            The _q_u_e_r_y function is used to ask the group plugin whether _u_s_e_r is
                    980:            a member of _g_r_o_u_p.
                    981: 
                    982:            The function arguments are as follows:
                    983: 
                    984:            user
                    985:                The name of the user being looked up in the external group
                    986:                database.
                    987: 
                    988:            group
                    989:                The name of the group being queried.
                    990: 
                    991:            pwd The password database entry for _u_s_e_r, if any.  If _u_s_e_r is not
                    992:                present in the password database, _p_w_d will be NULL.
                    993: 
                    994:        _V_e_r_s_i_o_n _M_a_c_r_o_s
                    995: 
                    996:         /* Sudoers group plugin version major/minor */
                    997:         #define GROUP_API_VERSION_MAJOR 1
                    998:         #define GROUP_API_VERSION_MINOR 0
                    999:         #define GROUP_API_VERSION ((GROUP_API_VERSION_MAJOR << 16) | \
                   1000:                                    GROUP_API_VERSION_MINOR)
                   1001: 
                   1002:         /* Getters and setters for group version */
                   1003:         #define GROUP_API_VERSION_GET_MAJOR(v) ((v) >> 16)
                   1004:         #define GROUP_API_VERSION_GET_MINOR(v) ((v) & 0xffff)
                   1005:         #define GROUP_API_VERSION_SET_MAJOR(vp, n) do { \
                   1006:             *(vp) = (*(vp) & 0x0000ffff) | ((n) << 16); \
                   1007:         } while(0)
                   1008:         #define GROUP_API_VERSION_SET_MINOR(vp, n) do { \
                   1009:             *(vp) = (*(vp) & 0xffff0000) | (n); \
                   1010:         } while(0)
                   1011: 
                   1012: SSEEEE AALLSSOO
                   1013:        _s_u_d_o_e_r_s(4), _s_u_d_o(1m)
                   1014: 
                   1015: BBUUGGSS
                   1016:        If you feel you have found a bug in ssuuddoo, please submit a bug report at
                   1017:        http://www.sudo.ws/sudo/bugs/
                   1018: 
                   1019: SSUUPPPPOORRTT
                   1020:        Limited free support is available via the sudo-workers mailing list,
                   1021:        see http://www.sudo.ws/mailman/listinfo/sudo-workers to subscribe or
                   1022:        search the archives.
                   1023: 
                   1024: DDIISSCCLLAAIIMMEERR
                   1025:        ssuuddoo is provided ``AS IS'' and any express or implied warranties,
                   1026:        including, but not limited to, the implied warranties of
                   1027:        merchantability and fitness for a particular purpose are disclaimed.
                   1028:        See the LICENSE file distributed with ssuuddoo or
                   1029:        http://www.sudo.ws/sudo/license.html for complete details.
                   1030: 
                   1031: 
                   1032: 
                   1033: 1.8.3                         September 16, 2011               SUDO_PLUGIN(1m)

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