Implement CallToken support, fixes #36 - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit 819317ab5c5cc3ba0ae7cd5e2bd3aa441656b083
 (DIR) parent 30e3eb477e3685c65266c058ce3eaaf1b0bff9f4
 (HTM) Author: HD Moore <x@hdm.io>
       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(-)
       ---
 (DIR) 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_CALLTOKEN)
       +    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
 (DIR) 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_name)
       -    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.oseq, call.iseq, IAX_TYPE_IAX, data ) )
          end
 (DIR) diff --git a/lib/warvox/proto/iax2/constants.rb b/lib/warvox/proto/iax2/constants.rb
       @@ -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_G711_ALAW | IAX_CODEC_L
        IAX_DEFAULT_REG_REFRESH = 60
        IAX_DEFAULT_TIMEOUT     = 10
        
       +# IAX Vendor
       +IAX_VENDOR_STRING = "Rex IAX2 1.0"
        
        end
        end