queue_it 1.1.4 → 2.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 3cf1c4d4dc15ffa2ac59b4cc9d8bab11f2b3afd5
4
- data.tar.gz: 63dce2fd71cd93fe97cd3006512dfb132e5ad0c4
2
+ SHA256:
3
+ metadata.gz: f11577e97ce556432a30d08b8ba74a6445bc9b1e5da0a3142f635f446244c3fc
4
+ data.tar.gz: cc3738902c861b0458d22fcdbb3488ffe1175c814e0368c763d6d8e84ec2104e
5
5
  SHA512:
6
- metadata.gz: f0a74f6ddf7bd56f08ed688ca178baaccb86d7822bce501fee86c30339c8d681367a5854bbf22c0d221e65a94ab50c5dacc97ac024de7b366dd067da57e64670
7
- data.tar.gz: a3dd10f885f6b7ed9870ac90cdc5ddb2ed45e0818aee84c7117831c0a6e6697db5cb5943f0ba842cd9dc65618aed6070a43d4b80a34a12c0dd673a8bf739f13c
6
+ metadata.gz: e55018d02461c0dde121202e00fa9417c293422bb4fb937c94ecb669b6ecfcb7eccd7432660883c1c629e92b45b7a0d0de947fec9837ac9e1e3995526351d327
7
+ data.tar.gz: 4ddf7fd7661186ba14ce8d2cfc2179b9627e1249cf7cbedc675ca32fac2c58b76e808ebc2f6d476ac41fc87a624f49cc66a493327068cd7ec064463cb1031d29
@@ -1,3 +1,18 @@
1
+ ### 2.0.0 - 2020-10-29
2
+
3
+ * A customer ID is needed to create a client instance
4
+ * Always include the Customer ID in the API request URL
5
+ * Bump webmock to properly handle Ruby 2.4+
6
+
7
+ ### 1.1.6 - 2017-03-15
8
+
9
+ * Now by default, during creation event, we support using redirect urls
10
+ * Added possibility to pass redirect url for queue it
11
+
12
+ ### 1.1.5 - 2016-06-02
13
+
14
+ * Remove warning about circular argument reference - api_key in Ruby 2.3.1
15
+
1
16
  ### 1.1.4 - 2016-04-06
2
17
 
3
18
  * Solve gem publishing issue - no changes comparing to 1.1.3
data/README.md CHANGED
@@ -80,7 +80,7 @@ end
80
80
  Initialize client to pass it as a dependency to `Event` instance.
81
81
 
82
82
  ``` ruby
83
- client = QueueIt::Api::Client.new(api_key: "SECRET_API_KEY")
83
+ client = QueueIt::Api::Client.new("YOUR_CUSTOMER_ID", api_key: "SECRET_API_KEY")
84
84
  ```
85
85
 
86
86
  #### Event
@@ -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,11 +8,12 @@ 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
12
11
 
13
- def initialize(api_key: api_key, debug: false)
12
+ def initialize(customer_id, api_key: nil, debug: false)
13
+ self.customer_id = customer_id
14
14
  self.api_key = api_key
15
15
  self.debug = debug
16
+ self.endpoint = URI("https://#{customer_id}.api2.queue-it.net/2_0/event")
16
17
  end
17
18
 
18
19
  def put(path, body)
@@ -21,11 +22,11 @@ module QueueIt
21
22
 
22
23
  private
23
24
 
24
- attr_accessor :api_key, :debug
25
+ attr_accessor :api_key, :customer_id, :debug, :endpoint
25
26
 
26
27
  def options
27
28
  {
28
- url: ENDPOINT_URL.dup,
29
+ url: endpoint.dup,
29
30
  headers: {
30
31
  accept: JSON_FORMAT,
31
32
  content_type: JSON_FORMAT,
@@ -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)
@@ -32,13 +35,16 @@ module QueueIt
32
35
 
33
36
  private
34
37
 
35
- 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)
36
39
  # If there exists a session, we return. This needs to be refactored when we start to look at the timestamp parameter
37
40
  return if session[queue_it_session_variable(event_id)].present?
38
41
 
39
42
  begin
40
- user_checker = QueueIt::KnownUserChecker.new(secret_key, event_id, customer_id)
41
- 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
42
48
 
