Class: Tinypass::AccessToken

Inherits:
Object
  • Object
show all
Defined in:
lib/tinypass/token/access_token.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(rid_or_token_data, expiration_in_seconds = nil, early_expiration_in_seconds = nil) ⇒ AccessToken



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# File 'lib/tinypass/token/access_token.rb', line 5

def initialize(rid_or_token_data, expiration_in_seconds = nil, early_expiration_in_seconds = nil)
  if rid_or_token_data.kind_of?(TokenData)
    self.token_data = rid_or_token_data
    return
  end

  expiration_in_seconds ||= 0
  early_expiration_in_seconds ||= 0

  token_data = TokenData.new
  token_data[TokenData::RID] = rid_or_token_data.to_s
  token_data[TokenData::EX] = TokenData.convert_to_epoch_seconds(expiration_in_seconds)
  token_data[TokenData::EARLY_EX] = TokenData.convert_to_epoch_seconds(early_expiration_in_seconds)
  self.token_data = token_data
end

Instance Attribute Details

#access_stateObject

Returns the value of attribute access_state.



3
4
5
# File 'lib/tinypass/token/access_token.rb', line 3

def access_state
  @access_state
end

#token_dataObject

Returns the value of attribute token_data.



3
4
5
# File 'lib/tinypass/token/access_token.rb', line 3

def token_data
  @token_data
end

Instance Method Details

#access_granted?(client_ip = nil) ⇒ Boolean



80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/tinypass/token/access_token.rb', line 80

def access_granted?(client_ip = nil)
  if expiration_in_seconds == -1
    # special case. RID_NOT_FOUND
    @access_state = AccessState::RID_NOT_FOUND if @access_state != AccessState::NO_TOKENS_FOUND
    return false
  end

  if Utils::valid_ip?(client_ip) && ips.any? && !ips.include?(client_ip)
    @access_state = AccessState::CLIENT_IP_DOES_NOT_MATCH_TOKEN
    return false
  end

  if metered?
    if trial_period_active?
      @access_state = AccessState::METERED_IN_TRIAL
      return true
    end

    if lockout_period_active?
      @access_state = AccessState::METERED_IN_LOCKOUT
    else
      @access_state = AccessState::METERED_TRIAL_DEAD
    end

    return false
  end

  if expired?
    @access_state = AccessState::EXPIRED
    return false
  end

  @access_state = AccessState::ACCESS_GRANTED
  true
end

#access_idObject



25
26
27
# File 'lib/tinypass/token/access_token.rb', line 25

def access_id
  token_data[TokenData::ACCESS_ID]
end

#early_expiration_in_secondsObject Also known as: early_expiration_in_secs



38
39
40
# File 'lib/tinypass/token/access_token.rb', line 38

def early_expiration_in_seconds
  token_data.fetch(TokenData::EARLY_EX, 0)
end

#expiration_in_secondsObject Also known as: expiration_in_secs



33
34
35
# File 'lib/tinypass/token/access_token.rb', line 33

def expiration_in_seconds
  token_data.fetch(TokenData::EX, 0)
end

#expired?Boolean



138
139
140
141
142
143
144
145
# File 'lib/tinypass/token/access_token.rb', line 138

def expired?
  expiration = early_expiration_in_seconds
  expiration = expiration_in_seconds if expiration == 0

  return false if expiration == 0

  expiration <= Time.now.to_i
end

#ipsObject



71
72
73
# File 'lib/tinypass/token/access_token.rb', line 71

def ips
  token_data.fetch(TokenData::IPS, [])
end

#lockout_end_time_secsObject



47
48
49
# File 'lib/tinypass/token/access_token.rb', line 47

def lockout_end_time_secs
  token_data.fetch(TokenData::METER_LOCKOUT_ENDTIME, 0)
end

#lockout_period_active?Boolean



131
132
133
134
135
136
# File 'lib/tinypass/token/access_token.rb', line 131

def lockout_period_active?
  return false unless metered?
  return false if trial_period_active?

  return Time.now.to_i <= lockout_end_time_secs
end

#meter_typeObject



67
68
69
# File 'lib/tinypass/token/access_token.rb', line 67

def meter_type
  token_data.fetch(TokenData::METER_TYPE, 0)
end

#meter_view_based?Boolean



63
64
65
# File 'lib/tinypass/token/access_token.rb', line 63

def meter_view_based?
  metered? && token_data[TokenData::METER_TRIAL_MAX_ACCESS_ATTEMPTS]
end

#metered?Boolean



59
60
61
# File 'lib/tinypass/token/access_token.rb', line 59

def metered?
  meter_type != 0
end

#ridObject



21
22
23
# File 'lib/tinypass/token/access_token.rb', line 21

def rid
  token_data.rid
end

#trial_dead?Boolean



147
148
149
# File 'lib/tinypass/token/access_token.rb', line 147

def trial_dead?
  !lockout_period_active? && !trial_period_active?
end

#trial_end_time_secsObject



43
44
45
# File 'lib/tinypass/token/access_token.rb', line 43

def trial_end_time_secs
  token_data.fetch(TokenData::METER_TRIAL_ENDTIME, 0)
end

#trial_period_active?Boolean



116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'lib/tinypass/token/access_token.rb', line 116

def trial_period_active?
  return false unless metered?

  if meter_type == TokenData::METER_STRICT
    return Time.now.to_i <= trial_end_time_secs
  end

  if meter_view_based?
    return trial_view_count <= trial_view_limit && Time.now.to_i <= trial_end_time_secs
  end

  # unknown meter
  return trial_end_time_secs == 0 || Time.now.to_i <= trial_end_time_secs
end

#trial_view_countObject



51
52
53
# File 'lib/tinypass/token/access_token.rb', line 51

def trial_view_count
  token_data.fetch(TokenData::METER_TRIAL_ACCESS_ATTEMPTS, 0)
end

#trial_view_limitObject



55
56
57
# File 'lib/tinypass/token/access_token.rb', line 55

def trial_view_limit
  token_data.fetch(TokenData::METER_TRIAL_MAX_ACCESS_ATTEMPTS, 0)
end

#uidObject



29
30
31
# File 'lib/tinypass/token/access_token.rb', line 29

def uid
  token_data.fetch(TokenData::UID, 0)
end