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
30 typedef char **rlm_sql_row_t;
33 * Sections where we dynamically resolve the config entry to use,
34 * by xlating reference.
36 typedef struct sql_acct_section {
39 char const *reference;
44 typedef struct sql_config {
45 char const *xlat_name;
47 char const *sql_driver_name;
48 char const *sql_server;
50 char const *sql_login;
51 char const *sql_password;
54 char const *query_user;
55 char const *default_profile;
57 char const *client_query;
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;
72 bool deletestalesessions;
73 char const *allowed_chars;
74 uint32_t query_timeout;
76 void *driver; //!< Where drivers should write a
77 //!< pointer to their configurations.
80 * @todo The rest of the queries should also be moved into
85 * Section configurations
87 sql_acct_section_t *postauth;
88 sql_acct_section_t *accounting;
91 typedef struct sql_inst rlm_sql_t;
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.
99 typedef struct rlm_sql_module_t {
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);
118 rlm_sql_config_t myconfig; /* HACK */
119 fr_connection_pool_t *pool;
120 rlm_sql_config_t *config;
123 DICT_ATTR const *sql_user; //!< Cached pointer to SQL-User-Name
124 //!< dictionary attribute.
128 rlm_sql_module_t *module;
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);
139 typedef struct sql_grouplist {
141 struct sql_grouplist *next;
142 } rlm_sql_grouplist_t;
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);