session-rails 0.1.0 → 0.1.1
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/session/attributes.rb +81 -0
- data/lib/session/comparisons.rb +11 -0
- data/lib/session/core_ext/action_controller.rb +39 -0
- data/lib/session/rails.rb +15 -0
- data/lib/session/rails/version.rb +1 -1
- data/lib/session/storage.rb +47 -0
- data/lib/session/validations.rb +39 -0
- metadata +22 -5
- data/app/models/session.rb +0 -80
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3ed67024199af94ed5df5a7419dac5de4f6922895116ef14fd9a407c84a56c2
|
4
|
+
data.tar.gz: 2ee461cb43bb57668a1311b486bb55e4582cafdb0cc02ae3e9bed998ac304932
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2df0cea9205c4581c9141aef86ba6c25a75a42b54a7a4662af9ba756d4edaf0742ff6bf42d6b2c3fec5c782da7465d20792377b7f5ffd8c58ce52b754494961
|
7
|
+
data.tar.gz: 80b2d5b79fa6d8ed0e254d3d26b86137569db6dcda0396a2ee50b12fc107049a6cdc02b8b39869dd68ca41155ba70e066a8d71d7bcd97c4f1a09bf71d0184ca3
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module Session
|
2
|
+
module Attributes
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
DEFAULT_MODEL_NAME = :user
|
6
|
+
DEFAULT_ID_ATTRIBUTE = :id
|
7
|
+
DEFAULT_PUBLIC_ATTRIBUTE = :email
|
8
|
+
DEFAULT_PRIVATE_ATTRIBUTE = :password
|
9
|
+
|
10
|
+
included do
|
11
|
+
attr_accessor :public_attribute, :private_attribute
|
12
|
+
|
13
|
+
def id
|
14
|
+
return nil if model.blank?
|
15
|
+
model.send self.class.id_attribute
|
16
|
+
end
|
17
|
+
|
18
|
+
def id=(v)
|
19
|
+
return self.model = nil if v.nil?
|
20
|
+
self.model = self.class.model.find_by self.class.id_attribute => v
|
21
|
+
end
|
22
|
+
|
23
|
+
def model
|
24
|
+
return nil if public_attribute.blank?
|
25
|
+
self.class.model.find_by self.class.public_attribute => public_attribute
|
26
|
+
end
|
27
|
+
|
28
|
+
def model=(v)
|
29
|
+
self.public_attribute = v.try self.class.public_attribute
|
30
|
+
end
|
31
|
+
|
32
|
+
authenticates
|
33
|
+
end
|
34
|
+
|
35
|
+
class_methods do
|
36
|
+
attr_reader :model_name, :id_attribute, :public_attribute, :private_attribute
|
37
|
+
|
38
|
+
def model
|
39
|
+
@model ||= model_name.to_s.classify.constantize
|
40
|
+
end
|
41
|
+
|
42
|
+
def authenticates(model_name = nil, by: nil)
|
43
|
+
alias_accessor :model, :model_name do
|
44
|
+
@model_name = (model_name.to_s.underscore.presence || DEFAULT_MODEL_NAME).to_sym
|
45
|
+
@model = nil
|
46
|
+
end
|
47
|
+
|
48
|
+
attributes = by&.symbolize_keys.presence || {}
|
49
|
+
|
50
|
+
alias_accessor(:id, :id_attribute) { @id_attribute = attributes[:id].to_s.to_sym.presence || DEFAULT_ID_ATTRIBUTE }
|
51
|
+
alias_accessor(:public_attribute) { @public_attribute = attributes[:public].to_s.to_sym.presence || DEFAULT_PUBLIC_ATTRIBUTE }
|
52
|
+
alias_accessor(:private_attribute) { @private_attribute = attributes[:private].to_s.to_sym.presence || DEFAULT_PRIVATE_ATTRIBUTE }
|
53
|
+
end
|
54
|
+
|
55
|
+
def columns
|
56
|
+
[
|
57
|
+
Struct.new(:name, :type).new(public_attribute, :string),
|
58
|
+
Struct.new(:name, :type).new(private_attribute, :string)
|
59
|
+
]
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
|
64
|
+
def alias_accessor(name, name_method = nil)
|
65
|
+
method_name = send name_method || name
|
66
|
+
if method_name.present? && method_name.to_s != name.to_s
|
67
|
+
remove_method method_name if respond_to? method_name
|
68
|
+
remove_method "#{method_name}=" if respond_to? "#{method_name}="
|
69
|
+
end
|
70
|
+
|
71
|
+
yield
|
72
|
+
|
73
|
+
method_name = send name_method || name
|
74
|
+
if method_name.to_s != name.to_s
|
75
|
+
alias_method method_name, name
|
76
|
+
alias_method "#{method_name}=", "#{name}="
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -1,3 +1,42 @@
|
|
1
1
|
ActionController::Base.class_eval do
|
2
|
+
before_action :initialize_sessions
|
3
|
+
before_action :check_session_authentications
|
2
4
|
|
5
|
+
protected
|
6
|
+
|
7
|
+
def initialize_sessions
|
8
|
+
Session::Base.descendants.each { |session| session.store = self.session }
|
9
|
+
end
|
10
|
+
|
11
|
+
def check_session_authentications
|
12
|
+
self.class.authentication_requirements.each do |session|
|
13
|
+
redirect_to controller: session.to_s.tableize, action: :new and return unless session.current.exists?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def check_session_unauthentications
|
18
|
+
self.class.unauthentication_requirements.each do |session|
|
19
|
+
redirect_to root_path if session.current.exists?
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class << self
|
24
|
+
def requires_authentication(from: :session)
|
25
|
+
(authentication_requirements << from.to_s.classify.constantize).uniq!
|
26
|
+
end
|
27
|
+
|
28
|
+
def requires_unauthentication(from: :session)
|
29
|
+
(unauthentication_requirements << from.to_s.classify.constantize).uniq!
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
def authentication_requirements
|
35
|
+
@authentication_requirements ||= []
|
36
|
+
end
|
37
|
+
|
38
|
+
def unauthentication_requirements
|
39
|
+
@unauthentication_requirements ||= []
|
40
|
+
end
|
41
|
+
end
|
3
42
|
end
|
data/lib/session/rails.rb
CHANGED
@@ -3,5 +3,20 @@ require "session/rails/railtie"
|
|
3
3
|
module Session
|
4
4
|
module Rails
|
5
5
|
require __dir__ + '/engine'
|
6
|
+
require __dir__ + '/core_ext'
|
7
|
+
|
8
|
+
require __dir__ + '/validations'
|
9
|
+
require __dir__ + '/attributes'
|
10
|
+
require __dir__ + '/storage'
|
11
|
+
require __dir__ + '/comparisons'
|
12
|
+
end
|
13
|
+
|
14
|
+
class Base
|
15
|
+
include ActiveModel::Model
|
16
|
+
|
17
|
+
include Validations
|
18
|
+
include Attributes
|
19
|
+
include Storage
|
20
|
+
include Comparisons
|
6
21
|
end
|
7
22
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Session
|
2
|
+
module Storage
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
def save
|
7
|
+
if validate
|
8
|
+
self.class.current = self
|
9
|
+
return true
|
10
|
+
else
|
11
|
+
return false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def destroy
|
16
|
+
self.class.current = nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def persisted?
|
20
|
+
self.class.current == self
|
21
|
+
end
|
22
|
+
alias_method :exists?, :persisted?
|
23
|
+
end
|
24
|
+
|
25
|
+
class_methods do
|
26
|
+
attr_writer :store
|
27
|
+
|
28
|
+
def store
|
29
|
+
@store ||= {}
|
30
|
+
end
|
31
|
+
|
32
|
+
def current
|
33
|
+
new id: store&.[](store_key)
|
34
|
+
end
|
35
|
+
|
36
|
+
def current=(v)
|
37
|
+
store&.[]=(store_key, v&.id)
|
38
|
+
end
|
39
|
+
|
40
|
+
protected
|
41
|
+
|
42
|
+
def store_key
|
43
|
+
:"#{self.to_s.underscore.sub '/', '_'}_#{id_attribute}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Session
|
2
|
+
module Validations
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
included do
|
6
|
+
validate(
|
7
|
+
:public_attribute_is_present,
|
8
|
+
:private_attribute_is_present,
|
9
|
+
:session_is_valid
|
10
|
+
)
|
11
|
+
|
12
|
+
def authenticate
|
13
|
+
model&.authenticate private_attribute
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def public_attribute_is_present
|
19
|
+
attribute_is_present self.class.public_attribute, public_attribute
|
20
|
+
end
|
21
|
+
|
22
|
+
def private_attribute_is_present
|
23
|
+
attribute_is_present self.class.private_attribute, private_attribute
|
24
|
+
end
|
25
|
+
|
26
|
+
def session_is_valid
|
27
|
+
if public_attribute.present? && private_attribute.present? && !authenticate
|
28
|
+
errors.add :base, I18n.t("activerecord.errors.models.#{self.class.to_s.underscore.sub '/', '_'}.invalid")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def attribute_is_present(name, value)
|
33
|
+
if value.blank?
|
34
|
+
errors.add name, I18n.t("activerecord.errors.models.#{self.class.to_s.underscore.sub '/', '_'}.attributes.#{name}.blank")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: session-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Julien Dargelos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-04-
|
11
|
+
date: 2018-04-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -38,7 +38,21 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bcrypt
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: A session Active Model.
|
42
56
|
email:
|
43
57
|
- contact@juliendargelos.com
|
44
58
|
executables: []
|
@@ -48,13 +62,16 @@ files:
|
|
48
62
|
- MIT-LICENSE
|
49
63
|
- README.md
|
50
64
|
- Rakefile
|
51
|
-
-
|
65
|
+
- lib/session/attributes.rb
|
66
|
+
- lib/session/comparisons.rb
|
52
67
|
- lib/session/core_ext.rb
|
53
68
|
- lib/session/core_ext/action_controller.rb
|
54
69
|
- lib/session/engine.rb
|
55
70
|
- lib/session/rails.rb
|
56
71
|
- lib/session/rails/railtie.rb
|
57
72
|
- lib/session/rails/version.rb
|
73
|
+
- lib/session/storage.rb
|
74
|
+
- lib/session/validations.rb
|
58
75
|
- lib/tasks/session/rails_tasks.rake
|
59
76
|
homepage: https://www.github.com/juliendargelos/session-rails
|
60
77
|
licenses:
|
@@ -79,5 +96,5 @@ rubyforge_project:
|
|
79
96
|
rubygems_version: 2.7.3
|
80
97
|
signing_key:
|
81
98
|
specification_version: 4
|
82
|
-
summary:
|
99
|
+
summary: A session Active Model.
|
83
100
|
test_files: []
|
data/app/models/session.rb
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
class Session
|
2
|
-
include ActiveModel::Model
|
3
|
-
|
4
|
-
attr_accessor :email, :password
|
5
|
-
|
6
|
-
validates :email, presence: true
|
7
|
-
validates :password, presence: true
|
8
|
-
|
9
|
-
validate do |session|
|
10
|
-
errors.add :base, I18n.t('activerecord.errors.models.session.invalid') unless email.blank? || password.blank? || session.authenticate
|
11
|
-
end
|
12
|
-
|
13
|
-
def id
|
14
|
-
user&.id
|
15
|
-
end
|
16
|
-
|
17
|
-
def id=(v)
|
18
|
-
self.user = User.find_by id: v
|
19
|
-
end
|
20
|
-
|
21
|
-
def user
|
22
|
-
User.find_by email: email
|
23
|
-
end
|
24
|
-
|
25
|
-
def user=(v)
|
26
|
-
self.email = v&.email
|
27
|
-
end
|
28
|
-
|
29
|
-
def authenticate
|
30
|
-
if user&.authenticate password
|
31
|
-
self.password = nil
|
32
|
-
return true
|
33
|
-
else
|
34
|
-
return false
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def save
|
39
|
-
if validate
|
40
|
-
self.class.current = self
|
41
|
-
return true
|
42
|
-
else
|
43
|
-
return false
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def destroy
|
48
|
-
self.class.current = nil
|
49
|
-
end
|
50
|
-
|
51
|
-
def persisted?
|
52
|
-
self.class.current == self
|
53
|
-
end
|
54
|
-
alias_method :exists?, :persisted?
|
55
|
-
|
56
|
-
def ==(session)
|
57
|
-
session.is_a?(self.class) && id.present? && id == session.id
|
58
|
-
end
|
59
|
-
|
60
|
-
class << self
|
61
|
-
KEY = :user_id
|
62
|
-
|
63
|
-
attr_accessor :store
|
64
|
-
|
65
|
-
def current
|
66
|
-
new id: store&.[](KEY)
|
67
|
-
end
|
68
|
-
|
69
|
-
def current=(v)
|
70
|
-
store&.[]=(KEY, v&.id)
|
71
|
-
end
|
72
|
-
|
73
|
-
def columns
|
74
|
-
[
|
75
|
-
Struct.new(:name, :type).new('email', :string),
|
76
|
-
Struct.new(:name, :type).new('password', :string)
|
77
|
-
]
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|