69de680690561c18eb77eeb0013392cdc4ca7337
[freeradius.git] / src / modules / rlm_sql / rlm_sql.h
1 /***************************************************************************
2 * rlm_sql.h                       rlm_sql - FreeRADIUS SQL Module      *
3 *                                                                        *
4 *     Header for main SQL module file                                *
5 *                                                                        *
6 *                                   Mike Machado <mike@innercite.com>    *
7 ***************************************************************************/
8 #ifndef _RLM_SQL_H
9 #define _RLM_SQL_H
10
11 RCSIDH(rlm_sql_h, "$Id$")
12
13 #include        <freeradius-devel/radiusd.h>
14 #include        <freeradius-devel/connection.h>
15 #include        <freeradius-devel/modpriv.h>
16
17 #define PW_ITEM_CHECK           0
18 #define PW_ITEM_REPLY           1
19
20
21 /* SQL Errors */
22 typedef enum {
23         RLM_SQL_QUERY_ERROR = -3,       //!< Query syntax error
24         RLM_SQL_ERROR = -2,             //!< General connection/server error
25         RLM_SQL_OK = 0,                 //!< Success
26         RLM_SQL_RECONNECT = 1,          //!< Stale connection, should reconnect
27         RLM_SQL_DUPLICATE = 2           //!< Key constraint violation
28 } sql_rcode_t;
29
30 typedef char **rlm_sql_row_t;
31
32 /*
33  * Sections where we dynamically resolve the config entry to use,
34  * by xlating reference.
35  */
36 typedef struct sql_acct_section {
37         CONF_SECTION    *cs;
38
39         char const      *reference;
40
41         char const      *logfile;
42 } sql_acct_section_t;
43
44 typedef struct sql_config {
45         char const      *xlat_name;
46
47         char const      *sql_driver_name;
48         char const      *sql_server;
49         char const      *sql_port;
50         char const      *sql_login;
51         char const      *sql_password;
52         char const      *sql_db;
53
54         char const      *query_user;
55         char const      *default_profile;
56
57         char const      *client_query;
58
59         char const      *open_query;
60         char const      *authorize_check_query;
61         char const      *authorize_reply_query;
62         char const      *authorize_group_check_query;
63         char const      *authorize_group_reply_query;
64         char const      *simul_count_query;
65         char const      *simul_verify_query;
66         char const      *groupmemb_query;
67
68         bool            do_clients;
69         bool            read_groups;
70         char const      *logfile;
71
72         bool            deletestalesessions;
73         char const      *allowed_chars;
74         uint32_t        query_timeout;
75
76         void            *driver;        //!< Where drivers should write a
77                                         //!< pointer to their configurations.
78
79         /*
80          *      @todo The rest of the queries should also be moved into
81          *      their own sections.
82          */
83
84         /*
85          *      Section configurations
86          */
87         sql_acct_section_t      *postauth;
88         sql_acct_section_t      *accounting;
89 } rlm_sql_config_t;
90
91 typedef struct sql_inst rlm_sql_t;
92
93 typedef struct rlm_sql_handle {
94         void            *conn;  //!< Database specific connection handle.
95         rlm_sql_row_t   row;    //!< Row data from the last query.
96         rlm_sql_t       *inst;  //!< The rlm_sql instance this connection belongs to.
97 } rlm_sql_handle_t;
98
99 typedef struct rlm_sql_module_t {
100         char const *name;
101
102         sql_rcode_t (*mod_instantiate)(CONF_SECTION *conf, rlm_sql_config_t *config);
103         sql_rcode_t (*sql_socket_init)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
104         sql_rcode_t (*sql_query)(rlm_sql_handle_t *handle, rlm_sql_config_t *config, char const *query);
105         sql_rcode_t (*sql_select_query)(rlm_sql_handle_t *handle, rlm_sql_config_t *config, char const *query);
106         sql_rcode_t (*sql_store_result)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
107         int (*sql_num_fields)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
108         int (*sql_num_rows)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
109         sql_rcode_t (*sql_fetch_row)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
110         sql_rcode_t (*sql_free_result)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
111         char const *(*sql_error)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
112         sql_rcode_t (*sql_finish_query)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
113         sql_rcode_t (*sql_finish_select_query)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
114         int (*sql_affected_rows)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
115 } rlm_sql_module_t;
116
117 struct sql_inst {
118         rlm_sql_config_t        myconfig; /* HACK */
119         fr_connection_pool_t    *pool;
120         rlm_sql_config_t        *config;
121         CONF_SECTION            *cs;
122
123         DICT_ATTR const         *sql_user;      //!< Cached pointer to SQL-User-Name
124                                                 //!< dictionary attribute.
125         fr_logfile_t            *lf;
126
127         void *handle;
128         rlm_sql_module_t *module;
129
130         int (*sql_set_user)(rlm_sql_t *inst, REQUEST *request, char const *username);
131         rlm_sql_handle_t *(*sql_get_socket)(rlm_sql_t *inst);
132         int (*sql_release_socket)(rlm_sql_t *inst, rlm_sql_handle_t *handle);
133         size_t (*sql_escape_func)(REQUEST *, char *out, size_t outlen, char const *in, void *arg);
134         sql_rcode_t (*sql_query)(rlm_sql_handle_t **handle, rlm_sql_t *inst, char const *query);
135         sql_rcode_t (*sql_select_query)(rlm_sql_handle_t **handle, rlm_sql_t *inst, char const *query);
136         sql_rcode_t (*sql_fetch_row)(rlm_sql_handle_t **handle, rlm_sql_t *inst);
137 };
138
139 typedef struct sql_grouplist {
140         char                    *name;
141         struct sql_grouplist    *next;
142 } rlm_sql_grouplist_t;
143
144 int             sql_socket_pool_init(rlm_sql_t *inst);
145 void            sql_poolfree(rlm_sql_t *inst);
146 int             sql_close_socket(rlm_sql_t *inst, rlm_sql_handle_t *handle);
147 rlm_sql_handle_t *sql_get_socket(rlm_sql_t *inst);
148 int             sql_release_socket(rlm_sql_t *inst, rlm_sql_handle_t *handle);
149 int             sql_userparse(TALLOC_CTX *ctx, VALUE_PAIR **first_pair, rlm_sql_row_t row);
150 int             sql_read_realms(rlm_sql_handle_t *handle);
151 int             sql_getvpdata(rlm_sql_t *inst, rlm_sql_handle_t **handle, TALLOC_CTX *ctx, VALUE_PAIR **pair, char const *query);
152 int             sql_read_naslist(rlm_sql_handle_t *handle);
153 int             sql_read_clients(rlm_sql_handle_t *handle);
154 int             sql_dict_init(rlm_sql_handle_t *handle);
155 void            CC_HINT(nonnull (1, 2, 4)) rlm_sql_query_log(rlm_sql_t *inst, REQUEST *request, sql_acct_section_t *section, char const *query);
156 sql_rcode_t     CC_HINT(nonnull) rlm_sql_select_query(rlm_sql_handle_t **handle, rlm_sql_t *inst, char const *query);
157 sql_rcode_t     CC_HINT(nonnull) rlm_sql_query(rlm_sql_handle_t **handle, rlm_sql_t *inst, char const *query);
158 int             rlm_sql_fetch_row(rlm_sql_handle_t **handle, rlm_sql_t *inst);
159 int             sql_set_user(rlm_sql_t *inst, REQUEST *request, char const *username);
160 #endif