Changeset 874 in openpam


Ignore:
Timestamp:
Dec 1, 2015, 7:40:01 PM (5 years ago)
Author:
Dag-Erling Smørgrav
Message:

Add a table-driven test which leverages the pam_return module to test
various code paths in openpam_dispatch().

Location:
trunk/t
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/t/Makefile.am

    r867 r874  
    22
    33AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir)/lib/libpam
     4
     5AM_TESTS_ENVIRONMENT = \
     6        PAM_RETURN_SO=$(abs_top_builddir)/modules/pam_return/.libs/pam_return.so
    47
    58noinst_HEADERS = t.h t_pam_conv.h
  • trunk/t/t_openpam_dispatch.c

    r866 r874  
    4646#include "t_pam_conv.h"
    4747
     48const char *pam_return_so;
     49
     50T_FUNC(null, "null handle")
     51{
     52        int pam_err;
     53
     54#if __clang__
     55#pragma clang diagnostic push
     56#pragma clang diagnostic ignored "-Wnonnull"
     57#elif __GNUC__
     58#pragma gcc diagnostic push
     59#pragma gcc diagnostic ignored "-Wnonnull"
     60#endif
     61        pam_err = pam_authenticate(NULL, 0);
     62#if __clang__
     63#pragma clang diagnostic pop
     64#elif __GNUC__
     65#pragma gcc diagnostic pop
     66#endif
     67        return (pam_err == PAM_SYSTEM_ERR);
     68}
     69
    4870T_FUNC(empty_policy, "empty policy")
    4971{
     
    90112}
    91113
     114static struct t_pam_return_case {
     115        int              facility;
     116        int              primitive;
     117        int              flags;
     118        struct {
     119                int              ctlflag;
     120                int              modret;
     121        } mod[2];
     122        int              result;
     123} t_pam_return_cases[] = {
     124        {
     125                PAM_AUTH, PAM_SM_AUTHENTICATE, 0,
     126                {
     127                        { PAM_REQUIRED, PAM_SUCCESS },
     128                        { PAM_REQUIRED, PAM_SUCCESS },
     129                },
     130                PAM_SUCCESS,
     131        },
     132};
     133
     134T_FUNC(mod_return, "module return value")
     135{
     136        struct t_pam_return_case *tc;
     137        struct t_pam_conv_script script;
     138        struct pam_conv pamc;
     139        struct t_file *tf;
     140        pam_handle_t *pamh;
     141        unsigned int i, j, n;
     142        int pam_err;
     143
     144        memset(&script, 0, sizeof script);
     145        pamc.conv = &t_pam_conv;
     146        pamc.appdata_ptr = &script;
     147        n = sizeof t_pam_return_cases / sizeof t_pam_return_cases[0];
     148        for (i = 0; i < n; ++i) {
     149                tc = &t_pam_return_cases[i];
     150                tf = t_fopen(NULL);
     151                for (j = 0; j < 2; ++j) {
     152                        t_fprintf(tf, "%s %s %s error=%s\n",
     153                            pam_facility_name[tc->facility],
     154                            pam_control_flag_name[tc->mod[j].ctlflag],
     155                            pam_return_so,
     156                            pam_err_name[tc->mod[j].modret]);
     157                }
     158                pam_err = pam_start(tf->name, "test", &pamc, &pamh);
     159                t_verbose("pam_start() returned %d\n", pam_err);
     160                if (pam_err != PAM_SUCCESS)
     161                        continue;
     162                switch (tc->primitive) {
     163                case PAM_SM_AUTHENTICATE:
     164                        pam_err = pam_authenticate(pamh, tc->flags);
     165                        break;
     166                case PAM_SM_SETCRED:
     167                        pam_err = pam_setcred(pamh, tc->flags);
     168                        break;
     169                case PAM_SM_ACCT_MGMT:
     170                        pam_err = pam_acct_mgmt(pamh, tc->flags);
     171                        break;
     172                case PAM_SM_OPEN_SESSION:
     173                        pam_err = pam_open_session(pamh, tc->flags);
     174                        break;
     175                case PAM_SM_CLOSE_SESSION:
     176                        pam_err = pam_close_session(pamh, tc->flags);
     177                        break;
     178                case PAM_SM_CHAUTHTOK:
     179                        pam_err = pam_chauthtok(pamh, tc->flags);
     180                        break;
     181                }
     182                t_verbose("%s returned %d\n",
     183                    pam_func_name[tc->primitive], pam_err);
     184                t_fclose(tf);
     185        }
     186        return (1);
     187}
     188
    92189
    93190
     
    97194
    98195static struct t_test *t_plan[] = {
     196        T(null),
    99197        T(empty_policy),
     198        T(mod_return),
    100199
    101200        NULL
     
    105204t_prepare(int argc, char *argv[])
    106205{
     206
     207        if ((pam_return_so = getenv("PAM_RETURN_SO")) == NULL)
     208                return (NULL);
    107209
    108210        openpam_set_feature(OPENPAM_RESTRICT_MODULE_NAME, 0);
Note: See TracChangeset for help on using the changeset viewer.