Changeset 137 in openpam for trunk


Ignore:
Timestamp:
May 2, 2002, 6:08:02 AM (17 years ago)
Author:
Dag-Erling Smørgrav
Message:

Fall in line with Solaris and Linux-PAM wrt use of the "other" policy:
use it to fill the gaps in incomplete policies as well as to replace
missing ones.

Sponsored by: DARPA, NAI Labs

Location:
trunk/lib
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/openpam_configure.c

    r112 r137  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/openpam_configure.c#1 $
     34 * $P4: //depot/projects/openpam/lib/openpam_configure.c#2 $
    3535 */
    3636
     
    5151
    5252static int
    53 openpam_read_policy_file(pam_handle_t *pamh,
     53openpam_read_policy_file(pam_chain_t *policy[],
    5454        const char *service,
    5555        const char *filename,
     
    187187                 * appropriate chain and bump the counter.
    188188                 */
    189                 r = openpam_add_module(pamh, chain, flag, p, optc, optv);
     189                r = openpam_add_module(policy, chain, flag, p, optc, optv);
    190190                if (r != PAM_SUCCESS)
    191191                        return (-r);
     
    215215};
    216216
    217 /*
    218  * OpenPAM internal
    219  *
    220  * Configure a service
    221  */
    222 
    223 int
    224 openpam_configure(pam_handle_t *pamh,
     217static int
     218openpam_load_policy(pam_chain_t *policy[],
    225219        const char *service)
    226220{
     
    236230                        if (filename == NULL) {
    237231                                openpam_log(PAM_LOG_ERROR, "malloc(): %m");
    238                                 return (PAM_BUF_ERR);
     232                                return (-PAM_BUF_ERR);
    239233                        }
    240234                        strcpy(filename, *path);
    241235                        strcat(filename, service);
    242                         r = openpam_read_policy_file(pamh,
     236                        r = openpam_read_policy_file(policy,
    243237                            service, filename, PAM_D_STYLE);
    244238                        free(filename);
    245239                } else {
    246                         r = openpam_read_policy_file(pamh,
     240                        r = openpam_read_policy_file(policy,
    247241                            service, *path, PAM_CONF_STYLE);
    248242                }
    249                 if (r < 0)
    250                         return (-r);
    251                 if (r > 0)
    252                         return (PAM_SUCCESS);
    253         }
    254 
    255         return (PAM_SYSTEM_ERR);
     243                if (r != 0)
     244                        return (r);
     245        }
     246
     247        return (0);
     248}
     249
     250/*
     251 * OpenPAM internal
     252 *
     253 * Configure a service
     254 */
     255
     256int
     257openpam_configure(pam_handle_t *pamh,
     258        const char *service)
     259{
     260        pam_chain_t *other[PAM_NUM_CHAINS];
     261        int i, n, r;
     262
     263        /* try own configuration first */
     264        r = openpam_load_policy(pamh->chains, service);
     265        if (r < 0)
     266                return (-r);
     267        for (i = n = 0; i < PAM_NUM_CHAINS; ++i) {
     268                if (pamh->chains[i] != NULL)
     269                        ++n;
     270        }
     271        if (n == PAM_NUM_CHAINS)
     272                return (PAM_SUCCESS);
     273
     274        /* fill in the blanks with "other" */
     275        openpam_load_policy(other, PAM_OTHER);
     276        if (r < 0)
     277                return (-r);
     278        for (i = n = 0; i < PAM_NUM_CHAINS; ++i) {
     279                if (pamh->chains[i] == NULL) {
     280                        pamh->chains[i] = other[i];
     281                        other[i] = NULL;
     282                }
     283                if (pamh->chains[i] != NULL)
     284                        ++n;
     285        }
     286        openpam_clear_chains(other);
     287        return (n > 0 ? PAM_SUCCESS : PAM_SYSTEM_ERR);
    256288}
    257289
  • trunk/lib/openpam_impl.h

    r112 r137  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/openpam_impl.h#13 $
     34 * $P4: //depot/projects/openpam/lib/openpam_impl.h#14 $
    3535 */
    3636
     
    109109int             openpam_dispatch(pam_handle_t *, int, int);
    110110int             openpam_findenv(pam_handle_t *, const char *, size_t);
    111 int             openpam_add_module(pam_handle_t *, int, int,
     111int             openpam_add_module(pam_chain_t **, int, int,
    112112                                   const char *, int, const char **);
    113 void            openpam_clear_chains(pam_handle_t *);
     113void            openpam_clear_chains(pam_chain_t **);
    114114
    115115#ifdef OPENPAM_STATIC_MODULES
  • trunk/lib/openpam_load.c

    r94 r137  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/openpam_load.c#12 $
     34 * $P4: //depot/projects/openpam/lib/openpam_load.c#13 $
    3535 */
    3636
     
    157157
    158158int
    159 openpam_add_module(pam_handle_t *pamh,
     159openpam_add_module(pam_chain_t *policy[],
    160160        int chain,
    161161        int flag,
     
    179179                return (PAM_OPEN_ERR);
    180180        }
    181         if ((iterator = pamh->chains[chain]) != NULL) {
     181        if ((iterator = policy[chain]) != NULL) {
    182182                while (iterator->next != NULL)
    183183                        iterator = iterator->next;
    184184                iterator->next = new;
    185185        } else {
    186                 pamh->chains[chain] = new;
     186                policy[chain] = new;
    187187        }
    188188        return (PAM_SUCCESS);
     
    200200
    201201void
    202 openpam_clear_chains(pam_handle_t *pamh)
     202openpam_clear_chains(pam_chain_t *policy[])
    203203{
    204204        int i;
    205205
    206206        for (i = 0; i < PAM_NUM_CHAINS; ++i)
    207                 openpam_destroy_chain(pamh->chains[i]);
     207                openpam_destroy_chain(policy[i]);
    208208}
    209209
  • trunk/lib/pam_end.c

    r93 r137  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/pam_end.c#8 $
     34 * $P4: //depot/projects/openpam/lib/pam_end.c#9 $
    3535 */
    3636
     
    7373
    7474        /* clear chains */
    75         openpam_clear_chains(pamh);
     75        openpam_clear_chains(pamh->chains);
    7676
    7777        /* clear items */
  • trunk/lib/pam_start.c

    r112 r137  
    3232 * SUCH DAMAGE.
    3333 *
    34  * $P4: //depot/projects/openpam/lib/pam_start.c#13 $
     34 * $P4: //depot/projects/openpam/lib/pam_start.c#14 $
    3535 */
    3636
     
    6767
    6868        r = openpam_configure(ph, service);
    69         if (r != PAM_SUCCESS && r != PAM_BUF_ERR)
    70                 r = openpam_configure(ph, PAM_OTHER);
    7169        if (r != PAM_SUCCESS)
    7270                goto fail;
Note: See TracChangeset for help on using the changeset viewer.