URI: 
       WIP: Fixing bug with viewing calls from a scan - warvox - VoIP based wardialing tool, forked from rapid7/warvox.
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
   DIR commit ea169591d3a6898656c184c761dcc5a5ee9ba1a0
   DIR parent 9bec858678949e4169f78911c1062767d4cdcd7d
  HTML Author: Jay Scott <jay@beardyjay.co.uk>
       Date:   Fri, 26 Aug 2016 10:15:45 +0000
       
       WIP: Fixing bug with viewing calls from a scan
       
       Scans -> View Call Connections (the eye icon)
       
       PG::SyntaxError: ERROR: syntax error at or near "{" LINE 1:
       SELECT COUNT({:conditions=>{:answered=>false}}) FROM "calls"
       ... ^ : SELECT COUNT({:conditions=>{:answered=>false}}) FROM
       "calls" WHERE "calls"."job_id" = $1
       
       line 37: app/controllers/jobs_controller.rb
           @call_results = {
             Timeout: @job.calls.count(conditions: { answered: false }),
             Busy: @job.calls.count(conditions: { busy: true }),
             Answered: @job.calls.count(conditions: { answered: true })
           }
       
       Diffstat:
         M README.md                           |      20 +-------------------
         M app/controllers/calls_controller.rb |      70 +++++++++++++++----------------
         M app/controllers/jobs_controller.rb  |     222 ++++++++++++++-----------------
       
       3 files changed, 138 insertions(+), 174 deletions(-)
       ---
   DIR diff --git a/README.md b/README.md
       @@ -7,13 +7,11 @@ The latest version of this software is available from http://github.com/rapid7/w
        Questions and suggestions can be sent to:
         x(at)hdm(dot)io
        
       -#table of contents
         - [Installing](#installing)
       - - [Development](#development)
        
        ##installing
        
       -WarVOX requires a Linux operating system, preferably Ubuntu or Debian, but Kali should work as well.
       +WarVOX requires a Linux operating system, preferably Ubuntu or Debian.
        
        WarVOX requires PostgreSQL 9.1 or newer with the "contrib" package installed for integer array support.
        
       @@ -88,19 +86,3 @@ Access the web interface at http://127.0.0.1:7777/
        
        At this point you can configure a new IAX2 provider, create a project, and start making calls.
        
       -##development
       -
       -Using the Dockerfile
       -
       -Run a postgres container
       -
       -        docker pull postgres
       -        docker run -d --name=postgres postgres
       -
       -Build the image 
       -
       -        docker build -t warvox/test .
       -
       -Run the image 
       -
       -        docker run -p 7777:7777 -ti --link postgres:db warvox/test
   DIR diff --git a/app/controllers/calls_controller.rb b/app/controllers/calls_controller.rb
       @@ -1,40 +1,40 @@
        class CallsController < ApplicationController
       -
          # GET /calls
          # GET /calls.xml
          def index
            @jobs = @project.jobs.order('id DESC').where('task = ? AND completed_at IS NOT NULL', 'dialer').paginate(
       -    :page => params[:page],
       -    :per_page => 30
       -  )
       +      page: params[:page],
       +      per_page: 30
       +    )
        
            respond_to do |format|
              format.html # index.html.erb
       -      format.xml  { render :xml => @calls }
       +      format.xml  { render xml: @calls }
            end
          end
        
          # GET /calls/1/view
          # GET /calls/1/view.xml
          def view
       -    @calls = Call.order('id DESC').where(:job_id => params[:id]).paginate(
       -    :page => params[:page],
       -    :per_page => 30
       -  )
       -
       -  unless @calls and @calls.length > 0
       -    redirect_to :action => :index
       -    return
       -  end
       -  @call_results = {
       -    :Timeout  => Call.count(:conditions =>['job_id = ? and answered = ?', params[:id], false]),
       -    :Busy     => Call.count(:conditions =>['job_id = ? and busy = ?', params[:id], true]),
       -    :Answered => Call.count(:conditions =>['job_id = ? and answered = ?', params[:id], true]),
       -  }
       +    @calls = Call.order('id DESC').where(job_id: params[:id]).paginate(
       +      page: params[:page],
       +      per_page: 30
       +    )
       +
       +    unless @calls && !@calls.empty?
       +      redirect_to action: :index
       +      return
       +    end
        
       -  respond_to do |format|
       +    @call_results = {
       +      Timeout: Call.count(conditions: ['job_id = ? and answered = ?', params[:id], false]),
       +      Busy: Call.count(conditions: ['job_id = ? and busy = ?', params[:id], true]),
       +      Answered: Call.count(conditions: ['job_id = ? and answered = ?', params[:id], true])
       +    }
       +
       +    respond_to do |format|
              format.html # index.html.erb
       -      format.xml  { render :xml => @calls }
       +      format.xml  { render xml: @calls }
            end
          end
        
       @@ -43,14 +43,14 @@ class CallsController < ApplicationController
          def show
            @call = Call.find(params[:id])
        
       -  unless @call
       -    redirect_to :action => :index
       -    return
       -  end
       +    unless @call
       +      redirect_to action: :index
       +      return
       +    end
        
            respond_to do |format|
              format.html # show.html.erb
       -      format.xml  { render :xml => @call }
       +      format.xml  { render xml: @call }
            end
          end
        
       @@ -61,7 +61,7 @@ class CallsController < ApplicationController
        
            respond_to do |format|
              format.html # new.html.erb
       -      format.xml  { render :xml => @call }
       +      format.xml  { render xml: @call }
            end
          end
        
       @@ -79,10 +79,10 @@ class CallsController < ApplicationController
              if @call.save
                flash[:notice] = 'Call was successfully created.'
                format.html { redirect_to(@call) }
       -        format.xml  { render :xml => @call, :status => :created, :location => @call }
       +        format.xml  { render xml: @call, status: :created, location: @call }
              else
       -        format.html { render :action => "new" }
       -        format.xml  { render :xml => @call.errors, :status => :unprocessable_entity }
       +        format.html { render action: 'new' }
       +        format.xml  { render xml: @call.errors, status: :unprocessable_entity }
              end
            end
          end
       @@ -98,8 +98,8 @@ class CallsController < ApplicationController
                format.html { redirect_to(@call) }
                format.xml  { head :ok }
              else
       -        format.html { render :action => "edit" }
       -        format.xml  { render :xml => @call.errors, :status => :unprocessable_entity }
       +        format.html { render action: 'edit' }
       +        format.xml  { render xml: @call.errors, status: :unprocessable_entity }
              end
            end
          end
       @@ -107,14 +107,12 @@ class CallsController < ApplicationController
          # DELETE /calls/1
          # DELETE /calls/1.xml
          def destroy
       -
            @job = Job.find(params[:id])
       -  @job.destroy
       +    @job.destroy
        
            respond_to do |format|
       -      format.html { redirect_to :action => 'index' }
       +      format.html { redirect_to action: 'index' }
              format.xml  { head :ok }
            end
          end
       -
        end
   DIR diff --git a/app/controllers/jobs_controller.rb b/app/controllers/jobs_controller.rb
       @@ -1,24 +1,19 @@
        class JobsController < ApplicationController
       -
          require 'shellwords'
        
          def index
       -    @reload_interval = 20000
       +    @reload_interval = 20_000
        
       -    @submitted_jobs = Job.where(:status => ['submitted', 'scheduled'], :completed_at => nil)
       -    @active_jobs    = Job.where(:status => 'running', :completed_at => nil)
       -    @inactive_jobs  = Job.order('id DESC').where('status NOT IN (?)', ['submitted', 'scheduled', 'running']).paginate(
       -      :page => params[:page],
       -      :per_page => 30
       +    @submitted_jobs = Job.where(status: %w(submitted scheduled), completed_at: nil)
       +    @active_jobs    = Job.where(status: 'running', completed_at: nil)
       +    @inactive_jobs  = Job.order('id DESC').where('status NOT IN (?)', %w(submitted scheduled running)).paginate(
       +      page: params[:page],
       +      per_page: 30
            )
        
       -    if @active_jobs.length > 0
       -      @reload_interval = 5000
       -    end
       +    @reload_interval = 5000 unless @active_jobs.empty?
        
       -    if @submitted_jobs.length > 0
       -      @reload_interval = 3000
       -    end
       +    @reload_interval = 3000 unless @submitted_jobs.empty?
        
            respond_to do |format|
              format.html
       @@ -27,8 +22,8 @@ class JobsController < ApplicationController
        
          def results
            @jobs = @project.jobs.order('id DESC').where('(task = ? OR task = ?) AND completed_at IS NOT NULL', 'dialer', 'import').paginate(
       -      :page => params[:page],
       -      :per_page => 30
       +      page: params[:page],
       +      per_page: 30
            )
        
            respond_to do |format|
       @@ -40,16 +35,17 @@ class JobsController < ApplicationController
            @job = Job.find(params[:id])
        
            @call_results = {
       -      :Timeout  => @job.calls.count(:conditions => { :answered => false }),
       -      :Busy     => @job.calls.count(:conditions => { :busy     => true }),
       -      :Answered => @job.calls.count(:conditions => { :answered => true }),
       +      Timeout: @job.calls.count(conditions: { answered: false }),
       +      Busy: @job.calls.count(conditions: { busy: true }),
       +      Answered: @job.calls.count(conditions: { answered: true })
            }
        
       -    sort_by   = params[:sort_by] || 'number'
       +
       +    sort_by = params[:sort_by] || 'number'
            sort_dir = params[:sort_dir] || 'asc'
        
            @results = []
       -    @results_total_count = @job.calls.count()
       +    @results_total_count = @job.calls.count
        
            if request.format.json?
              if params[:iDisplayLength] == '-1'
       @@ -61,14 +57,14 @@ class JobsController < ApplicationController
        
              calls_search
              @results = @job.calls.includes(:provider).where(@search_conditions).limit(@results_per_page).offset(@results_offset).order(calls_sort_option)
       -      @results_total_display_count = @job.calls.includes(:provider).where(@search_conditions).count()
       +      @results_total_display_count = @job.calls.includes(:provider).where(@search_conditions).count
            end
        
            respond_to do |format|
              format.html
       -      format.json {
       -        render :content_type => 'application/json', :json => render_to_string(:partial => 'view_results', :results => @results, :call_results => @call_results )
       -      }
       +      format.json do
       +        render content_type: 'application/json', json: render_to_string(partial: 'view_results', results: @results, call_results: @call_results)
       +      end
            end
          end
        
       @@ -77,20 +73,20 @@ class JobsController < ApplicationController
          # Returns the SQL String.
          def calls_sort_option
            column = case params[:iSortCol_0].to_s
       -      when '1'
       -        'number'
       -      when '2'
       -        'caller_id'
       -      when '3'
       -        'providers.name'
       -      when '4'
       -        'answered'
       -      when '5'
       -        'busy'
       -      when '6'
       -        'audio_length'
       -      when '7'
       -        'ring_length'
       +             when '1'
       +               'number'
       +             when '2'
       +               'caller_id'
       +             when '3'
       +               'providers.name'
       +             when '4'
       +               'answered'
       +             when '5'
       +               'busy'
       +             when '6'
       +               'audio_length'
       +             when '7'
       +               'ring_length'
            end
            column + ' ' + (params[:sSortDir_0] =~ /^A/i ? 'asc' : 'desc') if column
          end
       @@ -98,41 +94,45 @@ class JobsController < ApplicationController
          def calls_search
            @search_conditions = []
            terms = params[:sSearch].to_s
       -    terms = Shellword.shellwords(terms) rescue terms.split(/\s+/)
       -    where = ""
       +    terms = begin
       +              Shellword.shellwords(terms)
       +            rescue
       +              terms.split(/\s+/)
       +            end
       +    where = ''
            param = []
       -    glue  = ""
       +    glue  = ''
            terms.each do |w|
       -      next if w.downcase == 'undefined'
       +      next if w.casecmp('undefined').zero?
              where << glue
              case w
       -        when 'answered'
       -          where << "answered = ? "
       -          param << true
       -        when 'busy'
       -          where << "busy = ? "
       -          param << true
       -        else
       -          where << "( number ILIKE ? OR caller_id ILIKE ? ) "
       -          param << "%#{w}%"
       -          param << "%#{w}%"
       +      when 'answered'
       +        where << 'answered = ? '
       +        param << true
       +      when 'busy'
       +        where << 'busy = ? '
       +        param << true
       +      else
       +        where << '( number ILIKE ? OR caller_id ILIKE ? ) '
       +        param << "%#{w}%"
       +        param << "%#{w}%"
              end
       -      glue = "AND " if glue.empty?
       -      @search_conditions = [ where, *param ]
       +      glue = 'AND ' if glue.empty?
       +      @search_conditions = [where, *param]
            end
          end
        
          def new_dialer
            @job = Job.new
       -    if @project
       -      @job.project = @project
       -    else
       -      @job.project = Project.last
       -    end
       +    @job.project = if @project
       +                     @project
       +                   else
       +                     Project.last
       +                   end
        
            if params[:result_ids]
       -      nums = ""
       -      Call.find_each(:conditions => { :id => params[:result_ids] }) do |call|
       +      nums = ''
       +      Call.find_each(conditions: { id: params[:result_ids] }) do |call|
                nums << call.number + "\n"
              end
              @job.range = nums
       @@ -140,12 +140,12 @@ class JobsController < ApplicationController
        
            respond_to do |format|
              format.html
       -     end
       +    end
          end
        
          def purge_calls
       -    Call.delete_all(:id => params[:result_ids])
       -    CallMedium.delete_all(:call_id => params[:result_ids])
       +    Call.delete_all(id: params[:result_ids])
       +    CallMedium.delete_all(call_id: params[:result_ids])
            flash[:notice] = "Purged #{params[:result_ids].length} calls"
            if params[:id]
              @job = Job.find(params[:id])
       @@ -160,33 +160,33 @@ class JobsController < ApplicationController
            @job.created_by = @current_user.login
            @job.task = 'dialer'
            @job.range.to_s.gsub!(/[^0-9X:,\n]/, '')
       -    @job.cid_mask.to_s.gsub!(/[^0-9X]/, '') if @job.cid_mask != "SELF"
       +    @job.cid_mask.to_s.gsub!(/[^0-9X]/, '') if @job.cid_mask != 'SELF'
        
       -    if @job.range_file.to_s != ""
       +    if @job.range_file.to_s != ''
              @job.range = @job.range_file.read.gsub(/[^0-9X:,\n]/, '')
            end
        
            respond_to do |format|
              if @job.schedule
                flash[:notice] = 'Job was successfully created.'
       -        format.html { redirect_to :action => :index }
       +        format.html { redirect_to action: :index }
              else
       -        format.html { render :action => "new_dialer" }
       +        format.html { render action: 'new_dialer' }
              end
            end
          end
        
          def new_analyze
            @job = Job.new
       -    if @project
       -      @job.project = @project
       -    else
       -      @job.project = Project.last
       -    end
       +    @job.project = if @project
       +                     @project
       +                   else
       +                     Project.last
       +                   end
        
            if params[:result_ids]
       -      nums = ""
       -      Call.find_each(:conditions => { :id => params[:result_ids] }) do |call|
       +      nums = ''
       +      Call.find_each(conditions: { id: params[:result_ids] }) do |call|
                nums << call.number + "\n"
              end
              @job.range = nums
       @@ -194,20 +194,20 @@ class JobsController < ApplicationController
        
            respond_to do |format|
              format.html
       -     end
       +    end
          end
        
          def new_identify
            @job = Job.new
       -    if @project
       -      @job.project = @project
       -    else
       -      @job.project = Project.last
       -    end
       +    @job.project = if @project
       +                     @project
       +                   else
       +                     Project.last
       +                   end
        
            if params[:result_ids]
       -      nums = ""
       -      Call.find_each(:conditions => { :id => params[:result_ids] }) do |call|
       +      nums = ''
       +      Call.find_each(conditions: { id: params[:result_ids] }) do |call|
                nums << call.number + "\n"
              end
              @job.range = nums
       @@ -215,15 +215,13 @@ class JobsController < ApplicationController
        
            respond_to do |format|
              format.html
       -     end
       +    end
          end
        
          def reanalyze_job
            @job = Job.find(params[:id])
       -    @new = Job.new({
       -      :task => 'analysis', :scope => 'job', :target_id => @job.id, :force => true,
       -      :project_id => @project.id, :status => 'submitted'
       -    })
       +    @new = Job.new(task: 'analysis', scope: 'job', target_id: @job.id, force: true,
       +                   project_id: @project.id, status: 'submitted')
            @new.created_by = @current_user.login
            respond_to do |format|
              if @new.schedule
       @@ -241,16 +239,12 @@ class JobsController < ApplicationController
        
            # Handle analysis of specific call IDs via checkbox submission
            if params[:result_ids]
       -      @new = Job.new({
       -        :task => 'analysis', :scope => 'calls', :target_ids => params[:result_ids],
       -        :project_id => @project.id, :status => 'submitted'
       -      })
       +      @new = Job.new(task: 'analysis', scope: 'calls', target_ids: params[:result_ids],
       +                     project_id: @project.id, status: 'submitted')
            else
       -    # Otherwise analyze the entire Job
       -      @new = Job.new({
       -        :task => 'analysis', :scope => 'job', :target_id => @job.id,
       -        :project_id => @project.id, :status => 'submitted'
       -      })
       +      # Otherwise analyze the entire Job
       +      @new = Job.new(task: 'analysis', scope: 'job', target_id: @job.id,
       +                     project_id: @project.id, status: 'submitted')
            end
        
            @new.created_by = @current_user.login
       @@ -266,21 +260,15 @@ class JobsController < ApplicationController
            end
          end
        
       -
          def analyze_project
       -
            # Handle analysis of specific call IDs via checkbox submission
            if params[:result_ids]
       -      @new = Job.new({
       -        :task => 'analysis', :scope => 'calls', :target_ids => params[:result_ids],
       -        :project_id => @project.id, :status => 'submitted'
       -      })
       +      @new = Job.new(task: 'analysis', scope: 'calls', target_ids: params[:result_ids],
       +                     project_id: @project.id, status: 'submitted')
            else
       -    # Otherwise analyze the entire Project
       -      @new = Job.new({
       -        :task => 'analysis', :scope => 'project', :target_id => @project.id,
       -        :project_id => @project.id, :status => 'submitted'
       -      })
       +      # Otherwise analyze the entire Project
       +      @new = Job.new(task: 'analysis', scope: 'project', target_id: @project.id,
       +                     project_id: @project.id, status: 'submitted')
            end
        
            @new.created_by = @current_user.login
       @@ -301,16 +289,12 @@ class JobsController < ApplicationController
        
            # Handle identification of specific lines via checkbox submission
            if params[:result_ids]
       -      @new = Job.new({
       -        :task => 'identify', :scope => 'calls', :target_ids => params[:result_ids],
       -        :project_id => @project.id, :status => 'submitted'
       -      })
       +      @new = Job.new(task: 'identify', scope: 'calls', target_ids: params[:result_ids],
       +                     project_id: @project.id, status: 'submitted')
            else
       -    # Otherwise analyze the entire Job
       -      @new = Job.new({
       -        :task => 'identify', :scope => 'job', :target_id => @job.id,
       -        :project_id => @project.id, :status => 'submitted'
       -      })
       +      # Otherwise analyze the entire Job
       +      @new = Job.new(task: 'identify', scope: 'job', target_id: @job.id,
       +                     project_id: @project.id, status: 'submitted')
            end
        
            @new.created_by = @current_user.login
       @@ -329,8 +313,8 @@ class JobsController < ApplicationController
          def stop
            @job = Job.find(params[:id])
            @job.stop
       -    flash[:notice] = "Job has been cancelled"
       -    redirect_to :action => 'index'
       +    flash[:notice] = 'Job has been cancelled'
       +    redirect_to action: 'index'
          end
        
          def destroy