Class: Arachni::Support::Signature

Inherits:
Object
  • Object
show all
Defined in:
lib/arachni/support/signature.rb

Overview

Represents a signature, used to maintain a lightweight representation of a String and refine it using similar Strings to remove noise.

Author:

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data, options = {}) ⇒ Signature

Note:

The string will be tokenized based on whitespace.

Returns a new instance of Signature.

Parameters:

  • data (String, Signature)

    Seed data to use to initialize the signature.

  • options (Hash) (defaults to: {})

Options Hash (options):



27
28
29
30
31
32
33
34
# File 'lib/arachni/support/signature.rb', line 27

def initialize( data, options = {} )
    @tokens  = tokenize( data )
    @options = options

    if @options[:threshold] && !@options[:threshold].is_a?( Numeric )
        fail ArgumentError, 'Option :threshold must be a number.'
    end
end

Instance Attribute Details

#tokensObject (readonly)

Returns the value of attribute tokens.



17
18
19
# File 'lib/arachni/support/signature.rb', line 17

def tokens
  @tokens
end

Instance Method Details

#==(other) ⇒ Object

Parameters:



92
93
94
# File 'lib/arachni/support/signature.rb', line 92

def ==( other )
    hash == other.hash
end

#differences(other) ⇒ Float

Returns Ratio of difference between signatures.

Parameters:

Returns:

  • (Float)

    Ratio of difference between signatures.



63
64
65
66
67
68
69
# File 'lib/arachni/support/signature.rb', line 63

def differences( other )
    return 1 if other.nil?
    return 0 if self == other

    ((tokens - other.tokens) | (other.tokens - tokens)).size /
        Float((other.tokens | tokens).size)
end

#dupSignature

Returns Copy of ‘self`.

Returns:



83
84
85
# File 'lib/arachni/support/signature.rb', line 83

def dup
    self.class.new( '' ).tap { |s| s.copy( tokens, @options ) }
end

#hashObject



87
88
89
# File 'lib/arachni/support/signature.rb', line 87

def hash
    tokens.hash
end

#refine(data) ⇒ Signature

Note:

The string will be tokenized based on whitespace.

Returns New, refined signature.

Parameters:

Returns:



55
56
57
# File 'lib/arachni/support/signature.rb', line 55

def refine( data )
    dup.refine!( data )
end

#refine!(data) ⇒ Signature

Note:

The string will be tokenized based on whitespace.

Returns ‘self`.

Parameters:

Returns:



43
44
45
46
# File 'lib/arachni/support/signature.rb', line 43

def refine!( data )
    @tokens &= tokenize( data )
    self
end

#similar?(other, threshold = @options[:threshold]) ⇒ Bool

Parameters:

  • other (Signature)
  • threshold (Integer) (defaults to: @options[:threshold])

    Threshold of differences.

Returns:

  • (Bool)


76
77
78
79
# File 'lib/arachni/support/signature.rb', line 76

def similar?( other, threshold = @options[:threshold] )
    fail 'No threshold given.' if !threshold
    self == other || differences( other ) < threshold
end