queue_it 1.1.2 → 1.1.8

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 6e0f8c10dbb05748bd09448b5f6d1421a8b406b7
4
- data.tar.gz: e030dafd924558163c7abf88e2e69df608d5bd1d
2
+ SHA256:
3
+ metadata.gz: c485ac9dd1277900f3ed127d294b5d54afcb27d3d79f80cd7fe54c668079c28f
4
+ data.tar.gz: 407a76048056f086591bd4fcd3088acb94f94be010f50937b0a645248258d497
5
5
  SHA512:
6
- metadata.gz: e455106e76f90fc90f8bafb0bb61413ed303d7398d5bdb8ff2421e338d96253bcfcef8e11ec37199fef1e76d9d1de7d174bcc6aef1d7157f926ee30ae974a7de
7
- data.tar.gz: e6d104ac4641fd6fd7a5c6af5ec5572a422f93789aa71af0e682de77b02f5a8eb392fbae647a94a3a5d97ca123f219927af494f296b10ce28daff0b2f4eec2f0
6
+ metadata.gz: 26ccccd935d7770cddfc276e3944be5664362969187b1967db1b9a239bedbd7f69e0f44bb021a8d4c40a826262b7545908ff3606eca47b5347184044e433af4b
7
+ data.tar.gz: 54df44820c6b12d1a9469f4187f8204dee202f898cf47ef60935aee262ad09fba40cb58937d65f27d6ffe92108adb6ea8371c0d2e5ce05249ee98b852df496d6
@@ -1,3 +1,20 @@
1
+ ### 1.1.6 - 2017-03-15
2
+
3
+ * Now by default, during creation event, we support using redirect urls
4
+ * Added possibility to pass redirect url for queue it
5
+
6
+ ### 1.1.5 - 2016-06-02
7
+
8
+ * Remove warning about circular argument reference - api_key in Ruby 2.3.1
9
+
10
+ ### 1.1.4 - 2016-04-06
11
+
12
+ * Solve gem publishing issue - no changes comparing to 1.1.3
13
+
14
+ ### 1.1.3 - 2016-04-06
15
+
16
+ * do not rely on ActionDispatch::Resuest::Session API that was removed in Rails 4.2
17
+
1
18
  ### 1.1.2 - 2015-05-19
2
19
 
3
20
  * More time zone mappings.
@@ -1,5 +1,5 @@
1
1
  require "queue_it/version"
2
- require "queue_it/known_user_checker"
2
+ require "queue_it/extract_queue_number"
3
3
  require "queue_it/api/client"
4
4
  require "queue_it/api/event"
5
5
 
@@ -8,9 +8,9 @@ module QueueIt
8
8
  module Api
9
9
  class Client
10
10
  JSON_FORMAT = "application/json".freeze
11
- ENDPOINT_URL = URI("https://api2.queue-it.net/2_0_beta/event").freeze
11
+ ENDPOINT_URL = URI("https://api2.queue-it.net/2_0/event").freeze
12
12
 
13
- def initialize(api_key: api_key, debug: false)
13
+ def initialize(api_key: nil, debug: false)
14
14
  self.api_key = api_key
15
15
  self.debug = debug
16
16
  end
@@ -48,23 +48,23 @@ module QueueIt
48
48
  MICROSOFT_TIME_ZONE_INDEX_VALUES = {
49
49
  "Europe/Helsinki" => "FLE Standard Time",
50
50
  "Helsinki" => "FLE Standard Time",
51
-
51
+
52
52
  "Europe/London" => "GMT Standard Time",
53
53
  "London" => "GMT Standard Time",
54
54
  "Edinburgh" => "GMT Standard Time",
55
-
55
+
56
56
  "Europe/Dublin" => "GMT Standard Time",
57
57
  "Dublin" => "GMT Standard Time",
58
-
58
+
59
59
  "Europe/Copenhagen" => "Romance Standard Time",
60
60
  "Copenhagen" => "Romance Standard Time",
61
-
61
+
62
62
  "Europe/Paris" => "Romance Standard Time",
63
63
  "Paris" => "Romance Standard Time",
64
-
64
+
65
65
  "Europe/Stockholm" => "W. Europe Standard Time",
66
66
  "Stockholm" => "W. Europe Standard Time",
67
-
67
+
68
68
  "Europe/Rome" => "W. Europe Standard Time",
69
69
  "Rome" => "W. Europe Standard Time",
70
70
  }.freeze
