123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- -- 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
|