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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7f2d79d7e04cd133c4f3ac7ebfec21fa50742650
4
- data.tar.gz: c8db33715f544a85a17cb89e5a1be90d6bdf5f2b
3
+ metadata.gz: 7e2fdc0e26429acf2ba0b9913963559a3ad1ea2c
4
+ data.tar.gz: ef63471c2d83ce54c0f8abb29a4771a95a37affc
5
5
  SHA512:
6
- metadata.gz: ab76e029cfa6d7d95e7490bd87c87de34872e40ac8f4153f49214035991880d3f757e60d56ccaad0d172ed0c5cd42c494ab6b9a87ae36b6c4ceb620d5ffd01d0
7
- data.tar.gz: bb3cee43adee9ac75af954f63e4ef4649764000ab2ce6a2d6d82cf49367377efc190ab35f08de2192e9b34fd5cfb88e4e29ace99edce3e217644fd389a1da8c1
6
+ metadata.gz: d516716e5554f39e4685cedcac4bac81d0e0a7b6ee48925b8be8baf469af5bdce234bc350bd6229653bf1b8836446b43be1be2056d3e2a39ee16b518161f9182
7
+ data.tar.gz: 59cc9a8cad9c2d92739844e7e77b76c5fdf2aa67d643eb479981d47c93321bfa4b78b79259e85efb01666fb7d37a443eda907b01758442d1e19fcabcbd837582
@@ -61,6 +61,10 @@ module Netfira
61
61
  @schema ||= Schema.new if @config
62
62
  end
63
63
 
64
+ def self.session_lifetime
65
+ @config.session_lifetime
66
+ end
67
+
64
68
  private
65
69
 
66
70
  def self.null_logger
@@ -2,7 +2,7 @@ module Netfira::WebConnect
2
2
  class Configuration
3
3
 
4
4
  attr_accessor :db_table_prefix, :file_store, :authenticator, :custom_fields,
5
- :time_zone, :materialize_when_db_changed
5
+ :time_zone, :materialize_when_db_changed, :session_lifetime
6
6
 
7
7
  attr_reader :logger, :db
8
8
 
@@ -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
@@ -68,6 +68,4 @@ module Netfira::WebConnect
68
68
  end
69
69
  end
70
70
 
71
- require_relative 'models/support/setting'
72
- require_relative 'models/support/shop'
73
- require_relative 'models/support/table'
71
+ require_relative 'models/support'
@@ -0,0 +1,4 @@
1
+ require_relative 'support/setting'
2
+ require_relative 'support/shop'
3
+ require_relative 'support/table'
4
+ require_relative 'support/session'
@@ -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
@@ -2,6 +2,7 @@ module Netfira::WebConnect
2
2
  class Models::Shop < Model::Support
3
3
 
4
4
  has_many :setting_models, class_name: Models::Setting.name, inverse_of: :shop
5
+ has_many :sessions
5
6
 
6
7
  def settings
7
8
  @settings ||= Settings.new(setting_models)
@@ -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
- # Authentication
11
- authenticator = Netfira::WebConnect.authenticator
12
- if authenticator.respond_to? :call
13
- shop_name = env['HTTP_X_SHOP_NAME']
14
- password = request['pw'] || env['HTTP_X_PASSWORD']
15
-
16
- # Basic auth
17
- auth = Rack::Auth::Basic::Request.new(env)
18
- if auth.provided? && auth.basic?
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
- result = authenticator.call shop_name, password
24
- raise Unauthorized unless result
25
- header :x_vary_password, result if String === result
26
- @shop = Netfira::WebConnect::Models::Shop.find_or_create_by(name: shop_name)
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
- elsif authenticator.nil?
29
- @shop = Netfira::WebConnect.anonymous_shop
30
- else
31
- raise 'Authenticator is not callable'
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)
@@ -1,5 +1,5 @@
1
1
  module Netfira
2
2
  module WebConnect
3
- VERSION = '0.1.4'
3
+ VERSION = '0.1.5'
4
4
  end
5
5
  end
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
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