@@ -113,7 +113,7 @@ module QueueIt
113
113
  "AfterEventRedirectPage" => "",
114
114
  "UseSSL" => "Auto",
115
115
  "JavaScriptSupportEnabled" => "False",
116
- "TargetUrlSupportEnabled" => "False",
116
+ "TargetUrlSupportEnabled" => "True",
117
117
  "SafetyNetMode" => "Disabled",
118
118
  "KnowUserSecurity" => "MD5Hash",
119
119
  "KnowUserSecretKey" => know_user_secret_key,
@@ -0,0 +1,45 @@
1
+ require 'digest/md5'
2
+
3
+ module QueueIt
4
+ class ExtractQueueNumber
5
+ def call(secret_key:, request_url:, request_params:)
6
+ encrypted_place_in_queue = request_params['p']
7
+ expected_hash = request_params['h']
8
+
9
+ raise QueueIt::MissingArgsGiven.new if queue_it_params_missing?(request_params)
10
+
11
+ if verify_md5_hash?(request_url, expected_hash, secret_key)
12
+ return decrypted_place_in_queue(encrypted_place_in_queue)
13
+ else
14
+ raise QueueIt::NotAuthorized.new
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def queue_it_params_missing?(params)
21
+ queue_id = params['q'] # A QuID, the user’s queue ID
22
+ encrypted_place_in_queue = params['p'] # A text, an encrypted version of the user’s queue number
23
+ expected_hash = params['h'] # An integer calculated hash
24
+ timestamp = params['ts'] # An integer timestamp counting number of seconds since 1970-01-01 00:00:00 UTC
25
+
26
+ [queue_id, encrypted_place_in_queue, timestamp, expected_hash].any?(&:nil?)
27
+ end
28
+
29
+ # uses one char of each string at a given starting point
30
+ # given b852fe78-0d10-4254-823c-f8749c401153 should get 4212870
31
+ def decrypted_place_in_queue(encrypted_place_in_queue)
32
+ return encrypted_place_in_queue[ 30..30 ] + encrypted_place_in_queue[ 3..3 ] + encrypted_place_in_queue[ 11..11 ] +
33
+ encrypted_place_in_queue[ 20..20 ] + encrypted_place_in_queue[ 7..7 ] + encrypted_place_in_queue[ 26..26 ] +
34
+ encrypted_place_in_queue[ 9..9 ]
35
+ end
36
+
37
+ # TODO add timestamp check
38
+ def verify_md5_hash?(url, expected_hash, secret_key)
39
+ url_no_hash = "#{url[ 0..-33 ]}#{secret_key}"
40
+ actual_hash = Digest::MD5.hexdigest(url_no_hash)
41
+
42
+ return (expected_hash == actual_hash)
43
+ end
44
+ end
45
+ end
@@ -1,14 +1,17 @@
1
+ require 'queue_it/url_builder'
2
+
1
3
  module QueueIt
2
4
  module Queueable
3
5
  extend ActiveSupport::Concern
4
6
 
5
7
  included do
6
- def protect_with_queue!(known_user_secret_key, event_id, customer_id)
8
+ def protect_with_queue!(known_user_secret_key, event_id, customer_id, redirect_url: nil)
7
9
  create_or_verify_queue_it_session(known_user_secret_key,
8
10
  event_id,
9
11
  customer_id,
10
- request.url,
11
- params)
12
+ request.original_url,
13
+ params,
14
+ redirect_url)
12
15
  end
