Fix fall-through behaviour in rlm_sql Closes #622
[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 enum {
31         FALL_THROUGH_DEFAULT = 0,
32         FALL_THROUGH_YES,
33         FALL_THROUGH_NO
34 } sql_fall_through_t;
35
36
37 typedef char **rlm_sql_row_t;
38
39 /*
40  * Sections where we dynamically resolve the config entry to use,
41  * by xlating reference.
42  */
43 typedef struct sql_acct_section {
44         CONF_SECTION    *cs;
45
46         char const      *reference;
47
48         char const      *logfile;
49 } sql_acct_section_t;
50
51 typedef struct sql_config {
52         char const      *xlat_name;
53
54         char const      *sql_driver_name;
55         char const      *sql_server;
56         char const      *sql_port;
57         char const      *sql_login;
58         char const      *sql_password;
59         char const      *sql_db;
60
61         char const      *query_user;
62         char const      *default_profile;
63
64         char const      *client_query;
65
66         char const      *open_query;
67         char const      *authorize_check_query;
68         char const      *authorize_reply_query;
69         char const      *authorize_group_check_query;
70         char const      *authorize_group_reply_query;
71         char const      *simul_count_query;
72         char const      *simul_verify_query;
73         char const      *groupmemb_query;
74
75         bool            do_clients;
76         bool            read_groups;
77         bool            read_profiles;
78         char const      *logfile;
79
80         bool            deletestalesessions;
81         char const      *allowed_chars;
82         uint32_t        query_timeout;
83
84         void            *driver;        //!< Where drivers should write a
85                                         //!< pointer to their configurations.
86
87         /*
88          *      @todo The rest of the queries should also be moved into
89          *      their own sections.
90          */
91
92         /*
93          *      Section configurations
94          */
95         sql_acct_section_t      *postauth;
96         sql_acct_section_t      *accounting;
97 } rlm_sql_config_t;
98
99 typedef struct sql_inst rlm_sql_t;
100
101 typedef struct rlm_sql_handle {
102         void            *conn;  //!< Database specific connection handle.
103         rlm_sql_row_t   row;    //!< Row data from the last query.
104         rlm_sql_t       *inst;  //!< The rlm_sql instance this connection belongs to.
105 } rlm_sql_handle_t;
106
107 typedef struct rlm_sql_module_t {
108         char const *name;
109
110         sql_rcode_t (*mod_instantiate)(CONF_SECTION *conf, rlm_sql_config_t *config);
111         sql_rcode_t (*sql_socket_init)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
112         sql_rcode_t (*sql_query)(rlm_sql_handle_t *handle, rlm_sql_config_t *config, char const *query);
113         sql_rcode_t (*sql_select_query)(rlm_sql_handle_t *handle, rlm_sql_config_t *config, char const *query);
114         sql_rcode_t (*sql_store_result)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
115         int (*sql_num_fields)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
116         int (*sql_num_rows)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
117         sql_rcode_t (*sql_fetch_row)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
118         sql_rcode_t (*sql_free_result)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
119         char const *(*sql_error)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
120         sql_rcode_t (*sql_finish_query)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
121         sql_rcode_t (*sql_finish_select_query)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
122         int (*sql_affected_rows)(rlm_sql_handle_t *handle, rlm_sql_config_t *config);
123 } rlm_sql_module_t;
124
125 struct sql_inst {
126         rlm_sql_config_t        myconfig; /* HACK */
127         fr_connection_pool_t    *pool;
128         rlm_sql_config_t        *config;
129         CONF_SECTION            *cs;
130
131         DICT_ATTR const         *sql_user;      //!< Cached pointer to SQL-User-Name
132                                                 //!< dictionary attribute.
133         fr_logfile_t            *lf;
134
135         void *handle;
136         rlm_sql_module_t *module;
137
138         int (*sql_set_user)(rlm_sql_t *inst, REQUEST *request, char const *username);
139         rlm_sql_handle_t *(*sql_get_socket)(rlm_sql_t *inst);
140         int (*sql_release_socket)(rlm_sql_t *inst, rlm_sql_handle_t *handle);
141         size_t (*sql_escape_func)(REQUEST *, char *out, size_t outlen, char const *in, void *arg);
142         sql_rcode_t (*sql_query)(rlm_sql_handle_t **handle, rlm_sql_t *inst, char const *query);
143         sql_rcode_t (*sql_select_query)(rlm_sql_handle_t **handle, rlm_sql_t *inst, char const *query);
144         sql_rcode_t (*sql_fetch_row)(rlm_sql_handle_t **handle, rlm_sql_t *inst);
145 };
146
147 typedef struct sql_grouplist {
148         char                    *name;
149         struct sql_grouplist    *next;
150 } rlm_sql_grouplist_t;
151
152 int             sql_socket_pool_init(rlm_sql_t *inst);
153 void            sql_poolfree(rlm_sql_t *inst);
154 int             sql_close_socket(rlm_sql_t *inst, rlm_sql_handle_t *handle);
155 rlm_sql_handle_t *sql_get_socket(rlm_sql_t *inst);
156 int             sql_release_socket(rlm_sql_t *inst, rlm_sql_handle_t *handle);
157 int             sql_userparse(TALLOC_CTX *ctx, VALUE_PAIR **first_pair, rlm_sql_row_t row);
158 int             sql_read_realms(rlm_sql_handle_t *handle);
159 int             sql_getvpdata(rlm_sql_t *inst, rlm_sql_handle_t **handle, TALLOC_CTX *ctx, VALUE_PAIR **pair, char const *query);
160 int             sql_read_naslist(rlm_sql_handle_t *handle);
161 int             sql_read_clients(rlm_sql_handle_t *handle);
162 int             sql_dict_init(rlm_sql_handle_t *handle);
163 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);
164 sql_rcode_t     CC_HINT(nonnull) rlm_sql_select_query(rlm_sql_handle_t **handle, rlm_sql_t *inst, char const *query);
165 sql_rcode_t     CC_HINT(nonnull) rlm_sql_query(rlm_sql_handle_t **handle, rlm_sql_t *inst, char const *query);
166 int             rlm_sql_fetch_row(rlm_sql_handle_t **handle, rlm_sql_t *inst);
167 int             sql_set_user(rlm_sql_t *inst, REQUEST *request, char const *username);
168 #endif