forked from Mirrors/freeswitch
37d6c8556c
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. See the documentation in the header of the script for instructions on enabling this behavior.
88 lines
3.0 KiB
Lua
88 lines
3.0 KiB
Lua
-- 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:
|
|
--
|
|
-- <extension name="global" continue="true">
|
|
-- <condition break="never">
|
|
-- <action application="lua" data="lua/zrtp_proxy_media.lua"/>
|
|
-- </condition>
|
|
-- </extension>
|
|
--
|
|
-- 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:
|
|
--
|
|
-- <action application="lua" data="lua/zrtp_proxy_media.lua disable"/>
|
|
|
|
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()
|