Class: Broke::Pingback

Inherits:
Broke
  • Object
show all
Defined in:
lib/broke/pingback.rb

Constant Summary collapse

PINGBACK_TYPE_REGULAR =
0
PINGBACK_TYPE_GOODWILL =
1
PINGBACK_TYPE_NEGATIVE =
2

Instance Method Summary collapse

Methods inherited from Broke

#charge, #pingback, #subscription, #token

Constructor Details

#initialize(parameters = {}, ipAddress = '') ⇒ Pingback

Returns a new instance of Pingback.



7
8
9
10
# File 'lib/broke/pingback.rb', line 7

def initialize(parameters = {}, ipAddress = '')
  @parameters = parameters
  @ipAddress = ipAddress
end

Instance Method Details

#getParameter(param) ⇒ Object



97
98
99
100
101
102
103
# File 'lib/broke/pingback.rb', line 97

def getParameter(param)
  if @parameters.include?(param)
    return @parameters[param]
  else 
    return nil
  end
end

#getPingbackUniqueIdObject



145
146
147
# File 'lib/broke/pingback.rb', line 145

def getPingbackUniqueId()
  self.getReferenceId().to_s + '_' + self.getType().to_s
end

#getProductIdObject



129
130
131
# File 'lib/broke/pingback.rb', line 129

def getProductId()
  self.getParameter('goodsid').to_s
end

#getProductPeriodLengthObject



133
134
135
# File 'lib/broke/pingback.rb', line 133

def getProductPeriodLength()
  self.getParameter('slength').to_i
end

#getProductPeriodTypeObject



137
138
139
# File 'lib/broke/pingback.rb', line 137

def getProductPeriodType()
  self.getParameter('speriod').to_s
end

#getReferenceIdObject



141
142
143
# File 'lib/broke/pingback.rb', line 141

def getReferenceId()
  self.getParameter('ref').to_s
end

#getTypeObject



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/broke/pingback.rb', line 105

def getType()
  pingbackTypes = [
    self.class::PINGBACK_TYPE_REGULAR,
    self.class::PINGBACK_TYPE_GOODWILL,
    self.class::PINGBACK_TYPE_NEGATIVE
  ]

  if @parameters.include?('type')
    if pingbackTypes.include?(@parameters['type'].to_i)
      return @parameters['type'].to_i
    end
  end

  return nil
end

#getUserIdObject



121
122
123
# File 'lib/broke/pingback.rb', line 121

def getUserId
  self.getParameter('uid').to_s
end

#getVirtualCurrencyAmountObject



125
126
127
# File 'lib/broke/pingback.rb', line 125

def getVirtualCurrencyAmount()
  self.getParameter('currency').to_i
end

#isCancelableObject



153
154
155
# File 'lib/broke/pingback.rb', line 153

def isCancelable()
  self.getType() == self.class::PINGBACK_TYPE_NEGATIVE
end

#isDeliverableObject



149
150
151
# File 'lib/broke/pingback.rb', line 149

def isDeliverable()
  self.getType() == self.class::PINGBACK_TYPE_REGULAR || self.getType() == self.class::PINGBACK_TYPE_GOODWILL
end

#isIpAddressValidObject



63
64
65
66
67
68
69
70
71
72
73
# File 'lib/broke/pingback.rb', line 63

def isIpAddressValid()
  ipsWhitelist = [
    '174.36.92.186',
    '174.36.96.66',
    '174.36.92.187',
    '174.36.92.192',
    '174.37.14.28'
  ]

  ipsWhitelist.include? @ipAddress
end

#isParametersValidObject



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/broke/pingback.rb', line 75

def isParametersValid()
  errorsNumber = 0
  requiredParams = []

  if self.class::getApiType() == self.class::API_VC
    requiredParams = ['uid', 'currency', 'type', 'ref', 'sig']
  elsif self.class::getApiType() == self.class::API_GOODS
    requiredParams = ['uid', 'goodsid', 'type', 'ref', 'sig']
  else
    requiredParams = ['uid', 'goodsid', 'type', 'ref', 'sig']
  end

  requiredParams.each do |field|
    if !@parameters.include?(field) # || $parameters[field] === ''
      self.appendToErrors("Parameter #{field} is missing")
      errorsNumber += 1
    end
  end

  errorsNumber == 0
end

#isSignatureValidObject



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/broke/pingback.rb', line 32

def isSignatureValid()
  signatureParamsToSign = {}

  if self.class::getApiType() == self.class::API_VC
    signatureParams = Array['uid', 'currency', 'type', 'ref']
  elsif self.class::getApiType() == self.class::API_GOODS
    signatureParams = Array['uid', 'goodsid', 'slength', 'speriod', 'type', 'ref']
  else
    signatureParams = Array['uid', 'goodsid', 'type', 'ref']
    @parameters['sign_version'] = self.class::SIGNATURE_VERSION_2

  end

  if !@parameters.include?('sign_version') || @parameters['sign_version'].to_i == self.class::SIGNATURE_VERSION_1
    signatureParams.each do |field|
      signatureParamsToSign[field] = @parameters.include?(field) ? @parameters[field] : nil
    end
    
    @parameters['sign_version'] = self.class::SIGNATURE_VERSION_1

  else
    signatureParamsToSign = @parameters
  end

  signatureCalculated = self.calculateSignature(signatureParamsToSign, self.class::api_key, @parameters['sign_version'])
  
  signature = @parameters.include?('sig') ? @parameters['sig'] : nil

  signature == signatureCalculated
end

#validate(skipIpWhitelistCheck = false) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/broke/pingback.rb', line 12

def validate(skipIpWhitelistCheck = false)
  validated = false

  if self.isParametersValid()
    if self.isIpAddressValid() || skipIpWhitelistCheck
      if self.isSignatureValid()
        validated = true
      else 
        self.appendToErrors('Wrong signature')
      end
    else
      self.appendToErrors('IP address is not whitelisted')
    end
  else
    self.appendToErrors('Missing parameters')
  end

  validated
end