Added rbtree_deletebydata()
[freeradius.git] / src / include / libradius.h
1 #ifndef LIBRADIUS_H
2 #define LIBRADIUS_H
3
4 /*
5  * libradius.h  Structures and prototypes
6  *              for the radius library.
7  *
8  * Version:     $Id$
9  *
10  */
11 #include "autoconf.h"
12
13 #ifdef HAVE_SYS_TYPES_H
14 #include <sys/types.h>
15 #endif
16
17 #ifdef HAVE_STDINT_H
18 #include <stdint.h>
19 #endif
20
21 #ifdef HAVE_INTTYPES_H
22 #include <inttypes.h>
23 #endif
24
25 #ifdef HAVE_ERRNO_H
26 #include <errno.h>
27 #endif
28
29 #include <stdio.h>
30
31 /*
32  *  Check for inclusion of <time.h>, versus <sys/time.h>
33  *  Taken verbatim from the autoconf manual.
34  */
35 #if TIME_WITH_SYS_TIME
36 # include <sys/time.h>
37 # include <time.h>
38 #else
39 # ifdef HAVE_SYS_TIME_H
40 #  include <sys/time.h>
41 # else
42 #  include <time.h>
43 # endif
44 #endif
45
46 #include "radius.h"
47 #include "token.h"
48
49 #ifdef SIZEOF_UNSIGNED_INT
50 #if SIZEOF_UNSIGNED_INT != 4
51 #error FATAL: sizeof(unsigned int) != 4
52 #endif
53 #endif
54
55 /*
56  *  Include for modules.
57  */
58 #include <sha1.h>
59 #include <md4.h>
60
61 #define EAP_START               2
62
63 #define AUTH_VECTOR_LEN         16
64 #define CHAP_VALUE_LENGTH       16
65 #define MAX_STRING_LEN          254     /* RFC2138: string 0-253 octets */
66
67 #ifdef _LIBRADIUS
68 #  define AUTH_HDR_LEN          20
69 #  define VENDORPEC_USR         429
70 #  define VENDOR(x)             ((x >> 16) & 0xffff)
71 #  define DEBUG                 if (librad_debug) printf
72 #  define debug_pair(vp)        do { if (librad_debug) { \
73                                         putchar('\t'); \
74                                         vp_print(stdout, vp); \
75                                         putchar('\n'); \
76                                      } \
77                                 } while(0)
78 #  define TAG_VALID(x)          ((x) > 0 && (x) < 0x20)
79 #  define TAG_VALID_ZERO(x)     ((x) >= 0 && (x) < 0x20)
80 #  define TAG_ANY               -128   /* minimum signed char */
81 #endif
82
83 #if defined(__GNUC__)
84 # define PRINTF_LIKE(n) __attribute__ ((format(printf, n, n+1)))
85 # define NEVER_RETURNS __attribute__ ((noreturn))
86 # define UNUSED __attribute__ ((unused))
87 # define BLANK_FORMAT " "       /* GCC_LINT whines about empty formats */
88 #else
89 # define PRINTF_LIKE(n) /* ignore */
90 # define NEVER_RETURNS /* ignore */
91 # define UNUSED /* ignore */
92 # define BLANK_FORMAT ""
93 #endif
94
95 typedef struct attr_flags {
96         unsigned int            addport : 1;  /* add NAS-Port to IP address */
97         unsigned int            has_tag : 1;  /* tagged attribute */
98         unsigned int            do_xlat : 1;  /* strvalue is dynamic */
99         unsigned int            caseless : 1; /* case insensitive compares */
100         int8_t                  tag;          /* tag for tunneled attributes */
101         uint8_t                 encrypt;      /* encryption method */
102 } ATTR_FLAGS;
103
104 /*
105  *  Values of the encryption flags.
106  */
107 #define FLAG_ENCRYPT_NONE            (0)
108 #define FLAG_ENCRYPT_USER_PASSWORD   (1)
109 #define FLAG_ENCRYPT_TUNNEL_PASSWORD (2)
110 #define FLAG_ENCRYPT_ASCEND_SECRET   (3)
111
112 typedef struct dict_attr {
113         char                    name[40];
114         int                     attr;
115         int                     type;
116         int                     vendor;
117         ATTR_FLAGS              flags;
118 } DICT_ATTR;
119
120 typedef struct dict_value {
121         char                    name[40];
122         int                     attr;
123         int                     value;
124 } DICT_VALUE;
125
126 typedef struct dict_vendor {
127         char                    name[40];
128         int                     vendorpec;
129         struct dict_vendor      *next;
130 } DICT_VENDOR;
131
132 typedef struct value_pair {
133         char                    name[40];
134         int                     attribute;
135         int                     type;
136         int                     length; /* of strvalue */
137         uint32_t                lvalue;
138         LRAD_TOKEN              operator;
139         uint8_t                 strvalue[MAX_STRING_LEN];
140         ATTR_FLAGS              flags;
141         struct value_pair       *next;
142 } VALUE_PAIR;
143
144 /*
145  *      vector:         Request authenticator from access-request packet
146  *                      Put in there by rad_decode, and must be put in the
147  *                      response RADIUS_PACKET as well before calling rad_send
148  *
149  *      verified:       Filled in by rad_decode for accounting-request packets
150  *
151  *      data,data_len:  Used between rad_recv and rad_decode.
152  */
153 typedef struct radius_packet {
154         int                     sockfd;
155         uint32_t                src_ipaddr;
156         uint32_t                dst_ipaddr;
157         u_short                 src_port;
158         u_short                 dst_port;
159         int                     id;
160         unsigned int            code;
161         uint8_t                 vector[AUTH_VECTOR_LEN];
162         time_t                  timestamp;
163         int                     verified;
164         uint8_t                 *data;
165         int                     data_len;
166         VALUE_PAIR              *vps;
167 } RADIUS_PACKET;
168
169 /*
170  *      Printing functions.
171  */
172 void            librad_safeprint(char *in, int inlen, char *out, int outlen);
173 int     vp_prints_value(char *out, int outlen, VALUE_PAIR *vp,int delimitst);
174 int     vp_prints(char *out, int outlen, VALUE_PAIR *vp);
175 void            vp_print(FILE *, VALUE_PAIR *);
176 void            vp_printlist(FILE *, VALUE_PAIR *);
177 #define         fprint_attr_val vp_print
178
179 /*
180  *      Dictionary functions.
181  */
182 int             dict_addvendor(const char *name, int value);
183 int             dict_addattr(const char *name, int vendor, int type, int value, ATTR_FLAGS flags);
184 int             dict_addvalue(const char *namestr, char *attrstr, int value);
185 int             dict_init(const char *dir, const char *fn);
186 void            dict_free(void);
187 DICT_ATTR       *dict_attrbyvalue(int attr);
188 DICT_ATTR       *dict_attrbyname(const char *attr);
189 DICT_VALUE      *dict_valbyattr(int attr, int val);
190 DICT_VALUE      *dict_valbyname(int attr, const char *val);
191 int             dict_vendorbyname(const char *name);
192 DICT_VENDOR     *dict_vendorbyvalue(int vendor);
193
194 /*
195  *  Compatibility
196  */
197 #define dict_vendorcode
198 #define dict_vendorpec
199
200
201 #if 1 /* FIXME: compat */
202 #define dict_attrget    dict_attrbyvalue
203 #define dict_attrfind   dict_attrbyname
204 #define dict_valfind    dict_valbyname
205 /*#define dict_valget   dict_valbyattr almost but not quite*/
206 #endif
207
208 /* get around diffrent ctime_r styles */
209 #ifdef CTIMERSTYLE
210 #if CTIMERSTYLE == SOLARISSTYLE
211 #define CTIME_R(a,b,c) ctime_r(a,b,c)
212 #else
213 #define CTIME_R(a,b,c) ctime_r(a,b)
214 #endif
215 #else
216 #define CTIME_R(a,b,c) ctime_r(a,b)
217 #endif
218
219 /* md5.c */
220
221 void            librad_md5_calc(u_char *, u_char *, u_int);
222
223 /* hmac.c */
224
225 void lrad_hmac_md5(const unsigned char *text, int text_len,
226                    const unsigned char *key, int key_len,
227                    unsigned char *digest);
228
229 /* hmacsha1.c */
230
231 void lrad_hmac_sha1(const unsigned char *text, int text_len,
232                     const unsigned char *key, int key_len,
233                     unsigned char *digest);
234
235 /* radius.c */
236 int             rad_send(RADIUS_PACKET *, const RADIUS_PACKET *, const char *secret);
237 RADIUS_PACKET   *rad_recv(int fd);
238 int             rad_decode(RADIUS_PACKET *packet, RADIUS_PACKET *original, const char *secret);
239 RADIUS_PACKET   *rad_alloc(int newvector);
240 void            rad_free(RADIUS_PACKET **);
241 int             rad_pwencode(char *encpw, int *len, const char *secret, const char *vector);
242 int             rad_pwdecode(char *encpw, int len, const char *secret, const char *vector);
243 int             rad_tunnel_pwencode(char *encpw, int *len, const char *secret, const char *vector);
244 int             rad_tunnel_pwdecode(uint8_t *encpw, int *len, const char *secret, const char *vector);
245 int             rad_chap_encode(RADIUS_PACKET *packet, char *output, int id, VALUE_PAIR *password);
246
247 /* valuepair.c */
248 VALUE_PAIR      *paircreate(int attr, int type);
249 void            pairfree(VALUE_PAIR **);
250 void            pairbasicfree(VALUE_PAIR *pair);
251 VALUE_PAIR      *pairfind(VALUE_PAIR *, int);
252 void            pairdelete(VALUE_PAIR **, int);
253 void            pairadd(VALUE_PAIR **, VALUE_PAIR *);
254 void            pairreplace(VALUE_PAIR **first, VALUE_PAIR *add);
255 VALUE_PAIR      *paircopy(VALUE_PAIR *vp);
256 VALUE_PAIR      *paircopy2(VALUE_PAIR *vp, int attr);
257 void            pairmove(VALUE_PAIR **to, VALUE_PAIR **from);
258 void            pairmove2(VALUE_PAIR **to, VALUE_PAIR **from, int attr);
259 VALUE_PAIR      *pairparsevalue(VALUE_PAIR *vp, const char *value);
260 VALUE_PAIR      *pairmake(const char *attribute, const char *value, int operator);
261 VALUE_PAIR      *pairread(char **ptr, LRAD_TOKEN *eol);
262 LRAD_TOKEN      userparse(char *buffer, VALUE_PAIR **first_pair);
263 VALUE_PAIR     *readvp2(FILE *fp, int *pfiledone, const char *errprefix);
264
265 /*
266  *      Error functions.
267  */
268 #ifdef _LIBRADIUS
269 void            librad_log(const char *, ...)
270 #ifdef __GNUC__
271                 __attribute__ ((format (printf, 1, 2)))
272 #endif
273 ;
274 #endif
275 void            librad_perror(const char *, ...)
276 #ifdef __GNUC__
277                 __attribute__ ((format (printf, 1, 2)))
278 #endif
279 ;
280 extern char     librad_errstr[];
281 extern int      librad_dodns;   /* 0 = no dns lookups */
282 extern int      librad_debug;   /* 0 = no debugging information */
283 extern int      librad_max_attributes; /* per incoming packet */
284
285 /*
286  *      Several handy miscellaneous functions.
287  */
288 char *          ip_hostname (char *buf, size_t buflen, uint32_t ipaddr);
289 uint32_t        ip_getaddr (const char *);
290 char *          ip_ntoa(char *, uint32_t);
291 uint32_t        ip_addr(const char *);
292 char            *ifid_ntoa(char *buffer, size_t size, uint8_t *ifid);
293 uint8_t         *ifid_aton(const char *ifid_str, uint8_t *ifid);
294 char            *ipv6_ntoa(char *buffer, size_t size, void *ip6addr);
295 int             ipv6_addr(const char *ip6_str, void *ip6addr);
296 char            *strNcpy(char *dest, const char *src, int n);
297 void            rad_lowercase(char *str);
298 void            rad_rmspace(char *str);
299 int             rad_lockfd(int fd, int lock_len);
300 int             rad_lockfd_nonblock(int fd, int lock_len);
301 int             rad_unlockfd(int fd, int lock_len);
302
303 #ifdef ASCEND_BINARY
304 /* filters.c */
305 int             ascend_parse_filter(VALUE_PAIR *pair);
306 void            print_abinary(VALUE_PAIR *vp, u_char *buffer, int len);
307 #endif /*ASCEND_BINARY*/
308
309 #ifdef HAVE_LOCAL_SNPRINTF
310 #include <stdarg.h>
311 int snprintf(char *str, size_t count, const char *fmt, ...);
312 int vsnprintf(char *str, size_t count, const char *fmt, va_list arg);
313 #endif
314
315 /* random numbers in isaac.c */
316 /* context of random number generator */
317 typedef struct lrad_randctx {
318   uint32_t randcnt;
319   uint32_t randrsl[256];
320   uint32_t randmem[256];
321   uint32_t randa;
322   uint32_t randb;
323   uint32_t randc;
324 } lrad_randctx;
325
326 void lrad_isaac(lrad_randctx *ctx);
327 void lrad_randinit(lrad_randctx *ctx, int flag);
328 uint32_t lrad_rand(void);       /* like rand(), but better. */
329
330 /* crypt wrapper from crypt.c */
331 int lrad_crypt_check(const char *key, const char *salt);
332
333 /* rbtree.c */
334 typedef struct rbtree_t rbtree_t;
335 typedef struct rbnode_t rbnode_t;
336
337 rbtree_t       *rbtree_create(int (*Compare)(const void *, const void *),
338                                void (*freeNode)(void *),
339                                int replace_flag);
340 void            rbtree_free(rbtree_t *tree);
341 int             rbtree_insert(rbtree_t *tree, const void *Data);
342 void            rbtree_delete(rbtree_t *tree, rbnode_t *Z);
343 int             rbtree_deletebydata(rbtree_t *tree, const void *data);
344 rbnode_t       *rbtree_find(rbtree_t *tree, const void *Data);
345 void           *rbtree_finddata(rbtree_t *tree, const void *Data);
346 int             rbtree_num_elements(rbtree_t *tree);
347 void           *rbtree_node2data(rbtree_t *tree, rbnode_t *node);
348
349 /* callback order for walking  */
350 typedef enum { PreOrder, InOrder, PostOrder } RBTREE_ORDER;
351
352 /*
353  *      The callback should be declared as:
354  *      int callback(void *context, void *data)
355  *
356  *      The "context" is some user-defined context.
357  *      The "data" is the pointer to the user data in the node,
358  *        NOT the node itself.
359  *
360  *      It should return 0 if all is OK, and !0 for any error.
361  *      The walking will stop on any error.
362  */
363 int rbtree_walk(rbtree_t *tree, RBTREE_ORDER order, int (*callback)(void *, void *), void *context); 
364
365 #endif /*LIBRADIUS_H*/