Annotation of embedaddon/mpd/src/auth.h, revision 1.1.1.1

1.1       misho       1: 
                      2: /*
                      3:  * auth.h
                      4:  *
                      5:  * Written by Archie Cobbs <archie@freebsd.org>
                      6:  * Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
                      7:  * See ``COPYRIGHT.whistle''
                      8:  */
                      9: 
                     10: #ifndef _AUTH_H_
                     11: #define        _AUTH_H_
                     12: 
                     13: #include "timer.h"
                     14: #include "ppp.h"
                     15: #include "pap.h"
                     16: #include "chap.h"
                     17: #include "eap.h"
                     18: #include "radius.h"
                     19: 
                     20: #ifdef USE_SYSTEM
                     21: #include <pwd.h>
                     22: #endif
                     23: #ifdef USE_OPIE
                     24: #include <opie.h>
                     25: #endif
                     26: 
                     27: /*
                     28:  * DEFINITIONS
                     29:  */
                     30: 
                     31:   #define AUTH_RETRIES         5
                     32: 
                     33:   #define AUTH_MSG_WELCOME     "Welcome"
                     34:   #define AUTH_MSG_INVALID     "Login incorrect"
                     35:   #define AUTH_MSG_BAD_PACKET  "Incorrectly formatted packet"
                     36:   #define AUTH_MSG_NOT_ALLOWED "Login not allowed for this account"
                     37:   #define AUTH_MSG_NOT_EXPECTED        "Unexpected packet"
                     38:   #define AUTH_MSG_ACCT_DISAB  "Account disabled"
                     39:   #define AUTH_MSG_RESTR_HOURS "Login hours restricted"
                     40: 
                     41:   #define AUTH_PEER_TO_SELF    0
                     42:   #define AUTH_SELF_TO_PEER    1
                     43: 
                     44:   #define AUTH_FAIL_INVALID_LOGIN      0
                     45:   #define AUTH_FAIL_ACCT_DISABLED      1
                     46:   #define AUTH_FAIL_NO_PERMISSION      2
                     47:   #define AUTH_FAIL_RESTRICTED_HOURS   3
                     48:   #define AUTH_FAIL_INVALID_PACKET     4
                     49:   #define AUTH_FAIL_NOT_EXPECTED       5
                     50:   
                     51:   #define AUTH_STATUS_UNDEF            0
                     52:   #define AUTH_STATUS_FAIL             1
                     53:   #define AUTH_STATUS_SUCCESS          2
                     54:   #define AUTH_STATUS_BUSY             3
                     55:   
                     56:   #define AUTH_PW_HASH_NONE            0
                     57:   #define AUTH_PW_HASH_NT              1
                     58:   
                     59:   #define AUTH_ACCT_START              1
                     60:   #define AUTH_ACCT_STOP               2
                     61:   #define AUTH_ACCT_UPDATE             3
                     62:   
                     63:   #define MPPE_POLICY_NONE     0
                     64:   #define MPPE_POLICY_ALLOWED  1
                     65:   #define MPPE_POLICY_REQUIRED 2
                     66: 
                     67:   #define MPPE_TYPE_0BIT       0       /* No encryption required */
                     68:   #define MPPE_TYPE_40BIT      2
                     69:   #define MPPE_TYPE_128BIT     4
                     70:   #define MPPE_TYPE_56BIT      8
                     71:   
                     72:   /* Configuration options */
                     73:   enum {
                     74:     AUTH_CONF_RADIUS_AUTH = 1,
                     75:     AUTH_CONF_RADIUS_ACCT,
                     76:     AUTH_CONF_INTERNAL,
                     77:     AUTH_CONF_EXT_AUTH,
                     78:     AUTH_CONF_EXT_ACCT,
                     79:     AUTH_CONF_SYSTEM_AUTH,
                     80:     AUTH_CONF_SYSTEM_ACCT,
                     81:     AUTH_CONF_PAM_AUTH,
                     82:     AUTH_CONF_PAM_ACCT,
                     83:     AUTH_CONF_OPIE,
                     84:     AUTH_CONF_ACCT_MANDATORY
                     85:   };  
                     86: 
                     87: #if defined(USE_NG_BPF) || defined(USE_IPFW)
                     88:   struct acl {                 /* List of ACLs received from auth */
                     89:     u_short number;            /* ACL number given by auth server */
                     90:     u_short real_number;       /* ACL number allocated my mpd */
                     91:     struct acl *next;
                     92:     char name[ACL_NAME_LEN];   /* Name of ACL */
                     93:     char rule[1];              /* Text of ACL (Dynamically sized!) */
                     94:   };
                     95: #endif
                     96: 
                     97:   struct authparams {
                     98:     char               authname[AUTH_MAX_AUTHNAME];
                     99:     char               password[AUTH_MAX_PASSWORD];
                    100: 
                    101:     struct papparams   pap;
                    102:     struct chapparams  chap;
                    103: 
                    104:     struct u_range     range;          /* IP range allowed to user */
                    105:     u_char             range_valid;    /* range is valid */
                    106:     u_char             netmask;        /* IP Netmask */
                    107:     u_char             vjc_enable;     /* VJC requested by AAA */
                    108: 
                    109:     u_char             ippool_used;
                    110:     char               ippool[LINK_MAX_NAME];
                    111: 
                    112:     struct in_addr     peer_dns[2];    /* DNS servers for peer to use */
                    113:     struct in_addr     peer_nbns[2];   /* NBNS servers for peer to use */
                    114: 
                    115:     char               *eapmsg;        /* EAP Msg for forwarding to RADIUS server */
                    116:     int                        eapmsg_len;
                    117:     u_char             *state;         /* copy of the state attribute, needed for accounting */
                    118:     int                        state_len;
                    119:     u_char             *class;         /* copy of the class attribute, needed for accounting */
                    120:     int                        class_len;
                    121: 
                    122:     char               action[8 + LINK_MAX_NAME];
                    123: 
                    124: #ifdef USE_IPFW
                    125:     struct acl         *acl_rule;      /* ipfw rules */
                    126:     struct acl         *acl_pipe;      /* ipfw pipes */
                    127:     struct acl         *acl_queue;     /* ipfw queues */
                    128:     struct acl         *acl_table;     /* ipfw tables */
                    129: #endif
                    130: 
                    131: #ifdef USE_NG_BPF
                    132:     struct acl         *acl_filters[ACL_FILTERS]; /* mpd's internal bpf filters */
                    133:     struct acl         *acl_limits[ACL_DIRS];  /* traffic limits based on mpd's filters */
                    134: 
                    135:     char               std_acct[ACL_DIRS][ACL_NAME_LEN]; /* Names of ACL rerurned in standard accounting */
                    136: #endif
                    137:     
                    138:     u_int              session_timeout;        /* Session-Timeout */
                    139:     u_int              idle_timeout;           /* Idle-Timeout */
                    140:     u_int              acct_update;            /* interval for accouting updates */
                    141:     u_int              acct_update_lim_recv;
                    142:     u_int              acct_update_lim_xmit;
                    143:     char               *msdomain;              /* Microsoft domain */
                    144:     SLIST_HEAD(, ifaceroute) routes;
                    145:     u_short            mtu;                    /* MTU */
                    146: 
                    147:     u_char             authentic;      /* wich backend was used */
                    148: 
                    149:     char               callingnum[128];/* hr representation of the calling number */
                    150:     char               callednum[128]; /* hr representation of the called number */
                    151:     char               selfname[64];   /* hr representation of the self name */
                    152:     char               peername[64];   /* hr representation of the peer name */
                    153:     char               selfaddr[64];   /* hr representation of the self address */
                    154:     char               peeraddr[64];   /* hr representation of the peer address */
                    155:     char               peerport[6];    /* hr representation of the peer port */
                    156:     char               peermacaddr[32];        /* hr representation of the peer MAC address */
                    157:     char               peeriface[IFNAMSIZ];    /* hr representation of the peer interface */
                    158: 
                    159:     /* Iface stuff */
                    160:     char               ifname[IFNAMSIZ];       /* Interface name */
                    161: #ifdef SIOCSIFDESCR
                    162:     char               *ifdescr;               /* Interface description */
                    163: #endif
                    164: #ifdef SIOCAIFGROUP
                    165:     char               ifgroup[IFNAMSIZ];      /* Interface group */
                    166: #endif
                    167: 
                    168:     struct {
                    169:       int      policy;                 /* MPPE_POLICY_* */
                    170:       int      types;                  /* MPPE_TYPE_*BIT bitmask */
                    171:       u_char   lm_hash[16];            /* LM-Hash */
                    172:       u_char   nt_hash[16];            /* NT-Hash */
                    173:       u_char   nt_hash_hash[16];       /* NT-Hash-Hash */
                    174:       u_char   has_lm_hash;
                    175:       u_char   has_nt_hash;
                    176:       u_char   has_keys;
                    177: 
                    178:       u_char   chap_alg;               /* Callers's CHAP algorithm */
                    179: 
                    180:       u_char   msChal[CHAP_MSOFTv2_CHAL_LEN]; /* MSOFT challng */
                    181:       u_char   ntResp[CHAP_MSOFTv2_RESP_LEN]; /* MSOFT response */
                    182: 
                    183: #ifdef CCP_MPPC
                    184:       /* Keys when using MS-CHAPv2 or EAP */
                    185:       u_char   xmit_key[MPPE_KEY_LEN]; /* xmit start key */
                    186:       u_char   recv_key[MPPE_KEY_LEN]; /* recv start key */
                    187: #endif
                    188:     } msoft;
                    189:   };
                    190: 
                    191:   struct authconf {
                    192:     struct radiusconf  radius;         /* RADIUS configuration */
                    193:     char               authname[AUTH_MAX_AUTHNAME];    /* Configured username */
                    194:     char               password[AUTH_MAX_PASSWORD];    /* Configured password */
                    195:     u_int              acct_update;
                    196:     u_int              acct_update_lim_recv;
                    197:     u_int              acct_update_lim_xmit;
                    198:     int                        timeout;        /* Authorization timeout in seconds */
                    199:     struct optinfo     options;        /* Configured options */
                    200:     char               *extauth_script;/*  External auth script */
                    201:     char               *extacct_script;/*  External acct script */
                    202:     char               ippool[LINK_MAX_NAME];
                    203:   };
                    204:   typedef struct authconf      *AuthConf;
                    205: 
                    206:   /* State of authorization process during authorization phase,
                    207:    * contains params set by the auth-backend */
                    208:   struct auth {
                    209:     u_short            peer_to_self;   /* What I need from peer */
                    210:     u_short            self_to_peer;   /* What peer needs from me */
                    211:     u_char             peer_to_self_alg;       /* What alg I need from peer */
                    212:     u_char             self_to_peer_alg;       /* What alg peer needs from me */
                    213:     struct pppTimer    timer;          /* Max time to spend doing auth */
                    214:     struct pppTimer    acct_timer;     /* Timer for accounting updates */
                    215:     struct papinfo     pap;            /* PAP state */
                    216:     struct chapinfo    chap;           /* CHAP state */
                    217:     struct eapinfo     eap;            /* EAP state */
                    218:     struct paction     *thread;        /* async auth thread */
                    219:     struct paction     *acct_thread;   /* async accounting auth thread */
                    220:     struct authconf    conf;           /* Auth backends, RADIUS, etc. */
                    221:     struct authparams  params;         /* params to pass to from auth backend */
                    222:     struct ng_ppp_link_stat64  prev_stats;     /* Previous link statistics */
                    223:   };
                    224:   typedef struct auth  *Auth;
                    225: 
                    226:   struct radiusconf    radius;                 /* RADIUS configuration */
                    227:   /* Interface between the auth-backend (secret file, RADIUS, etc.)
                    228:    * and Mpd's internal structs.
                    229:    */
                    230:   struct authdata {
                    231:     struct authconf    conf;           /* a copy of bundle's authconf */
                    232:     u_short            proto;          /* wich proto are we using, PAP, CHAP, ... */
                    233:     u_char             alg;            /* proto specific algoruthm */
                    234:     u_int              id;             /* Actual, packet id */    
                    235:     u_int              code;           /* Proto specific code */
                    236:     u_char             acct_type;      /* Accounting type, Start, Stop, Update */
                    237:     u_char             eap_radius;
                    238:     u_char             status;
                    239:     u_char             why_fail;
                    240:     char               *reply_message; /* Text wich may displayed to the user */
                    241:     char               *mschap_error;  /* MSCHAP Error Message */
                    242:     char               *mschapv2resp;  /* Response String for MSCHAPv2 */
                    243:     void               (*finish)(Link l, struct authdata *auth); /* Finish handler */
                    244:     int                        drop_user;      /* RAD_MPD_DROP_USER value sent by RADIUS server */
                    245:     struct {
                    246:       struct rad_handle        *handle;        /* the RADIUS handle */
                    247:     } radius;
                    248: #ifdef USE_OPIE
                    249:     struct {
                    250:       struct opie      data;
                    251:     } opie;
                    252: #endif
                    253:     struct {           /* informational (read-only) data needed for e.g. accouting */
                    254:       char             msession_id[AUTH_MAX_SESSIONID]; /* multi-session-id */
                    255:       char             session_id[AUTH_MAX_SESSIONID]; /* session-id */
                    256:       char             ifname[IFNAMSIZ];       /* interface name */
                    257:       uint             ifindex;                /* System interface index */
                    258:       char             bundname[LINK_MAX_NAME];/* name of the bundle */
                    259:       char             lnkname[LINK_MAX_NAME]; /* name of the link */
                    260:       struct ng_ppp_link_stat64        stats;          /* Current link statistics */
                    261: #ifdef USE_NG_BPF
                    262:       struct svcstat   ss;
                    263: #endif
                    264:       char             *downReason;    /* Reason for link going down */
                    265:       time_t           last_up;        /* Time this link last got up */
                    266:       PhysType         phys_type;      /* Device type descriptor */
                    267:       int              linkID;         /* Absolute link number */
                    268:       char             peer_ident[64]; /* LCP ident received from peer */
                    269:       struct in_addr   peer_addr;      /* currently assigned IP-Address of the client */
                    270:       short            n_links;        /* number of links in the bundle */
                    271:       u_char           originate;      /* Who originated the connection */
                    272:     } info;
                    273:     struct authparams  params;         /* params to pass to from auth backend */
                    274:   };
                    275:   typedef struct authdata      *AuthData;
                    276:   
                    277:   extern const struct cmdtab AuthSetCmds[];
                    278: 
                    279: /*
                    280:  * GLOBAL VARIABLES
                    281:  */
                    282:   extern const u_char  gMsoftZeros[32];
                    283:   extern int           gMaxLogins;     /* max number of concurrent logins per user */
                    284:   extern int           gMaxLoginsCI;
                    285: 
                    286: /*
                    287:  * FUNCTIONS
                    288:  */
                    289: 
                    290:   extern void          AuthInit(Link l);
                    291:   extern void          AuthInst(Auth auth, Auth autht);
                    292:   extern void          AuthShutdown(Link l);
                    293:   extern void          AuthStart(Link l);
                    294:   extern void          AuthStop(Link l);
                    295:   extern void          AuthInput(Link l, int proto, Mbuf bp);
                    296:   extern void          AuthOutput(Link l, int proto, u_int code, u_int id,
                    297:                          const u_char *ptr, int len, int add_len, 
                    298:                          u_char eap_type);
                    299:   extern void          AuthFinish(Link l, int which, int ok);
                    300:   extern void          AuthCleanup(Link l);
                    301:   extern int           AuthStat(Context ctx, int ac, char *av[], void *arg);
                    302:   extern void          AuthAccountStart(Link l, int type);
                    303:   extern void          AuthAccountTimeout(void *arg);
                    304:   extern AuthData      AuthDataNew(Link l);
                    305:   extern void          AuthDataDestroy(AuthData auth);
                    306:   extern int           AuthGetData(char *authname, char *password, size_t passlen, 
                    307:                            struct u_range *range, u_char *range_valid);
                    308:   extern void          AuthAsyncStart(Link l, AuthData auth);
                    309:   extern const char    *AuthFailMsg(AuthData auth, char *buf, size_t len);
                    310:   extern const char    *AuthStatusText(int status);
                    311:   extern const char    *AuthMPPEPolicyname(int policy);
                    312:   extern const char    *AuthMPPETypesname(int types, char *buf, size_t len);
                    313: 
                    314: #if defined(USE_NG_BPF) || defined(USE_IPFW)
                    315:   extern void          ACLCopy(struct acl *src, struct acl **dst);
                    316:   extern void          ACLDestroy(struct acl *acl);
                    317: #endif
                    318:   extern void          authparamsInit(struct authparams *ap);
                    319:   extern void          authparamsCopy(struct authparams *src, struct authparams *dst);
                    320:   extern void          authparamsMove(struct authparams *src, struct authparams *dst);
                    321:   extern void          authparamsDestroy(struct authparams *ap);
                    322: 
                    323: #endif

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