apisonator 2.100.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +317 -0
  3. data/Gemfile +11 -0
  4. data/Gemfile.base +65 -0
  5. data/Gemfile.lock +319 -0
  6. data/Gemfile.on_prem +1 -0
  7. data/Gemfile.on_prem.lock +297 -0
  8. data/LICENSE +202 -0
  9. data/NOTICE +15 -0
  10. data/README.md +230 -0
  11. data/Rakefile +287 -0
  12. data/apisonator.gemspec +47 -0
  13. data/app/api/api.rb +13 -0
  14. data/app/api/internal/alert_limits.rb +32 -0
  15. data/app/api/internal/application_keys.rb +49 -0
  16. data/app/api/internal/application_referrer_filters.rb +43 -0
  17. data/app/api/internal/applications.rb +77 -0
  18. data/app/api/internal/errors.rb +54 -0
  19. data/app/api/internal/events.rb +42 -0
  20. data/app/api/internal/internal.rb +104 -0
  21. data/app/api/internal/metrics.rb +40 -0
  22. data/app/api/internal/service_tokens.rb +46 -0
  23. data/app/api/internal/services.rb +58 -0
  24. data/app/api/internal/stats.rb +42 -0
  25. data/app/api/internal/usagelimits.rb +62 -0
  26. data/app/api/internal/utilization.rb +23 -0
  27. data/bin/3scale_backend +223 -0
  28. data/bin/3scale_backend_worker +26 -0
  29. data/config.ru +4 -0
  30. data/config/puma.rb +192 -0
  31. data/config/schedule.rb +9 -0
  32. data/ext/mkrf_conf.rb +64 -0
  33. data/lib/3scale/backend.rb +67 -0
  34. data/lib/3scale/backend/alert_limit.rb +56 -0
  35. data/lib/3scale/backend/alerts.rb +137 -0
  36. data/lib/3scale/backend/analytics/kinesis.rb +3 -0
  37. data/lib/3scale/backend/analytics/kinesis/adapter.rb +180 -0
  38. data/lib/3scale/backend/analytics/kinesis/exporter.rb +86 -0
  39. data/lib/3scale/backend/analytics/kinesis/job.rb +135 -0
  40. data/lib/3scale/backend/analytics/redshift.rb +3 -0
  41. data/lib/3scale/backend/analytics/redshift/adapter.rb +367 -0
  42. data/lib/3scale/backend/analytics/redshift/importer.rb +83 -0
  43. data/lib/3scale/backend/analytics/redshift/job.rb +33 -0
  44. data/lib/3scale/backend/application.rb +330 -0
  45. data/lib/3scale/backend/application_events.rb +76 -0
  46. data/lib/3scale/backend/background_job.rb +65 -0
  47. data/lib/3scale/backend/configurable.rb +20 -0
  48. data/lib/3scale/backend/configuration.rb +151 -0
  49. data/lib/3scale/backend/configuration/loader.rb +42 -0
  50. data/lib/3scale/backend/constants.rb +19 -0
  51. data/lib/3scale/backend/cors.rb +84 -0
  52. data/lib/3scale/backend/distributed_lock.rb +67 -0
  53. data/lib/3scale/backend/environment.rb +21 -0
  54. data/lib/3scale/backend/error_storage.rb +52 -0
  55. data/lib/3scale/backend/errors.rb +343 -0
  56. data/lib/3scale/backend/event_storage.rb +120 -0
  57. data/lib/3scale/backend/experiment.rb +84 -0
  58. data/lib/3scale/backend/extensions.rb +5 -0
  59. data/lib/3scale/backend/extensions/array.rb +19 -0
  60. data/lib/3scale/backend/extensions/hash.rb +26 -0
  61. data/lib/3scale/backend/extensions/nil_class.rb +13 -0
  62. data/lib/3scale/backend/extensions/redis.rb +44 -0
  63. data/lib/3scale/backend/extensions/string.rb +13 -0
  64. data/lib/3scale/backend/extensions/time.rb +110 -0
  65. data/lib/3scale/backend/failed_jobs_scheduler.rb +141 -0
  66. data/lib/3scale/backend/job_fetcher.rb +122 -0
  67. data/lib/3scale/backend/listener.rb +728 -0
  68. data/lib/3scale/backend/listener_metrics.rb +99 -0
  69. data/lib/3scale/backend/logging.rb +48 -0
  70. data/lib/3scale/backend/logging/external.rb +44 -0
  71. data/lib/3scale/backend/logging/external/impl.rb +93 -0
  72. data/lib/3scale/backend/logging/external/impl/airbrake.rb +66 -0
  73. data/lib/3scale/backend/logging/external/impl/bugsnag.rb +69 -0
  74. data/lib/3scale/backend/logging/external/impl/default.rb +18 -0
  75. data/lib/3scale/backend/logging/external/resque.rb +57 -0
  76. data/lib/3scale/backend/logging/logger.rb +18 -0
  77. data/lib/3scale/backend/logging/middleware.rb +62 -0
  78. data/lib/3scale/backend/logging/middleware/json_writer.rb +21 -0
  79. data/lib/3scale/backend/logging/middleware/text_writer.rb +60 -0
  80. data/lib/3scale/backend/logging/middleware/writer.rb +143 -0
  81. data/lib/3scale/backend/logging/worker.rb +107 -0
  82. data/lib/3scale/backend/manifest.rb +80 -0
  83. data/lib/3scale/backend/memoizer.rb +277 -0
  84. data/lib/3scale/backend/metric.rb +275 -0
  85. data/lib/3scale/backend/metric/collection.rb +91 -0
  86. data/lib/3scale/backend/oauth.rb +4 -0
  87. data/lib/3scale/backend/oauth/token.rb +26 -0
  88. data/lib/3scale/backend/oauth/token_key.rb +30 -0
  89. data/lib/3scale/backend/oauth/token_storage.rb +313 -0
  90. data/lib/3scale/backend/oauth/token_value.rb +25 -0
  91. data/lib/3scale/backend/period.rb +3 -0
  92. data/lib/3scale/backend/period/boundary.rb +107 -0
  93. data/lib/3scale/backend/period/cache.rb +28 -0
  94. data/lib/3scale/backend/period/period.rb +402 -0
  95. data/lib/3scale/backend/queue_storage.rb +16 -0
  96. data/lib/3scale/backend/rack.rb +49 -0
  97. data/lib/3scale/backend/rack/exception_catcher.rb +136 -0
  98. data/lib/3scale/backend/rack/internal_error_catcher.rb +23 -0
  99. data/lib/3scale/backend/rack/prometheus.rb +19 -0
  100. data/lib/3scale/backend/saas.rb +6 -0
  101. data/lib/3scale/backend/saas_analytics.rb +4 -0
  102. data/lib/3scale/backend/server.rb +30 -0
  103. data/lib/3scale/backend/server/falcon.rb +52 -0
  104. data/lib/3scale/backend/server/puma.rb +71 -0
  105. data/lib/3scale/backend/service.rb +317 -0
  106. data/lib/3scale/backend/service_token.rb +97 -0
  107. data/lib/3scale/backend/stats.rb +8 -0
  108. data/lib/3scale/backend/stats/aggregator.rb +170 -0
  109. data/lib/3scale/backend/stats/aggregators/base.rb +72 -0
  110. data/lib/3scale/backend/stats/aggregators/response_code.rb +58 -0
  111. data/lib/3scale/backend/stats/aggregators/usage.rb +34 -0
  112. data/lib/3scale/backend/stats/bucket_reader.rb +135 -0
  113. data/lib/3scale/backend/stats/bucket_storage.rb +108 -0
  114. data/lib/3scale/backend/stats/cleaner.rb +195 -0
  115. data/lib/3scale/backend/stats/codes_commons.rb +14 -0
  116. data/lib/3scale/backend/stats/delete_job_def.rb +60 -0
  117. data/lib/3scale/backend/stats/key_generator.rb +73 -0
  118. data/lib/3scale/backend/stats/keys.rb +104 -0
  119. data/lib/3scale/backend/stats/partition_eraser_job.rb +58 -0
  120. data/lib/3scale/backend/stats/partition_generator_job.rb +46 -0
  121. data/lib/3scale/backend/stats/period_commons.rb +34 -0
  122. data/lib/3scale/backend/stats/stats_parser.rb +141 -0
  123. data/lib/3scale/backend/stats/storage.rb +113 -0
  124. data/lib/3scale/backend/statsd.rb +14 -0
  125. data/lib/3scale/backend/storable.rb +35 -0
  126. data/lib/3scale/backend/storage.rb +40 -0
  127. data/lib/3scale/backend/storage_async.rb +4 -0
  128. data/lib/3scale/backend/storage_async/async_redis.rb +21 -0
  129. data/lib/3scale/backend/storage_async/client.rb +205 -0
  130. data/lib/3scale/backend/storage_async/pipeline.rb +79 -0
  131. data/lib/3scale/backend/storage_async/resque_extensions.rb +30 -0
  132. data/lib/3scale/backend/storage_helpers.rb +278 -0
  133. data/lib/3scale/backend/storage_key_helpers.rb +9 -0
  134. data/lib/3scale/backend/storage_sync.rb +43 -0
  135. data/lib/3scale/backend/transaction.rb +62 -0
  136. data/lib/3scale/backend/transactor.rb +177 -0
  137. data/lib/3scale/backend/transactor/limit_headers.rb +54 -0
  138. data/lib/3scale/backend/transactor/notify_batcher.rb +139 -0
  139. data/lib/3scale/backend/transactor/notify_job.rb +47 -0
  140. data/lib/3scale/backend/transactor/process_job.rb +33 -0
  141. data/lib/3scale/backend/transactor/report_job.rb +84 -0
  142. data/lib/3scale/backend/transactor/status.rb +236 -0
  143. data/lib/3scale/backend/transactor/usage_report.rb +182 -0
  144. data/lib/3scale/backend/usage.rb +63 -0
  145. data/lib/3scale/backend/usage_limit.rb +115 -0
  146. data/lib/3scale/backend/use_cases/provider_key_change_use_case.rb +60 -0
  147. data/lib/3scale/backend/util.rb +17 -0
  148. data/lib/3scale/backend/validators.rb +26 -0
  149. data/lib/3scale/backend/validators/base.rb +36 -0
  150. data/lib/3scale/backend/validators/key.rb +17 -0
  151. data/lib/3scale/backend/validators/limits.rb +57 -0
  152. data/lib/3scale/backend/validators/oauth_key.rb +15 -0
  153. data/lib/3scale/backend/validators/oauth_setting.rb +15 -0
  154. data/lib/3scale/backend/validators/redirect_uri.rb +33 -0
  155. data/lib/3scale/backend/validators/referrer.rb +60 -0
  156. data/lib/3scale/backend/validators/service_state.rb +15 -0
  157. data/lib/3scale/backend/validators/state.rb +15 -0
  158. data/lib/3scale/backend/version.rb +5 -0
  159. data/lib/3scale/backend/views/oauth_access_tokens.builder +14 -0
  160. data/lib/3scale/backend/views/oauth_app_id_by_token.builder +4 -0
  161. data/lib/3scale/backend/worker.rb +87 -0
  162. data/lib/3scale/backend/worker_async.rb +88 -0
  163. data/lib/3scale/backend/worker_metrics.rb +44 -0
  164. data/lib/3scale/backend/worker_sync.rb +32 -0
  165. data/lib/3scale/bundler_shim.rb +17 -0
  166. data/lib/3scale/prometheus_server.rb +10 -0
  167. data/lib/3scale/tasks/connectivity.rake +41 -0
  168. data/lib/3scale/tasks/helpers.rb +3 -0
  169. data/lib/3scale/tasks/helpers/environment.rb +23 -0
  170. data/lib/3scale/tasks/stats.rake +131 -0
  171. data/lib/3scale/tasks/swagger.rake +46 -0
  172. data/licenses.xml +1215 -0
  173. metadata +227 -0
