00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00038 #include "domainpolicy_mod.h"
00039 #include <stdio.h>
00040 #include "../../mem/shm_mem.h"
00041 #include "../../sr_module.h"
00042 #include "../../ut.h"
00043 #include "domainpolicy.h"
00044
00045
00046
00047
00048 static int mod_init(void);
00049 static int child_init(int rank);
00050
00051 MODULE_VERSION
00052
00057 #define DOMAINPOLICY_TABLE_VERSION 2
00058
00059
00060 #define DOMAINPOLICY_TABLE "domainpolicy"
00061 #define DOMAINPOLICY_COL_RULE "rule"
00062 #define DOMAINPOLICY_COL_TYPE "type"
00063 #define DOMAINPOLICY_COL_ATT "att"
00064 #define DOMAINPOLICY_COL_VAL "val"
00065
00066
00067 #define DEF_PORT_OVERRIDE_AVP "portoverride"
00068 #define DEF_TRANSPORT_OVERRIDE_AVP "transportoverride"
00069 #define DEF_DOMAIN_PREFIX_AVP "domainprefix"
00070 #define DEF_DOMAIN_SUFFIX_AVP "domainsuffix"
00071 #define DEF_DOMAIN_REPLACEMENT_AVP "domainreplacement"
00072 #define DEF_SEND_SOCKET_AVP "sendsocket"
00073
00074
00075
00076
00077 static str db_url = str_init(DEFAULT_RODB_URL);
00078 str domainpolicy_table = str_init(DOMAINPOLICY_TABLE);
00079 str domainpolicy_col_rule = str_init(DOMAINPOLICY_COL_RULE);
00080 str domainpolicy_col_type = str_init(DOMAINPOLICY_COL_TYPE);
00081 str domainpolicy_col_att = str_init(DOMAINPOLICY_COL_ATT);
00082 str domainpolicy_col_val = str_init(DOMAINPOLICY_COL_VAL);
00083
00084 str port_override_avp = str_init(DEF_PORT_OVERRIDE_AVP);
00085 str transport_override_avp = str_init(DEF_TRANSPORT_OVERRIDE_AVP);
00086 str domain_prefix_avp = str_init(DEF_DOMAIN_PREFIX_AVP);
00087 str domain_suffix_avp = str_init(DEF_DOMAIN_SUFFIX_AVP);
00088 str domain_replacement_avp = str_init(DEF_DOMAIN_REPLACEMENT_AVP);
00089 str send_socket_avp = str_init(DEF_SEND_SOCKET_AVP);
00090
00091
00092
00093
00094
00095 int_str port_override_name, transport_override_name, domain_prefix_name,
00096 domain_suffix_name, domain_replacement_name, send_socket_name;
00097 unsigned short port_override_avp_name_str;
00098 unsigned short transport_override_avp_name_str;
00099 unsigned short domain_prefix_avp_name_str;
00100 unsigned short domain_suffix_avp_name_str;
00101 unsigned short domain_replacement_avp_name_str;
00102 unsigned short send_socket_avp_name_str;
00103
00104
00105
00106
00107 static cmd_export_t cmds[] = {
00108 {"dp_can_connect", (cmd_function)dp_can_connect, 0, 0, 0, REQUEST_ROUTE},
00109 {"dp_apply_policy", (cmd_function)dp_apply_policy, 0, 0, 0, REQUEST_ROUTE},
00110 {0, 0, 0, 0, 0, 0}
00111 };
00112
00113
00114
00115
00116
00117 static param_export_t params[] = {
00118 {"db_url", STR_PARAM, &db_url.s },
00119 {"dp_table", STR_PARAM, &domainpolicy_table.s },
00120 {"dp_col_rule", STR_PARAM, &domainpolicy_col_rule.s },
00121 {"dp_col_type", STR_PARAM, &domainpolicy_col_type.s },
00122 {"dp_col_att", STR_PARAM, &domainpolicy_col_att.s },
00123 {"dp_col_val", STR_PARAM, &domainpolicy_col_val.s },
00124 {"port_override_avp", STR_PARAM, &port_override_avp.s },
00125 {"transport_override_avp", STR_PARAM, &transport_override_avp.s },
00126 {"domain_prefix_avp", STR_PARAM, &domain_prefix_avp.s },
00127 {"domain_suffix_avp", STR_PARAM, &domain_suffix_avp.s },
00128 {"domain_replacement_avp", STR_PARAM, &domain_replacement_avp.s },
00129 {"send_socket_avp", STR_PARAM, &send_socket_avp.s },
00130 {0, 0, 0}
00131 };
00132
00133
00134
00135
00136
00137 struct module_exports exports = {
00138 "domainpolicy",
00139 DEFAULT_DLFLAGS,
00140 cmds,
00141 params,
00142 0,
00143 0,
00144 0,
00145 0,
00146 mod_init,
00147 0,
00148 0,
00149 child_init
00150 };
00151
00152
00153 static int mod_init(void)
00154 {
00155 unsigned int par;
00156 int ver;
00157
00158 db_url.len = strlen(db_url.s);
00159 domainpolicy_table.len = strlen(domainpolicy_table.s);
00160 domainpolicy_col_rule.len = strlen(domainpolicy_col_rule.s);
00161 domainpolicy_col_type.len = strlen(domainpolicy_col_type.s);
00162 domainpolicy_col_att.len = strlen(domainpolicy_col_att.s);
00163 domainpolicy_col_val.len = strlen(domainpolicy_col_val.s);
00164
00165 LM_DBG("check for DB module\n");
00166
00167
00168 if (domainpolicy_db_bind(&db_url)<0) {
00169 LM_ERR("no database module loaded!"
00170 " Please make sure that a DB module is loaded first\n");
00171 return -1;
00172 }
00173
00174 LM_DBG("update length of module variables\n");
00175
00176 port_override_avp.len = strlen(port_override_avp.s);
00177 transport_override_avp.len = strlen(transport_override_avp.s);
00178 domain_prefix_avp.len = strlen(domain_prefix_avp.s);
00179 domain_suffix_avp.len = strlen(domain_suffix_avp.s);
00180 domain_replacement_avp.len = strlen(domain_replacement_avp.s);
00181 send_socket_avp.len = strlen(send_socket_avp.s);
00182
00183
00184 ver = domainpolicy_db_ver(&db_url, &domainpolicy_table);
00185 if (ver < 0) {
00186 LM_ERR("failed to query table version\n");
00187 return -1;
00188 } else if (ver < DOMAINPOLICY_TABLE_VERSION) {
00189 LM_ERR("invalid table version of domainpolicy table\n");
00190 return -1;
00191 }
00192
00193
00194 LM_DBG("AVP\n");
00195 if (str2int(&port_override_avp, &par) == 0) {
00196 if (!par) {
00197 LM_ERR("port_override_avp not defined!\n");
00198 return -1;
00199 }
00200 port_override_name.n = par;
00201 port_override_avp_name_str = 0;
00202 } else {
00203 port_override_name.s = port_override_avp;
00204 port_override_avp_name_str = AVP_NAME_STR;
00205 }
00206 if (str2int(&transport_override_avp, &par) == 0) {
00207 if (!par) {
00208 LM_ERR(" transport_override_avp not defined!\n");
00209 return -1;
00210 }
00211 transport_override_name.n = par;
00212 transport_override_avp_name_str = 0;
00213 } else {
00214 transport_override_name.s = transport_override_avp;
00215 transport_override_avp_name_str = AVP_NAME_STR;
00216 }
00217 if (str2int(&domain_prefix_avp, &par) == 0) {
00218 if (!par) {
00219 LM_ERR("domain_prefix_avp not defined!\n");
00220 return -1;
00221 }
00222 domain_prefix_name.n = par;
00223 domain_prefix_avp_name_str = 0;
00224 } else {
00225 domain_prefix_name.s = domain_prefix_avp;
00226 domain_prefix_avp_name_str = AVP_NAME_STR;
00227 }
00228 if (str2int(&domain_suffix_avp, &par) == 0) {
00229 if (!par) {
00230 LM_ERR(" domain_suffix_avp not defined!\n");
00231 return -1;
00232 }
00233 domain_suffix_name.n = par;
00234 domain_suffix_avp_name_str = 0;
00235 } else {
00236 domain_suffix_name.s = domain_suffix_avp;
00237 domain_suffix_avp_name_str = AVP_NAME_STR;
00238 }
00239 if (str2int(&domain_replacement_avp, &par) == 0) {
00240 if (!par) {
00241 LM_ERR(" domain_replacement_avp not defined!\n");
00242 return -1;
00243 }
00244 domain_replacement_name.n = par;
00245 domain_replacement_avp_name_str = 0;
00246 } else {
00247 domain_replacement_name.s = domain_replacement_avp;
00248 domain_replacement_avp_name_str = AVP_NAME_STR;
00249 }
00250 if (str2int(&send_socket_avp, &par) == 0) {
00251 if (!par) {
00252 LM_ERR(" send_socket_avp not defined!\n");
00253 return -1;
00254 }
00255 send_socket_name.n = par;
00256 send_socket_avp_name_str = 0;
00257 } else {
00258 send_socket_name.s = send_socket_avp;
00259 send_socket_avp_name_str = AVP_NAME_STR;
00260 }
00261
00262 return 0;
00263 }
00264
00265
00266 static int child_init(int rank)
00267 {
00268
00269 if (rank > 0) {
00270 if (domainpolicy_db_init(&db_url)<0) {
00271 LM_ERR("unable to connect to the database\n");
00272 return -1;
00273 }
00274 }
00275 return 0;
00276 }