Annotation of embedaddon/sudo/plugins/sudoers/auth/API, revision 1.1

1.1     ! misho       1: NOTE: the Sudo auth API is subject to change
        !             2: 
        !             3: Purpose: to provide a simple API for authentication methods that
        !             4:          encapsulates things nicely without turning into a maze
        !             5:         of #ifdef's
        !             6: 
        !             7: The sudo_auth struct looks like this:
        !             8: 
        !             9: typedef struct sudo_auth {
        !            10:     int flags;                  /* various flags, see below */
        !            11:     int status;                 /* status from verify routine */
        !            12:     char *name;                        /* name of the method in string form */
        !            13:     void *data;                 /* method-specific data pointer */
        !            14: 
        !            15:     int (*init)(struct passwd *pw, sudo_auth *auth);
        !            16:     int (*setup)(struct passwd *pw, char **prompt, sudo_auth *auth);
        !            17:     int (*verify)(struct passwd *pw, char *p, sudo_auth *auth);
        !            18:     int (*cleanup)(struct passwd *pw, sudo_auth *auth);
        !            19:     int (*begin_session)(struct passwd *pw, sudo_auth *auth);
        !            20:     int (*end_session)(sudo_auth *auth);
        !            21: } sudo_auth;
        !            22: 
        !            23: The variables in the struct are as follows:
        !            24:     flags      Bitwise binary flags, see below.
        !            25: 
        !            26:     status     Contains the return value from the last run of
        !            27:                the "verify" function.  Starts out as AUTH_FAILURE.
        !            28: 
        !            29:     name       The name of the authentication method as a C string.
        !            30: 
        !            31:     data       A pointer to method-specific data.  This is passed to
        !            32:                all the functions of an auth method and is usually
        !            33:                initialized in the "init" or "setup" routines.
        !            34: 
        !            35: Possible values of sudo_auth.flags:
        !            36:     FLAG_USER          Whether or not the auth functions should run with
        !            37:                        the euid of the invoking user instead of 0.
        !            38: 
        !            39:     FLAG_DISABLED      Set if an "init" or "setup" function fails.
        !            40: 
        !            41:     FLAG_STANDALONE    If set, this indicates that the method must
        !            42:                        be the only auth method configured, and that
        !            43:                        it will prompt for the password itself.
        !            44: 
        !            45:     FLAG_ONEANDONLY    If set, this indicates that the method is the
        !            46:                        only one in use.  Can be used by auth functions
        !            47:                        to determine whether to return a fatal or nonfatal
        !            48:                        error.
        !            49: 
        !            50: The member functions can return the following values:
        !            51:     AUTH_SUCCESS       Function succeeded.  For a ``verify'' function
        !            52:                        this means the user correctly authenticated.
        !            53: 
        !            54:     AUTH_FAILURE       Function failed.  If this is an ``init'' or
        !            55:                        ``setup'' routine, the auth method will be
        !            56:                        marked as !configured.
        !            57: 
        !            58:     AUTH_FATAL         A fatal error occurred.  The routine should have
        !            59:                        written an error message to stderr and optionally
        !            60:                        sent mail to the administrator.  (If log_error()
        !            61:                        is called to do this, the NO_EXIT flag must be used.)
        !            62:                        When verify_user() gets AUTH_FATAL from an auth
        !            63:                        function it does an exit(1).
        !            64: 
        !            65: The functions in the struct are as follows:
        !            66: 
        !            67:     int init(struct passwd *pw, sudo_auth *auth)
        !            68:         Function to do any one-time initialization for the auth
        !            69:         method.  All of the "init" functions are run before anything
        !            70:         else.
        !            71: 
        !            72:     int setup(struct passwd *pw, char **prompt, sudo_auth *auth)
        !            73:         Function to do method-specific setup.  All the "setup"
        !            74:         routines are run before any of the "verify" routines.  A
        !            75:         pointer to the prompt string may be used to add method-specific
        !            76:         info to the prompt.
        !            77: 
        !            78:     int verify(struct passwd *pw, char *p, sudo_auth *auth)
        !            79:         Function to do user verification for this auth method.  For
        !            80:         standalone auth methods ``p'' is the prompt string.  For
        !            81:         normal auth methods, ``p'' is the password the user entered.
        !            82:         Note that standalone auth methods are responsible for
        !            83:         rerading the password themselves.
        !            84: 
        !            85:     int cleanup(struct passwd *pw, sudo_auth *auth)
        !            86:         Function to do per-auth method cleanup.  This is only run
        !            87:         at the end of the authentication process, after the user
        !            88:         has completely failed or succeeded to authenticate.
        !            89:        The ``auth->status'' variable contains the result of the
        !            90:        last authentication attempt which may be interesting.
        !            91: 
        !            92: A note about standalone methods.  Some authentication methods can't
        !            93: coexist with any others.  This may be because they encapsulate other
        !            94: methods (pam, sia) or because they have a special way of interacting
        !            95: with the user (securid).
        !            96: 
        !            97: Adding a new authentication method:
        !            98: 
        !            99: Each method should live in its own file.  Add prototypes for the functions
        !           100: in sudo_auth.h.
        !           101: 
        !           102: Add the method to the ``auth_switch'' in sudo_auth.c.  Note that
        !           103: standalone methods must go first.  If ``fooauth'' is a normal auth
        !           104: method, its entry would look like:
        !           105: 
        !           106: #ifdef HAVE_FOOAUTH
        !           107: AUTH_ENTRY("foo", 0, foo_init, foo_setup, foo_verify,
        !           108:     foo_cleanup, foo_begin_session, foo_end_session)
        !           109: #endif
        !           110: 
        !           111: If this is a standalone method, it would be:
        !           112: 
        !           113: #ifdef HAVE_FOOAUTH
        !           114: AUTH_ENTRY("foo", FLAG_STANDALONE, foo_init, foo_setup, foo_verify,
        !           115:     foo_cleanup, foo_begin_session, foo_end_session)
        !           116: #endif
        !           117: 
        !           118: If the method needs to run as the user, not root, add FLAG_USER to
        !           119: the second argument in the  AUTH_ENTRY line.  If you don't have an
        !           120: init/setup/cleanup/begin/end routine, just use a NULL for that
        !           121: field.

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