| Implement CallToken support, fixes #36 - warvox - VoIP based wardialing tool, f… | |
| Log | |
| Files | |
| Refs | |
| README | |
| --- | |
| commit 819317ab5c5cc3ba0ae7cd5e2bd3aa441656b083 | |
| parent 30e3eb477e3685c65266c058ce3eaaf1b0bff9f4 | |
| Author: HD Moore <[email protected]> | |
| Date: Sun, 28 Feb 2016 18:43:58 -0600 | |
| Implement CallToken support, fixes #36 | |
| Diffstat: | |
| M lib/warvox/proto/iax2/call.rb | 23 +++++++++++++++++++++-- | |
| M lib/warvox/proto/iax2/client.rb | 10 ++++++++-- | |
| M lib/warvox/proto/iax2/constants.rb | 15 +++++++++++++-- | |
| 3 files changed, 42 insertions(+), 6 deletions(-) | |
| --- | |
| diff --git a/lib/warvox/proto/iax2/call.rb b/lib/warvox/proto/iax2/call.rb | |
| @@ -19,6 +19,7 @@ class Call | |
| attr_accessor :caller_name | |
| attr_accessor :caller_number | |
| attr_accessor :dtmf | |
| + attr_accessor :call_token | |
| def initialize(client, src_id) | |
| @@ -36,9 +37,9 @@ class Call | |
| self.busy = false | |
| self.dtmf = '' | |
| + self.call_token = '' | |
| end | |
| - | |
| def dprint(msg) | |
| self.client.dprint(msg) | |
| end | |
| @@ -59,6 +60,7 @@ class Call | |
| # Register with the IAX endpoint | |
| def register | |
| + | |
| self.client.send_regreq(self) | |
| res = wait_for( IAX_SUBTYPE_REGAUTH, IAX_SUBTYPE_REGREJ ) | |
| return if not res | |
| @@ -115,7 +117,24 @@ class Call | |
| def dial(number) | |
| self.client.send_new(self, number) | |
| - res = wait_for(IAX_SUBTYPE_AUTHREQ, IAX_SUBTYPE_ACCEPT) | |
| + res = wait_for(IAX_SUBTYPE_AUTHREQ, IAX_SUBTYPE_ACCEPT, IAX_SUBTYPE_CALLTO… | |
| + return if not res | |
| + | |
| + # Handle CallToken support | |
| + if res[1] == IAX_SUBTYPE_CALLTOKEN | |
| + if res[2][IAX_IE_CALL_TOKEN] | |
| + # Reset sequence numbers | |
| + self.oseq = self.iseq = 0 | |
| + # Store the CallToken | |
| + self.call_token = res[2][IAX_IE_CALL_TOKEN] | |
| + # Restart the call | |
| + self.client.send_new(self, number) | |
| + res = wait_for(IAX_SUBTYPE_AUTHREQ, IAX_SUBTYPE_ACCEPT) | |
| + else | |
| + dprint("NEW: No CallToken received in CALLTOKEN reply") | |
| + return | |
| + end | |
| + end | |
| return if not res | |
| # Handle authentication if its requested | |
| diff --git a/lib/warvox/proto/iax2/client.rb b/lib/warvox/proto/iax2/client.rb | |
| @@ -158,14 +158,20 @@ class Client | |
| cid = call.caller_number || self.caller_number | |
| cid = number if cid == 'SELF' | |
| - | |
| + data << create_ie(IAX_IE_PROTO_VERSION, [2].pack("n") ) | |
| data << create_ie(IAX_IE_CALLING_NUMBER, cid ) | |
| data << create_ie(IAX_IE_CALLING_NAME, call.caller_name || self.caller_nam… | |
| - data << create_ie(IAX_IE_DESIRED_CODEC, [IAX_SUPPORTED_CODECS].pack("N") ) | |
| + data << create_ie(IAX_IE_CALLING_PRESENTATION, [1].pack("C") ) | |
| + data << create_ie(IAX_IE_CALLING_TYPE_NUMBER, [0].pack("C") ) | |
| + data << create_ie(IAX_IE_CALLING_TRANSIT_NETWORK_SELECT, [0].pack("n") ) | |
| + data << create_ie(IAX_IE_DESIRED_CODEC, [IAX_CODEC_G711_MULAW].pack("N") ) | |
| data << create_ie(IAX_IE_ACTUAL_CODECS, [IAX_SUPPORTED_CODECS].pack("N") ) | |
| data << create_ie(IAX_IE_USERNAME, self.username) if self.username | |
| data << create_ie(IAX_IE_CALLED_NUMBER, number) | |
| data << create_ie(IAX_IE_ORIGINAL_DID, number) | |
| + data << create_ie(IAX_IE_CPE_ADSI_CAP, [0].pack("n")) | |
| + data << create_ie(IAX_IE_CALL_TOKEN, call.call_token) | |
| + data << create_ie(IAX_IE_FIRMWARE_BLOCK, IAX_VENDOR_STRING) | |
| send_data( call, create_pkt( call.scall, call.dcall, call.timestamp, call.… | |
| end | |
| diff --git a/lib/warvox/proto/iax2/constants.rb b/lib/warvox/proto/iax2/constan… | |
| @@ -173,16 +173,24 @@ IAX_IE_CALLING_NUMBER = 2 | |
| IAX_IE_AUTH_METHODS = 3 | |
| IAX_IE_CALLING_NAME = 4 | |
| IAX_IE_USERNAME = 6 | |
| -IAX_IE_DESIRED_CODEC = 9 | |
| -IAX_IE_ORIGINAL_DID = 10 | |
| IAX_IE_ACTUAL_CODECS = 8 | |
| +IAX_IE_DESIRED_CODEC = 9 | |
| IAX_IE_PROTO_VERSION = 11 | |
| +IAX_IE_CPE_ADSI_CAP = 12 | |
| +IAX_IE_ORIGINAL_DID = 13 | |
| IAX_IE_REG_REFRESH = 19 | |
| IAX_IE_CHALLENGE_DATA = 15 | |
| IAX_IE_CHALLENGE_RESP = 16 | |
| IAX_IE_APPARENT_ADDR = 18 | |
| IAX_IE_REGREJ_CAUSE = 22 | |
| +IAX_IE_FIRMWARE_BLOCK = 36 | |
| +IAX_IE_CALLING_PRESENTATION = 38 | |
| +IAX_IE_CALLING_TYPE_NUMBER = 39 | |
| +IAX_IE_CALLING_TRANSIT_NETWORK_SELECT = 40 | |
| IAX_IE_HANGUP_CAUSE = 42 | |
| +IAX_IE_CALL_TOKEN = 54 | |
| + | |
| + | |
| =begin | |
| +------+----------------+-------------------------------------------+ | |
| @@ -244,6 +252,7 @@ IAX_IE_HANGUP_CAUSE = 42 | |
| | | | buffer) | | |
| | 0x33 | RR OOO | Frames received Out of Order | | |
| | 0x34 | OSPTOKEN | OSP Token Block | | |
| + | 0x54 | CALL TOKEN | Call Token | |
| +------+----------------+-------------------------------------------+ | |
| =end | |
| @@ -260,6 +269,8 @@ IAX_SUPPORTED_CODECS = IAX_CODEC_G711_MULAW | IAX_CODEC_G7… | |
| IAX_DEFAULT_REG_REFRESH = 60 | |
| IAX_DEFAULT_TIMEOUT = 10 | |
| +# IAX Vendor | |
| +IAX_VENDOR_STRING = "Rex IAX2 1.0" | |
| end | |
| end |