Class: Aspera::OAuth::Factory

Inherits:
Object
  • Object
show all
Includes:
Singleton
Defined in:
lib/aspera/oauth/factory.rb

Overview

Factory to create tokens and manage their cache

Constant Summary collapse

TOKEN_FIELD =
'access_token'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#parametersObject (readonly)

Returns the value of attribute parameters.



69
70
71
# File 'lib/aspera/oauth/factory.rb', line 69

def parameters
  @parameters
end

Class Method Details

.bearer?(token) ⇒ Boolean

Returns:

  • (Boolean)


25
26
27
# File 'lib/aspera/oauth/factory.rb', line 25

def bearer?(token)
  return token.start_with?(BEARER_PREFIX)
end

.bearer_build(token) ⇒ Object



21
22
23
# File 'lib/aspera/oauth/factory.rb', line 21

def bearer_build(token)
  return "#{BEARER_PREFIX}#{token}"
end

.bearer_extract(token) ⇒ Object



29
30
31
32
# File 'lib/aspera/oauth/factory.rb', line 29

def bearer_extract(token)
  Aspera.assert(bearer?(token)){'not a bearer token, wrong prefix'}
  return token[BEARER_PREFIX.length..-1]
end

.cache_id(url, creator_class, *params) ⇒ Object

Returns a cache identifier.

Returns:

  • a cache identifier



35
36
37
38
39
40
41
42
# File 'lib/aspera/oauth/factory.rb', line 35

def cache_id(url, creator_class, *params)
  return IdGenerator.from_list([
    PERSIST_CATEGORY_TOKEN,
    url,
    Factory.class_to_id(creator_class),
    *params
  ].flatten)
end

.class_to_id(creator_class) ⇒ Object

Returns snake version of class name.

Returns:

  • snake version of class name



45
46
47
# File 'lib/aspera/oauth/factory.rb', line 45

def class_to_id(creator_class)
  return creator_class.name.split('::').last.capital_to_snake.to_sym
end

Instance Method Details

#create(**parameters) ⇒ Object

Returns one of the registered creators for the given create type.

Returns:

  • one of the registered creators for the given create type



158
159
160
161
162
163
164
# File 'lib/aspera/oauth/factory.rb', line 158

def create(**parameters)
  Aspera.assert_type(parameters, Hash)
  id = parameters[:grant_method]
  Aspera.assert(@token_type_classes.key?(id)){"token grant method unknown: '#{id}'"}
  create_parameters = parameters.reject { |k, _v| k.eql?(:grant_method) }
  @token_type_classes[id].new(**create_parameters)
end

#decode_token(token) ⇒ Object

decode token using all registered decoders



138
139
140
141
142
143
144
# File 'lib/aspera/oauth/factory.rb', line 138

def decode_token(token)
  @decoders.each do |decoder|
    result = decoder.call(token) rescue nil
    return result unless result.nil?
  end
  return nil
end

#flush_tokensObject

delete all existing tokens



90
91
92
# File 'lib/aspera/oauth/factory.rb', line 90

def flush_tokens
  persist_mgr.garbage_collect(PERSIST_CATEGORY_TOKEN)
end

#get_token_info(id) ⇒ Hash

get token information from cache

Parameters:

  • id (String)

    identifier of token

Returns:

  • (Hash)

    token internal information , including Date object for ‘expiration_date`



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/aspera/oauth/factory.rb', line 108

def get_token_info(id)
  token_raw_string = persist_mgr.get(id)
  return nil if token_raw_string.nil?
  token_data = JSON.parse(token_raw_string)
  Aspera.assert_type(token_data, Hash)
  decoded_token = decode_token(token_data[TOKEN_FIELD])
  info = { data: token_data }
  Log.log.debug{Log.dump('decoded_token', decoded_token)}
  if decoded_token.is_a?(Hash)
    info[:decoded] = decoded_token
    # TODO: move date decoding to token decoder ?
    expiration_date =
      if    decoded_token['expires_at'].is_a?(String) then DateTime.parse(decoded_token['expires_at']).to_time
      elsif decoded_token['exp'].is_a?(Integer)       then Time.at(decoded_token['exp'])
      end
    unless expiration_date.nil?
      info[:expiration] = expiration_date
      info[:ttl_sec] = expiration_date - Time.now
      info[:expired] = info[:ttl_sec] < @parameters[:token_expiration_guard_sec]
    end
  end
  return info
end

#persist_mgrObject



77
78
79
80
81
82
83
84
85
86
87
# File 'lib/aspera/oauth/factory.rb', line 77

def persist_mgr
  if @persist.nil?
    # use OAuth::Factory.instance.persist_mgr=PersistencyFolder.new)
    Log.log.debug('Not using persistency')
    # create NULL persistency class
    @persist = Class.new do
      def get(_x); nil; end; def delete(_x); nil; end; def put(_x, _y); nil; end; def garbage_collect(_x, _y); nil; end # rubocop:disable Layout/EmptyLineBetweenDefs, Style/Semicolon, Layout/LineLength
    end.new
  end
  return @persist
end

#persist_mgr=(manager) ⇒ Object



71
72
73
74
75
# File 'lib/aspera/oauth/factory.rb', line 71

def persist_mgr=(manager)
  @persist = manager
  # cleanup expired tokens
  @persist.garbage_collect(PERSIST_CATEGORY_TOKEN, @parameters[:token_cache_expiry_sec])
end

#persisted_tokensObject



94
95
96
97
98
99
100
101
102
103
# File 'lib/aspera/oauth/factory.rb', line 94

def persisted_tokens
  data = persist_mgr.current_items(PERSIST_CATEGORY_TOKEN)
  data.each.map do |k, v|
    info = {id: k}
    info.merge!(JSON.parse(v)) rescue nil
    d = decode_token(info.delete(TOKEN_FIELD))
    info.merge(d) if d
    info
  end
end

#register_decoder(method) ⇒ Object

register a bearer token decoder, mainly to inspect expiry date



133
134
135
# File 'lib/aspera/oauth/factory.rb', line 133

def register_decoder(method)
  @decoders.push(method)
end

#register_token_creator(creator_class) ⇒ Object

register a token creation method

Parameters:

  • id

    creation type from field :grant_method in constructor

  • lambda_create

    called to create token

  • id_create

    called to generate unique id for token, for cache



150
151
152
153
154
155
# File 'lib/aspera/oauth/factory.rb', line 150

def register_token_creator(creator_class)
  Aspera.assert_type(creator_class, Class)
  id = Factory.class_to_id(creator_class)
  Log.log.debug{"registering token creator #{id}"}
  @token_type_classes[id] = creator_class
end