/*
* Internal data types and prototypes for the fake PAM test framework.
*
* The canonical version of this file is maintained in the rra-c-util package,
* which can be found at .
*
* Written by Russ Allbery
* Copyright 2021 Russ Allbery
* Copyright 2011-2012
* The Board of Trustees of the Leland Stanford Junior University
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* SPDX-License-Identifier: MIT
*/
#ifndef FAKEPAM_INTERNAL_H
#define FAKEPAM_INTERNAL_H 1
#include
#include
/* Forward declarations to avoid unnecessary includes. */
struct output;
struct script_config;
/* The type of a PAM module call. */
typedef int (*pam_call)(pam_handle_t *, int, int, const char **);
/* The possible PAM groups as element numbers in an array of options. */
enum group_type
{
GROUP_ACCOUNT = 0,
GROUP_AUTH = 1,
GROUP_PASSWORD = 2,
GROUP_SESSION = 3,
};
/* Holds a PAM argc and argv. */
struct options {
char **argv;
int argc;
};
/*
* Holds a linked list of actions: a PAM call that should return some
* status.
*/
struct action {
char *name;
pam_call call;
int flags;
enum group_type group;
int status;
struct action *next;
};
/* Holds an expected PAM prompt style, the prompt, and the response. */
struct prompt {
int style;
char *prompt;
char *response;
};
/* Holds an array of PAM prompts and the current index into that array. */
struct prompts {
struct prompt *prompts;
size_t size;
size_t allocated;
size_t current;
};
/*
* Holds the complete set of things that we should do, configuration for them,
* and expected output and return values.
*/
struct work {
struct options options[4];
struct action *actions;
struct prompts *prompts;
struct output *output;
int end_flags;
};
BEGIN_DECLS
/* Create a new output struct. */
struct output *output_new(void);
/* Add a new output line (with numeric priority) to an output struct. */
void output_add(struct output *, int, const char *);
/*
* Parse a PAM interaction script. Returns the total work to do as a work
* struct.
*/
struct work *parse_script(FILE *, const struct script_config *);
END_DECLS
#endif /* !FAKEPAM_API_H */