web-connect 0.1.4 → 0.1.5
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 +4 -4
- data/lib/netfira/web_connect.rb +4 -0
- data/lib/netfira/web_connect/configuration.rb +1 -1
- data/lib/netfira/web_connect/db_schema/20140514_support.rb +6 -0
- data/lib/netfira/web_connect/models.rb +1 -3
- data/lib/netfira/web_connect/models/support.rb +4 -0
- data/lib/netfira/web_connect/models/support/session.rb +25 -0
- data/lib/netfira/web_connect/models/support/shop.rb +1 -0
- data/lib/netfira/web_connect/rack_app/action_helpers/env_importer.rb +44 -19
- data/lib/netfira/web_connect/version.rb +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7e2fdc0e26429acf2ba0b9913963559a3ad1ea2c
|
4
|
+
data.tar.gz: ef63471c2d83ce54c0f8abb29a4771a95a37affc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d516716e5554f39e4685cedcac4bac81d0e0a7b6ee48925b8be8baf469af5bdce234bc350bd6229653bf1b8836446b43be1be2056d3e2a39ee16b518161f9182
|
7
|
+
data.tar.gz: 59cc9a8cad9c2d92739844e7e77b76c5fdf2aa67d643eb479981d47c93321bfa4b78b79259e85efb01666fb7d37a443eda907b01758442d1e19fcabcbd837582
|
data/lib/netfira/web_connect.rb
CHANGED
@@ -33,6 +33,12 @@ class Support < Netfira::WebConnect::Migration
|
|
33
33
|
t.binary :value, limit: 0x10000
|
34
34
|
end
|
35
35
|
|
36
|
+
create_table :_sessions do |t|
|
37
|
+
t.references :shop, index: true
|
38
|
+
t.string :token, limit: 40, index: true
|
39
|
+
t.datetime :expires_at
|
40
|
+
end
|
41
|
+
|
36
42
|
end
|
37
43
|
|
38
44
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
3
|
+
module Netfira::WebConnect
|
4
|
+
class Models::Session < Model::Support
|
5
|
+
|
6
|
+
belongs_to :shop
|
7
|
+
|
8
|
+
after_initialize :generate_token
|
9
|
+
|
10
|
+
def self.by_token(token)
|
11
|
+
where(token: token).where(expires_at_column.eq(nil).or expires_at_column.gt(Time.now)).first
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def generate_token
|
17
|
+
self.token ||= SecureRandom.random_bytes(20).unpack('H*').first
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.expires_at_column
|
21
|
+
@expires_at_column ||= arel_table[:expires_at]
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -3,32 +3,57 @@ module Netfira::WebConnect
|
|
3
3
|
|
4
4
|
def import_env(env)
|
5
5
|
@env = env
|
6
|
+
@shop = nil
|
7
|
+
session = nil
|
6
8
|
|
7
9
|
# Parse the environment
|
8
10
|
request = Rack::Request.new env
|
9
11
|
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
shop_name ||= auth.username
|
20
|
-
password ||= auth.credentials[1]
|
12
|
+
# Restore sessions
|
13
|
+
session_lifetime = Netfira::WebConnect.session_lifetime
|
14
|
+
session_token = session_lifetime && env['HTTP_X_SESSION']
|
15
|
+
if session_token
|
16
|
+
session = Models::Session.by_token(session_token)
|
17
|
+
if session
|
18
|
+
@shop = session.shop
|
19
|
+
else
|
20
|
+
raise Unauthorized, 'Session has expired'
|
21
21
|
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Authentication
|
25
|
+
unless @shop
|
26
|
+
authenticator = Netfira::WebConnect.authenticator
|
27
|
+
if authenticator.respond_to? :call
|
28
|
+
shop_name = env['HTTP_X_SHOP_NAME']
|
29
|
+
password = request['pw'] || env['HTTP_X_PASSWORD']
|
22
30
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
31
|
+
# Basic auth
|
32
|
+
auth = Rack::Auth::Basic::Request.new(env)
|
33
|
+
if auth.provided? && auth.basic?
|
34
|
+
shop_name ||= auth.username
|
35
|
+
password ||= auth.credentials[1]
|
36
|
+
end
|
27
37
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
38
|
+
result = authenticator.call shop_name, password
|
39
|
+
raise Unauthorized unless result
|
40
|
+
@shop = Netfira::WebConnect::Models::Shop.find_or_create_by(name: shop_name)
|
41
|
+
|
42
|
+
header :x_vary_password, result if String === result
|
43
|
+
|
44
|
+
# Sessions
|
45
|
+
if session_lifetime
|
46
|
+
session ||= @shop.sessions.new
|
47
|
+
session.expires_at = Time.now + session_lifetime if Fixnum === session_lifetime
|
48
|
+
session.save
|
49
|
+
header :x_session, session.token
|
50
|
+
end
|
51
|
+
|
52
|
+
elsif authenticator.nil?
|
53
|
+
@shop = Netfira::WebConnect.anonymous_shop
|
54
|
+
else
|
55
|
+
raise 'Authenticator is not callable'
|
56
|
+
end
|
32
57
|
end
|
33
58
|
|
34
59
|
# The request verb (PUT, GET, POST etc)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: web-connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neil E. Pearson
|
@@ -194,6 +194,8 @@ files:
|
|
194
194
|
- lib/netfira/web_connect/models/image.rb
|
195
195
|
- lib/netfira/web_connect/models/order.rb
|
196
196
|
- lib/netfira/web_connect/models/order_line.rb
|
197
|
+
- lib/netfira/web_connect/models/support.rb
|
198
|
+
- lib/netfira/web_connect/models/support/session.rb
|
197
199
|
- lib/netfira/web_connect/models/support/setting.rb
|
198
200
|
- lib/netfira/web_connect/models/support/shop.rb
|
199
201
|
- lib/netfira/web_connect/models/support/shop/settings.rb
|