####### Permissions module ##########
|
|
|
|
#!trydef KZ_PERMISSIONS_MAX_SUBNET 2048
|
|
#!trydef KZ_PERMISSIONS_CACHE 0
|
|
#!trydef TRUSTED_AMQP_FLAGS 2048
|
|
|
|
|
|
loadmodule "permissions.so"
|
|
modparam("permissions", "db_url", "KAZOO_DB_URL")
|
|
modparam("permissions", "db_mode", KZ_PERMISSIONS_CACHE)
|
|
modparam("permissions", "peer_tag_avp", "$avp(trusted_x_header)")
|
|
modparam("permissions", "max_subnets", KZ_PERMISSIONS_MAX_SUBNET)
|
|
|
|
modparam("rtimer", "timer", "name=trusted_reload;interval=30;mode=1;")
|
|
modparam("rtimer", "exec", "timer=trusted_reload;route=TRUSTED_RELOAD")
|
|
modparam("rtimer", "exec", "timer=trusted_reload;route=TRUSTED_QUERY")
|
|
|
|
modparam("pv", "shvset", "trusted_query=i:1")
|
|
|
|
route[TRUSTED_LOAD]
|
|
{
|
|
$shv(trusted_query) = 2;
|
|
$shv(trusted_reload) = 0;
|
|
|
|
$var(amqp_payload_request) = $_s({"Event-Category" : "trusted" , "Event-Name" : "query"});
|
|
$var(amqp_routing_key) = "trusted.query";
|
|
|
|
xlog("L_INFO", "event|trusted|publishing to acl => $var(amqp_routing_key) : $var(amqp_payload_request)\n");
|
|
if(kazoo_query("trusted", $var(amqp_routing_key), $var(amqp_payload_request), "$def(TRUSTED_AMQP_FLAGS)") != 1) {
|
|
if($(kzR{kz.json,Event-Name}) == "message_returned" ) {
|
|
xlog("L_WARNING", "event|trusted|message was returned by broker $(kzR{kz.json,Error-Code}) $(kzR{kz.json,Error-Reason})\n");
|
|
} else {
|
|
xlog("L_WARNING", "event|trusted|query failed $kzR\n");
|
|
}
|
|
$shv(trusted_query) = 1;
|
|
return;
|
|
}
|
|
|
|
xlog("L_INFO", "event|trusted|query got reply\n");
|
|
avp_delete("$avp(TrustedKeys)/g");
|
|
if(kazoo_json_keys($kzR, "Trusted", "$avp(TrustedKeys)") != 1) {
|
|
xlog("L_WARNING", "event|trusted|no keys for Trusted\n");
|
|
$shv(trusted_query) = 0;
|
|
return;
|
|
}
|
|
xlog("L_INFO", "event|trusted|cleaning address table\n");
|
|
sql_query("exec", "delete from address");
|
|
$var(total) = 0;
|
|
$var(Count) = $cnt($avp(TrustedKeys));
|
|
$var(Idx) = 0;
|
|
xlog("L_INFO", "event|trusted|count for trusted is $var(Count)\n");
|
|
while($var(Idx) < $var(Count)) {
|
|
$var(KeyName) = $(avp(TrustedKeys)[$var(Idx)]);
|
|
$var(Key) = $(var(KeyName){s.replace,.,%});
|
|
$var(token) = $(kzR{kz.json,Trusted.$var(Key).token});
|
|
$var(cidr_count) = $(kzR{kz.json.count, Trusted.$var(Key).cidrs});
|
|
|
|
## ports
|
|
$var(port_count) = $(kzR{kz.json.count, Trusted.$var(Key).ports});
|
|
$(avp(ports)[*]) = $null;
|
|
if($var(port_count) == 0) {
|
|
$avp(ports) = 0;
|
|
$var(port_count) = 1;
|
|
} else {
|
|
$var(portIdx) = 0;
|
|
while($var(portIdx) < $var(port_count)) {
|
|
$avp(ports) = $(kzR{kz.json, Trusted.$var(Key).ports[$var(portIdx)});
|
|
$var(portIdx) = $var(portIdx) + 1;
|
|
}
|
|
}
|
|
|
|
$var(cidr_idx) = 0;
|
|
while($var(cidr_idx) < $var(cidr_count)) {
|
|
$var(cidr) = $(kzR{kz.json,Trusted.$var(Key).cidrs[$var(cidr_idx)]});
|
|
$var(ip) = $(var(cidr){s.select,0,/});
|
|
$var(mask) = $(var(cidr){s.select,1,/});
|
|
|
|
$var(portIdx) = 0;
|
|
while($var(portIdx) < $var(port_count)) {
|
|
$var(sql) = $_s(insert into address(ip_addr, mask, port, tag) values("$var(ip)", $var(mask), $(avp(ports)[$var(portIdx)]), "$var(token)"));
|
|
sql_query("exec", "$var(sql)");
|
|
$var(portIdx) = $var(portIdx) + 1;
|
|
$var(total) = $var(total) + 1;
|
|
}
|
|
|
|
$var(cidr_idx) = $var(cidr_idx) + 1;
|
|
}
|
|
$var(Idx) = $var(Idx) + 1;
|
|
}
|
|
|
|
xlog("L_NOTICE", "event|trusted|loaded $var(total) entries into address table\n");
|
|
$shv(trusted_reload) = 1;
|
|
$shv(trusted_query) = 0;
|
|
|
|
}
|
|
|
|
route[RELOAD_TRUSTED]
|
|
{
|
|
jsonrpc_exec('{"jsonrpc": "2.0", "method": "permissions.addressReload"}');
|
|
xlog("L_NOTICE", "event|trusted|reload $(jsonrpl(body){kz.json,result})\n");
|
|
$shv(trusted_reload) = 0;
|
|
}
|
|
|
|
route[TRUSTED_RELOAD]
|
|
{
|
|
if($shv(trusted_reload) == 1) {
|
|
$shv(trusted_reload) = 2;
|
|
} else if($shv(trusted_reload) == 2) {
|
|
route(RELOAD_TRUSTED);
|
|
};
|
|
}
|
|
|
|
route[TRUSTED_QUERY]
|
|
{
|
|
if($shv(trusted_query) == 1) {
|
|
route(TRUSTED_LOAD);
|
|
};
|
|
}
|
|
|
|
route[KZ_AMQP_BINDING_TRUSTED]
|
|
{
|
|
if(!check_route_exists("KZ_AMQP_BINDING_CUSTOM_TRUSTED")) {
|
|
$var(payload) = $_s({"name": "trusted-reload", "exchange": "trusted", "type": "topic", "queue": "trusted-reload-MY_HOSTNAME", "routing": "trusted.reload", "federate": true });
|
|
kazoo_subscribe("$var(payload)");
|
|
}
|
|
}
|
|
|
|
event_route[kazoo:consumer-event-trusted-reload]
|
|
{
|
|
xlog("L_NOTICE", "event|trusted|received trusted reload\n");
|
|
if ($shv(trusted_query) == 0) {
|
|
xlog("L_NOTICE", "event|trusted|signaling trusted reload\n");
|
|
$shv(trusted_query) = 1;
|
|
} else {
|
|
xlog("L_NOTICE", "event|trusted|signal already active for trusted reload\n");
|
|
}
|
|
}
|