Changeset 243 in openpam for trunk/lib


Ignore:
Timestamp:
Jun 1, 2003, 2:23:25 PM (17 years ago)
Author:
Dag-Erling Smørgrav
Message:

Incorporate patches from Dmitry V. Levin which improve the policy
loader, reducing the number of times each file is read. Also fix
a few minor nits (such as making facility names and control flags
case insensitive like they are in Solaris).

Location:
trunk/lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/openpam_configure.c

    r241 r243  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/openpam_configure.c#9 $
    35  */
    36 
     34 * $P4: //depot/projects/openpam/lib/openpam_configure.c#10 $
     35 */
     36
     37#include <ctype.h>
    3738#include <errno.h>
    3839#include <stdio.h>
     
    5960};
    6061
    61 static int openpam_load_chain(pam_chain_t **, const char *, const char *);
     62static int openpam_load_chain(pam_handle_t *, const char *, pam_facility_t);
    6263
    6364/*
     
    6970{
    7071
    71         while (*str && *str == *word)
     72        while (*str && tolower(*str) == tolower(*word))
    7273                ++str, ++word;
    7374        return (*str == ' ' && *word == '\0');
     
    122123
    123124/*
    124  * Extracts a given chain from a policy file.
     125 * Extracts given chains from a policy file.
    125126 */
    126127static int
    127 openpam_read_chain(pam_chain_t **chain,
     128openpam_read_chain(pam_handle_t *pamh,
    128129        const char *service,
    129         const char *facility,
     130        pam_facility_t facility,
    130131        const char *filename,
    131132        openpam_style_t style)
     
    134135        const char *p, *q;
    135136        int count, i, lineno, ret;
     137        pam_facility_t fclt;
     138        pam_control_t ctlf;
    136139        char *line, *name;
    137140        FILE *f;
     
    142145                return (0);
    143146        }
    144         next = chain;
    145         this = *next = NULL;
     147        this = NULL;
    146148        count = lineno = 0;
    147149        while ((line = openpam_readline(f, &lineno, NULL)) != NULL) {
     
    158160
    159161                /* match facility name */
    160                 for (i = 0; i < PAM_NUM_FACILITIES; ++i)
    161                         if (match_word(p, _pam_facility_name[i]))
     162                for (fclt = 0; fclt < PAM_NUM_FACILITIES; ++fclt)
     163                        if (match_word(p, _pam_facility_name[fclt]))
    162164                                break;
    163                 if (i == PAM_NUM_FACILITIES) {
     165                if (fclt == PAM_NUM_FACILITIES) {
    164166                        openpam_log(PAM_LOG_NOTICE,
    165167                            "%s(%d): invalid facility '%.*s' (ignored)",
    166168                            filename, lineno, wordlen(p), p);
    167                 }
    168                 if (!match_word(p, facility)) {
     169                        goto fail;
     170                }
     171                if (facility != fclt && facility != PAM_FACILITY_ANY) {
    169172                        FREE(line);
    170173                        continue;
     
    181184                        if ((name = dup_word(p)) == NULL)
    182185                                goto syserr;
    183                         ret = openpam_load_chain(next, name, facility);
     186                        ret = openpam_load_chain(pamh, name, fclt);
     187                        fprintf(stderr, "include %s returned %d\n", name, ret);
    184188                        FREE(name);
    185                         while (*next != NULL) {
    186                                 next = &(*next)->next;
    187                                 ++count;
    188                         }
    189                         FREE(line);
    190189                        if (ret < 0)
    191190                                goto fail;
     191                        count += ret;
     192                        FREE(line);
    192193                        continue;
    193194                }
     
    198199
    199200                /* control flag */
    200                 for (i = 0; i < PAM_NUM_CONTROL_FLAGS; ++i)
    201                         if (match_word(p, _pam_control_flag_name[i]))
     201                for (ctlf = 0; ctlf < PAM_NUM_CONTROL_FLAGS; ++ctlf)
     202                        if (match_word(p, _pam_control_flag_name[ctlf]))
    202203                                break;
    203                 if (i == PAM_NUM_CONTROL_FLAGS) {
     204                if (ctlf == PAM_NUM_CONTROL_FLAGS) {
    204205                        openpam_log(PAM_LOG_ERROR,
    205206                            "%s(%d): invalid control flag '%.*s'",
     
    207208                        goto fail;
    208209                }
    209                 this->flag = i;
     210                this->flag = ctlf;
    210211
    211212                /* module name */
     
    240241
    241242                /* hook it up */
     243                for (next = &pamh->chains[fclt]; *next != NULL;
     244                     next = &(*next)->next)
     245                        /* nothing */ ;
    242246                *next = this;
    243                 next = &this->next;
    244247                this = NULL;
    245248                ++count;
     
    270273
    271274/*
    272  * Locates the policy file for a given service and reads the given chain
     275 * Locates the policy file for a given service and reads the given chains
    273276 * from it.
    274277 */
    275278static int
    276 openpam_load_chain(pam_chain_t **chain,
     279openpam_load_chain(pam_handle_t *pamh,
    277280        const char *service,
    278         const char *facility)
     281        pam_facility_t facility)
    279282{
    280283        const char **path;
     
    290293                                return (-PAM_BUF_ERR);
    291294                        }
    292                         r = openpam_read_chain(chain, service, facility,
     295                        r = openpam_read_chain(pamh, service, facility,
    293296                            filename, pam_d_style);
    294297                        FREE(filename);
    295298                } else {
    296                         r = openpam_read_chain(chain, service, facility,
     299                        r = openpam_read_chain(pamh, service, facility,
    297300                            *path, pam_conf_style);
    298301                }
     
    313316        const char *service)
    314317{
    315         int i, ret;
    316 
    317         for (i = 0; i < PAM_NUM_FACILITIES; ++i) {
    318                 ret = openpam_load_chain(&pamh->chains[i],
    319                     service, _pam_facility_name[i]);
    320                 if (ret == 0)
    321                         ret = openpam_load_chain(&pamh->chains[i],
    322                             PAM_OTHER, _pam_facility_name[i]);
    323                 if (ret < 0) {
    324                         openpam_clear_chains(pamh->chains);
    325                         return (PAM_SYSTEM_ERR);
    326                 }
     318        pam_facility_t fclt;
     319
     320        if (openpam_load_chain(pamh, service, PAM_FACILITY_ANY) < 0)
     321                goto load_err;
     322
     323        for (fclt = 0; fclt < PAM_NUM_FACILITIES; ++fclt) {
     324                if (pamh->chains[fclt] != NULL)
     325                        continue;
     326                if (openpam_load_chain(pamh, PAM_OTHER, fclt) < 0)
     327                        goto load_err;
    327328        }
    328329        return (PAM_SUCCESS);
     330 load_err:
     331        openpam_clear_chains(pamh->chains);
     332        return (PAM_SYSTEM_ERR);
    329333}
    330334
  • trunk/lib/openpam_impl.h

    r241 r243  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/openpam_impl.h#26 $
     34 * $P4: //depot/projects/openpam/lib/openpam_impl.h#27 $
    3535 */
    3636
     
    5050 * Control flags
    5151 */
    52 #define PAM_BINDING             0
    53 #define PAM_REQUIRED            1
    54 #define PAM_REQUISITE           2
    55 #define PAM_SUFFICIENT          3
    56 #define PAM_OPTIONAL            4
    57 #define PAM_NUM_CONTROL_FLAGS   5
     52typedef enum {
     53        PAM_BINDING,
     54        PAM_REQUIRED,
     55        PAM_REQUISITE,
     56        PAM_SUFFICIENT,
     57        PAM_OPTIONAL,
     58        PAM_NUM_CONTROL_FLAGS
     59} pam_control_t;
    5860
    5961/*
    6062 * Facilities
    6163 */
    62 #define PAM_AUTH                0
    63 #define PAM_ACCOUNT             1
    64 #define PAM_SESSION             2
    65 #define PAM_PASSWORD            3
    66 #define PAM_NUM_FACILITIES      4
     64typedef enum {
     65        PAM_FACILITY_ANY = -1,
     66        PAM_AUTH = 0,
     67        PAM_ACCOUNT,
     68        PAM_SESSION,
     69        PAM_PASSWORD,
     70        PAM_NUM_FACILITIES
     71} pam_facility_t;
    6772
    6873typedef struct pam_chain pam_chain_t;
Note: See TracChangeset for help on using the changeset viewer.