1 /***************************************************************************
2 * rlm_sql.h rlm_sql - FreeRADIUS SQL Module *
4 * Header for main SQL module file *
6 * Mike Machado <mike@innercite.com> *
7 ***************************************************************************/
11 RCSIDH(rlm_sql_h, "$Id$")
13 #include <freeradius-devel/radiusd.h>
14 #include <freeradius-devel/connection.h>
15 #include <freeradius-devel/modpriv.h>
17 #define PW_ITEM_CHECK 0
18 #define PW_ITEM_REPLY 1
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
31 FALL_THROUGH_DEFAULT = 0,
37 typedef char **rlm_sql_row_t;
40 * Sections where we dynamically resolve the config entry to use,
41 * by xlating reference.
43 typedef struct sql_acct_section {
46 char const *reference;
51 typedef struct sql_config {
52 char const *xlat_name;
54 char const *sql_driver_name;
55 char const *sql_server;
57 char const *sql_login;
58 char const *sql_password;
61 char const *query_user;
62 char const *default_profile;
64 char const *client_query;
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;
80 bool deletestalesessions;
81 char const *allowed_chars;
82 uint32_t query_timeout;
84 void *driver; //!< Where drivers should write a
85 //!< pointer to their configurations.
88 * @todo The rest of the queries should also be moved into
93 * Section configurations
95 sql_acct_section_t *postauth;
96 sql_acct_section_t *accounting;
99 typedef struct sql_inst rlm_sql_t;
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.
107 typedef struct rlm_sql_module_t {
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);
126 rlm_sql_config_t myconfig; /* HACK */
127 fr_connection_pool_t *pool;
128 rlm_sql_config_t *config;
131 DICT_ATTR const *sql_user; //!< Cached pointer to SQL-User-Name
132 //!< dictionary attribute.
136 rlm_sql_module_t *module;
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);
147 typedef struct sql_grouplist {
149 struct sql_grouplist *next;
150 } rlm_sql_grouplist_t;
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);