web-connect 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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
|