PROG = $(LIB_NAME).so
-SRCS = ./rlm_stg.cpp \
+SRCS = ./rlm_stg.c \
+ ./iface.cpp \
./stg_client.cpp
STGLIBS = crypto \
+++ /dev/null
-int main() { int probe = 0x00000001; return *(char *)&probe; }
+++ /dev/null
-/* Default Database File Names */
-
-#define RADIUS_DIR RADDBDIR
-#define RADACCT_DIR RADIR
-#define RADLOG_DIR LOGDIR
-
-#define RADIUS_DICTIONARY "dictionary"
-#define RADIUS_CLIENTS "clients"
-#define RADIUS_NASLIST "naslist"
-#define RADIUS_REALMS "realms"
-
-#define RADUTMP LOGDIR "/radutmp"
-#define SRADUTMP LOGDIR "/sradutmp"
-#define RADWTMP LOGDIR "/radwtmp"
-#define SRADWTMP LOGDIR "/sradwtmp"
-
-/* Hack for funky ascend ports on MAX 4048 (and probably others)
- The "NAS-Port-Id" value is "xyyzz" where "x" = 1 for digital, 2 for analog;
- "yy" = line number (1 for first PRI/T1/E1, 2 for second, so on);
- "zz" = channel number (on the PRI or Channelized T1/E1).
- This should work with normal terminal servers, unless you have a TS with
- more than 9999 ports ;^).
- The "ASCEND_CHANNELS_PER_LINE" is the number of channels for each line into
- the unit. For my US/PRI that's 23. A US/T1 would be 24, and a
- European E1 would be 30 (I think ... never had one ;^).
- This will NOT change the "NAS-Port-Id" reported in the detail log. This
- is simply to fix the dynamic IP assignments a la Cistron.
- You can change the default of 23 with an argument to ./configure.
- WARNING: This hack works for me, but I only have one PRI!!! I've not
- tested it on 2 or more (or with models other than the Max 4048)
- Use at your own risk!
- -- dgreer@austintx.com
-*/
-#ifdef ASCEND_PORT_HACK
-# ifndef ASCEND_CHANNELS_PER_LINE
-# define ASCEND_CHANNELS_PER_LINE 23
-# endif
-#endif
+++ /dev/null
-#ifndef _CONFFILE_H
-#define _CONFFILE_H
-
-/*
- * conffile.h Defines for the conffile parsing routines.
- *
- * Version: $Id: conffile.h,v 1.1 2010/08/14 04:13:52 faust Exp $
- *
- */
-
-//#include <freeradius/ident.h>
-//RCSIDH(conffile_h, "$Id: conffile.h,v 1.1 2010/08/14 04:13:52 faust Exp $")
-
-#include <stddef.h>
-//#include <freeradius/token.h>
-#include "libradius.h"
-
-/*
- * Export the minimum amount of information about these structs
- */
-typedef struct conf_item CONF_ITEM;
-typedef struct conf_pair CONF_PAIR;
-typedef struct conf_part CONF_SECTION;
-typedef struct conf_data CONF_DATA;
-
-/*
- * Instead of putting the information into a configuration structure,
- * the configuration file routines MAY just parse it directly into
- * user-supplied variables.
- */
-#define PW_TYPE_STRING_PTR 100
-#define PW_TYPE_BOOLEAN 101
-#define PW_TYPE_SUBSECTION 102
-#define PW_TYPE_FILENAME 103
-
-typedef struct CONF_PARSER {
- const char *name;
- int type; /* PW_TYPE_STRING, etc. */
- size_t offset; /* relative pointer within "base" */
- void *data; /* absolute pointer if base is NULL */
- const char *dflt; /* default as it would appear in radiusd.conf */
-} CONF_PARSER;
-
-/* This preprocessor trick will be useful in initializing CONF_PARSER struct */
-#define XStringify(x) #x
-#define Stringify(x) XStringify(x)
-
-void cf_pair_free(CONF_PAIR **cp);
-int cf_pair_replace(CONF_SECTION *cs, CONF_PAIR *cp,
- const char *value);
-void cf_section_free(CONF_SECTION **cp);
-int cf_item_parse(CONF_SECTION *cs, const char *name,
- int type, void *data, const char *dflt);
-int cf_section_parse(CONF_SECTION *, void *base,
- const CONF_PARSER *variables);
-void cf_section_parse_free(CONF_SECTION *cs, void *base);
-const CONF_PARSER *cf_section_parse_table(CONF_SECTION *cs);
-CONF_SECTION *cf_file_read(const char *file);
-int cf_file_include(const char *file, CONF_SECTION *cs);
-
-CONF_PAIR *cf_pair_find(const CONF_SECTION *, const char *name);
-CONF_PAIR *cf_pair_find_next(const CONF_SECTION *, CONF_PAIR *, const char *name);
-CONF_SECTION *cf_section_find(const char *name);
-CONF_SECTION *cf_section_sub_find(const CONF_SECTION *, const char *name);
-CONF_SECTION *cf_section_sub_find_name2(const CONF_SECTION *, const char *name1, const char *name2);
-const char *cf_section_value_find(const CONF_SECTION *, const char *attr);
-CONF_SECTION *cf_top_section(CONF_SECTION *cs);
-
-void *cf_data_find(CONF_SECTION *, const char *);
-int cf_data_add(CONF_SECTION *, const char *, void *, void (*)(void *));
-
-const char *cf_pair_attr(CONF_PAIR *pair);
-const char *cf_pair_value(CONF_PAIR *pair);
-VALUE_PAIR *cf_pairtovp(CONF_PAIR *pair);
-const char *cf_section_name1(const CONF_SECTION *);
-const char *cf_section_name2(const CONF_SECTION *);
-int dump_config(CONF_SECTION *cs);
-CONF_SECTION *cf_subsection_find_next(CONF_SECTION *section,
- CONF_SECTION *subsection,
- const char *name1);
-CONF_SECTION *cf_section_find_next(CONF_SECTION *section,
- CONF_SECTION *subsection,
- const char *name1);
-int cf_section_lineno(CONF_SECTION *section);
-int cf_pair_lineno(CONF_PAIR *pair);
-const char *cf_pair_filename(CONF_PAIR *pair);
-const char *cf_section_filename(CONF_SECTION *section);
-CONF_ITEM *cf_item_find_next(CONF_SECTION *section, CONF_ITEM *item);
-int cf_item_is_section(CONF_ITEM *item);
-int cf_item_is_pair(CONF_ITEM *item);
-CONF_PAIR *cf_itemtopair(CONF_ITEM *item);
-CONF_SECTION *cf_itemtosection(CONF_ITEM *item);
-CONF_ITEM *cf_pairtoitem(CONF_PAIR *cp);
-CONF_ITEM *cf_sectiontoitem(CONF_SECTION *cs);
-int cf_section_template(CONF_SECTION *cs, CONF_SECTION *_template);
-void cf_log_err(CONF_ITEM *ci, const char *fmt, ...)
-#ifdef __GNUC__
- __attribute__ ((format (printf, 2, 3)))
-#endif
-;
-void cf_log_info(CONF_SECTION *cs, const char *fmt, ...)
-#ifdef __GNUC__
- __attribute__ ((format (printf, 2, 3)))
-#endif
-;
-void cf_log_module(CONF_SECTION *cs, const char *fmt, ...)
-#ifdef __GNUC__
- __attribute__ ((format (printf, 2, 3)))
-#endif
-;
-CONF_ITEM *cf_reference_item(const CONF_SECTION *parentcs,
- CONF_SECTION *outercs,
- const char *ptr);
-extern int cf_log_config;
-extern int cf_log_modules;
-
-extern int cf_pair2xml(FILE *fp, CONF_PAIR *cp);
-extern int cf_section2xml(FILE *fp, CONF_SECTION *cs);
-extern int cf_pair2file(FILE *fp, CONF_PAIR *cp);
-extern int cf_section2file(FILE *fp, CONF_SECTION *cs);
-
-/*
- * Big magic.
- */
-int cf_section_migrate(CONF_SECTION *dst, CONF_SECTION *src);
-
-#endif /* _CONFFILE_H */
--- /dev/null
+#include "iface.h"
+
+#include "loki/Singleton.h"
+
+#include "thriftclient.h"
+
+int stgInstantiateImpl(const char * server, uint16_t port, const char * password)
+{
+ if (STG_CLIENT_ST::Get().Configure(server, port, password))
+ return 1;
+
+ return 0;
+}
+
+const STG_PAIR * stgAuthorizeImpl(const char * userName, const char * serviceType)
+{
+ return STG_CLIENT_ST::Get().Authorize(userName, serviceType);
+}
+
+const STG_PAIR * stgAuthenticateImpl(const char * userName, const char * serviceType)
+{
+ return STG_CLIENT_ST::Get().Authenticate(userName, serviceType);
+}
+
+const STG_PAIR * stgPostAuthImpl(const char * userName, const char * serviceType)
+{
+ return STG_CLIENT_ST::Get().PostAuth(userName, serviceType);
+}
+
+const STG_PAIR * stgPreAcctImpl(const char * userName, const char * serviceType)
+{
+ return STG_CLIENT_ST::Get().PreAcct(userName, serviceType);
+}
+
+const STG_PAIR * stgAccountingImpl(const char * userName, const char * serviceType, const char * statusType, const char * sessionId)
+{
+ return STG_CLIENT_ST::Get().Account(userName, serviceType, statusType, sessionId);
+}
+
+void deletePairs(const STG_PAIR * pairs)
+{
+ delete[] pairs;
+}
--- /dev/null
+#ifndef __STG_IFACE_H__
+#define __STG_IFACE_H__
+
+#include <stdint.h>
+
+#include "stgpair.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+int stgInstantiateImpl(const char * server, uint16_t port, const char * password);
+const STG_PAIR * stgAuthorizeImpl(const char * userName, const char * serviceType);
+const STG_PAIR * stgAuthenticateImpl(const char * userName, const char * serviceType);
+const STG_PAIR * stgPostAuthImpl(const char * userName, const char * serviceType);
+const STG_PAIR * stgPreAcctImpl(const char * userName, const char * serviceType);
+const STG_PAIR * stgAccountingImpl(const char * userName, const char * serviceType, const char * statusType, const char * sessionId);
+
+void deletePairs(const STG_PAIR * pairs);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+++ /dev/null
-#ifndef LIBRADIUS_H
-#define LIBRADIUS_H
-
-/*
- * libradius.h Structures and prototypes
- * for the radius library.
- *
- * Version: $Id: libradius.h,v 1.1 2010/08/14 04:13:52 faust Exp $
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- *
- * Copyright 1999,2000,2001,2002,2003,2004,2005,2006,2007,2008 The FreeRADIUS server project
- */
-
-//#include <freeradius/ident.h>
-//RCSIDH(libradius_h, "$Id: libradius.h,v 1.1 2010/08/14 04:13:52 faust Exp $")
-
-#include <errno.h>
-#include <time.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include "stg/os_int.h"
-
-#ifdef FREE_BSD
-#include <sys/types.h>
-#endif
-#include <netinet/in.h>
-#include <sys/socket.h>
-
-/*#include <freeradius/radius.h>
-#include <freeradius/hash.h>*/
-
-#include "token.h"
-
-#ifdef SIZEOF_UNSIGNED_INT
-#if SIZEOF_UNSIGNED_INT != 4
-#error FATAL: sizeof(unsigned int) != 4
-#endif
-#endif
-
-/*
- * Include for modules.
- */
-/*#include <freeradius/sha1.h>
-#include <freeradius/md4.h>*/
-
-#define EAP_START 2
-
-#define AUTH_VECTOR_LEN 16
-#define CHAP_VALUE_LENGTH 16
-#define MAX_STRING_LEN 254 /* RFC2138: string 0-253 octets */
-
-# define VENDOR(x) ((x >> 16) & 0xffff)
-
-#ifdef _LIBRADIUS
-# define AUTH_HDR_LEN 20
-# define VENDORPEC_USR 429
-#define VENDORPEC_LUCENT 4846
-#define VENDORPEC_STARENT 8164
-# define DEBUG if (fr_debug_flag && fr_log_fp) fr_printf_log
-# define debug_pair(vp) do { if (fr_debug_flag && fr_log_fp) { \
- fputc('\t', fr_log_fp); \
- vp_print(fr_log_fp, vp); \
- fputc('\n', fr_log_fp); \
- } \
- } while(0)
-# define TAG_VALID(x) ((x) > 0 && (x) < 0x20)
-# define TAG_VALID_ZERO(x) ((x) < 0x20)
-# define TAG_ANY -128 /* minimum signed char */
-#endif
-
-#if defined(__GNUC__)
-# define PRINTF_LIKE(n) __attribute__ ((format(printf, n, n+1)))
-# define NEVER_RETURNS __attribute__ ((noreturn))
-# define UNUSED __attribute__ ((unused))
-# define BLANK_FORMAT " " /* GCC_LINT whines about empty formats */
-#else
-# define PRINTF_LIKE(n) /* ignore */
-# define NEVER_RETURNS /* ignore */
-# define UNUSED /* ignore */
-# define BLANK_FORMAT ""
-#endif
-
-typedef struct attr_flags {
- unsigned int addport : 1; /* add NAS-Port to IP address */
- unsigned int has_tag : 1; /* tagged attribute */
- unsigned int do_xlat : 1; /* strvalue is dynamic */
- unsigned int unknown_attr : 1; /* not in dictionary */
- unsigned int array : 1; /* pack multiples into 1 attr */
- unsigned int has_value : 1; /* has a value */
- unsigned int has_value_alias : 1; /* has a value alias */
- unsigned int has_tlv : 1; /* has sub attributes */
- unsigned int is_tlv : 1; /* is a sub attribute */
- unsigned int encoded : 1; /* has been put into packet */
-
- int8_t tag; /* tag for tunneled attributes */
- uint8_t encrypt; /* encryption method */
-} ATTR_FLAGS;
-
-/*
- * Values of the encryption flags.
- */
-#define FLAG_ENCRYPT_NONE (0)
-#define FLAG_ENCRYPT_USER_PASSWORD (1)
-#define FLAG_ENCRYPT_TUNNEL_PASSWORD (2)
-#define FLAG_ENCRYPT_ASCEND_SECRET (3)
-
-typedef struct dict_attr {
- unsigned int attr;
- int type;
- int vendor;
- ATTR_FLAGS flags;
- char name[1];
-} DICT_ATTR;
-
-typedef struct dict_value {
- unsigned int attr;
- int value;
- char name[1];
-} DICT_VALUE;
-
-typedef struct dict_vendor {
- int vendorpec;
- int type; /* length of type data */
- int length; /* length of length data */
- int flags;
- char name[1];
-} DICT_VENDOR;
-
-typedef union value_pair_data {
- char strvalue[MAX_STRING_LEN];
- uint8_t octets[MAX_STRING_LEN];
- struct in_addr ipaddr;
- struct in6_addr ipv6addr;
- uint32_t date;
- uint32_t integer;
- int32_t sinteger;
- uint8_t filter[32];
- uint8_t ifid[8]; /* struct? */
- uint8_t ipv6prefix[18]; /* struct? */
- uint8_t ether[6];
- uint8_t *tlv;
-} VALUE_PAIR_DATA;
-
-typedef struct value_pair {
- const char *name;
- int attribute;
- int vendor;
- int type;
- size_t length; /* of data */
- FR_TOKEN _operator;
- ATTR_FLAGS flags;
- struct value_pair *next;
- uint32_t lvalue;
- VALUE_PAIR_DATA data;
-} VALUE_PAIR;
-#define vp_strvalue data.strvalue
-#define vp_octets data.octets
-#define vp_ipv6addr data.ipv6addr
-#define vp_ifid data.ifid
-#define vp_ipv6prefix data.ipv6prefix
-#define vp_filter data.filter
-#define vp_ether data.ether
-#define vp_signed data.sinteger
-#define vp_tlv data.tlv
-
-#if 0
-#define vp_ipaddr data.ipaddr.s_addr
-#define vp_date data.date
-#define vp_integer data.integer
-#else
-/*
- * These are left as lvalue until we audit the source for code
- * that prints to vp_strvalue for integer/ipaddr/date types.
- */
-#define vp_ipaddr lvalue
-#define vp_date lvalue
-#define vp_integer lvalue
-#endif
-
-
-typedef struct fr_ipaddr_t {
- int af; /* address family */
- union {
- struct in_addr ip4addr;
- struct in6_addr ip6addr; /* maybe defined in missing.h */
- } ipaddr;
-} fr_ipaddr_t;
-
-/*
- * vector: Request authenticator from access-request packet
- * Put in there by rad_decode, and must be put in the
- * response RADIUS_PACKET as well before calling rad_send
- *
- * verified: Filled in by rad_decode for accounting-request packets
- *
- * data,data_len: Used between rad_recv and rad_decode.
- */
-typedef struct radius_packet {
- int sockfd;
- fr_ipaddr_t src_ipaddr;
- fr_ipaddr_t dst_ipaddr;
- uint16_t src_port;
- uint16_t dst_port;
- int id;
- unsigned int code;
- uint32_t hash;
- uint8_t vector[AUTH_VECTOR_LEN];
- time_t timestamp;
- uint8_t *data;
- int data_len;
- VALUE_PAIR *vps;
- ssize_t offset;
-} RADIUS_PACKET;
-
-/*
- * Printing functions.
- */
-int fr_utf8_char(const uint8_t *str);
-void fr_print_string(const char *in, size_t inlen,
- char *out, size_t outlen);
-int vp_prints_value(char *out, size_t outlen,
- VALUE_PAIR *vp, int delimitst);
-const char *vp_print_name(char *buffer, size_t bufsize, int attr);
-int vp_prints(char *out, size_t outlen, VALUE_PAIR *vp);
-void vp_print(FILE *, VALUE_PAIR *);
-void vp_printlist(FILE *, VALUE_PAIR *);
-#define fprint_attr_val vp_print
-
-/*
- * Dictionary functions.
- */
-int dict_addvendor(const char *name, int value);
-int dict_addattr(const char *name, int vendor, int type, int value, ATTR_FLAGS flags);
-int dict_addvalue(const char *namestr, const char *attrstr, int value);
-int dict_init(const char *dir, const char *fn);
-void dict_free(void);
-DICT_ATTR *dict_attrbyvalue(unsigned int attr);
-DICT_ATTR *dict_attrbyname(const char *attr);
-DICT_VALUE *dict_valbyattr(unsigned int attr, int val);
-DICT_VALUE *dict_valbyname(unsigned int attr, const char *val);
-int dict_vendorbyname(const char *name);
-DICT_VENDOR *dict_vendorbyvalue(int vendor);
-
-#if 1 /* FIXME: compat */
-#define dict_attrget dict_attrbyvalue
-#define dict_attrfind dict_attrbyname
-#define dict_valfind dict_valbyname
-/*#define dict_valget dict_valbyattr almost but not quite*/
-#endif
-
-/* get around diffrent ctime_r styles */
-#ifdef CTIMERSTYLE
-#if CTIMERSTYLE == SOLARISSTYLE
-#define CTIME_R(a,b,c) ctime_r(a,b,c)
-#else
-#define CTIME_R(a,b,c) ctime_r(a,b)
-#endif
-#else
-#define CTIME_R(a,b,c) ctime_r(a,b)
-#endif
-
-/* md5.c */
-
-void fr_md5_calc(uint8_t *, const uint8_t *, unsigned int);
-
-/* hmac.c */
-
-void fr_hmac_md5(const uint8_t *text, int text_len,
- const uint8_t *key, int key_len,
- unsigned char *digest);
-
-/* hmacsha1.c */
-
-void fr_hmac_sha1(const uint8_t *text, int text_len,
- const uint8_t *key, int key_len,
- uint8_t *digest);
-
-/* radius.c */
-int rad_send(RADIUS_PACKET *, const RADIUS_PACKET *, const char *secret);
-int rad_packet_ok(RADIUS_PACKET *packet, int flags);
-RADIUS_PACKET *rad_recv(int fd, int flags);
-ssize_t rad_recv_header(int sockfd, fr_ipaddr_t *src_ipaddr, int *src_port,
- int *code);
-void rad_recv_discard(int sockfd);
-int rad_verify(RADIUS_PACKET *packet, RADIUS_PACKET *original,
- const char *secret);
-int rad_decode(RADIUS_PACKET *packet, RADIUS_PACKET *original, const char *secret);
-int rad_encode(RADIUS_PACKET *packet, const RADIUS_PACKET *original,
- const char *secret);
-int rad_sign(RADIUS_PACKET *packet, const RADIUS_PACKET *original,
- const char *secret);
-
-RADIUS_PACKET *rad_alloc(int newvector);
-RADIUS_PACKET *rad_alloc_reply(RADIUS_PACKET *);
-void rad_free(RADIUS_PACKET **);
-int rad_pwencode(char *encpw, size_t *len, const char *secret,
- const uint8_t *vector);
-int rad_pwdecode(char *encpw, size_t len, const char *secret,
- const uint8_t *vector);
-int rad_tunnel_pwencode(char *encpw, size_t *len, const char *secret,
- const uint8_t *vector);
-int rad_tunnel_pwdecode(uint8_t *encpw, size_t *len,
- const char *secret, const uint8_t *vector);
-int rad_chap_encode(RADIUS_PACKET *packet, uint8_t *output,
- int id, VALUE_PAIR *password);
-VALUE_PAIR *rad_attr2vp(const RADIUS_PACKET *packet, const RADIUS_PACKET *original,
- const char *secret, int attribute, int length,
- const uint8_t *data);
-int rad_vp2attr(const RADIUS_PACKET *packet,
- const RADIUS_PACKET *original, const char *secret,
- const VALUE_PAIR *vp, uint8_t *ptr);
-
-/* valuepair.c */
-VALUE_PAIR *pairalloc(DICT_ATTR *da);
-VALUE_PAIR *paircreate(int attr, int type);
-void pairfree(VALUE_PAIR **);
-void pairbasicfree(VALUE_PAIR *pair);
-VALUE_PAIR *pairfind(VALUE_PAIR *, int);
-void pairdelete(VALUE_PAIR **, int);
-void pairadd(VALUE_PAIR **, VALUE_PAIR *);
-void pairreplace(VALUE_PAIR **first, VALUE_PAIR *add);
-int paircmp(VALUE_PAIR *check, VALUE_PAIR *data);
-VALUE_PAIR *paircopyvp(const VALUE_PAIR *vp);
-VALUE_PAIR *paircopy(VALUE_PAIR *vp);
-VALUE_PAIR *paircopy2(VALUE_PAIR *vp, int attr);
-void pairmove(VALUE_PAIR **to, VALUE_PAIR **from);
-void pairmove2(VALUE_PAIR **to, VALUE_PAIR **from, int attr);
-VALUE_PAIR *pairparsevalue(VALUE_PAIR *vp, const char *value);
-VALUE_PAIR *pairmake(const char *attribute, const char *value, int _operator);
-VALUE_PAIR *pairread(const char **ptr, FR_TOKEN *eol);
-FR_TOKEN userparse(const char *buffer, VALUE_PAIR **first_pair);
-VALUE_PAIR *readvp2(FILE *fp, int *pfiledone, const char *errprefix);
-
-/*
- * Error functions.
- */
-#ifdef _LIBRADIUS
-void fr_strerror_printf(const char *, ...)
-#ifdef __GNUC__
- __attribute__ ((format (printf, 1, 2)))
-#endif
-;
-#endif
-void fr_perror(const char *, ...)
-#ifdef __GNUC__
- __attribute__ ((format (printf, 1, 2)))
-#endif
-;
-extern const char *fr_strerror(void);
-extern int fr_dns_lookups; /* 0 = no dns lookups */
-extern int fr_debug_flag; /* 0 = no debugging information */
-extern int fr_max_attributes; /* per incoming packet */
-#define FR_MAX_PACKET_CODE (52)
-extern const char *fr_packet_codes[FR_MAX_PACKET_CODE];
-extern FILE *fr_log_fp;
-void fr_printf_log(const char *, ...)
-#ifdef __GNUC__
- __attribute__ ((format (printf, 1, 2)))
-#endif
-;
-
-/*
- * Several handy miscellaneous functions.
- */
-const char * ip_ntoa(char *, uint32_t);
-char *ifid_ntoa(char *buffer, size_t size, uint8_t *ifid);
-uint8_t *ifid_aton(const char *ifid_str, uint8_t *ifid);
-int rad_lockfd(int fd, int lock_len);
-int rad_lockfd_nonblock(int fd, int lock_len);
-int rad_unlockfd(int fd, int lock_len);
-void fr_bin2hex(const uint8_t *bin, char *hex, size_t len);
-size_t fr_hex2bin(const char *hex, uint8_t *bin, size_t len);
-#ifndef HAVE_CLOSEFROM
-int closefrom(int fd);
-#endif
-int fr_ipaddr_cmp(const fr_ipaddr_t *a, const fr_ipaddr_t *b);
-
-int ip_hton(const char *src, int af, fr_ipaddr_t *dst);
-const char *ip_ntoh(const fr_ipaddr_t *src, char *dst, size_t cnt);
-int fr_ipaddr2sockaddr(const fr_ipaddr_t *ipaddr, int port,
- struct sockaddr_storage *sa, socklen_t *salen);
-int fr_sockaddr2ipaddr(const struct sockaddr_storage *sa, socklen_t salen,
- fr_ipaddr_t *ipaddr, int * port);
-
-
-#ifdef ASCEND_BINARY
-/* filters.c */
-int ascend_parse_filter(VALUE_PAIR *pair);
-void print_abinary(VALUE_PAIR *vp, char *buffer, size_t len);
-#endif /*ASCEND_BINARY*/
-
-/* random numbers in isaac.c */
-/* context of random number generator */
-typedef struct fr_randctx {
- uint32_t randcnt;
- uint32_t randrsl[256];
- uint32_t randmem[256];
- uint32_t randa;
- uint32_t randb;
- uint32_t randc;
-} fr_randctx;
-
-void fr_isaac(fr_randctx *ctx);
-void fr_randinit(fr_randctx *ctx, int flag);
-uint32_t fr_rand(void); /* like rand(), but better. */
-void fr_rand_seed(const void *, size_t ); /* seed the random pool */
-
-
-/* crypt wrapper from crypt.c */
-int fr_crypt_check(const char *key, const char *salt);
-
-/* rbtree.c */
-typedef struct rbtree_t rbtree_t;
-typedef struct rbnode_t rbnode_t;
-
-rbtree_t *rbtree_create(int (*Compare)(const void *, const void *),
- void (*freeNode)(void *),
- int replace_flag);
-void rbtree_free(rbtree_t *tree);
-int rbtree_insert(rbtree_t *tree, void *Data);
-rbnode_t *rbtree_insertnode(rbtree_t *tree, void *Data);
-void rbtree_delete(rbtree_t *tree, rbnode_t *Z);
-int rbtree_deletebydata(rbtree_t *tree, const void *data);
-rbnode_t *rbtree_find(rbtree_t *tree, const void *Data);
-void *rbtree_finddata(rbtree_t *tree, const void *Data);
-int rbtree_num_elements(rbtree_t *tree);
-void *rbtree_min(rbtree_t *tree);
-void *rbtree_node2data(rbtree_t *tree, rbnode_t *node);
-
-/* callback order for walking */
-typedef enum { PreOrder, InOrder, PostOrder } RBTREE_ORDER;
-
-/*
- * The callback should be declared as:
- * int callback(void *context, void *data)
- *
- * The "context" is some user-defined context.
- * The "data" is the pointer to the user data in the node,
- * NOT the node itself.
- *
- * It should return 0 if all is OK, and !0 for any error.
- * The walking will stop on any error.
- */
-int rbtree_walk(rbtree_t *tree, RBTREE_ORDER order, int (*callback)(void *, void *), void *context);
-
-/*
- * FIFOs
- */
-typedef struct fr_fifo_t fr_fifo_t;
-typedef void (*fr_fifo_free_t)(void *);
-fr_fifo_t *fr_fifo_create(int max_entries, fr_fifo_free_t freeNode);
-void fr_fifo_free(fr_fifo_t *fi);
-int fr_fifo_push(fr_fifo_t *fi, void *data);
-void *fr_fifo_pop(fr_fifo_t *fi);
-void *fr_fifo_peek(fr_fifo_t *fi);
-int fr_fifo_num_elements(fr_fifo_t *fi);
-
-//#include <freeradius/packet.h>
-
-#endif /*LIBRADIUS_H*/
+++ /dev/null
-/*
- * module.h Interface to the RADIUS module system.
- *
- * Version: $Id: modules.h,v 1.1 2010/08/14 04:13:52 faust Exp $
- *
- */
-
-#ifndef RADIUS_MODULES_H
-#define RADIUS_MODULES_H
-
-//#include <freeradius/ident.h>
-//RCSIDH(modules_h, "$Id: modules.h,v 1.1 2010/08/14 04:13:52 faust Exp $")
-
-//#include "conffile.h"
-#include "radiusd.h"
-
-typedef int (*packetmethod)(void *instance, REQUEST *request);
-
-enum {
- RLM_COMPONENT_AUTH = 0,
- RLM_COMPONENT_AUTZ, /* 1 */
- RLM_COMPONENT_PREACCT, /* 2 */
- RLM_COMPONENT_ACCT, /* 3 */
- RLM_COMPONENT_SESS, /* 4 */
- RLM_COMPONENT_PRE_PROXY, /* 5 */
- RLM_COMPONENT_POST_PROXY, /* 6 */
- RLM_COMPONENT_POST_AUTH, /* 7 */
-#ifdef WITH_COA
- RLM_COMPONENT_RECV_COA, /* 8 */
- RLM_COMPONENT_SEND_COA, /* 9 */
-#endif
- RLM_COMPONENT_COUNT /* 8 / 10: How many components are there */
-};
-
-#define RLM_TYPE_THREAD_SAFE (0 << 0)
-#define RLM_TYPE_THREAD_UNSAFE (1 << 0)
-#define RLM_TYPE_CHECK_CONFIG_SAFE (1 << 1)
-#define RLM_TYPE_HUP_SAFE (1 << 2)
-
-#define RLM_MODULE_MAGIC_NUMBER ((uint32_t) (0xf4ee4ad2))
-#define RLM_MODULE_INIT RLM_MODULE_MAGIC_NUMBER
-
-typedef struct module_t {
- uint32_t magic; /* may later be opaque struct */
- const char *name;
- int type;
- int (*instantiate)(CONF_SECTION *mod_cs, void **instance);
- int (*detach)(void *instance);
- packetmethod methods[RLM_COMPONENT_COUNT];
-} module_t;
-
-enum {
- RLM_MODULE_REJECT, /* immediately reject the request */
- RLM_MODULE_FAIL, /* module failed, don't reply */
- RLM_MODULE_OK, /* the module is OK, continue */
- RLM_MODULE_HANDLED, /* the module handled the request, so stop. */
- RLM_MODULE_INVALID, /* the module considers the request invalid. */
- RLM_MODULE_USERLOCK, /* reject the request (user is locked out) */
- RLM_MODULE_NOTFOUND, /* user not found */
- RLM_MODULE_NOOP, /* module succeeded without doing anything */
- RLM_MODULE_UPDATED, /* OK (pairs modified) */
- RLM_MODULE_NUMCODES /* How many return codes there are */
-};
-
-int setup_modules(int, CONF_SECTION *);
-int detach_modules(void);
-int module_hup(CONF_SECTION *modules);
-int module_authorize(int type, REQUEST *request);
-int module_authenticate(int type, REQUEST *request);
-int module_preacct(REQUEST *request);
-int module_accounting(int type, REQUEST *request);
-int module_checksimul(int type, REQUEST *request, int maxsimul);
-int module_pre_proxy(int type, REQUEST *request);
-int module_post_proxy(int type, REQUEST *request);
-int module_post_auth(int type, REQUEST *request);
-#ifdef WITH_COA
-int module_recv_coa(int type, REQUEST *request);
-int module_send_coa(int type, REQUEST *request);
-#define MODULE_NULL_COA_FUNCS ,NULL,NULL
-#else
-#define MODULE_NULL_COA_FUNCS
-#endif
-int indexed_modcall(int comp, int idx, REQUEST *request);
-
-/*
- * For now, these are strongly tied together.
- */
-int virtual_servers_load(CONF_SECTION *config);
-void virtual_servers_free(time_t when);
-
-
-#endif /* RADIUS_MODULES_H */
+++ /dev/null
-/*
- * radius.h Constants of the radius protocol.
- *
- * Version: $Id$
- *
- */
-
-
-#define PW_TYPE_STRING 0
-#define PW_TYPE_INTEGER 1
-#define PW_TYPE_IPADDR 2
-#define PW_TYPE_DATE 3
-#define PW_TYPE_ABINARY 4
-#define PW_TYPE_OCTETS 5
-#define PW_TYPE_IFID 6
-#define PW_TYPE_IPV6ADDR 7
-#define PW_TYPE_IPV6PREFIX 8
-#define PW_TYPE_BYTE 9
-#define PW_TYPE_SHORT 10
-#define PW_TYPE_ETHERNET 11
-#define PW_TYPE_SIGNED 12
-#define PW_TYPE_COMBO_IP 13
-#define PW_TYPE_TLV 14
-
-#define PW_AUTHENTICATION_REQUEST 1
-#define PW_AUTHENTICATION_ACK 2
-#define PW_AUTHENTICATION_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
-#define PW_DISCONNECT_REQUEST 40
-#define PW_DISCONNECT_ACK 41
-#define PW_DISCONNECT_NAK 42
-#define PW_COA_REQUEST 43
-#define PW_COA_ACK 44
-#define PW_COA_NAK 45
-
-#define PW_AUTH_UDP_PORT 1812
-#define PW_ACCT_UDP_PORT 1813
-#define PW_POD_UDP_PORT 1700
-#define PW_COA_UDP_PORT 3799
-
-#define PW_USER_NAME 1
-#define PW_USER_PASSWORD 2
-#define PW_PASSWORD 2
-#define PW_CHAP_PASSWORD 3
-#define PW_NAS_IP_ADDRESS 4
-#define PW_NAS_PORT 5
-#define PW_SERVICE_TYPE 6
-#define PW_FRAMED_PROTOCOL 7
-#define PW_FRAMED_IP_ADDRESS 8
-#define PW_FRAMED_IP_NETMASK 9
-#define PW_FRAMED_ROUTING 10
-#define PW_FILTER_ID 11
-#define PW_FRAMED_MTU 12
-#define PW_FRAMED_COMPRESSION 13
-#define PW_LOGIN_IP_HOST 14
-#define PW_LOGIN_SERVICE 15
-#define PW_LOGIN_TCP_PORT 16
-#define PW_OLD_PASSWORD 17
-#define PW_REPLY_MESSAGE 18
-#define PW_CALLBACK_NUMBER 19
-#define PW_CALLBACK_ID 20
-#if 0
-/*
- * Deprecated, and no longer used.
- */
-#define PW_EXPIRATION 21
-#endif
-#define PW_FRAMED_ROUTE 22
-#define PW_FRAMED_IPXNET 23
-#define PW_STATE 24
-#define PW_CLASS 25
-#define PW_VENDOR_SPECIFIC 26
-#define PW_SESSION_TIMEOUT 27
-#define PW_IDLE_TIMEOUT 28
-#define PW_CALLED_STATION_ID 30
-#define PW_CALLING_STATION_ID 31
-#define PW_NAS_IDENTIFIER 32
-#define PW_PROXY_STATE 33
-
-#define PW_ACCT_STATUS_TYPE 40
-#define PW_ACCT_DELAY_TIME 41
-#define PW_ACCT_INPUT_OCTETS 42
-#define PW_ACCT_OUTPUT_OCTETS 43
-#define PW_ACCT_SESSION_ID 44
-#define PW_ACCT_AUTHENTIC 45
-#define PW_ACCT_SESSION_TIME 46
-#define PW_ACCT_INPUT_PACKETS 47
-#define PW_ACCT_OUTPUT_PACKETS 48
-#define PW_ACCT_TERMINATE_CAUSE 49
-
-#define PW_EVENT_TIMESTAMP 55
-
-#define PW_CHAP_CHALLENGE 60
-#define PW_NAS_PORT_TYPE 61
-#define PW_PORT_LIMIT 62
-
-#define PW_ARAP_PASSWORD 70
-#define PW_ARAP_FEATURES 71
-#define PW_ARAP_ZONE_ACCESS 72
-#define PW_ARAP_SECURITY 73
-#define PW_ARAP_SECURITY_DATA 74
-#define PW_PASSWORD_RETRY 75
-#define PW_PROMPT 76
-#define PW_CONNECT_INFO 77
-#define PW_CONFIGURATION_TOKEN 78
-#define PW_EAP_MESSAGE 79
-#define PW_MESSAGE_AUTHENTICATOR 80
-
-#define PW_ARAP_CHALLENGE_RESPONSE 84
-#define PW_NAS_PORT_ID_STRING 87
-#define PW_FRAMED_POOL 88
-#define PW_CHARGEABLE_USER_IDENTITY 89
-#define PW_NAS_IPV6_ADDRESS 95
-
-#define PW_EXTENDED_ATTRIBUTE 192
-
-#define PW_DIGEST_RESPONSE 206
-#define PW_DIGEST_ATTRIBUTES 207
-
-#define PW_FALL_THROUGH 500
-#define PW_EXEC_PROGRAM 502
-#define PW_EXEC_PROGRAM_WAIT 503
-
-#define PW_AUTH_TYPE 1000
-#define PW_PREFIX 1003
-#define PW_SUFFIX 1004
-#define PW_GROUP 1005
-#define PW_CRYPT_PASSWORD 1006
-#define PW_CONNECT_RATE 1007
-#define PW_ADD_PREFIX 1008
-#define PW_ADD_SUFFIX 1009
-#define PW_EXPIRATION 1010
-#define PW_AUTZ_TYPE 1011
-#define PW_ACCT_TYPE 1012
-#define PW_SESSION_TYPE 1013
-#define PW_POST_AUTH_TYPE 1014
-#define PW_PRE_PROXY_TYPE 1015
-#define PW_POST_PROXY_TYPE 1016
-#define PW_PRE_ACCT_TYPE 1017
-#define PW_EAP_TYPE 1018
-#define PW_EAP_TLS_REQUIRE_CLIENT_CERT 1019
-#define PW_CLIENT_SHORTNAME 1024
-#define PW_LOAD_BALANCE_KEY 1025
-#define PW_RAW_ATTRIBUTE 1026
-#define PW_TNC_VLAN_ACCESS 1027
-#define PW_TNC_VLAN_ISOLATE 1028
-#define PW_USER_CATEGORY 1029
-#define PW_GROUP_NAME 1030
-#define PW_HUNTGROUP_NAME 1031
-#define PW_SIMULTANEOUS_USE 1034
-#define PW_STRIP_USER_NAME 1035
-#define PW_HINT 1040
-#define PAM_AUTH_ATTR 1041
-#define PW_LOGIN_TIME 1042
-#define PW_STRIPPED_USER_NAME 1043
-#define PW_CURRENT_TIME 1044
-#define PW_REALM 1045
-#define PW_NO_SUCH_ATTRIBUTE 1046
-#define PW_PACKET_TYPE 1047
-#define PW_PROXY_TO_REALM 1048
-#define PW_REPLICATE_TO_REALM 1049
-#define PW_ACCT_SESSION_START_TIME 1050
-#define PW_ACCT_UNIQUE_SESSION_ID 1051
-#define PW_CLIENT_IP_ADDRESS 1052
-#define PW_LDAP_USERDN 1053
-#define PW_NS_MTA_MD5_PASSWORD 1054
-#define PW_SQL_USER_NAME 1055
-#define PW_LM_PASSWORD 1057
-#define PW_NT_PASSWORD 1058
-#define PW_SMB_ACCOUNT_CTRL 1059
-#define PW_SMB_ACCOUNT_CTRL_TEXT 1061
-#define PW_USER_PROFILE 1062
-#define PW_DIGEST_REALM 1063
-#define PW_DIGEST_NONCE 1064
-#define PW_DIGEST_METHOD 1065
-#define PW_DIGEST_URI 1066
-#define PW_DIGEST_QOP 1067
-#define PW_DIGEST_ALGORITHM 1068
-#define PW_DIGEST_BODY_DIGEST 1069
-#define PW_DIGEST_CNONCE 1070
-#define PW_DIGEST_NONCE_COUNT 1071
-#define PW_DIGEST_USER_NAME 1072
-#define PW_POOL_NAME 1073
-#define PW_LDAP_GROUP 1074
-#define PW_MODULE_SUCCESS_MESSAGE 1075
-#define PW_MODULE_FAILURE_MESSAGE 1076
-#if 0 /* no longer used */
-#define PW_X99_FAST 1077
-#endif
-#define PW_REWRITE_RULE 1078
-#define PW_SQL_GROUP 1079
-#define PW_RESPONSE_PACKET_TYPE 1080
-#define PW_DIGEST_HA1 1081
-#define PW_MS_CHAP_USE_NTLM_AUTH 1082
-#define PW_MS_CHAP_USER_NAME 1083
-#define PW_PACKET_SRC_IP_ADDRESS 1084
-#define PW_PACKET_DST_IP_ADDRESS 1085
-#define PW_PACKET_SRC_PORT 1086
-#define PW_PACKET_DST_PORT 1087
-#define PW_PACKET_AUTHENTICATION_VECTOR 1088
-#define PW_TIME_OF_DAY 1089
-#define PW_REQUEST_PROCESSING_STAGE 1090
-#define PW_CACHE_NO_CACHING 1091
-#define PW_CACHE_DELETE_CACHE 1092
-
-#define PW_SHA_PASSWORD 1093
-#define PW_SSHA_PASSWORD 1094
-#define PW_MD5_PASSWORD 1095
-#define PW_SMD5_PASSWORD 1096
-
-#define PW_PACKET_SRC_IPV6_ADDRESS 1097
-#define PW_PACKET_DST_IPV6_ADDRESS 1098
-#define PW_VIRTUAL_SERVER 1099
-#define PW_CLEARTEXT_PASSWORD 1100
-#define PW_PASSWORD_WITH_HEADER 1101
-#define PW_SEND_COA_REQUEST 1107
-#define PW_MODULE_RETURN_CODE 1108
-#define PW_PACKET_ORIGINAL_TIMESTAMP 1109
-#define PW_HOME_SERVER_POOL 1111
-#define PW_RECV_COA_TYPE 1131
-#define PW_SEND_COA_TYPE 1132
-#define PW_MSCHAP_PASSWORD 1133
-#define PW_PACKET_TRANSMIT_COUNTER 1134
-#define PW_CACHED_SESSION_POLICY 1135
-
-/*
- * Integer Translations
- */
-
-/* User Types */
-
-#define PW_LOGIN_USER 1
-#define PW_FRAMED_USER 2
-#define PW_CALLBACK_LOGIN_USER 3
-#define PW_CALLBACK_FRAMED_USER 4
-#define PW_OUTBOUND_USER 5
-#define PW_ADMINISTRATIVE_USER 6
-#define PW_NAS_PROMPT_USER 7
-#define PW_AUTHENTICATE_ONLY 8
-#define PW_CALLBACK_NAS_PROMPT 9
-
-/* Framed Protocols */
-
-#define PW_PPP 1
-#define PW_SLIP 2
-
-/* 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_JACOBSEN_TCP_IP 1
-
-/* Login Services */
-
-#define PW_TELNET 0
-#define PW_RLOGIN 1
-#define PW_TCP_CLEAR 2
-#define PW_PORTMASTER 3
-
-/* Authentication Level */
-
-#define PW_AUTHTYPE_LOCAL 0
-#define PW_AUTHTYPE_SYSTEM 1
-#define PW_AUTHTYPE_SECURID 2
-#define PW_AUTHTYPE_CRYPT 3
-#define PW_AUTHTYPE_REJECT 4
-#define PW_AUTHTYPE_ACTIVCARD 5
-#define PW_AUTHTYPE_EAP 6
-#define PW_AUTHTYPE_ACCEPT 254
-#define PW_AUTHTYPE_MS_CHAP 1028
-
-/* Port Types */
-
-#define PW_NAS_PORT_ASYNC 0
-#define PW_NAS_PORT_SYNC 1
-#define PW_NAS_PORT_ISDN 2
-#define PW_NAS_PORT_ISDN_V120 3
-#define PW_NAS_PORT_ISDN_V110 4
-
-/* Status Types */
-
-#define PW_STATUS_START 1
-#define PW_STATUS_STOP 2
-#define PW_STATUS_ALIVE 3
-#define PW_STATUS_ACCOUNTING_ON 7
-#define PW_STATUS_ACCOUNTING_OFF 8
-
-/*
- * Vendor Private Enterprise Codes
- */
-#define VENDORPEC_FREERADIUS 11344
-
-
-/*
- * Vendor specific attributes
- */
-#define PW_FREERADIUS_PROXIED_TO ((VENDORPEC_FREERADIUS<<16)|1)
-
-/*
- * Microsoft has vendor code 311.
- */
-#define PW_MSCHAP_RESPONSE ((311 << 16) | 1)
-#define PW_MSCHAP_ERROR ((311 << 16) | 2)
-#define PW_MSCHAP_CHALLENGE ((311 << 16) | 11)
-#define PW_MSCHAP2_RESPONSE ((311 << 16) | 25)
-#define PW_MSCHAP2_SUCCESS ((311 << 16) | 26)
-
-
-/*
- * Old nonsense. Will be deleted ASAP
- */
-#define PW_AUTHTYPE 1000
-#define PW_AUTZTYPE 1011
-#define PW_ACCTTYPE 1012
-#define PW_SESSTYPE 1013
-#define PW_POSTAUTHTYPE 1014
-
-/*
- * Cisco's VLAN Query Protocol.
- */
-#define PW_VQP_PACKET_TYPE 0x2b00
-#define PW_VQP_ERROR_CODE 0x2b01
-#define PW_VQP_SEQUENCE_NUMBER 0x2b02
-
-#define PW_VQP_CLIENT_IP_ADDRESS 0x2c01
-#define PW_VQP_PORT_NAME 0x2c02
-#define PW_VQP_VLAN_NAME 0x2c03
-#define PW_VQP_DOMAIN_NAME 0x2c04
-#define PW_VQP_ETHERNET_FRAME 0x2c05
-#define PW_VQP_MAC 0x2c06
-#define PW_VQP_UNKNOWN 0x2c07
-#define PW_VQP_COOKIE 0x2c08
+++ /dev/null
-#ifndef RADIUSD_H
-#define RADIUSD_H
-/*
- * radiusd.h Structures, prototypes and global variables
- * for the FreeRADIUS server.
- *
- * Version: $Id: radiusd.h,v 1.1 2010/08/14 04:13:52 faust Exp $
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- *
- * Copyright 1999,2000,2002,2003,2004,2005,2006,2007,2008 The FreeRADIUS server project
- *
- */
-
-//#include <freeradius/ident.h>
-//RCSIDH(radiusd_h, "$Id: radiusd.h,v 1.1 2010/08/14 04:13:52 faust Exp $")
-
-#include "libradius.h"
-//#include <freeradius/radpaths.h>
-//#include "conf.h"
-#include "conffile.h"
-#include "event.h"
-
-typedef struct auth_req REQUEST;
-
-#ifdef HAVE_PTHREAD_H
-#include <pthread.h>
-#endif
-
-#ifndef NDEBUG
-#define REQUEST_MAGIC (0xdeadbeef)
-#endif
-
-/*
- * New defines for minimizing the size of the server, to strip
- * out functionality. In order to ensure that people don't have
- * to re-run "configure", after "cvs update", we play some
- * special games with the defines. i.e. any top-level "configure"
- * option should set both WITH_FOO and WITHOUT_FOO. After a few
- * weeks, the WITHOUT_FOO can be deleted from the configure script.
- */
-#ifndef WITHOUT_PROXY
-#define WITH_PROXY (1)
-#endif
-
-#ifndef WITHOUT_DETAIL
-#define WITH_DETAIL (1)
-#endif
-
-#ifndef WITHOUT_SESSION_MGMT
-#define WITH_SESSION_MGMT (1)
-#endif
-
-#ifndef WITHOUT_UNLANG
-#define WITH_UNLANG (1)
-#endif
-
-#ifndef WITHOUT_ACCOUNTING
-#define WITH_ACCOUNTING (1)
-#else
-#ifdef WITH_SESSION_MGMT
-#error WITH_SESSION_MGMT is defined, but WITH_ACCOUNTING is not. Session management requires accounting.
-#endif
-#ifdef WITH_DETAIL
-#error WITH_DETAIL is defined, but WITH_ACCOUNTING is not. Detail file reading requires accounting.
-#endif
-#endif
-
-#ifndef WITHOUT_DYNAMIC_CLIENTS
-#define WITH_DYNAMIC_CLIENTS (1)
-#endif
-
-#ifndef WITHOUT_STATS
-#define WITH_STATS
-#endif
-
-#ifndef WITHOUT_COMMAND_SOCKET
-#ifdef HAVE_SYS_UN_H
-#define WITH_COMMAND_SOCKET (1)
-#endif
-#endif
-
-#ifndef WITHOUT_COA
-#define WITH_COA (1)
-#ifndef WITH_PROXY
-#error WITH_COA requires WITH_PROXY
-#endif
-#endif
-
-#include "stats.h"
-/*#include "realms.h"*/
-
-
-/*
- * See util.c
- */
-typedef struct request_data_t request_data_t;
-
-typedef struct radclient {
- fr_ipaddr_t ipaddr;
- int prefix;
- char *longname;
- char *secret;
- char *shortname;
- int message_authenticator;
- char *nastype;
- char *login;
- char *password;
- char *server;
- int number;
- const CONF_SECTION *cs;
-#ifdef WITH_STATS
- fr_stats_t *auth;
-#ifdef WITH_ACCOUNTING
- fr_stats_t *acct;
-#endif
-#endif
-
-#ifdef WITH_DYNAMIC_CLIENTS
- int lifetime;
- int dynamic;
- time_t created;
- time_t last_new_client;
- char *client_server;
-#endif
-} RADCLIENT;
-
-/*
- * Types of listeners.
- *
- * Ordered by priority!
- */
-typedef enum RAD_LISTEN_TYPE {
- RAD_LISTEN_NONE = 0,
-#ifdef WITH_PROXY
- RAD_LISTEN_PROXY,
-#endif
- RAD_LISTEN_AUTH,
-#ifdef WITH_ACCOUNTING
- RAD_LISTEN_ACCT,
-#endif
-#ifdef WITH_DETAIL
- RAD_LISTEN_DETAIL,
-#endif
-#ifdef WITH_VMPS
- RAD_LISTEN_VQP,
-#endif
-#ifdef WITH_DHCP
- RAD_LISTEN_DHCP,
-#endif
-#ifdef WITH_COMMAND_SOCKET
- RAD_LISTEN_COMMAND,
-#endif
-#ifdef WITH_COA
- RAD_LISTEN_COA,
-#endif
- RAD_LISTEN_MAX
-} RAD_LISTEN_TYPE;
-
-#if defined(FREE_BSD) || defined(FREE_BSD5)
-#include <sys/time.h>
-#endif
-
-/*
- * For listening on multiple IP's and ports.
- */
-typedef struct rad_listen_t rad_listen_t;
-typedef void (*radlog_func_t)(int, int, REQUEST *, const char *, ...);
-
-#define REQUEST_DATA_REGEX (0xadbeef00)
-#define REQUEST_MAX_REGEX (8)
-
-struct auth_req {
-#ifndef NDEBUG
- uint32_t magic; /* for debugging only */
-#endif
- RADIUS_PACKET *packet;
-#ifdef WITH_PROXY
- RADIUS_PACKET *proxy;
-#endif
- RADIUS_PACKET *reply;
-#ifdef WITH_PROXY
- RADIUS_PACKET *proxy_reply;
-#endif
- VALUE_PAIR *config_items;
- VALUE_PAIR *username;
- VALUE_PAIR *password;
-
- struct main_config_t *root;
-
- request_data_t *data;
- RADCLIENT *client;
-#ifdef HAVE_PTHREAD_H
- pthread_t child_pid;
-#endif
- time_t timestamp;
- int number; /* internal server number */
-
- rad_listen_t *listener;
-#ifdef WITH_PROXY
- rad_listen_t *proxy_listener;
-#endif
-
-
- int simul_max; /* see modcall.c && xlat.c */
-#ifdef WITH_SESSION_MGMT
- int simul_count;
- int simul_mpp; /* WEIRD: 1 is false, 2 is true */
-#endif
-
- int options; /* miscellanous options */
- const char *module; /* for debugging unresponsive children */
- const char *component; /* ditto */
-
- struct timeval received;
- struct timeval when; /* to wake up */
- int delay;
-
- int master_state;
- int child_state;
- RAD_LISTEN_TYPE priority;
-
- fr_event_t *ev;
- struct timeval next_when;
- fr_event_callback_t next_callback;
-
- int in_request_hash;
-
- const char *server;
- REQUEST *parent;
- radlog_func_t radlog; /* logging function, if set */
-#ifdef WITH_COA
- REQUEST *coa;
- int num_coa_requests;
-#endif
-}; /* REQUEST typedef */
-
-#define RAD_REQUEST_OPTION_NONE (0)
-#define RAD_REQUEST_OPTION_DEBUG (1)
-#define RAD_REQUEST_OPTION_DEBUG2 (2)
-#define RAD_REQUEST_OPTION_DEBUG3 (3)
-#define RAD_REQUEST_OPTION_DEBUG4 (4)
-
-#define REQUEST_ACTIVE (1)
-#define REQUEST_STOP_PROCESSING (2)
-#define REQUEST_COUNTED (3)
-
-#define REQUEST_QUEUED (1)
-#define REQUEST_RUNNING (2)
-#define REQUEST_PROXIED (3)
-#define REQUEST_REJECT_DELAY (4)
-#define REQUEST_CLEANUP_DELAY (5)
-#define REQUEST_DONE (6)
-
-/*
- * Function handler for requests.
- */
-typedef int (*RAD_REQUEST_FUNP)(REQUEST *);
-
-typedef struct radclient_list RADCLIENT_LIST;
-
-typedef struct pair_list {
- const char *name;
- VALUE_PAIR *check;
- VALUE_PAIR *reply;
- int lineno;
- int order;
- struct pair_list *next;
- struct pair_list *lastdefault;
-} PAIR_LIST;
-
-
-typedef int (*rad_listen_recv_t)(rad_listen_t *, RAD_REQUEST_FUNP *, REQUEST **);
-typedef int (*rad_listen_send_t)(rad_listen_t *, REQUEST *);
-typedef int (*rad_listen_print_t)(rad_listen_t *, char *, size_t);
-typedef int (*rad_listen_encode_t)(rad_listen_t *, REQUEST *);
-typedef int (*rad_listen_decode_t)(rad_listen_t *, REQUEST *);
-
-struct rad_listen_t {
- struct rad_listen_t *next; /* should be rbtree stuff */
-
- /*
- * For normal sockets.
- */
- RAD_LISTEN_TYPE type;
- int fd;
- const char *server;
- int status;
-
- rad_listen_recv_t recv;
- rad_listen_send_t send;
- rad_listen_encode_t encode;
- rad_listen_decode_t decode;
- rad_listen_print_t print;
-
- void *data;
-
-#ifdef WITH_STATS
- fr_stats_t stats;
-#endif
-};
-
-#define RAD_LISTEN_STATUS_INIT (0)
-#define RAD_LISTEN_STATUS_KNOWN (1)
-#define RAD_LISTEN_STATUS_CLOSED (2)
-#define RAD_LISTEN_STATUS_FINISH (3)
-
-typedef enum radlog_dest_t {
- RADLOG_STDOUT = 0,
- RADLOG_FILES,
- RADLOG_SYSLOG,
- RADLOG_STDERR,
- RADLOG_NULL,
- RADLOG_NUM_DEST
-} radlog_dest_t;
-
-typedef struct main_config_t {
- struct main_config *next;
- int refcount;
- fr_ipaddr_t myip; /* from the command-line only */
- int port; /* from the command-line only */
- int log_auth;
- int log_auth_badpass;
- int log_auth_goodpass;
- int allow_core_dumps;
- int debug_level;
- int proxy_requests;
- int reject_delay;
- int status_server;
- int max_request_time;
- int cleanup_delay;
- int max_requests;
-#ifdef DELETE_BLOCKED_REQUESTS
- int kill_unresponsive_children;
-#endif
- char *log_file;
- char *checkrad;
- const char *pid_file;
- rad_listen_t *listen;
- int syslog_facility;
- int radlog_fd;
- radlog_dest_t radlog_dest;
- CONF_SECTION *config;
- const char *name;
- const char *auth_badpass_msg;
- const char *auth_goodpass_msg;
-} MAIN_CONFIG_T;
-
-#define DEBUG if(debug_flag)log_debug
-#define DEBUG2 if (debug_flag > 1)log_debug
-#define DEBUG3 if (debug_flag > 2)log_debug
-#define DEBUG4 if (debug_flag > 3)log_debug
-
-#if __GNUC__ >= 3
-#define RDEBUG(fmt, ...) if(request && request->radlog) request->radlog(L_DBG, 1, request, fmt, ## __VA_ARGS__)
-#define RDEBUG2(fmt, ...) if(request && request->radlog) request->radlog(L_DBG, 2, request, fmt, ## __VA_ARGS__)
-#define RDEBUG3(fmt, ...) if(request && request->radlog) request->radlog(L_DBG, 3, request, fmt, ## __VA_ARGS__)
-#define RDEBUG4(fmt, ...) if(request && request->radlog) request->radlog(L_DBG, 4, request, fmt, ## __VA_ARGS__)
-#else
-#define RDEBUG DEBUG
-#define RDEBUG2 DEBUG2
-#define RDEBUG3 DEBUG3
-#define RDEBUG4 DEBUG4
-#endif
-
-#define SECONDS_PER_DAY 86400
-#define MAX_REQUEST_TIME 30
-#define CLEANUP_DELAY 5
-#define MAX_REQUESTS 256
-#define RETRY_DELAY 5
-#define RETRY_COUNT 3
-#define DEAD_TIME 120
-
-#define L_DBG 1
-#define L_AUTH 2
-#define L_INFO 3
-#define L_ERR 4
-#define L_PROXY 5
-#define L_ACCT 6
-#define L_CONS 128
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-#ifndef TRUE
-/*
- * This definition of true as NOT false is definitive. :) Making
- * it '1' can cause problems on stupid platforms. See articles
- * on C portability for more information.
- */
-#define TRUE (!FALSE)
-#endif
-
-/* for paircompare_register */
-typedef int (*RAD_COMPARE_FUNC)(void *instance, REQUEST *,VALUE_PAIR *, VALUE_PAIR *, VALUE_PAIR *, VALUE_PAIR **);
-
-typedef enum request_fail_t {
- REQUEST_FAIL_UNKNOWN = 0,
- REQUEST_FAIL_NO_THREADS, /* no threads to handle it */
- REQUEST_FAIL_DECODE, /* rad_decode didn't like it */
- REQUEST_FAIL_PROXY, /* call to proxy modules failed */
- REQUEST_FAIL_PROXY_SEND, /* proxy_send didn't like it */
- REQUEST_FAIL_NO_RESPONSE, /* we weren't told to respond, so we reject */
- REQUEST_FAIL_HOME_SERVER, /* the home server didn't respond */
- REQUEST_FAIL_HOME_SERVER2, /* another case of the above */
- REQUEST_FAIL_HOME_SERVER3, /* another case of the above */
- REQUEST_FAIL_NORMAL_REJECT, /* authentication failure */
- REQUEST_FAIL_SERVER_TIMEOUT /* the server took too long to process the request */
-} request_fail_t;
-
-/*
- * Global variables.
- *
- * We really shouldn't have this many.
- */
-extern const char *progname;
-extern int debug_flag;
-extern const char *radacct_dir;
-extern const char *radlog_dir;
-extern const char *radlib_dir;
-extern const char *radius_dir;
-extern const char *radius_libdir;
-extern uint32_t expiration_seconds;
-extern int log_stripped_names;
-extern int log_auth_detail;
-extern const char *radiusd_version;
-void radius_signal_self(int flag);
-
-#define RADIUS_SIGNAL_SELF_NONE (0)
-#define RADIUS_SIGNAL_SELF_HUP (1 << 0)
-#define RADIUS_SIGNAL_SELF_TERM (1 << 1)
-#define RADIUS_SIGNAL_SELF_EXIT (1 << 2)
-#define RADIUS_SIGNAL_SELF_DETAIL (1 << 3)
-#define RADIUS_SIGNAL_SELF_NEW_FD (1 << 4)
-#define RADIUS_SIGNAL_SELF_MAX (1 << 5)
-
-
-/*
- * Function prototypes.
- */
-
-/* acct.c */
-int rad_accounting(REQUEST *);
-
-/* session.c */
-int rad_check_ts(uint32_t nasaddr, unsigned int port, const char *user,
- const char *sessionid);
-int session_zap(REQUEST *request, uint32_t nasaddr,
- unsigned int port, const char *user,
- const char *sessionid, uint32_t cliaddr,
- char proto,int session_time);
-
-/* radiusd.c */
-#undef debug_pair
-void debug_pair(VALUE_PAIR *);
-void debug_pair_list(VALUE_PAIR *);
-int log_err (char *);
-
-/* util.c */
-void (*reset_signal(int signo, void (*func)(int)))(int);
-void request_free(REQUEST **request);
-int rad_mkdir(char *directory, int mode);
-int rad_checkfilename(const char *filename);
-void *rad_malloc(size_t size); /* calls exit(1) on error! */
-REQUEST *request_alloc(void);
-REQUEST *request_alloc_fake(REQUEST *oldreq);
-REQUEST *request_alloc_coa(REQUEST *request);
-int request_data_add(REQUEST *request,
- void *unique_ptr, int unique_int,
- void *opaque, void (*free_opaque)(void *));
-void *request_data_get(REQUEST *request,
- void *unique_ptr, int unique_int);
-void *request_data_reference(REQUEST *request,
- void *unique_ptr, int unique_int);
-int rad_copy_string(char *dst, const char *src);
-int rad_copy_variable(char *dst, const char *from);
-
-/* client.c */
-RADCLIENT_LIST *clients_init(void);
-void clients_free(RADCLIENT_LIST *clients);
-RADCLIENT_LIST *clients_parse_section(CONF_SECTION *section);
-void client_free(RADCLIENT *client);
-int client_add(RADCLIENT_LIST *clients, RADCLIENT *client);
-#ifdef WITH_DYNAMIC_CLIENTS
-void client_delete(RADCLIENT_LIST *clients, RADCLIENT *client);
-RADCLIENT *client_create(RADCLIENT_LIST *clients, REQUEST *request);
-#endif
-RADCLIENT *client_find(const RADCLIENT_LIST *clients,
- const fr_ipaddr_t *ipaddr);
-RADCLIENT *client_findbynumber(const RADCLIENT_LIST *clients,
- int number);
-RADCLIENT *client_find_old(const fr_ipaddr_t *ipaddr);
-int client_validate(RADCLIENT_LIST *clients, RADCLIENT *master,
- RADCLIENT *c);
-RADCLIENT *client_read(const char *filename, int in_server, int flag);
-
-
-/* files.c */
-int pairlist_read(const char *file, PAIR_LIST **list, int complain);
-void pairlist_free(PAIR_LIST **);
-
-/* version.c */
-void version(void);
-
-/* log.c */
-int vradlog(int, const char *, va_list ap);
-int radlog(int, const char *, ...)
-#ifdef __GNUC__
- __attribute__ ((format (printf, 2, 3)))
-#endif
-;
-int log_debug(const char *, ...)
-#ifdef __GNUC__
- __attribute__ ((format (printf, 1, 2)))
-#endif
-;
-void vp_listdebug(VALUE_PAIR *vp);
-void radlog_request(int lvl, int priority, REQUEST *request, const char *msg, ...)
-#ifdef __GNUC__
- __attribute__ ((format (printf, 4, 5)))
-#endif
-;
-
-/* auth.c */
-char *auth_name(char *buf, size_t buflen, REQUEST *request, int do_cli);
-int rad_authenticate (REQUEST *);
-int rad_postauth(REQUEST *);
-
-/* exec.c */
-int radius_exec_program(const char *, REQUEST *, int,
- char *user_msg, int msg_len,
- VALUE_PAIR *input_pairs,
- VALUE_PAIR **output_pairs,
- int shell_escape);
-
-/* timestr.c */
-int timestr_match(char *, time_t);
-
-/* valuepair.c */
-int paircompare_register(int attr, int otherattr,
- RAD_COMPARE_FUNC func,
- void *instance);
-void paircompare_unregister(int attr, RAD_COMPARE_FUNC func);
-int paircompare(REQUEST *req, VALUE_PAIR *request, VALUE_PAIR *check,
- VALUE_PAIR **reply);
-void pairxlatmove(REQUEST *, VALUE_PAIR **to, VALUE_PAIR **from);
-int radius_compare_vps(REQUEST *request, VALUE_PAIR *check, VALUE_PAIR *vp);
-int radius_callback_compare(REQUEST *req, VALUE_PAIR *request,
- VALUE_PAIR *check, VALUE_PAIR *check_pairs,
- VALUE_PAIR **reply_pairs);
-int radius_find_compare(int attribute);
-VALUE_PAIR *radius_paircreate(REQUEST *request, VALUE_PAIR **vps,
- int attribute, int type);
-VALUE_PAIR *radius_pairmake(REQUEST *request, VALUE_PAIR **vps,
- const char *attribute, const char *value,
- int _operator);
-
-/* xlat.c */
-typedef size_t (*RADIUS_ESCAPE_STRING)(char *out, size_t outlen, const char *in);
-
-int radius_xlat(char * out, int outlen, const char *fmt,
- REQUEST * request, RADIUS_ESCAPE_STRING func);
-typedef size_t (*RAD_XLAT_FUNC)(void *instance, REQUEST *, char *, char *, size_t, RADIUS_ESCAPE_STRING func);
-int xlat_register(const char *module, RAD_XLAT_FUNC func,
- void *instance);
-void xlat_unregister(const char *module, RAD_XLAT_FUNC func);
-void xlat_free(void);
-
-/* threads.c */
-extern int thread_pool_init(CONF_SECTION *cs, int *spawn_flag);
-extern int thread_pool_addrequest(REQUEST *, RAD_REQUEST_FUNP);
-extern pid_t rad_fork(void);
-extern pid_t rad_waitpid(pid_t pid, int *status);
-extern int total_active_threads(void);
-extern void thread_pool_lock(void);
-extern void thread_pool_unlock(void);
-extern void thread_pool_queue_stats(int *array);
-
-#ifndef HAVE_PTHREAD_H
-#define rad_fork(n) fork()
-#define rad_waitpid(a,b) waitpid(a,b, 0)
-#endif
-
-/* mainconfig.c */
-/* Define a global config structure */
-extern struct main_config_t mainconfig;
-
-int read_mainconfig(int reload);
-int free_mainconfig(void);
-void hup_mainconfig(void);
-void fr_suid_down(void);
-void fr_suid_up(void);
-void fr_suid_down_permanent(void);
-
-/* listen.c */
-void listen_free(rad_listen_t **head);
-int listen_init(CONF_SECTION *cs, rad_listen_t **head);
-rad_listen_t *proxy_new_listener(fr_ipaddr_t *ipaddr, int exists);
-RADCLIENT *client_listener_find(const rad_listen_t *listener,
- const fr_ipaddr_t *ipaddr, int src_port);
-#ifdef WITH_STATS
-RADCLIENT_LIST *listener_find_client_list(const fr_ipaddr_t *ipaddr,
- int port);
-rad_listen_t *listener_find_byipaddr(const fr_ipaddr_t *ipaddr, int port);
-#endif
-
-/* event.c */
-int radius_event_init(CONF_SECTION *cs, int spawn_flag);
-void radius_event_free(void);
-int radius_event_process(void);
-void radius_handle_request(REQUEST *request, RAD_REQUEST_FUNP fun);
-int received_request(rad_listen_t *listener,
- RADIUS_PACKET *packet, REQUEST **prequest,
- RADCLIENT *client);
-REQUEST *received_proxy_response(RADIUS_PACKET *packet);
-void event_new_fd(rad_listen_t *listener);
-
-/* evaluate.c */
-int radius_evaluate_condition(REQUEST *request, int modreturn, int depth,
- const char **ptr, int evaluate_it, int *presult);
-int radius_update_attrlist(REQUEST *request, CONF_SECTION *cs,
- VALUE_PAIR *input_vps, const char *name);
-void radius_pairmove(REQUEST *request, VALUE_PAIR **to, VALUE_PAIR *from);
-#endif /*RADIUSD_H*/
--- /dev/null
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/*
+ * Author : Maxim Mamontov <faust@stargazer.dp.ua>
+ */
+
+/*
+ * FreeRADIUS module for data access via Stargazer
+ *
+ * $Revision: 1.8 $
+ * $Date: 2010/08/14 04:15:08 $
+ *
+ */
+
+#ifndef NDEBUG
+#define NDEBUG
+#include <freeradius/ident.h>
+#include <freeradius/radiusd.h>
+#include <freeradius/modules.h>
+#undef NDEBUG
+#endif
+
+#include "stgpair.h"
+#include "iface.h"
+
+typedef struct rlm_stg_t {
+ char * server;
+ uint16_t port;
+ char * password;
+} rlm_stg_t;
+
+static const CONF_PARSER module_config[] = {
+ { "server", PW_TYPE_STRING_PTR, offsetof(rlm_stg_t,server), NULL, "localhost"},
+ { "port", PW_TYPE_INTEGER, offsetof(rlm_stg_t,port), NULL, "9091" },
+ { "password", PW_TYPE_STRING_PTR, offsetof(rlm_stg_t,password), NULL, "123456"},
+
+ { NULL, -1, 0, NULL, NULL } /* end the list */
+};
+
+int emptyPair(const STG_PAIR * pair);
+
+/*
+ * Do any per-module initialization that is separate to each
+ * configured instance of the module. e.g. set up connections
+ * to external databases, read configuration files, set up
+ * dictionary entries, etc.
+ *
+ * If configuration information is given in the config section
+ * that must be referenced in later calls, store a handle to it
+ * in *instance otherwise put a null pointer there.
+ */
+static int stg_instantiate(CONF_SECTION *conf, void **instance)
+{
+ rlm_stg_t *data;
+
+ /*
+ * Set up a storage area for instance data
+ */
+ data = rad_malloc(sizeof(*data));
+ if (!data) {
+ return -1;
+ }
+ memset(data, 0, sizeof(*data));
+
+ /*
+ * If the configuration parameters can't be parsed, then
+ * fail.
+ */
+ if (cf_section_parse(conf, data, module_config) < 0) {
+ free(data);
+ return -1;
+ }
+
+ if (!stgInstantiateImpl(data->server, data->port)) {
+ free(data);
+ return -1;
+ }
+
+ *instance = data;
+
+ return 0;
+}
+
+/*
+ * Find the named user in this modules database. Create the set
+ * of attribute-value pairs to check and reply with for this user
+ * from the database. The authentication code only needs to check
+ * the password, the rest is done here.
+ */
+static int stg_authorize(void *, REQUEST *request)
+{
+ VALUE_PAIR * pwd;
+ VALUE_PAIR * svc;
+ const STG_PAIR * pairs;
+ const STG_PAIR * pair;
+ size_t count = 0;
+
+ instance = instance;
+
+ DEBUG("rlm_stg: stg_authorize()");
+
+ if (request->username) {
+ DEBUG("rlm_stg: stg_authorize() request username field: '%s'", request->username->vp_strvalue);
+ }
+ if (request->password) {
+ DEBUG("rlm_stg: stg_authorize() request password field: '%s'", request->password->vp_strvalue);
+ }
+ // Here we need to define Framed-Protocol
+ svc = pairfind(request->packet->vps, PW_SERVICE_TYPE);
+ if (svc) {
+ DEBUG("rlm_stg: stg_authorize() Service-Type defined as '%s'", svc->vp_strvalue);
+ pairs = stgAuthorizeImpl((const char *)request->username->vp_strvalue, (const char *)svc->vp_strvalue);
+ } else {
+ DEBUG("rlm_stg: stg_authorize() Service-Type undefined");
+ pairs = stgAuthorizeImpl((const char *)request->username->vp_strvalue, "");
+ }
+ if (!pairs) {
+ DEBUG("rlm_stg: stg_authorize() failed.");
+ return RLM_MODULE_REJECT;
+ }
+
+ pair = pairs;
+ while (!emptyPair(pair)) {
+ pwd = pairmake(pair->key, pair->value, T_OP_SET);
+ pairadd(&request->config_items, pwd);
+ DEBUG("Adding pair '%s': '%s'", pair->key, pair->value);
+ ++pair;
+ ++count;
+ }
+ deletePairs(pairs);
+
+ if (count)
+ return RLM_MODULE_UPDATED;
+
+ return RLM_MODULE_NOOP;
+}
+
+/*
+ * Authenticate the user with the given password.
+ */
+static int stg_authenticate(void *, REQUEST *request)
+{
+ VALUE_PAIR * svc;
+ VALUE_PAIR * pwd;
+ const STG_PAIR * pairs;
+ const STG_PAIR * pair;
+ size_t count = 0;
+
+ instance = instance;
+
+ DEBUG("rlm_stg: stg_authenticate()");
+
+ svc = pairfind(request->packet->vps, PW_SERVICE_TYPE);
+ if (svc) {
+ DEBUG("rlm_stg: stg_authenticate() Service-Type defined as '%s'", svc->vp_strvalue);
+ pairs = stgAuthenticateImpl((const char *)request->username->vp_strvalue, (const char *)svc->vp_strvalue);
+ } else {
+ DEBUG("rlm_stg: stg_authenticate() Service-Type undefined");
+ pairs = stgAuthenticateImpl((const char *)request->username->vp_strvalue, "");
+ }
+ if (!pairs) {
+ DEBUG("rlm_stg: stg_authenticate() failed.");
+ return RLM_MODULE_REJECT;
+ }
+
+ pair = pairs;
+ while (!emptyPair(pair)) {
+ pwd = pairmake(pair->key, pair->value, T_OP_SET);
+ pairadd(&request->reply->vps, pwd);
+ ++pair;
+ ++count;
+ }
+ deletePairs(pairs);
+
+ if (count)
+ return RLM_MODULE_UPDATED;
+
+ return RLM_MODULE_NOOP;
+}
+
+/*
+ * Massage the request before recording it or proxying it
+ */
+static int stg_preacct(void *, REQUEST *)
+{
+ DEBUG("rlm_stg: stg_preacct()");
+
+ instance = instance;
+
+ return RLM_MODULE_OK;
+}
+
+/*
+ * Write accounting information to this modules database.
+ */
+static int stg_accounting(void *, REQUEST * request)
+{
+ VALUE_PAIR * sttype;
+ VALUE_PAIR * svc;
+ VALUE_PAIR * sessid;
+ VALUE_PAIR * pwd;
+ const STG_PAIR * pairs;
+ const STG_PAIR * pair;
+ size_t count = 0;
+
+ instance = instance;
+
+ DEBUG("rlm_stg: stg_accounting()");
+
+ svc = pairfind(request->packet->vps, PW_SERVICE_TYPE);
+ sessid = pairfind(request->packet->vps, PW_ACCT_SESSION_ID);
+ sttype = pairfind(request->packet->vps, PW_ACCT_STATUS_TYPE);
+
+ if (!sessid) {
+ DEBUG("rlm_stg: stg_accounting() Acct-Session-ID undefined");
+ return RLM_MODULE_FAIL;
+ }
+
+ if (sttype) {
+ DEBUG("Acct-Status-Type := %s", sttype->vp_strvalue);
+ if (svc) {
+ DEBUG("rlm_stg: stg_accounting() Service-Type defined as '%s'", svc->vp_strvalue);
+ pairs = stgAccountingImpl((const char *)request->username->vp_strvalue, (const char *)svc->vp_strvalue, (const char *)sttype->vp_strvalue, (const char *)sessid->vp_strvalue);
+ } else {
+ DEBUG("rlm_stg: stg_accounting() Service-Type undefined");
+ pairs = stgAccountingImpl((const char *)request->username->vp_strvalue, (const char *)svc->vp_strvalue, (const char *)sttype->vp_strvalue, (const char *)sessid->vp_strvalue);
+ }
+ } else {
+ DEBUG("rlm_stg: stg_accounting() Acct-Status-Type := NULL");
+ return RLM_MODULE_OK;
+ }
+ if (!pairs) {
+ DEBUG("rlm_stg: stg_accounting() failed.");
+ return RLM_MODULE_REJECT;
+ }
+
+ pair = pairs;
+ while (!emptyPair(pair)) {
+ pwd = pairmake(pair->key, pair->value, T_OP_SET);
+ pairadd(&request->reply->vps, pwd);
+ ++pair;
+ ++count;
+ }
+ deletePairs(pairs);
+
+ if (count)
+ return RLM_MODULE_UPDATED;
+
+ return RLM_MODULE_OK;
+}
+
+/*
+ * See if a user is already logged in. Sets request->simul_count to the
+ * current session count for this user and sets request->simul_mpp to 2
+ * if it looks like a multilink attempt based on the requested IP
+ * address, otherwise leaves request->simul_mpp alone.
+ *
+ * Check twice. If on the first pass the user exceeds his
+ * max. number of logins, do a second pass and validate all
+ * logins by querying the terminal server (using eg. SNMP).
+ */
+static int stg_checksimul(void *, REQUEST *request)
+{
+ DEBUG("rlm_stg: stg_checksimul()");
+
+ instance = instance;
+
+ request->simul_count=0;
+
+ return RLM_MODULE_OK;
+}
+
+static int stg_postauth(void *, REQUEST *request)
+{
+ VALUE_PAIR * svc;
+ VALUE_PAIR * pwd;
+ const STG_PAIR * pairs;
+ const STG_PAIR * pair;
+ size_t count = 0;
+
+ instance = instance;
+
+ DEBUG("rlm_stg: stg_postauth()");
+
+ svc = pairfind(request->packet->vps, PW_SERVICE_TYPE);
+
+ if (svc) {
+ DEBUG("rlm_stg: stg_postauth() Service-Type defined as '%s'", svc->vp_strvalue);
+ pairs = stgPostAuthImpl((const char *)request->username->vp_strvalue, (const char *)svc->vp_strvalue);
+ } else {
+ DEBUG("rlm_stg: stg_postauth() Service-Type undefined");
+ pairs = stgPostAuthImpl((const char *)request->username->vp_strvalue, "");
+ }
+ if (!pairs) {
+ DEBUG("rlm_stg: stg_postauth() failed.");
+ return RLM_MODULE_REJECT;
+ }
+
+ pair = pairs;
+ while (!emptyPair(pair)) {
+ pwd = pairmake(pair->key, pair->value, T_OP_SET);
+ pairadd(&request->reply->vps, pwd);
+ ++pair;
+ ++count;
+ }
+ deletePairs(pairs);
+
+ if (count)
+ return RLM_MODULE_UPDATED;
+
+ return RLM_MODULE_NOOP;
+}
+
+static int stg_detach(void *instance)
+{
+ free(((struct rlm_stg_t *)instance)->server);
+ free(instance);
+ return 0;
+}
+
+/*
+ * The module name should be the only globally exported symbol.
+ * That is, everything else should be 'static'.
+ *
+ * If the module needs to temporarily modify it's instantiation
+ * data, the type should be changed to RLM_TYPE_THREAD_UNSAFE.
+ * The server will then take care of ensuring that the module
+ * is single-threaded.
+ */
+module_t rlm_stg = {
+ RLM_MODULE_INIT,
+ "stg",
+ RLM_TYPE_THREAD_SAFE, /* type */
+ stg_instantiate, /* instantiation */
+ stg_detach, /* detach */
+ {
+ stg_authenticate, /* authentication */
+ stg_authorize, /* authorization */
+ stg_preacct, /* preaccounting */
+ stg_accounting, /* accounting */
+ stg_checksimul, /* checksimul */
+ NULL, /* pre-proxy */
+ NULL, /* post-proxy */
+ stg_postauth /* post-auth */
+ },
+};
+++ /dev/null
-/*
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-/*
- * Author : Maxim Mamontov <faust@stargazer.dp.ua>
- */
-
-/*
- * FreeRADIUS module for data access via Stargazer
- *
- * $Revision: 1.8 $
- * $Date: 2010/08/14 04:15:08 $
- *
- */
-
-#include <cstdio>
-#include <cstdlib>
-#include <cstring>
-
-#include <exception>
-
-extern "C" {
-#include "radius.h"
-#include "modules.h"
-}
-
-#include "stg_client.h"
-#include "stg/common.h"
-
-STG_CLIENT * cli;
-volatile time_t stgTime;
-
-/*
- * Define a structure for our module configuration.
- *
- * These variables do not need to be in a structure, but it's
- * a lot cleaner to do so, and a pointer to the structure can
- * be used as the instance handle.
- */
-typedef struct rlm_stg_t {
- char * server;
- char * password;
- uint32_t port;
- uint32_t localPort;
-} rlm_stg_t;
-
-/*
- * A mapping of configuration file names to internal variables.
- *
- * Note that the string is dynamically allocated, so it MUST
- * be freed. When the configuration file parse re-reads the string,
- * it free's the old one, and strdup's the new one, placing the pointer
- * to the strdup'd string into 'config.string'. This gets around
- * buffer over-flows.
- */
-static CONF_PARSER module_config[] = {
- { "password", PW_TYPE_STRING_PTR, offsetof(rlm_stg_t,password), NULL, NULL},
- { "server", PW_TYPE_STRING_PTR, offsetof(rlm_stg_t,server), NULL, NULL},
- { "port", PW_TYPE_INTEGER, offsetof(rlm_stg_t,port), NULL, "5555" },
- { "local_port", PW_TYPE_INTEGER, offsetof(rlm_stg_t,localPort), NULL, "0" },
-
- { NULL, -1, 0, NULL, NULL } /* end the list */
-};
-
-/*
- * Do any per-module initialization that is separate to each
- * configured instance of the module. e.g. set up connections
- * to external databases, read configuration files, set up
- * dictionary entries, etc.
- *
- * If configuration information is given in the config section
- * that must be referenced in later calls, store a handle to it
- * in *instance otherwise put a null pointer there.
- */
-static int stg_instantiate(CONF_SECTION *conf, void **instance)
-{
- rlm_stg_t *data;
-
- /*
- * Set up a storage area for instance data
- */
- DEBUG("rlm_stg: stg_instantiate()");
- data = (rlm_stg_t *)rad_malloc(sizeof(rlm_stg_t));
- if (!data) {
- return -1;
- }
- memset(data, 0, sizeof(rlm_stg_t));
-
- /*
- * If the configuration parameters can't be parsed, then
- * fail.
- */
- if (cf_section_parse(conf, data, module_config) < 0) {
- free(data);
- return -1;
- }
-
- try {
- cli = new STG_CLIENT(data->server, data->port, data->localPort, data->password);
- }
- catch (std::exception & ex) {
- DEBUG("rlm_stg: stg_instantiate() error: '%s'", ex.what());
- return -1;
- }
-
- *instance = data;
-
- return 0;
-}
-
-/*
- * Find the named user in this modules database. Create the set
- * of attribute-value pairs to check and reply with for this user
- * from the database. The authentication code only needs to check
- * the password, the rest is done here.
- */
-static int stg_authorize(void *, REQUEST *request)
-{
- VALUE_PAIR *uname;
- VALUE_PAIR *pwd;
- VALUE_PAIR *svc;
- DEBUG("rlm_stg: stg_authorize()");
-
- uname = pairfind(request->packet->vps, PW_USER_NAME);
- if (uname) {
- DEBUG("rlm_stg: stg_authorize() user name defined as '%s'", uname->vp_strvalue);
- } else {
- DEBUG("rlm_stg: stg_authorize() user name undefined");
- return RLM_MODULE_FAIL;
- }
- if (request->username) {
- DEBUG("rlm_stg: stg_authorize() request username field: '%s'", request->username->vp_strvalue);
- }
- if (request->password) {
- DEBUG("rlm_stg: stg_authorize() request password field: '%s'", request->password->vp_strvalue);
- }
- // Here we need to define Framed-Protocol
- svc = pairfind(request->packet->vps, PW_SERVICE_TYPE);
- if (svc) {
- DEBUG("rlm_stg: stg_authorize() Service-Type defined as '%s'", svc->vp_strvalue);
- if (cli->Authorize((const char *)request->username->vp_strvalue, (const char *)svc->vp_strvalue)) {
- DEBUG("rlm_stg: stg_authorize() stg status: '%s'", cli->GetError().c_str());
- return RLM_MODULE_REJECT;
- }
- } else {
- DEBUG("rlm_stg: stg_authorize() Service-Type undefined");
- if (cli->Authorize((const char *)request->username->vp_strvalue, "")) {
- DEBUG("rlm_stg: stg_authorize() stg status: '%s'", cli->GetError().c_str());
- return RLM_MODULE_REJECT;
- }
- }
- pwd = pairmake("Cleartext-Password", cli->GetUserPassword().c_str(), T_OP_SET);
- pairadd(&request->config_items, pwd);
- //pairadd(&request->reply->vps, uname);
-
- return RLM_MODULE_UPDATED;
-}
-
-/*
- * Authenticate the user with the given password.
- */
-static int stg_authenticate(void *, REQUEST *request)
-{
- /* quiet the compiler */
- VALUE_PAIR *svc;
-
- DEBUG("rlm_stg: stg_authenticate()");
-
- svc = pairfind(request->packet->vps, PW_SERVICE_TYPE);
- if (svc) {
- DEBUG("rlm_stg: stg_authenticate() Service-Type defined as '%s'", svc->vp_strvalue);
- if (cli->Authenticate((char *)request->username->vp_strvalue, (const char *)svc->vp_strvalue)) {
- DEBUG("rlm_stg: stg_authenticate() stg status: '%s'", cli->GetError().c_str());
- return RLM_MODULE_REJECT;
- }
- } else {
- DEBUG("rlm_stg: stg_authenticate() Service-Type undefined");
- if (cli->Authenticate((char *)request->username->vp_strvalue, "")) {
- DEBUG("rlm_stg: stg_authenticate() stg status: '%s'", cli->GetError().c_str());
- return RLM_MODULE_REJECT;
- }
- }
-
- return RLM_MODULE_NOOP;
-}
-
-/*
- * Massage the request before recording it or proxying it
- */
-static int stg_preacct(void *, REQUEST *)
-{
- DEBUG("rlm_stg: stg_preacct()");
-
- return RLM_MODULE_OK;
-}
-
-/*
- * Write accounting information to this modules database.
- */
-static int stg_accounting(void *, REQUEST * request)
-{
- /* quiet the compiler */
- VALUE_PAIR * sttype;
- VALUE_PAIR * svc;
- VALUE_PAIR * sessid;
- svc = pairfind(request->packet->vps, PW_SERVICE_TYPE);
-
- DEBUG("rlm_stg: stg_accounting()");
-
- sessid = pairfind(request->packet->vps, PW_ACCT_SESSION_ID);
- if (!sessid) {
- DEBUG("rlm_stg: stg_accounting() Acct-Session-ID undefined");
- return RLM_MODULE_FAIL;
- }
- sttype = pairfind(request->packet->vps, PW_ACCT_STATUS_TYPE);
- if (sttype) {
- DEBUG("Acct-Status-Type := %s", sttype->vp_strvalue);
- if (svc) {
- DEBUG("rlm_stg: stg_accounting() Service-Type defined as '%s'", svc->vp_strvalue);
- if (cli->Account((const char *)sttype->vp_strvalue, (const char *)request->username->vp_strvalue, (const char *)svc->vp_strvalue, (const char *)sessid->vp_strvalue)) {
- DEBUG("rlm_stg: stg_accounting error: '%s'", cli->GetError().c_str());
- return RLM_MODULE_FAIL;
- }
- } else {
- DEBUG("rlm_stg: stg_accounting() Service-Type undefined");
- if (cli->Account((const char *)sttype->vp_strvalue, (const char *)request->username->vp_strvalue, "", (const char *)sessid->vp_strvalue)) {
- DEBUG("rlm_stg: stg_accounting error: '%s'", cli->GetError().c_str());
- return RLM_MODULE_FAIL;
- }
- }
- } else {
- DEBUG("Acct-Status-Type := NULL");
- }
-
- return RLM_MODULE_OK;
-}
-
-/*
- * See if a user is already logged in. Sets request->simul_count to the
- * current session count for this user and sets request->simul_mpp to 2
- * if it looks like a multilink attempt based on the requested IP
- * address, otherwise leaves request->simul_mpp alone.
- *
- * Check twice. If on the first pass the user exceeds his
- * max. number of logins, do a second pass and validate all
- * logins by querying the terminal server (using eg. SNMP).
- */
-static int stg_checksimul(void *, REQUEST *request)
-{
- DEBUG("rlm_stg: stg_checksimul()");
-
- request->simul_count=0;
-
- return RLM_MODULE_OK;
-}
-
-static int stg_postauth(void *, REQUEST *request)
-{
- VALUE_PAIR *fia;
- VALUE_PAIR *svc;
- struct in_addr fip;
- DEBUG("rlm_stg: stg_postauth()");
- svc = pairfind(request->packet->vps, PW_SERVICE_TYPE);
- if (svc) {
- DEBUG("rlm_stg: stg_postauth() Service-Type defined as '%s'", svc->vp_strvalue);
- if (cli->PostAuthenticate((const char *)request->username->vp_strvalue, (const char *)svc->vp_strvalue)) {
- DEBUG("rlm_stg: stg_postauth() error: '%s'", cli->GetError().c_str());
- return RLM_MODULE_FAIL;
- }
- } else {
- DEBUG("rlm_stg: stg_postauth() Service-Type undefined");
- if (cli->PostAuthenticate((const char *)request->username->vp_strvalue, "")) {
- DEBUG("rlm_stg: stg_postauth() error: '%s'", cli->GetError().c_str());
- return RLM_MODULE_FAIL;
- }
- }
- if (strncmp((const char *)svc->vp_strvalue, "Framed-User", 11) == 0) {
- fip.s_addr = cli->GetFramedIP();
- DEBUG("rlm_stg: stg_postauth() ip = '%s'", inet_ntostring(fip.s_addr).c_str());
- fia = pairmake("Framed-IP-Address", inet_ntostring(fip.s_addr).c_str(), T_OP_SET);
- pairadd(&request->reply->vps, fia);
- }
-
- return RLM_MODULE_UPDATED;
-}
-
-static int stg_detach(void *instance)
-{
- DEBUG("rlm_stg: stg_detach()");
- delete cli;
- free(((struct rlm_stg_t *)instance)->server);
- free(((struct rlm_stg_t *)instance)->password);
- free(instance);
- return 0;
-}
-
-/*
- * The module name should be the only globally exported symbol.
- * That is, everything else should be 'static'.
- *
- * If the module needs to temporarily modify it's instantiation
- * data, the type should be changed to RLM_TYPE_THREAD_UNSAFE.
- * The server will then take care of ensuring that the module
- * is single-threaded.
- */
-module_t rlm_stg = {
- RLM_MODULE_INIT,
- "stg",
- RLM_TYPE_THREAD_SAFE, /* type */
- stg_instantiate, /* instantiation */
- stg_detach, /* detach */
- {
- stg_authenticate, /* authentication */
- stg_authorize, /* authorization */
- stg_preacct, /* preaccounting */
- stg_accounting, /* accounting */
- stg_checksimul, /* checksimul */
- NULL, /* pre-proxy */
- NULL, /* post-proxy */
- stg_postauth /* post-auth */
- },
-};
+++ /dev/null
-#ifndef FR_STATS_H
-#define FR_STATS_H
-
-/*
- * stats.h Structures and functions for statistics.
- *
- * Version: $Id: stats.h,v 1.1 2010/08/14 04:13:52 faust Exp $
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- *
- * Copyright 2005,2006,2007,2008 The FreeRADIUS server project
- */
-
-//#include <freeradius/ident.h>
-//RCSIDH(stats_h, "$Id: stats.h,v 1.1 2010/08/14 04:13:52 faust Exp $")
-
-#ifdef WITH_STATS_64BIT
-typedef uint64_t fr_uint_t;
-#else
-typedef uint32_t fr_uint_t;
-#endif
-
-#ifdef WITH_STATS
-typedef struct fr_stats_t {
- fr_uint_t total_requests;
- fr_uint_t total_invalid_requests;
- fr_uint_t total_dup_requests;
- fr_uint_t total_responses;
- fr_uint_t total_access_accepts;
- fr_uint_t total_access_rejects;
- fr_uint_t total_access_challenges;
- fr_uint_t total_malformed_requests;
- fr_uint_t total_bad_authenticators;
- fr_uint_t total_packets_dropped;
- fr_uint_t total_no_records;
- fr_uint_t total_unknown_types;
-} fr_stats_t;
-
-typedef struct fr_stats_ema_t {
- int window;
-
- int f1, f10;
- int ema1, ema10;
-
-} fr_stats_ema_t;
-
-extern fr_stats_t radius_auth_stats;
-extern fr_stats_t radius_acct_stats;
-#ifdef WITH_PROXY
-extern fr_stats_t proxy_auth_stats;
-extern fr_stats_t proxy_acct_stats;
-#endif
-
-void radius_stats_init(int flag);
-void request_stats_final(REQUEST *request);
-void request_stats_reply(REQUEST *request);
-void radius_stats_ema(fr_stats_ema_t *ema,
- struct timeval *start, struct timeval *end);
-
-#define RAD_STATS_INC(_x) _x++
-#ifdef WITH_ACCOUNTING
-#define RAD_STATS_TYPE_INC(_listener, _x) if (_listener->type == RAD_LISTEN_AUTH) { \
- radius_auth_stats._x++; \
- } else if (_listener->type == RAD_LISTEN_ACCT) { \
- radius_acct_stats._x++; } \
- _listener->stats._x++
-
-#define RAD_STATS_CLIENT_INC(_listener, _client, _x) if (_listener->type == RAD_LISTEN_AUTH) \
- _client->auth->_x++; \
- else if (_listener->type == RAD_LISTEN_ACCT) \
- _client->acct->_x++
-
-#else /* WITH_ACCOUNTING */
-
-#define RAD_STATS_TYPE_INC(_listener, _x) { radius_auth_stats._x++; _listener->stats._x++; }
-
-#define RAD_STATS_CLIENT_INC(_listener, _client, _x) _client->auth->_x++
-
-#endif /* WITH_ACCOUNTING */
-
-
-#else /* WITH_STATS */
-#define request_stats_init(_x)
-#define request_stats_final(_x)
-
-#define RAD_STATS_INC(_x)
-#define RAD_STATS_TYPE_INC(_listener, _x)
-#define RAD_STATS_CLIENT_INC(_listener, _client, _x)
-
-#endif
-
-#endif /* FR_STATS_H */
#include <cerrno>
#include <cstring>
+#include <vector>
+#include <utility>
#include <stdexcept>
#include "stg_client.h"
-using namespace std;
+typedef std::vector<std::pair<std::string, std::string> > PAIRS;
-void InitEncrypt(BLOWFISH_CTX * ctx, const std::string & password);
-void Encrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8);
-void Decrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8);
-
-//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
+
STG_CLIENT::STG_CLIENT(const std::string & host, uint16_t port, uint16_t lp, const std::string & pass)
- : localPort(lp),
- password(pass),
+ : password(pass),
framedIP(0)
{
-sock = socket(AF_INET, SOCK_DGRAM, 0);
+/*sock = socket(AF_INET, SOCK_DGRAM, 0);
if (sock == -1)
{
std::string message = strerror(errno);
InitEncrypt(&ctx, password);
-PrepareNet();
+PrepareNet();*/
}
-//-----------------------------------------------------------------------------
+
STG_CLIENT::~STG_CLIENT()
{
-close(sock);
-}
-//-----------------------------------------------------------------------------
-uint32_t STG_CLIENT::GetFramedIP() const
-{
-return framedIP;
+/*close(sock);*/
}
-//-----------------------------------------------------------------------------
+
int STG_CLIENT::PrepareNet()
{
-if (localPort != 0)
- {
- struct sockaddr_in localAddr;
- localAddr.sin_family = AF_INET;
- localAddr.sin_port = htons(localPort);
- localAddr.sin_addr.s_addr = inet_addr("0.0.0.0");;
-
- if (bind(sock, (struct sockaddr *)&localAddr, sizeof(localAddr)))
- {
- errorStr = "Bind failed";
- return -1;
- }
- }
return 0;
}
-//-----------------------------------------------------------------------------
-string STG_CLIENT::GetUserPassword() const
-{
-return userPassword;
-}
-//-----------------------------------------------------------------------------
+
int STG_CLIENT::Send(const RAD_PACKET & packet)
{
-char buf[RAD_MAX_PACKET_LEN];
+/*char buf[RAD_MAX_PACKET_LEN];
Encrypt(&ctx, buf, (char *)&packet, sizeof(RAD_PACKET) / 8);
if (res == -1)
errorStr = "Error sending data";
-return res;
+return res;*/
}
-//-----------------------------------------------------------------------------
+
int STG_CLIENT::RecvData(RAD_PACKET * packet)
{
-char buf[RAD_MAX_PACKET_LEN];
+/*char buf[RAD_MAX_PACKET_LEN];
int res;
struct sockaddr_in addr;
Decrypt(&ctx, (char *)packet, buf, res / 8);
-return 0;
+return 0;*/
}
-//-----------------------------------------------------------------------------
+
int STG_CLIENT::Request(RAD_PACKET * packet, const std::string & login, const std::string & svc, uint8_t packetType)
{
-int res;
+/*int res;
memcpy((void *)&packet->magic, (void *)RAD_ID, RAD_MAGIC_LEN);
packet->protoVer[0] = '0';
return -1;
}
-return 0;
+return 0;*/
}
+
//-----------------------------------------------------------------------------
-int STG_CLIENT::Authorize(const string & login, const string & svc)
+
+const STG_PAIRS * STG_CLIENT::Authorize(const std::string & login, const std::string & svc)
{
-RAD_PACKET packet;
+/*RAD_PACKET packet;
userPassword = "";
if (packet.packetType != RAD_ACCEPT_PACKET)
return -1;
-userPassword = (char *)packet.password;
+userPassword = (char *)packet.password;*/
-return 0;
+PAIRS pairs;
+pairs.push_back(std::make_pair("Cleartext-Password", userPassword));
+
+return ToSTGPairs(pairs);
}
-//-----------------------------------------------------------------------------
-int STG_CLIENT::Authenticate(const string & login, const string & svc)
+
+const STG_PAIRS * STG_CLIENT::Authenticate(const std::string & login, const std::string & svc)
{
-RAD_PACKET packet;
+/*RAD_PACKET packet;
userPassword = "";
return -1;
if (packet.packetType != RAD_ACCEPT_PACKET)
- return -1;
+ return -1;*/
-return 0;
+PAIRS pairs;
+
+return ToSTGPairs(pairs);
}
-//-----------------------------------------------------------------------------
-int STG_CLIENT::PostAuthenticate(const string & login, const string & svc)
+
+const STG_PAIRS * STG_CLIENT::PostAuth(const std::string & login, const std::string & svc)
{
-RAD_PACKET packet;
+/*RAD_PACKET packet;
userPassword = "";
if (svc == "Framed-User")
framedIP = packet.ip;
else
- framedIP = 0;
+ framedIP = 0;*/
-return 0;
+PAIRS pairs;
+pairs.push_back(std::make_pair("Framed-IP-Address", inet_ntostring(framedIP)));
+
+return ToSTGPairs(pairs);
}
-//-----------------------------------------------------------------------------
-int STG_CLIENT::Account(const std::string & type, const string & login, const string & svc, const string & sessid)
+
+const STG_PAIRS * STG_CLIENT::PreAcct(const std::string & login, const std::String & service)
+{
+PAIRS pairs;
+
+return ToSTGPairs(pairs);
+}
+
+const STG_PAIRS * STG_CLIENT::Account(const std::string & type, const std::string & login, const std::string & svc, const std::string & sessid)
{
-RAD_PACKET packet;
+/*RAD_PACKET packet;
userPassword = "";
strncpy((char *)packet.sessid, sessid.c_str(), RAD_SESSID_LEN);
}
if (packet.packetType != RAD_ACCEPT_PACKET)
- return -1;
+ return -1;*/
-return 0;
+PAIRS pairs;
+
+return ToSTGPairs(pairs);
}
+
//-----------------------------------------------------------------------------
-inline
-void Encrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8)
-{
-// len8 - длина в 8-ми байтовых блоках
-if (dst != src)
- memcpy(dst, src, len8 * 8);
-
-for (int i = 0; i < len8; i++)
- Blowfish_Encrypt(ctx, (uint32_t *)(dst + i*8), (uint32_t *)(dst + i*8 + 4));
-}
+
+std::string STG_CLIENT_ST::m_host;
+uint16_t STG_CLIENT_ST::m_port(6666);
+std::string STG_CLIENT_ST::m_password;
+
//-----------------------------------------------------------------------------
-inline
-void Decrypt(BLOWFISH_CTX * ctx, char * dst, const char * src, int len8)
+
+STG_CLIENT * STG_CLIENT_ST::Get()
{
-// len8 - длина в 8-ми байтовых блоках
-if (dst != src)
- memcpy(dst, src, len8 * 8);
+ static STG_CLIENT * stgClient = NULL;
+ if ( stgClient == NULL )
+ stgClient = new STG_CLIENT(m_host, m_port, m_password);
+ return stgClient;
+}
-for (int i = 0; i < len8; i++)
- Blowfish_Decrypt(ctx, (uint32_t *)(dst + i*8), (uint32_t *)(dst + i*8 + 4));
+void STG_CLIENT_ST::Configure(const std::string & host, uint16_t port, const std::string & password)
+{
+ m_host = host;
+ m_port = port;
+ m_password = password;
}
+
//-----------------------------------------------------------------------------
-inline
-void InitEncrypt(BLOWFISH_CTX * ctx, const std::string & password)
+
+const STG_PAIR * ToSTGPairs(const PAIRS & source)
{
-unsigned char keyL[RAD_PASSWORD_LEN];
-memset(keyL, 0, RAD_PASSWORD_LEN);
-strncpy((char *)keyL, password.c_str(), RAD_PASSWORD_LEN);
-Blowfish_Init(ctx, keyL, RAD_PASSWORD_LEN);
+ STG_PAIR * pairs = new STG_PAIR[source.size() + 1];
+ for (size_t pos = 0; pos < source.size(); ++pos) {
+ bzero(pairs[pos].key, sizeof(STG_PAIR::key));
+ bzero(pairs[pos].value, sizeof(STG_PAIR::value));
+ strncpy(pairs[pos].key, source[pos].first.c_str(), sizeof(STG_PAIR::key));
+ strncpy(pairs[pos].value, source[pos].second.c_str(), sizeof(STG_PAIR::value));
+ ++pos;
+ }
+ bzero(pairs[sources.size()].key, sizeof(STG_PAIR::key));
+ bzero(pairs[sources.size()].value, sizeof(STG_PAIR::value));
+
+ return pairs;
}
-//-----------------------------------------------------------------------------
#include "stg/blowfish.h"
#include "stg/rad_packets.h"
+#include "stgpair.h"
+
class STG_CLIENT
{
public:
- STG_CLIENT(const std::string & host, uint16_t port, uint16_t lp, const std::string & pass);
+ STG_CLIENT(const std::string & host, uint16_t port, const std::string & password);
~STG_CLIENT();
- std::string GetUserPassword() const;
-
- int Authorize(const std::string & login, const std::string & svc);
- int Authenticate(const std::string & login, const std::string & svc);
- int PostAuthenticate(const std::string & login, const std::string & svc);
- int Account(const std::string & type, const std::string & login, const std::string & svc, const std::string & sessid);
-
- uint32_t GetFramedIP() const;
-
- const std::string & GetError() const { return errorStr; };
+ const STG_PAIR * Authorize(const std::string & login, const std::string & service);
+ const STG_PAIR * Authenticate(const std::string & login, const std::string & service);
+ const STG_PAIR * PostAuth(const std::string & login, const std::string & service);
+ const STG_PAIR * PreAcct(const std::string & login, const std::string & service);
+ const STG_PAIR * Account(const std::string & type, const std::string & login, const std::string & service, const std::string & sessionId);
private:
- uint16_t localPort;
std::string password;
- int sock;
- std::string errorStr;
-
- struct sockaddr_in outerAddr;
-
- std::string userPassword;
-
- uint32_t framedIP;
-
- BLOWFISH_CTX ctx;
int PrepareNet();
int Send(const RAD_PACKET & packet);
};
+struct STG_CLIENT_ST
+{
+ public:
+ static void Configure(const std::string & host, uint16_t port, const std::string & password);
+ static STG_CLIENT * Get();
+
+ private:
+ static std::string m_host;
+ static uint16_t m_port;
+ static std::string m_password;
+};
+
#endif
--- /dev/null
+#ifndef __STG_STGPAIR_H__
+#define __STG_STGPAIR_H__
+
+#define STGPAIR_KEYLENGTH 64
+#define STGPAIR_VALUELENGTH 256
+
+typedef struct STG_PAIR {
+ char key[STGPAIR_KEYLENGTH];
+ char value[STGPAIR_VALUELENGTH];
+} STG_PAIR;
+
+#endif
+++ /dev/null
-#ifndef FR_TOKEN_H
-#define FR_TOKEN_H
-
-/*
- * token.h Special tokens.
- *
- * $Id$
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- *
- * Copyright 2001,2006 The FreeRADIUS server project
- */
-
-//#include <freeradius-devel/ident.h>
-//RCSIDH(token_h, "$Id$")
-
-typedef enum fr_token_t {
- T_OP_INVALID = 0, /* invalid token */
- T_EOL, /* end of line */
- T_LCBRACE, /* { */
- T_RCBRACE, /* } */
- T_LBRACE, /* ( */
- T_RBRACE, /* ) 5 */
- T_COMMA, /* , */
- T_SEMICOLON, /* ; */
-
- T_OP_ADD, /* += */
- T_OP_SUB, /* -= */
- T_OP_SET, /* := 10 */
- T_OP_EQ, /* = */
- T_OP_NE, /* != */
- T_OP_GE, /* >= */
- T_OP_GT, /* > */
- T_OP_LE, /* <= 15 */
- T_OP_LT, /* < */
- T_OP_REG_EQ, /* =~ */
- T_OP_REG_NE, /* !~ */
- T_OP_CMP_TRUE, /* =* */
- T_OP_CMP_FALSE, /* !* 20 */
- T_OP_CMP_EQ, /* == */
- T_HASH, /* # */
- T_BARE_WORD, /* bare word */
- T_DOUBLE_QUOTED_STRING, /* "foo" */
- T_SINGLE_QUOTED_STRING, /* 'foo' 25 */
- T_BACK_QUOTED_STRING, /* `foo` */
- T_TOKEN_LAST
-} FR_TOKEN;
-
-#define T_EQSTART T_OP_ADD
-#define T_EQEND (T_OP_CMP_EQ + 1)
-
-typedef struct FR_NAME_NUMBER {
- const char *name;
- int number;
-} FR_NAME_NUMBER;
-
-int fr_str2int(const FR_NAME_NUMBER *table, const char *name, int def);
-const char *fr_int2str(const FR_NAME_NUMBER *table, int number,
- const char *def);
-
-
-int getword (const char **ptr, char *buf, int buflen);
-int getbareword (const char **ptr, char *buf, int buflen);
-FR_TOKEN gettoken(const char **ptr, char *buf, int buflen);
-FR_TOKEN getstring(const char **ptr, char *buf, int buflen);
-
-#endif /* FR_TOKEN_H */