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 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