@@ -0,0 +1,63 @@
1
+ module ThreeScale
2
+ module Backend
3
+ class Usage
4
+ class << self
5
+ def application_usage(application, timestamp)
6
+ usage(application, timestamp) do |metric_id, instance_period|
7
+ Stats::Keys.application_usage_value_key(
8
+ application.service_id, application.id, metric_id, instance_period)
9
+ end
10
+ end
11
+
12
+ def is_set?(usage_str)
13
+ usage_str && usage_str[0] == '#'.freeze
14
+ end
15
+
16
+ def get_from(usage_str, current_value = 0)
17
+ if is_set? usage_str
18
+ usage_str[1..-1].to_i
19
+ else
20
+ # Note: this relies on the fact that NilClass#to_i returns 0
21
+ # and String#to_i returns 0 on non-numeric contents.
22
+ current_value + usage_str.to_i
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def usage(obj, timestamp)
29
+ # The timestamp does not change, so we can generate all the
30
+ # instantiated periods just once.
31
+ # This is important. Without this, the code can generate many instance
32
+ # periods and it ends up consuming a significant part of the total CPU
33
+ # time.
34
+ instance_periods = Period::instance_periods_for_ts(timestamp)
35
+
36
+ pairs = metric_period_pairs obj.usage_limits
37
+ return {} if pairs.empty?
38
+
39
+ keys = pairs.map do |(metric_id, period)|
40
+ yield metric_id, instance_periods[period]
41
+ end
42
+
43
+ values = {}
44
+ pairs.zip(storage.mget(keys)) do |(metric_id, period), value|
45
+ values[period] ||= {}
46
+ values[period][metric_id] = value.to_i
47
+ end
48
+ values
49
+ end
50
+
51
+ def metric_period_pairs(usage_limits)
52
+ usage_limits.map do |usage_limit|
53
+ [usage_limit.metric_id, usage_limit.period]
54
+ end
55
+ end
56
+
57
+ def storage
58
+ Storage.instance
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,115 @@
1
+ module ThreeScale
2
+ module Backend
3
+ class UsageLimit
4
+ include Storable
5
+
6
+ PERIODS = (Period::ALL_DESC - [Period::Second]).freeze
7
+
8
+ attr_accessor :service_id, :plan_id, :metric_id, :period, :value
9
+
10
+ def metric_name
11
+ Metric.load_name(service_id, metric_id)
12
+ end
13
+
14
+ # NOTE: validate can ONLY be called with the guarantee that usage_data
15
+ # will have a matching period key.
16
+ def validate(usage_data)
17
+ usage_data[period][metric_id].to_i <= value
18
+ end
19
+
20
+ class << self
21
+ include Memoizer::Decorator
22
+
23
+ def load_all(service_id, plan_id)
24
+ metric_ids = Metric.load_all_ids(service_id)
25
+ return metric_ids if metric_ids.empty?
26
+
27
+ results = []
28
+ with_pairs_and_values service_id, plan_id, metric_ids do |pair, value|
29
+ value and results << new(service_id: service_id,
30
+ plan_id: plan_id,
31
+ metric_id: pair[0],
32
+ period: pair[1],
33
+ value: value.to_i)
34
+ end
35
+ results
36
+ end
37
+ memoize :load_all
38
+
39
+ def load_value(service_id, plan_id, metric_id, period)
40
+ raw_value = storage.get(key(service_id, plan_id, metric_id, period))
41
+ raw_value and raw_value.to_i
42
+ end
43
+
44
+ def save(attributes)
45
+ service_id = attributes[:service_id]
46
+ plan_id = attributes[:plan_id]
47
+ prefix = key_prefix(service_id, plan_id, attributes[:metric_id])
48
+ storage.pipelined do
49
+ PERIODS.each do |period|
50
+ p_val = attributes[period.to_sym]
51
+ p_val and storage.set(key_for_period(prefix, period), p_val)
52
+ end
53
+ end
54
+ clear_cache(service_id, plan_id)
55
+ end
56
+
57
+ def delete(service_id, plan_id, metric_id, period)
58
+ storage.del(key(service_id, plan_id, metric_id, period))
59
+ clear_cache(service_id, plan_id)
60
+ end
61
+
62
+ private
63
+
64
+ def key(service_id, plan_id, metric_id, period)
65
+ key_for_period(key_prefix(service_id, plan_id, metric_id), period)
66
+ end
67
+
68
+ # NOTE: metric_id == nil is an accepted value
69
+ def key_prefix(service_id, plan_id, metric_id = :none)
70
+ "usage_limit/service_id:#{service_id}/plan_id:#{plan_id}/metric_id:" \
71
+ "#{"#{metric_id}/" if metric_id != :none}"
72
+ end
73
+
74
+ # receives a key prefix and a pair [metric_id, period]
75
+ def key_for_pair(key_pre, pair)
76
+ encode_key("#{key_pre}#{pair[0]}/#{pair[1]}")
77
+ end
78
+
79
+ def key_for_period(key_pre, period)
80
+ encode_key(key_pre + period.to_s)
81
+ end
82
+
83
+ # yields [pair(metric_id, period), value]
84
+ def with_pairs_and_values(service_id, plan_id, metric_ids, &blk)
85
+ pairs, values = get_pairs_and_values_for service_id, plan_id, metric_ids
86
+ pairs.zip values, &blk
87
+ end
88
+
89
+ def get_pairs_and_values_for(service_id, plan_id, metric_ids)
90
+ pairs, keys = generate_pairs_and_keys_for service_id, plan_id, metric_ids
91
+
92
+ [pairs, storage.mget(keys)]
93
+ end
94
+
95
+ def generate_pairs_and_keys_for(service_id, plan_id, metric_ids)
96
+ pairs = []
97
+ keys = []
98
+
99
+ prefix = key_prefix service_id, plan_id
100
+ metric_ids.product PERIODS do |pair|
101
+ pairs << pair
102
+ keys << key_for_pair(prefix, pair)
103
+ end
104
+
105
+ [pairs, keys]
106
+ end
107
+
108
+ def clear_cache(service_id, plan_id)
109
+ Memoizer.clear(Memoizer.build_key(self, :load_all, service_id, plan_id))
110
+ end
111
+ end
112
+
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,60 @@
1
+ module ThreeScale
2
+ module Backend
3
+ class ProviderKeyChangeUseCase
4
+
5
+ def initialize(old_key, new_key)
6
+ @old_key = old_key
7
+ @new_key = new_key
8
+
9
+ validate_input
10
+ end
11
+
12
+ def process
13
+ default_service_id = Service.default_id(@old_key)
14
+
15
+ # Change the provider key on all the services and
16
+ # add all the services to the new provider
17
+ service_ids.each do |service_id|
18
+ storage.set Service.storage_key(service_id, :provider_key), @new_key
19
+ storage.sadd Service.storage_key_by_provider(@new_key, :ids), service_id
20
+ end
21
+
22
+ # Set the default service id to the new provider
23
+ storage.set Service.storage_key_by_provider(@new_key, :id), default_service_id
24
+
25
+ # Remove the old provider key and services associated to it
26
+ storage.del Service.storage_key_by_provider(@old_key, :id)
27
+ storage.del Service.storage_key_by_provider(@old_key, :ids)
28
+
29
+ clear_cache service_ids
30
+ end
31
+
32
+ private
33
+
34
+ def service_ids
35
+ @service_ids ||= Service.list(@old_key)
36
+ end
37
+
38
+ def validate_input
39
+ raise InvalidProviderKeys if [@old_key, @new_key].
40
+ any?{ |key| key.nil? || key.empty? } || @old_key == @new_key
41
+
42
+ raise ProviderKeyExists, @new_key if Service.list(@new_key).size != 0
43
+
44
+ raise ProviderKeyNotFound, @old_key if service_ids.size == 0
45
+ end
46
+
47
+ def storage
48
+ Service.storage
49
+ end
50
+
51
+ def clear_cache(service_ids)
52
+ service_ids.each do |service_id|
53
+ Service.clear_cache(@old_key, service_id)
54
+ Service.clear_cache(@new_key, service_id)
55
+ end
56
+ end
57
+
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,17 @@
1
+ require 'pathname'
2
+ require 'etc'
3
+
4
+ module ThreeScale
5
+ module Backend
6
+ module Util
7
+ def self.number_of_cpus
8
+ Etc.nprocessors
9
+ end
10
+
11
+ def self.root_dir
12
+ File.expand_path(File.join(Array.new(4, '..'.freeze)),
13
+ Pathname.new(__FILE__).realpath)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ require '3scale/backend/validators/base'
2
+ require '3scale/backend/validators/oauth_setting'
3
+ require '3scale/backend/validators/key'
4
+ require '3scale/backend/validators/oauth_key'
5
+ require '3scale/backend/validators/limits'
6
+ require '3scale/backend/validators/redirect_uri'
7
+ require '3scale/backend/validators/referrer'
8
+ require '3scale/backend/validators/state'
9
+ require '3scale/backend/validators/service_state'
10
+
11
+ module ThreeScale
12
+ module Backend
13
+ module Validators
14
+ COMMON_VALIDATORS = [Validators::Referrer,
15
+ Validators::State, # application state
16
+ Validators::ServiceState, # service state
17
+ Validators::Limits].freeze
18
+
19
+ VALIDATORS = ([Validators::Key] + COMMON_VALIDATORS).freeze
20
+
21
+ OAUTH_VALIDATORS = ([Validators::OauthSetting,
22
+ Validators::OauthKey,
23
+ Validators::RedirectURI] + COMMON_VALIDATORS).freeze
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,36 @@
1
+ module ThreeScale
2
+ module Backend
3
+ module Validators
4
+ class Base
5
+ def self.apply(status, params)
6
+ new(status, params).apply
7
+ end
8
+
9
+ def initialize(status, params)
10
+ @status = status
11
+ @params = params
12
+ end
13
+
14
+ attr_reader :status
15
+ attr_reader :params
16
+
17
+ def service
18
+ @service ||= Service.load_by_id!(status.service_id)
19
+ end
20
+
21
+ def application
22
+ status.application
23
+ end
24
+
25
+ def succeed!
26
+ true
27
+ end
28
+
29
+ def fail!(error)
30
+ status.reject!(error)
31
+ false
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,17 @@
1
+ module ThreeScale
2
+ module Backend
3
+ module Validators
4
+ class Key < Base
5
+ def apply
6
+ if service.backend_version.to_i == 1 ||
7
+ application.has_no_keys? ||
8
+ application.has_key?(params[:app_key])
9
+ succeed!
10
+ else
11
+ fail!(ApplicationKeyInvalid.new(params[:app_key]))
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,57 @@
1
+ module ThreeScale
2
+ module Backend
3
+ module Validators
4
+ class Limits < Base
5
+
6
+ def apply
7
+ valid_limits? ? succeed! : fail!(LimitsExceeded.new)
8
+ end
9
+
10
+ private
11
+
12
+ def process(values, raw_usage)
13
+ if raw_usage
14
+ metrics = Metric.load_all(status.service_id)
15
+ usage = metrics.process_usage(raw_usage, status.flat_usage)
16
+ values = filter_metrics(values, usage.keys)
17
+ values = increment_or_set(values, usage)
18
+ end
19
+
20
+ values
21
+ end
22
+
23
+ def valid_limits?
24
+ processed_values = process(status.values, params[:usage])
25
+ status.application.usage_limits.all? do |limit|
26
+ limit.validate(processed_values)
27
+ end
28
+ end
29
+
30
+ def filter_metrics(values, metric_ids)
31
+ values.inject({}) do |memo, (period, usage)|
32
+ memo[period] = slice_hash(usage, metric_ids)
33
+ memo
34
+ end
35
+ end
36
+
37
+ def increment_or_set(values, usage)
38
+ usage.inject(values) do |memo, (metric_id, value)|
39
+ memo.keys.each do |period|
40
+ memo[period][metric_id] = Usage.get_from value, memo[period][metric_id].to_i
41
+ end
42
+
43
+ memo
44
+ end
45
+ end
46
+
47
+ # TODO: Move this to extensions/hash.rb
48
+ def slice_hash(hash, keys)
49
+ keys.inject({}) do |memo, key|
50
+ memo[key] = hash[key] if hash.has_key?(key)
51
+ memo
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,15 @@
1
+ module ThreeScale
2
+ module Backend
3
+ module Validators
4
+ class OauthKey < Base
5
+ def apply
6
+ if params[:app_key].nil? || (!params[:app_key].empty? && application.has_key?(params[:app_key]))
7
+ succeed!
8
+ else
9
+ fail!(ApplicationKeyInvalid.new(params[:app_key]))
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module ThreeScale
2
+ module Backend
3
+ module Validators
4
+ class OauthSetting < Base
5
+ def apply
6
+ if service.backend_version == 'oauth'
7
+ succeed!
8
+ else
9
+ fail!(OauthNotEnabled.new)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,33 @@
1
+ module ThreeScale
2
+ module Backend
3
+ module Validators
4
+ class RedirectURI < Base
5
+ # This should've been named redirect_uri as per OAuth specs, but was
6
+ # initially named redirect_url. We check both fields, prioritizing the
7
+ # contents in the legacy redirect_url parameter over the "new"
8
+ # redirect_uri one.
9
+ REDIRECT_URL = 'redirect_url'.freeze
10
+ REDIRECT_URI = 'redirect_uri'.freeze
11
+
12
+ def apply
13
+ invalid_exception = RedirectURIInvalid
14
+ redirect_uri = if params.has_key? REDIRECT_URL
15
+ invalid_exception = RedirectURLInvalid
16
+ params[REDIRECT_URL]
17
+ elsif params.has_key? REDIRECT_URI
18
+ status.redirect_uri_field = REDIRECT_URI
19
+ params[REDIRECT_URI]
20
+ else
21
+ nil
22
+ end
23
+
24
+ if redirect_uri.nil? || redirect_uri.empty? || application.redirect_url == redirect_uri
25
+ succeed!
26
+ else
27
+ fail!(invalid_exception.new redirect_uri)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end