13
16
 
14
17
  def queue_it_queue_id(event_id)
@@ -17,7 +20,9 @@ module QueueIt
17
20
 
18
21
  def destroy_all_queue_it_sessions
19
22
  session_variable_prefix = queue_it_session_variable("")
20
- session.reject!{ |session_key| session_key.start_with?(session_variable_prefix) }
23
+ session.keys.select{ |session_key| session_key.start_with?(session_variable_prefix) }.each do |key|
24
+ session.delete(key)
25
+ end
21
26
  end
22
27
 
23
28
  def destroy_queue_it_session(event_id)
@@ -30,13 +35,16 @@ module QueueIt
30
35
 
31
36
  private
32
37
 
33
- def create_or_verify_queue_it_session(secret_key, event_id, customer_id, request_url, params)
38
+ def create_or_verify_queue_it_session(secret_key, event_id, customer_id, request_url, params, current_tickets_url)
34
39
  # If there exists a session, we return. This needs to be refactored when we start to look at the timestamp parameter
35
40
  return if session[queue_it_session_variable(event_id)].present?
36
41
 
37
42
  begin
38
- user_checker = QueueIt::KnownUserChecker.new(secret_key, event_id, customer_id)
39
- session[queue_it_session_variable(event_id)] = user_checker.create_or_verify_queue_it_session!(request_url, params)
43
+ queue_number = QueueIt::ExtractQueueNumber.new.(
44
+ secret_key: secret_key,
45
+ request_url: request_url,
46
+ request_params: params)
47
+ session[queue_it_session_variable(event_id)] = queue_number
40
48
 
41
49
  # If the request URL contains queue_it params we remove them and redirect
42
50
  # this is done to mask the params we use to create and verify the queue_it session
@@ -44,7 +52,7 @@ module QueueIt
44
52
  redirect_to QueueIt::UrlBuilder.clean_url(request_url) and return
45
53
  end
46
54
  rescue QueueIt::MissingArgsGiven
47
- queue_url = QueueIt::UrlBuilder.build_queue_url(customer_id, event_id)
55
+ queue_url = QueueIt::UrlBuilder.build_queue_url(customer_id, event_id, current_tickets_url)
48
56
  destroy_all_queue_it_sessions
49
57
  render("queue_it/enter_queue", layout: false, locals: { queue_it_url: queue_url }) and return
50
58
  rescue QueueIt::NotAuthorized
@@ -53,8 +61,6 @@ module QueueIt
53
61
  render("queue_it/cheating_queue", layout: false, locals: { queue_it_url: queue_cancel_url }) and return
54
62
  end
55
63
  end
56
-
57
64
  end
58
-
59
65
  end
60
66
  end
@@ -2,8 +2,8 @@ require 'addressable/uri'
2
2
 
3
3
  module QueueIt
4
4
  class UrlBuilder
5
- def self.build_queue_url(customer_id, event_id)
6
- "http://q.queue-it.net/?c=#{customer_id}&e=#{event_id}"
5
+ def self.build_queue_url(customer_id, event_id, redirect_url)
6
+ "http://q.queue-it.net/?c=#{customer_id}&e=#{event_id}&t=#{CGI.escape(redirect_url)}"
7
7
  end
8
8
 
9
9
  def self.build_cancel_url(customer_id, event_id, queue_id = nil)
@@ -1,3 +1,3 @@
1
1
  module QueueIt
2
- VERSION = "1.1.2"
2
+ VERSION = "1.1.8"
3
3
  end
@@ -19,8 +19,8 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_runtime_dependency "addressable", "~> 2.3"
22
- spec.add_runtime_dependency "faraday", "~> 0.9"
23
- spec.add_runtime_dependency "faraday_middleware", "~> 0.9"
22
+ spec.add_runtime_dependency "faraday", "<= 2.0", ">= 0.9"
23
+ spec.add_runtime_dependency "faraday_middleware", "<= 2.0", ">= 0.9"
24
24
 