43
49
  # If the request URL contains queue_it params we remove them and redirect
44
50
  # this is done to mask the params we use to create and verify the queue_it session
@@ -46,7 +52,7 @@ module QueueIt
46
52
  redirect_to QueueIt::UrlBuilder.clean_url(request_url) and return
47
53
  end
48
54
  rescue QueueIt::MissingArgsGiven
49
- 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)
50
56
  destroy_all_queue_it_sessions
51
57
  render("queue_it/enter_queue", layout: false, locals: { queue_it_url: queue_url }) and return
52
58
  rescue QueueIt::NotAuthorized
@@ -55,8 +61,6 @@ module QueueIt
55
61
  render("queue_it/cheating_queue", layout: false, locals: { queue_it_url: queue_cancel_url }) and return
56
62
  end
57
63
  end
58
-
59
64
  end
60
-
61
65
  end
62
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.4"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -19,10 +19,10 @@ 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"
27
- spec.add_development_dependency "webmock", "~> 1.21"
27
+ spec.add_development_dependency "webmock", "~> 3.3"
28
28
  end
@@ -5,7 +5,7 @@ require 'queue_it/api/client'
5
5
  module QueueIt
6
6
  module Api
7
7
  describe Client do
8
- subject(:client) { described_class.new(api_key: "SECURE_KEY") }
8
+ subject(:client) { Client.new("customerid", api_key: "SECURE_KEY") }
9
9
 
10
10
  specify "PUT data under given endpoint & path in JSON format" do
11
11
  request_hash = { "Request" => true }
@@ -71,7 +71,7 @@ module QueueIt
71
71
  end
72
72
 
73
73
  specify "debugging mode puts to STDOUT" do
74
- client = Client.new(api_key: "SECURE_KEY", debug: true)
74
+ client = Client.new("customerid", api_key: "SECURE_KEY", debug: true)
75
75
 
76
76
  request_hash = { "Request" => true }
77
77
 
@@ -83,7 +83,7 @@ module QueueIt
83
83
  private
84
84
 
85
85
  def endpoint_url
86
- Client::ENDPOINT_URL.to_s + "/fancy_event"
86
+ "https://customerid.api2.queue-it.net/2_0/event/fancy_event"
87
87
  end
88
88
 
89
89
  def stub_request_factory(method: :put, status: 200, request_body: "{}", response_body: "{}", content_type: "application/json")
@@ -108,12 +108,12 @@ module QueueIt
108
108
  end
109
109
 
110
110
  specify "Request hits proper endpoint" do
111
- client = Client.new(api_key: "SECURE_KEY")
111
+ client = Client.new("customerid", api_key: "SECURE_KEY")
112
112
  event_adapter = Event.new(client)
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://customerid.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,
@@ -165,13 +165,13 @@ module QueueIt
165
165
  end
166
166
 
167
167
  context "#set_speed" do
168
- let(:client) { Client.new(api_key: "SECURE_KEY") }
168
+ let(:client) { Client.new("customerid", api_key: "SECURE_KEY") }
169
169
  let(:max_redirects_per_minute) { 15 }
170
170
 
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://customerid.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://customerid.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.4
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Billetto
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-06 00:00:00.000000000 Z
11
+ date: 2020-10-29 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
@@ -86,14 +98,14 @@ dependencies:
86
98
  requirements:
87
99
  - - "~>"
88
100
  - !ruby/object:Gem::Version
89
- version: '1.21'
101
+ version: '3.3'
90
102
  type: :development
91
103
  prerelease: false
92
104
  version_requirements: !ruby/object:Gem::Requirement
93
105
  requirements:
94
106
  - - "~>"
95
107
  - !ruby/object:Gem::Version
96
- version: '1.21'
108
+ version: '3.3'
97
109
  description: Gem to handle the implementation of http://queue-it.net!
98
110
  email:
99
111
  - development@billetto.dk
@@ -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,11 +134,12 @@ 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
128
141
  metadata: {}
129
- post_install_message:
142
+ post_install_message:
130
143
  rdoc_options: []
131
144
  require_paths:
132
145
  - lib
@@ -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.2.3
146
- signing_key:
157
+ rubygems_version: 3.0.3
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