diff --git a/scripts/lua/zrtp_proxy_media.lua b/scripts/lua/zrtp_proxy_media.lua new file mode 100644 index 0000000000..1af3893f30 --- /dev/null +++ b/scripts/lua/zrtp_proxy_media.lua @@ -0,0 +1,87 @@ +-- Copyright (c) 2011-2012, Travis Cross. +-- +-- The contents of this file are subject to the Mozilla Public License +-- Version 1.1 (the "License"); you may not use this file except in +-- compliance with the License. You may obtain a copy of the License +-- at http://www.mozilla.org/MPL/ +-- +-- Software distributed under the License is distributed on an "AS IS" +-- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +-- the License for the specific language governing rights and +-- limitations under the License. +-- +-- zrtp_proxy_media.lua +-- +-- The logic in this script enables ZRTP sessions to negotiate +-- end-to-end security associations, which is desirable whether or not +-- the switch natively supports ZRTP itself. +-- +-- To enable this logic, call the script from the top of your dialplan +-- as so: +-- +-- +-- +-- +-- +-- +-- +-- If any particular call flow should never have proxy_media enabled, +-- such as for connecting to voicemail systems or conferences, make +-- sure this is called before the bridge: +-- +-- + +api=freeswitch.API() + +function sappend(s1,s2) if s1 and #s1>0 then return s1..s2 else return s2 end end +function log(level,msg) return freeswitch.consoleLog(level,msg.."\n") end +function ready() return session:ready() end +function getvar(var) return session:getVariable(var) end +function getvarp(var) return getvar(var)=="true" end +function setvar_a(k,v) return session:setVariable(k,v) end +function append_var(k,v) return setvar_a(k,sappend(getvar(k),v)) end +function export(k) return append_var("export_vars",","..k) end +function setvar_ab(k,v) if v then setvar_a(k,v) end return export(k) end +function setvar_b(k,v) return setvar_ab("nolocal:"..k,v) end + +function enable_zd(msg) + log("info",msg) + setvar_ab("zrtp_set","true") + setvar_ab("proxy_media","true") + setvar_ab("zrtp_secure_media","false") +end + +function disable_zd(msg) + log("info",msg) + setvar_ab("zrtp_set","true") + setvar_ab("proxy_media","false") + setvar_ab("zrtp_secure_media","true") +end + +function xfer(x) + return session:transfer(x,getvar("dialplan"),getvar("context")) +end + +function main() + if ready() then + session:setAutoHangup(false) + local dst=getvar("destination_number") + if argv[1]=="disable" then + return disable_zd("zrtp-direct disabled on this call flow") + elseif getvarp("zrtp_set") then + return log("notice","zrtp already decided; doing nothing") end + local x=dst:match("^%*%*%*(.*)$") + if x then + enable_zd("going zrtp-direct based on star code") + return xfer(x) end + local x=dst:match("^%*%*(.*)$") + if x then + disable_zd("going zrtp-indirect based on star code") + return xfer(x) end + if getvar("switch_r_sdp"):match("a=zrtp%-hash:") then + return enable_zd("going zrtp-direct based on a=zrtp-hash") end + return disable_zd("not going zrtp-direct") + end +end + +main()