freeswitch/scripts/lua/zrtp_sas_proxy.lua

104 lines
3.4 KiB
Lua

-- zrtp_sas_proxy.lua
--
-- Copyright (c) 2011-2013 Travis Cross
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy
-- of this software and associated documentation files (the "Software"), to deal
-- in the Software without restriction, including without limitation the rights
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-- copies of the Software, and to permit persons to whom the Software is
-- furnished to do so, subject to the following conditions:
--
-- The above copyright notice and this permission notice shall be included in
-- all copies or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-- THE SOFTWARE.
--
--
-- When we're acting as a ZRTP man-in-the-middle, proxy the SAS (Short
-- Authentication String) from one leg of the call to the other.
--
-- This script should be called asynchonously with luarun. e.g.:
--
-- <action application="export" data="nolocal:api_on_answer=luarun zrtp_sas_proxy.lua ${uuid}"/>
--
aleg=argv[1]
api=freeswitch.API()
function log(level,msg) return freeswitch.consoleLog(level,"zrtp_sas: "..msg.."\n") end
function sleep(sec) return freeswitch.msleep(sec*1000) end
function ready() return api:execute("uuid_exists",aleg)=="true" end
function getvar(uuid,var)
local x=api:execute("uuid_getvar",uuid.." "..var)
if x=="_undef_" then return nil end
return x
end
function getvarp(uuid,var) return getvar(uuid,var)=="true" end
function display(uuid,msg)
local cidn=getvar(uuid,"caller_id_name")
return api:execute("uuid_display",uuid.." "..msg.." "..cidn)
end
function mk_sas(sas1,sas2)
if sas1 and sas2 then return sas1.." "..sas2
else return sas1 or sas2 or "" end
end
function get_sas(uuid)
return mk_sas(getvar(uuid,"zrtp_sas1_string_audio"),
getvar(uuid,"zrtp_sas2_string"))
end
function log_sas(leg,uuid)
return log("notice",leg..": "..uuid.." sas: "..get_sas(uuid))
end
function display_sas(to,from)
return display(to," ("..get_sas(from)..")")
end
function get_bleg(aleg)
local retries=15 bleg=nil
while ready() do
if retries<1 then return nil end
local bleg=getvar(aleg,"signal_bond")
if bleg then return bleg end
log("debug","waiting for bleg uuid...")
sleep(1)
retries=retries-1
end
end
function handle_sas(aleg,bleg)
local retries=45 af=false bf=false
while ready() do
if retries<1 then return nil end
if not af and getvarp(aleg,"zrtp_secure_media_confirmed_audio") then
af=true
log_sas("aleg",aleg)
display_sas(bleg,aleg)
end
if not bf and getvarp(bleg,"zrtp_secure_media_confirmed_audio") then
bf=true
log_sas("bleg",bleg)
display_sas(aleg,bleg)
end
if (af and bf) then break
elseif af then log("debug","waiting on bleg zrtp...")
elseif bf then log("debug","waiting on aleg zrtp...")
else log("debug","waiting for zrtp...") end
sleep(1)
retries=retries-1
end
end
if not (getvarp(aleg,"zrtp_passthru") or getvarp(aleg,"proxy_media")) then
handle_sas(aleg,get_bleg(aleg))
end