25
25
  spec.add_development_dependency "bundler", "~> 1.3"
26
26
  spec.add_development_dependency "rspec", "~> 3.2"
@@ -113,7 +113,7 @@ module QueueIt
113
113
 
114
114
  body = JSON.generate(valid_create_body)
115
115
 
116
- stub = stub_request(:put, "https://api2.queue-it.net/2_0_beta/event/fancyevent")
116
+ stub = stub_request(:put, "https://api2.queue-it.net/2_0/event/fancyevent")
117
117
  .with(body: body, headers: headers)
118
118
 
119
119
  event_adapter.create_or_update(event_id: event_id,
@@ -148,7 +148,7 @@ module QueueIt
148
148
  "AfterEventRedirectPage" => "",
149
149
  "UseSSL" => "Auto",
150
150
  "JavaScriptSupportEnabled" => "False",
151
- "TargetUrlSupportEnabled" => "False",
151
+ "TargetUrlSupportEnabled" => "True",
152
152
  "SafetyNetMode" => "Disabled",
153
153
  "KnowUserSecurity" => "MD5Hash",
154
154
  "KnowUserSecretKey" => know_user_secret_key,
@@ -171,7 +171,7 @@ module QueueIt
171
171
  specify "Proper speed value is set" do
172
172
  body = { "MaxRedirectsPerMinute" => "15" }
173
173
 
174
- stub = stub_request(:put, "https://api2.queue-it.net/2_0_beta/event/fancyevent/queue/speed")
174
+ stub = stub_request(:put, "https://api2.queue-it.net/2_0/event/fancyevent/queue/speed")
175
175
  .with(body: body, headers: headers)
176
176
 
177
177
  event_adapter.set_speed(event_id: event_id, max_redirects_per_minute: max_redirects_per_minute)
@@ -182,7 +182,7 @@ module QueueIt
182
182
  specify "Speed must be greater than 5 so we send at least 5" do
183
183
  expected_body = { "MaxRedirectsPerMinute" => "5" }
184
184
 
185
- stub = stub_request(:put, "https://api2.queue-it.net/2_0_beta/event/fancyevent/queue/speed")
185
+ stub = stub_request(:put, "https://api2.queue-it.net/2_0/event/fancyevent/queue/speed")
186
186
  .with(body: expected_body, headers: headers)
187
187
 
188
188
  event_adapter.set_speed(event_id: event_id, max_redirects_per_minute: 1)
@@ -0,0 +1,62 @@
1
+ require 'queue_it'
2
+
3
+ module QueueIt
4
+ RSpec.describe ExtractQueueNumber do
5
+ let(:secret_key) { "1c9950a7-f716-432e-b5fa-b148d00480db" }
6
+ let(:service) { ExtractQueueNumber.new }
7
+
8
+ specify "happy path" do
9
+ url = "https://example.com/some/path?q=2647344b-e639-4cd6-8a77-3a8801553716&p=053eeb2c-b272-41a2-aacf-2742bc99676c&ts=1489367379&c=examplecompany&e=someeventid42&rt=Queue&h=bbaf9807496ecb687c85bfcc1a8369e1"
10
+
11
+ result = service.(
12
+ secret_key: secret_key,
13
+ request_url: url,
14
+ request_params: parse_params(url))
15
+ expect(result).not_to be_empty
16
+ end
17
+
18
+ specify do
19
+ url = "https://example.com/some/path"
20
+
21
+ expect do
22
+ service.(secret_key: secret_key, request_url: url, request_params: {})
23
+ end.to raise_error(MissingArgsGiven)
24
+ end
25
+
26
+ specify "queue id param is required" do
27
+ url = "https://example.com/some/path?p=053eeb2c-b272-41a2-aacf-2742bc99676c&ts=1489367379&c=examplecompany&e=someeventid42&rt=Queue&h=bbaf9807496ecb687c85bfcc1a8369e1"
28
+
29
+ expect do
30
+ service.(secret_key: secret_key, request_url: url, request_params: parse_params(url))
31
+ end.to raise_error(MissingArgsGiven)
32
+ end
33
+
34
+ specify "timestamp param is required" do
35
+ url = "https://example.com/some/path?q=2647344b-e639-4cd6-8a77-3a8801553716&p=053eeb2c-b272-41a2-aacf-2742bc99676c&c=examplecompany&e=someeventid42&rt=Queue&h=bbaf9807496ecb687c85bfcc1a8369e1"
36
+
37
+ expect do
38
+ service.(secret_key: secret_key, request_url: url, request_params: parse_params(url))
39
+ end.to raise_error(MissingArgsGiven)
40
+ end
41
+
42
+ specify "encrypted place in queue param is required" do
43
+ url = "https://example.com/some/path?q=2647344b-e639-4cd6-8a77-3a8801553716&ts=1489367379&c=examplecompany&e=someeventid42&rt=Queue&h=bbaf9807496ecb687c85bfcc1a8369e1"
44
+
45
+ expect do
46
+ service.(secret_key: secret_key, request_url: url, request_params: parse_params(url))
47
+ end.to raise_error(MissingArgsGiven)
48
+ end
49
+
50
+ specify "hash is required" do
51
+ url = "https://example.com/some/path?q=2647345b-e639-4cd6-8a77-3a8801553716&p=053eeb2c-b272-41a2-aacf-2742bc99676c&ts=1489367379&c=examplecompany&e=someeventid42&rt=Queue"
52
+
53
+ expect do
54
+ service.(secret_key: secret_key, request_url: url, request_params: parse_params(url))
55
+ end.to raise_error(MissingArgsGiven)
56
+ end
57
+
58
+ def parse_params(url)
59
+ CGI.parse(URI.parse(url).query).each_with_object({}) {|(k,v),o| o[k] = v.first }
60
+ end
61
+ end
62
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: queue_it
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Billetto
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-05-19 00:00:00.000000000 Z
11
+ date: 2020-09-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -28,30 +28,42 @@ dependencies:
28
28
  name: faraday
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0.9'
34
+ - - "<="
35
+ - !ruby/object:Gem::Version
36
+ version: '2.0'
34
37
  type: :runtime
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
43
  version: '0.9'
44
+ - - "<="
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: faraday_middleware
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
- - - "~>"
51
+ - - ">="
46
52
  - !ruby/object:Gem::Version
47
53
  version: '0.9'
54
+ - - "<="
55
+ - !ruby/object:Gem::Version
56
+ version: '2.0'
48
57
  type: :runtime
49
58
  prerelease: false
50
59
  version_requirements: !ruby/object:Gem::Requirement
51
60
  requirements:
52
- - - "~>"
61
+ - - ">="
53
62
  - !ruby/object:Gem::Version
54
63
  version: '0.9'
64
+ - - "<="
65
+ - !ruby/object:Gem::Version
66
+ version: '2.0'
55
67
  - !ruby/object:Gem::Dependency
56
68
  name: bundler
57
69
  requirement: !ruby/object:Gem::Requirement
@@ -114,7 +126,7 @@ files:
114
126
  - lib/queue_it/api/client.rb
115
127
  - lib/queue_it/api/error.rb
116
128
  - lib/queue_it/api/event.rb
117
- - lib/queue_it/known_user_checker.rb
129
+ - lib/queue_it/extract_queue_number.rb
118
130
  - lib/queue_it/queueable.rb
119
131
  - lib/queue_it/railtie.rb
120
132
  - lib/queue_it/url_builder.rb
@@ -122,6 +134,7 @@ files:
122
134
  - queue_it.gemspec
123
135
  - spec/queue_it/api/client_spec.rb
124
136
  - spec/queue_it/api/event_spec.rb
137
+ - spec/queue_it/extract_queue_number_spec.rb
125
138
  homepage: https://github.com/gfish/queue_it
126
139
  licenses:
127
140
  - GNU/GPLv3
@@ -141,11 +154,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
154
  - !ruby/object:Gem::Version
142
155
  version: '0'
143
156
  requirements: []
144
- rubyforge_project:
145
- rubygems_version: 2.4.5
157
+ rubygems_version: 3.0.3
146
158
  signing_key:
147
159
  specification_version: 4
148
160
  summary: Gem to handle the implementation of http://queue-it.net
149
161
  test_files:
150
162
  - spec/queue_it/api/client_spec.rb
151
163
  - spec/queue_it/api/event_spec.rb
164
+ - spec/queue_it/extract_queue_number_spec.rb
@@ -1,60 +0,0 @@
1
- require 'digest/md5'
2
- require "queue_it/url_builder"
3
-
4
- module QueueIt
5
- class KnownUserChecker
6
-
7
- attr_accessor :shared_event_key, :event_id, :customer_id
8
-
9
- def initialize(shared_event_key, event_id, customer_id)
10
- self.shared_event_key = shared_event_key
11
- self.event_id = event_id
12
- self.customer_id = customer_id
13
- end
14
-
15
- # This is bound to Rails!
16
- def create_or_verify_queue_it_session!(url, params)
17
- queue_id = params['q' ] # A QuID, the user’s queue ID
18
- encrypted_place_in_queue = params['p' ] # A text, an encrypted version of the user’s queue number
19
- expected_hash = params['h' ] # An integer calculated hash
20
- timestamp = params['ts'] # An integer timestamp counting number of seconds since 1970-01-01 00:00:00 UTC
21
-
22
- verify_request!(url, queue_id, encrypted_place_in_queue, expected_hash, timestamp)
23
- end
24
-
25
- def verify_request!(url, queue_id, encrypted_place_in_queue, expected_hash, timestamp)
26
- if verify_md5_hash?(url, queue_id, encrypted_place_in_queue, expected_hash, timestamp)
27
- decrypted_place_in_queue(encrypted_place_in_queue)
28
- else
29
- raise QueueIt::NotAuthorized.new
30
- end
31
- end
32
-
33
- private
34
-
35
- # uses one char of each string at a given starting point
36
- # given b852fe78-0d10-4254-823c-f8749c401153 should get 4212870
37
- def decrypted_place_in_queue(encrypted_place_in_queue)
38
- return encrypted_place_in_queue[ 30..30 ] + encrypted_place_in_queue[ 3..3 ] + encrypted_place_in_queue[ 11..11 ] +
39
- encrypted_place_in_queue[ 20..20 ] + encrypted_place_in_queue[ 7..7 ] + encrypted_place_in_queue[ 26..26 ] +
40
- encrypted_place_in_queue[ 9..9 ]
41
- end
42
-
43
- # TODO add timestamp check
44
- def verify_md5_hash?(url, queue_id, encrypted_place_in_queue, expected_hash, timestamp)
45
- raise QueueIt::MissingArgsGiven.new if [ url, queue_id, encrypted_place_in_queue, timestamp, expected_hash ].any?( &:nil? )
46
-
47
- url_no_hash = "#{ url[ 0..-33 ] }#{ shared_event_key }" # Remove hash value and add SharedEventKey
48
- actual_hash = Digest::MD5.hexdigest( utf8_encode( url_no_hash ) )
49
-
50
- return false unless expected_hash == actual_hash
51
- true
52
- end
53
-
54
- def utf8_encode(s)
55
- s.encode('UTF-8', 'UTF-8')
56
- s
57
- end
58
-
59
- end
60
- end