| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564 | /* * $Id: freeradius-client.h,v 1.18 2010/06/15 09:22:51 aland Exp $ * * Copyright (C) 1995,1996,1997,1998 Lars Fenneberg * * Copyright 1992 Livingston Enterprises, Inc. * * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan * and Merit Network, Inc. All Rights Reserved * * See the file COPYRIGHT for the respective terms and conditions. * If the file is missing contact me at lf@elemental.net * and I'll send you a copy. * */#ifndef FREERADIUS_CLIENT_H#define FREERADIUS_CLIENT_H//#define CP_DEBUG#ifdef CP_DEBUG#define		DEBUG(args, ...)	rc_log(## args)#else#define		DEBUG(args, ...)	;#endif//#include	<sys/types.h>#include "radius_config.h"/* * Include for C99 uintX_t defines is stdint.h on most systems.  Solaris uses * inttypes.h instead.  Comment out the stdint include if you get an error, * and uncomment the inttypes.h include. */#include	<stdint.h>/* #include	<inttypes.h> */#ifdef PRINTF_STDLIB#include <stdio.h>#endif#ifdef PRINTF_CUSTOM#include "tinystdio.h"#endif#include	<time.h>/* for struct addrinfo and sockaddr_storage *///#include <sys/socket.h>#include <netdb.h>#undef __BEGIN_DECLS#undef __END_DECLS#ifdef __cplusplus# define __BEGIN_DECLS extern "C" {# define __END_DECLS }#else# define __BEGIN_DECLS /* empty */# define __END_DECLS /* empty */#endif#define AUTH_VECTOR_LEN		16#define AUTH_PASS_LEN		(3 * 16) /* multiple of 16 */#define AUTH_ID_LEN		    64#define AUTH_STRING_LEN		253	 /* maximum of 253 */#define BUFFER_LEN		    8192#define NAME_LENGTH		    32#define GETSTR_LENGTH		128	//!< must be bigger than AUTH_PASS_LEN.#define MAX_SECRET_LENGTH	(3 * 16) /* MUST be multiple of 16 */#define VENDOR(x)		(((x) >> 16) & 0xffff)#define ATTRID(x)		((x) & 0xffff)#define PW_MAX_MSG_SIZE		256//4096   /* codes for radius_buildreq, radius_getport, etc. */#define AUTH			0#define ACCT			1/* defines for config.c */#define SERVER_MAX 8#define AUTH_LOCAL_FST	(1<<0)#define AUTH_RADIUS_FST	(1<<1)#define AUTH_LOCAL_SND	(1<<2)#define AUTH_RADIUS_SND	(1<<3)typedef struct server {	int max;	char *name[SERVER_MAX];	uint16_t port[SERVER_MAX];	char *secret[SERVER_MAX];	double deadtime_ends[SERVER_MAX];} SERVER;typedef struct pw_auth_hdr{	uint8_t		code;	uint8_t		id;	uint16_t	length;	uint8_t		vector[AUTH_VECTOR_LEN];	uint8_t		data[2];} AUTH_HDR;struct rc_conf{	struct _option		    *config_options;	struct sockaddr_storage	own_bind_addr;	unsigned		        own_bind_addr_set;	struct map2id_s		    *map2id_list;	struct dict_attr	    *dictionary_attributes;	struct dict_value	    *dictionary_values;	struct dict_vendor	    *dictionary_vendors;	char			        buf[GETSTR_LENGTH];    char    			    buf1[14];	char	    		    ifname[512];};typedef struct rc_conf rc_handle;#define AUTH_HDR_LEN			20#define CHAP_VALUE_LENGTH		16#define PW_AUTH_UDP_PORT		1645#define PW_ACCT_UDP_PORT		1646#define PW_TYPE_STRING			0#define PW_TYPE_INTEGER			1#define PW_TYPE_IPADDR			2#define PW_TYPE_DATE			3#define PW_TYPE_IPV6ADDR		4#define PW_TYPE_IPV6PREFIX		5/* standard RADIUS codes */#define PW_ACCESS_REQUEST		1#define PW_ACCESS_ACCEPT		2#define PW_ACCESS_REJECT		3#define PW_ACCOUNTING_REQUEST	4#define PW_ACCOUNTING_RESPONSE	5#define PW_ACCOUNTING_STATUS	6#define PW_PASSWORD_REQUEST		7#define PW_PASSWORD_ACK			8#define PW_PASSWORD_REJECT		9#define PW_ACCOUNTING_MESSAGE	10#define PW_ACCESS_CHALLENGE		11#define PW_STATUS_SERVER		12#define PW_STATUS_CLIENT		13/* standard RADIUS attribute-value pairs */#define PW_ACCESS               244#define PW_USER_NAME			1	//!< string.#define PW_USER_PASSWORD		2	//!< string.#define PW_CHAP_PASSWORD		3	//!< string.#define PW_NAS_IP_ADDRESS		4	//!< ipaddr.#define PW_NAS_PORT			    5	//!< integer.#define PW_SERVICE_TYPE			6	//!< integer.#define PW_FRAMED_PROTOCOL		7	//!< integer.#define PW_FRAMED_IP_ADDRESS	8	//!< ipaddr.#define PW_FRAMED_IP_NETMASK	9	//!< ipaddr.#define PW_FRAMED_ROUTING		10	//!< integer.#define PW_FILTER_ID			11	//!< string.#define PW_FRAMED_MTU			12	//!< integer.#define PW_FRAMED_COMPRESSION	13	//!< integer.#define PW_LOGIN_IP_HOST		14	//!< ipaddr.#define PW_LOGIN_SERVICE		15	//!< integer.#define PW_LOGIN_PORT			16	//!< integer.#define PW_OLD_PASSWORD			17	//!< string */ /* deprecated.#define PW_REPLY_MESSAGE		18	//!< string.#define PW_LOGIN_CALLBACK_NUMBER    19	//!< string.#define PW_FRAMED_CALLBACK_ID		20	//!< string.#define PW_EXPIRATION			21	//!< date */ /* deprecated.#define PW_FRAMED_ROUTE			22	//!< string.#define PW_FRAMED_IPX_NETWORK	23	//!< integer.#define PW_STATE			    24	//!< string.#define PW_CLASS			    25	//!< string.#define PW_VENDOR_SPECIFIC	    26	//!< string.#define PW_SESSION_TIMEOUT		27	//!< integer.#define PW_IDLE_TIMEOUT			28	//!< integer.#define PW_TERMINATION_ACTION	29	//!< integer.#define PW_CALLED_STATION_ID	30	//!< string.#define PW_CALLING_STATION_ID	31	//!< string.#define PW_NAS_IDENTIFIER		32	//!< string.#define PW_PROXY_STATE			33	//!< string.#define PW_LOGIN_LAT_SERVICE	34	//!< string.#define PW_LOGIN_LAT_NODE		35	//!< string.#define PW_LOGIN_LAT_GROUP		36	//!< string.#define PW_FRAMED_APPLETALK_LINK	37	//!< integer.#define PW_FRAMED_APPLETALK_NETWORK	38	//!< integer.#define PW_FRAMED_APPLETALK_ZONE	39	//!< string.#define PW_ACCT_STATUS_TYPE		    40	//!< integer.#define PW_ACCT_DELAY_TIME		    41	//!< integer.#define PW_ACCT_INPUT_OCTETS		42	//!< integer.#define PW_ACCT_OUTPUT_OCTETS		43	//!< integer.#define PW_ACCT_SESSION_ID		    44	//!< string.#define PW_ACCT_AUTHENTIC		    45	//!< integer.#define PW_ACCT_SESSION_TIME		46	//!< integer.#define PW_ACCT_INPUT_PACKETS		47	//!< integer.#define PW_ACCT_OUTPUT_PACKETS		48	//!< integer.#define PW_ACCT_TERMINATE_CAUSE		49	//!< integer.#define PW_ACCT_MULTI_SESSION_ID	50	//!< string.#define PW_ACCT_LINK_COUNT		    51	//!< integer.#define PW_ACCT_INPUT_GIGAWORDS		52	//!< integer.#define PW_ACCT_OUTPUT_GIGAWORDS	53	//!< integer.#define PW_EVENT_TIMESTAMP		    55	//!< integer.#define PW_EGRESS_VLANID		    56	//!< string.#define PW_INGRESS_FILTERS		    57	//!< integer.#define PW_EGRESS_VLAN_NAME		    58	//!< string.#define PW_USER_PRIORITY_TABLE		59	//!< string.#define PW_CHAP_CHALLENGE		    60	//!< string.#define PW_NAS_PORT_TYPE		    61	//!< integer.#define PW_PORT_LIMIT			    62	//!< integer.#define PW_LOGIN_LAT_PORT		    63	//!< string.#define PW_TUNNEL_TYPE			    64	//!< string.#define PW_TUNNEL_MEDIUM_TYPE		65	//!< integer.#define PW_TUNNEL_CLIENT_ENDPOINT	66	//!< string.#define PW_TUNNEL_SERVER_ENDPOINT	67	//!< string.#define PW_ACCT_TUNNEL_CONNECTION	68	//!< string.#define PW_TUNNEL_PASSWORD		    69	//!< string.#define PW_ARAP_PASSWORD		    70	//!< string.#define PW_ARAP_FEATURES		    71	//!< string.#define PW_ARAP_ZONE_ACCESS		    72	//!< integer.#define PW_ARAP_SECURITY		    73	//!< integer.#define PW_ARAP_SECURITY_DATA		74	//!< string.#define PW_PASSWORD_RETRY		    75	//!< integer.#define PW_PROMPT			        76	//!< integer.#define PW_CONNECT_INFO			    77	//!< string.#define PW_CONFIGURATION_TOKEN		78	//!< string.#define PW_EAP_MESSAGE			    79	//!< string.#define PW_MESSAGE_AUTHENTICATOR	80	//!< string.#define PW_TUNNEL_PRIVATE_GROUP_ID	81	//!< string.#define PW_TUNNEL_ASSIGNMENT_ID		82	//!< string.#define PW_TUNNEL_PREFERENCE		83	//!< string.#define PW_ARAP_CHALLENGE_RESPONSE	84	//!< string.#define PW_ACCT_INTERIM_INTERVAL	85	//!< integer.#define PW_ACCT_TUNNEL_PACKETS_LOST	86	//!< integer.#define PW_NAS_PORT_ID_STRING		87	//!< string.#define PW_FRAMED_POOL			    88	//!< string.#define PW_CHARGEABLE_USER_IDENTITY	89	//!< string.#define PW_CUI				        89	//!< string.#define PW_TUNNEL_CLIENT_AUTH_ID	90	//!< string.#define PW_TUNNEL_SERVER_AUTH_ID	91	//!< string.#define PW_NAS_FILTER_RULE		    92	//!< string.#define PW_ORIGINATING_LINE_INFO	94	//!< string.#define PW_NAS_IPV6_ADDRESS		    95	//!< string.#define PW_FRAMED_INTERFACE_ID		96	//!< string.#define PW_FRAMED_IPV6_PREFIX		97	//!< string.#define PW_LOGIN_IPV6_HOST		    98	//!< string.#define PW_FRAMED_IPV6_ROUTE		99	//!< string.#define PW_FRAMED_IPV6_POOL		    100	//!< string.#define PW_ERROR_CAUSE			    101	//!< integer.#define PW_EAP_KEY_NAME			    102	//!< string.#define PW_FRAMED_IPV6_ADDRESS		168	//!< ipaddr6.#define PW_DNS_SERVER_IPV6_ADDRESS	169	//!< ipaddr6.#define PW_ROUTE_IPV6_INFORMATION	170	//!< ipv6prefix./* Experimental SIP-specific attributes (draft-sterman-aaa-sip-00.txt etc) */#define PW_DIGEST_RESPONSE		    206	//!< string.#define PW_DIGEST_ATTRIBUTES		207	//!< string.#define PW_DIGEST_REALM			    1063	//!< string.#define PW_DIGEST_NONCE			    1064	//!< string.#define PW_DIGEST_METHOD		    1065	//!< string.#define PW_DIGEST_URI			    1066	//!< string.#define PW_DIGEST_QOP			    1067	//!< string.#define PW_DIGEST_ALGORITHM		    1068	//!< string.#define PW_DIGEST_BODY_DIGEST		1069	//!< string.#define PW_DIGEST_CNONCE		    1070	//!< string.#define PW_DIGEST_NONCE_COUNT		1071	//!< string.#define PW_DIGEST_USER_NAME		    1072	//!< string./* Integer Translations *//* SERVICE TYPES */#define PW_LOGIN			    1#define PW_FRAMED			    2#define PW_CALLBACK_LOGIN		3#define PW_CALLBACK_FRAMED		4#define PW_OUTBOUND			    5#define PW_ADMINISTRATIVE		6#define PW_NAS_PROMPT			7#define PW_AUTHENTICATE_ONLY	8#define PW_CALLBACK_NAS_PROMPT	9/* FRAMED PROTOCOLS */#define PW_PPP				1#define PW_SLIP				2#define PW_ARA				3#define PW_GANDALF			4#define PW_XYLOGICS			5/* FRAMED ROUTING VALUES */#define PW_NONE				0#define PW_BROADCAST		1#define PW_LISTEN			2#define PW_BROADCAST_LISTEN	3/* FRAMED COMPRESSION TYPES */#define PW_VAN_JACOBSON_TCP_IP		1#define PW_IPX_HEADER_COMPRESSION	2/* LOGIN SERVICES */#define PW_TELNET			0#define PW_RLOGIN			1#define PW_TCP_CLEAR		2#define PW_PORTMASTER		3#define PW_LAT				4#define PW_X25_PAD			5#define PW_X25_T3POS		6/* TERMINATION ACTIONS */#define PW_DEFAULT			0#define PW_RADIUS_REQUEST	1/* PROHIBIT PROTOCOL */#define PW_DUMB			    0	//!< 1 and 2 are defined in FRAMED PROTOCOLS.#define PW_AUTH_ONLY	    3#define PW_ALL			    255/* ACCOUNTING STATUS TYPES */#define PW_STATUS_START		1#define PW_STATUS_STOP		2#define PW_STATUS_ALIVE		3#define PW_STATUS_MODEM_START	4#define PW_STATUS_MODEM_STOP	5#define PW_STATUS_CANCEL	6#define PW_ACCOUNTING_ON	7#define PW_ACCOUNTING_OFF	8/* ACCOUNTING TERMINATION CAUSES */#define PW_USER_REQUEST		1#define PW_LOST_CARRIER		2#define PW_LOST_SERVICE		3#define PW_ACCT_IDLE_TIMEOUT	4#define PW_ACCT_SESSION_TIMEOUT	5#define PW_ADMIN_RESET		6#define PW_ADMIN_REBOOT		7#define PW_PORT_ERROR		8#define PW_NAS_ERROR		9#define PW_NAS_REQUEST		10#define PW_NAS_REBOOT		11#define PW_PORT_UNNEEDED	12#define PW_PORT_PREEMPTED	13#define PW_PORT_SUSPENDED	14#define PW_SERVICE_UNAVAILABLE	15#define PW_CALLBACK		    16#define PW_USER_ERROR		17#define PW_HOST_REQUEST		18/* NAS PORT TYPES */#define PW_ASYNC		    0#define PW_SYNC			    1#define PW_ISDN_SYNC		2#define PW_ISDN_SYNC_V120	3#define PW_ISDN_SYNC_V110	4#define PW_VIRTUAL		    5/* AUTHENTIC TYPES */#define PW_RADIUS	1#define PW_LOCAL	2#define PW_REMOTE	3/* Server data structures */typedef struct dict_attr{	char              name[NAME_LENGTH + 1];	//!< attribute name.	int               value;			//!< attribute index.	int               type;				//!< string, int, etc..	struct dict_attr *next;} DICT_ATTR;typedef struct dict_value{	char               attrname[NAME_LENGTH +1];	char               name[NAME_LENGTH + 1];	int                value;	struct dict_value *next;} DICT_VALUE;typedef struct dict_vendor{	char               vendorname[NAME_LENGTH +1];	int                vendorpec;	struct dict_vendor *next;} DICT_VENDOR;typedef struct value_pair{	char               name[NAME_LENGTH + 1];	int                attribute;	int                type;	uint32_t           lvalue;	char               strvalue[AUTH_STRING_LEN + 1];	struct value_pair *next;} VALUE_PAIR;/* Define return codes from "SendServer" utility */#define NET_ERR_RC  -3  // Ошибка создания сокета, соединения/отправки/приема#define BADRESP_RC	-2  // Неверный пароль#define ERROR_RC	-1#define OK_RC		0#define TIMEOUT_RC	1#define REJECT_RC	2  // Неверный логин#define USER_RC     3#define ADMIN_RC    4typedef struct send_data /* Used to pass information to sendserver() function */{	uint8_t        code;		//!< RADIUS packet code.	uint8_t        seq_nbr;		//!< Packet sequence number.	char           *server;		//!< Name/addrress of RADIUS server.	int            svc_port;	//!< RADIUS protocol destination port.	char           *secret;		//!< Shared secret of RADIUS server.	int            timeout;		//!< Session timeout in seconds.	int            retries;	VALUE_PAIR     *send_pairs;     //!< More a/v pairs to send.	VALUE_PAIR     *receive_pairs;  //!< Where to place received a/v pairs.} SEND_DATA;#ifndef MIN#define MIN(a, b)     ((a) < (b) ? (a) : (b))#endif#ifndef MAX#define MAX(a, b)     ((a) > (b) ? (a) : (b))#endif#ifndef PATH_MAX#define PATH_MAX	1024#endiftypedef struct env{	int maxsize, size;	char **env;} ENV;#define ENV_SIZE	128__BEGIN_DECLS/* Function prototypes *//* avpair.c */VALUE_PAIR *rc_avpair_add(rc_handle const *, VALUE_PAIR **, int, void const *, int, int);int rc_avpair_assign(VALUE_PAIR *, void const *, int);VALUE_PAIR *rc_avpair_new(rc_handle const *, int, void const *, int, int);VALUE_PAIR *rc_avpair_gen(rc_handle const *, VALUE_PAIR *, unsigned char const *, int, int);VALUE_PAIR *rc_avpair_get(VALUE_PAIR *, int, int);void rc_avpair_insert(VALUE_PAIR **, VALUE_PAIR *, VALUE_PAIR *);void rc_avpair_free(VALUE_PAIR *);int rc_avpair_parse(rc_handle const *, char const *, VALUE_PAIR **);int rc_avpair_tostr(rc_handle const *, VALUE_PAIR *, char *, int, char *, int);char *rc_avpair_log(rc_handle const *, VALUE_PAIR *, char *buf, size_t buf_len);//VALUE_PAIR *rc_avpair_readin(rc_handle const *, FILE *);/* buildreq.c */void rc_buildreq(rc_handle const *, SEND_DATA *, int, char *, unsigned short, char *, int, int);unsigned char rc_get_id();int rc_auth(rc_handle *, uint32_t, VALUE_PAIR *, VALUE_PAIR **, char *);int rc_auth_proxy(rc_handle *, VALUE_PAIR *, VALUE_PAIR **, char *);int rc_acct(rc_handle *, uint32_t, VALUE_PAIR *);int rc_acct_proxy(rc_handle *, VALUE_PAIR *);int rc_check(rc_handle *, char *, char *, unsigned short, char *);int rc_aaa(rc_handle *rh, uint32_t client_port, VALUE_PAIR *send, VALUE_PAIR **received,    char *msg, int add_nas_port, int request_type);/* clientid.c */int rc_read_mapfile(rc_handle *, char const *);uint32_t rc_map2id(rc_handle const *, char const *);void rc_map2id_free(rc_handle *);/* config.c *///rc_handle *rc_read_config(char const *);void rc_read_config(rc_handle* rh);char *rc_conf_str(rc_handle const *, char const *);int rc_conf_int(rc_handle const *, char const *);SERVER *rc_conf_srv(rc_handle const *, char const *);void rc_config_free(rc_handle *);int rc_add_config(rc_handle *, char const *, char const *, char const *, int);rc_handle *rc_config_init(rc_handle *);int test_config(rc_handle const *, char const *);/* dict.c */int rc_read_dictionary(rc_handle *, char const *);DICT_ATTR *rc_dict_getattr(rc_handle const *, int);DICT_ATTR *rc_dict_findattr(rc_handle const *, char const *);DICT_VALUE *rc_dict_findval(rc_handle const *, char const *);DICT_VENDOR *rc_dict_findvend(rc_handle const *, char const *);DICT_VENDOR *rc_dict_getvend(rc_handle const *, int);DICT_VALUE * rc_dict_getval(rc_handle const *, uint32_t, char const *);void rc_dict_free(rc_handle *);/* ip_util.c */int rc_good_ipaddr(char const *);unsigned short rc_getport(int);int rc_own_hostname(char *, int);struct sockaddr;int rc_get_srcaddr(struct sockaddr *, const struct sockaddr *);/* log.c */void rc_openlog(char const *);void rc_log(int, char const *, ...);/* sendserver.c */int rc_send_server(rc_handle *, SEND_DATA *, char *, unsigned flags);/* util.c */void rc_str2tm(char const *, struct tm *);char *rc_getifname(rc_handle *, char const *);char *rc_getstr(rc_handle *, char const *, int);void rc_mdelay(int);char *rc_mksid(rc_handle *);rc_handle *rc_new(void);void rc_destroy(rc_handle *);//char *rc_fgetln(FILE *, size_t *);double rc_getctime(void);/* env.c */struct env *rc_new_env(int);void rc_free_env(struct env *);int rc_add_env(struct env *, char const *, char const *);int rc_import_env(struct env *, char const **);/* md5.c */void rc_md5_calc(unsigned char *, unsigned char const *, unsigned int);__END_DECLS#endif /* FREERADIUS_CLIENT_H */
 |