isomorfeus-transport 2.2.11 → 2.3.0

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
  SHA256:
3
- metadata.gz: 7945a9b6793fff8882642b3ce49f9bb5c6159722c8f801863bcbd8ba1c536db9
4
- data.tar.gz: a6dba7db0da2a33cca0f115a3e46dcb795a86c51cabdc1271a86e7c5d9bc0bdc
3
+ metadata.gz: 17d091f9644e919161c0c8cbe7c373e5087d16d34a8978ebe704904da0a060ca
4
+ data.tar.gz: 7aa732e7e24caebd2945caf32ecada3ecfc56b5f01a00ea498fc025f31a6838e
5
5
  SHA512:
6
- metadata.gz: 51198a0ad3edfb66437c681f194af4584e8d332f859dff8bcad2d2f9dc32974c5b42504bcb1752beb059b45cbb251fcc758280fe154620fda855310dacb30874
7
- data.tar.gz: 8bd03eed04de9ae3245165f196dd7cdcffc8647a9ca0f1b906e5b164d78c9fbb063a5e4d47ece15458d550cd7e6bdea3d346d9c336fd1a3a810c6a5384a4e96b
6
+ metadata.gz: 5ac6e0d72a4c8a955ba5f5d85ce83be579d1c753752c8f420f0859907fd8d112d2ae5b630e72756f740936a9469990a5cd84048157143304506aef2e9348bb7e
7
+ data.tar.gz: 55d3d7e6d303bde3df2e573f2e0001536a740e5644fa5a0b8ebeb14c88fffb78cee84b1a446fb38bf6f54f7f467c1e581c90800232ee91990942ade758a20832
data/README.md CHANGED
@@ -23,5 +23,4 @@ Server only:
23
23
 
24
24
  ## Usage
25
25
 
26
- - [Authentication and Current User](https://github.com/isomorfeus/isomorfeus-project/blob/master/isomorfeus-transport/docs/authentication.md)
27
26
  - [Channels (PubSub)](https://github.com/isomorfeus/isomorfeus-project/blob/master/isomorfeus-transport/docs/channels.md)
@@ -43,28 +43,6 @@ module Isomorfeus
43
43
  def add_transport_init_class_name(init_class_name)
44
44
  transport_init_class_names << init_class_name
45
45
  end
46
-
47
- def current_user
48
- @current_user ||= init_current_user
49
- end
50
-
51
- def init_current_user
52
- if Isomorfeus.current_user_sid
53
- Isomorfeus.instance_from_sid(Isomorfeus.current_user_sid)
54
- else
55
- Anonymous.new
56
- end
57
- end
58
-
59
- def set_current_user(user)
60
- if user
61
- @current_user = user
62
- Isomorfeus.current_user_sid = user.sid
63
- else
64
- @current_user = Anonymous.new
65
- Isomorfeus.current_user_sid = nil
66
- end
67
- end
68
46
  end
69
47
  else
70
48
  class << self
@@ -73,7 +51,6 @@ module Isomorfeus
73
51
  attr_accessor :api_websocket_path
74
52
  attr_accessor :api_logout_path
75
53
  attr_accessor :cookie_eater_path
76
- attr_reader :session_store
77
54
 
78
55
  def valid_channel_class_name?(class_name)
79
56
  valid_channel_class_names.include?(class_name)
@@ -131,48 +108,9 @@ module Isomorfeus
131
108
  cached_handler_classes[class_name] = "::#{class_name}".constantize
132
109
  end
133
110
 
134
- def valid_user_class_names
135
- @valid_user_class_names ||= Set.new
136
- end
137
-
138
- def valid_user_class_name?(class_name)
139
- valid_user_class_names.include?(class_name)
140
- end
141
-
142
- def add_valid_user_class(klass)
143
- valid_user_class_names << raw_class_name(klass)
144
- end
145
-
146
- def cached_user_classes
147
- @cached_user_classes ||= {}
148
- end
149
-
150
- def cached_user_class(class_name)
151
- return "::#{class_name}".constantize if Isomorfeus.development?
152
- return cached_user_classes[class_name] if cached_user_classes.key?(class_name)
153
- cached_user_classes[class_name] = "::#{class_name}".constantize
154
- end
155
-
156
- def current_user
157
- Thread.current[:isomorfeus_user] ||= Anonymous.new
158
- end
159
-
160
111
  def pub_sub_client
161
112
  Thread.current[:isomorfeus_pub_sub_client]
162
113
  end
163
-
164
- def session_store
165
- @session_store ||= @session_store_init.call
166
- end
167
-
168
- def session_store_init(&block)
169
- @session_store_init = block
170
- end
171
- end
172
-
173
- self.session_store_init do
174
- store_path = File.expand_path(File.join(Isomorfeus.root, 'storage', Isomorfeus.env, 'session_store'))
175
- Isomorfeus::Transport::HamsterSessionStore.new(store_path)
176
114
  end
177
115
  end
178
116
 
@@ -34,14 +34,14 @@ module Isomorfeus
34
34
  session_cookie = "session=#{session_id}; SameSite=Strict; HttpOnly; Path=/; Max-Age=2592000#{'; Secure' if Isomorfeus.production?}"
35
35
  session_cookie_accessor = SecureRandom.uuid
36
36
  Isomorfeus.pub_sub_client.instance_variable_set(:@isomorfeus_authentication_tries, nil)
37
- Isomorfeus.session_store.add(session_id: session_id, cookie: session_cookie, user: user, accessor: session_cookie_accessor)
37
+ Isomorfeus.session_class.add(session_id: session_id, cookie: session_cookie, user: user, accessor: session_cookie_accessor)
38
38
  response_agent.agent_result = { success: 'ok', data: user.to_transport, session_cookie_accessor: session_cookie_accessor }
39
39
  end
40
40
  end
41
41
  elsif login_or_ssr_login == 'ssr_login'
42
42
  response_agent.agent_result = { error: 'Authentication failed' }
43
43
  session_id = response_agent.request['ssr_login']
44
- user = Isomorfeus.session_store.get_user(session_id: session_id)
44
+ user = Isomorfeus.session_class.get_user(session_id: session_id)
45
45
  if user
46
46
  Isomorfeus.pub_sub_client.instance_variable_set(:@isomorfeus_authentication_tries, nil)
47
47
  response_agent.agent_result = { success: 'ok', data: user.to_transport }
@@ -16,23 +16,26 @@ module Isomorfeus
16
16
  cookie = cookies.detect { |c| c.start_with?('session=') }
17
17
  if cookie
18
18
  session_id = cookie[8..-1]
19
- return [Anonymous.new, nil] if session_id.nil? || session_id.empty?
20
- user = Isomorfeus.session_store.get_user(session_id: session_id)
21
- [user, session_id]
19
+ if !session_id.nil? && !session_id.empty?
20
+ user = Isomorfeus.session_class&.get_user(session_id: session_id)
21
+ return [user, session_id] unless user.nil?
22
+ end
22
23
  end
23
24
  end
25
+ [Anonymous.new, nil]
24
26
  end
25
27
 
26
28
  def call(env)
27
- if env['PATH_INFO'] == Isomorfeus.api_websocket_path
29
+ case env['PATH_INFO']
30
+ when Isomorfeus.api_websocket_path
28
31
  if env['rack.upgrade?'] == :websocket
29
- user, _session_id = user_from_env(env)
30
- env['rack.upgrade'] = Isomorfeus::Transport::ServerSocketProcessor.new(user)
32
+ user, session_id = user_from_env(env)
33
+ env['rack.upgrade'] = Isomorfeus::Transport::ServerSocketProcessor.new(user, session_id)
31
34
  end
32
35
  WS_RESPONSE
33
- elsif env['PATH_INFO'] == Isomorfeus.cookie_eater_path
36
+ when Isomorfeus.cookie_eater_path
34
37
  cookie_accessor, new_path = env['QUERY_STRING'].split('=')
35
- cookie = Isomorfeus.session_store.take_cookie(accessor: cookie_accessor)
38
+ cookie = Isomorfeus.session_class&.take_cookie(accessor: cookie_accessor)
36
39
  if new_path.start_with?('/')
37
40
  if cookie
38
41
  [302, { 'Location' => new_path, 'Set-Cookie' => cookie }, ["Cookie eaten!"]]
@@ -42,11 +45,11 @@ module Isomorfeus
42
45
  else
43
46
  [404, {}, ["Must specify relative path!"]]
44
47
  end
45
- elsif env['PATH_INFO'] == Isomorfeus.api_logout_path
48
+ when Isomorfeus.api_logout_path
46
49
  user, session_id = user_from_env(env)
47
50
  if user
48
51
  begin
49
- Isomorfeus.session_store.remove(session_id: session_id)
52
+ Isomorfeus.session_class&.remove(session_id: session_id)
50
53
  cookie = "session=#{session_id}; SameSite=Strict; HttpOnly; Path=/; expires=Thu, 01 Jan 1970 00:00:00 UTC#{'; Secure' if Isomorfeus.production?}"
51
54
  return [302, { 'Location' => '/', 'Set-Cookie' => cookie }, ["Logged out!"]]
52
55
  ensure
@@ -3,8 +3,10 @@ module Isomorfeus
3
3
  class ServerSocketProcessor
4
4
  include Isomorfeus::Transport::ServerProcessor
5
5
 
6
- def initialize(user)
6
+ def initialize(user, session_id)
7
7
  @user = user
8
+ @session_id = session_id
9
+ @atime = Time.now
8
10
  end
9
11
 
10
12
  def on_message(client, data)
@@ -19,19 +21,21 @@ module Isomorfeus
19
21
  Isomorfeus.zeitwerk_lock.acquire_read_lock
20
22
  end
21
23
  request_hash = Oj.load(data, mode: :strict)
22
- handler_instance_cache = {}
23
- response_agent_array = []
24
- Thread.current[:isomorfeus_user] = user(client)
25
- Thread.current[:isomorfeus_pub_sub_client] = client
26
- process_request(request_hash, handler_instance_cache, response_agent_array)
27
- handler_instance_cache.each_value do |handler|
28
- handler.resolve if handler.resolving?
29
- end
30
- result = {}
31
- response_agent_array.each do |response_agent|
32
- result.deep_merge!(response_agent.result)
24
+ Thread.current[:isomorfeus_user] = user
25
+ unless request_hash.key?(:iso_ping)
26
+ handler_instance_cache = {}
27
+ response_agent_array = []
28
+ Thread.current[:isomorfeus_pub_sub_client] = client
29
+ process_request(request_hash, handler_instance_cache, response_agent_array)
30
+ handler_instance_cache.each_value do |handler|
31
+ handler.resolve if handler.resolving?
32
+ end
33
+ result = {}
34
+ response_agent_array.each do |response_agent|
35
+ result.deep_merge!(response_agent.result)
36
+ end
37
+ client.write Oj.dump(result, mode: :strict) unless result.empty?
33
38
  end
34
- client.write Oj.dump(result, mode: :strict) unless result.empty?
35
39
  ensure
36
40
  Thread.current[:isomorfeus_user] = nil
37
41
  Thread.current[:isomorfeus_pub_sub_client] = nil
@@ -50,8 +54,13 @@ module Isomorfeus
50
54
  # nothing for now
51
55
  end
52
56
 
53
- def user(client)
54
- @user ||= Anonymous.new
57
+ def user
58
+ t = Time.now
59
+ if @session_id && (t - @atime) > 600
60
+ Isomorfeus.session_class&.touch(session_id: @session_id)
61
+ @atime = t
62
+ end
63
+ @user
55
64
  end
56
65
  end
57
66
  end
@@ -1,5 +1,5 @@
1
1
  module Isomorfeus
2
2
  module Transport
3
- VERSION = '2.2.11'
3
+ VERSION = '2.3.0'
4
4
  end
5
5
  end
@@ -2,6 +2,8 @@ module Isomorfeus
2
2
  module Transport
3
3
  class << self
4
4
  if RUBY_ENGINE == 'opal'
5
+ PING = `JSON.stringify({iso_ping: true})`
6
+
5
7
  attr_accessor :socket
6
8
 
7
9
  def init
@@ -57,10 +59,18 @@ module Isomorfeus
57
59
  open_promise.then { promise_send_request(request) } if agent && !agent.sent
58
60
  end
59
61
  open_promise.then { promise.resolve(true) }
62
+ keep_session_alive if on_browser?
60
63
  end
61
64
  promise
62
65
  end
63
66
 
67
+ def keep_session_alive
68
+ after 480000 do
69
+ @socket.send(PING)
70
+ keep_session_alive
71
+ end
72
+ end
73
+
64
74
  def disconnect
65
75
  @socket.close if @socket
66
76
  @socket = nil
@@ -1,5 +1,4 @@
1
1
  require 'isomorfeus-policy'
2
- require 'lucid_authentication/mixin'
3
2
  if RUBY_ENGINE == 'opal'
4
3
  require 'json'
5
4
  require 'isomorfeus/transport/version'
@@ -33,7 +32,6 @@ else
33
32
  require 'active_support'
34
33
  require 'isomorfeus-asset-manager'
35
34
  require 'isomorfeus-hamster'
36
- require 'isomorfeus/transport/hamster_session_store'
37
35
  opal_path = Gem::Specification.find_by_name('opal').full_gem_path
38
36
  promise_path = File.join(opal_path, 'stdlib', 'promise.rb')
39
37
  require promise_path
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isomorfeus-transport
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.11
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-03 00:00:00.000000000 Z
11
+ date: 2022-03-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -100,56 +100,42 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 0.14.17
103
+ version: 0.14.21
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 0.14.17
111
- - !ruby/object:Gem::Dependency
112
- name: isomorfeus-hamster
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: 0.6.6
118
- type: :runtime
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: 0.6.6
110
+ version: 0.14.21
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: isomorfeus-preact
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
115
  - - "~>"
130
116
  - !ruby/object:Gem::Version
131
- version: 10.6.56
117
+ version: 10.6.60
132
118
  type: :runtime
133
119
  prerelease: false
134
120
  version_requirements: !ruby/object:Gem::Requirement
135
121
  requirements:
136
122
  - - "~>"
137
123
  - !ruby/object:Gem::Version
138
- version: 10.6.56
124
+ version: 10.6.60
139
125
  - !ruby/object:Gem::Dependency
140
126
  name: isomorfeus-policy
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
129
  - - '='
144
130
  - !ruby/object:Gem::Version
145
- version: 2.2.11
131
+ version: 2.3.0
146
132
  type: :runtime
147
133
  prerelease: false
148
134
  version_requirements: !ruby/object:Gem::Requirement
149
135
  requirements:
150
136
  - - '='
151
137
  - !ruby/object:Gem::Version
152
- version: 2.2.11
138
+ version: 2.3.0
153
139
  - !ruby/object:Gem::Dependency
154
140
  name: isomorfeus-redux
155
141
  requirement: !ruby/object:Gem::Requirement
@@ -170,14 +156,14 @@ dependencies:
170
156
  requirements:
171
157
  - - "~>"
172
158
  - !ruby/object:Gem::Version
173
- version: 0.5.2
159
+ version: 0.5.3
174
160
  type: :runtime
175
161
  prerelease: false
176
162
  version_requirements: !ruby/object:Gem::Requirement
177
163
  requirements:
178
164
  - - "~>"
179
165
  - !ruby/object:Gem::Version
180
- version: 0.5.2
166
+ version: 0.5.3
181
167
  - !ruby/object:Gem::Dependency
182
168
  name: rack
183
169
  requirement: !ruby/object:Gem::Requirement
@@ -226,14 +212,14 @@ dependencies:
226
212
  requirements:
227
213
  - - '='
228
214
  - !ruby/object:Gem::Version
229
- version: 2.2.11
215
+ version: 2.3.0
230
216
  type: :development
231
217
  prerelease: false
232
218
  version_requirements: !ruby/object:Gem::Requirement
233
219
  requirements:
234
220
  - - '='
235
221
  - !ruby/object:Gem::Version
236
- version: 2.2.11
222
+ version: 2.3.0
237
223
  - !ruby/object:Gem::Dependency
238
224
  name: rake
239
225
  requirement: !ruby/object:Gem::Requirement
@@ -275,7 +261,6 @@ files:
275
261
  - lib/isomorfeus/transport/client_processor.rb
276
262
  - lib/isomorfeus/transport/compressor_rack.rb
277
263
  - lib/isomorfeus/transport/config.rb
278
- - lib/isomorfeus/transport/hamster_session_store.rb
279
264
  - lib/isomorfeus/transport/handler/authentication_handler.rb
280
265
  - lib/isomorfeus/transport/imports.rb
281
266
  - lib/isomorfeus/transport/middlewares.rb
@@ -287,7 +272,6 @@ files:
287
272
  - lib/isomorfeus/transport/ssr_login.rb
288
273
  - lib/isomorfeus/transport/version.rb
289
274
  - lib/isomorfeus/transport/websocket_client.rb
290
- - lib/lucid_authentication/mixin.rb
291
275
  - lib/lucid_channel/base.rb
292
276
  - lib/lucid_channel/mixin.rb
293
277
  - lib/lucid_handler/base.rb
@@ -1,96 +0,0 @@
1
- module Isomorfeus
2
- module Transport
3
- class HamsterSessionStore
4
- class << self
5
- def environment
6
- @environment
7
- end
8
-
9
- def environment=(env)
10
- @environment = env
11
- end
12
-
13
- def ref
14
- @ref ||= 0
15
- end
16
-
17
- def ref=(val)
18
- @ref = val
19
- end
20
-
21
- def refa
22
- self.ref += 1
23
- end
24
-
25
- def refs
26
- self.ref -= 1 if self.ref > 0
27
- end
28
-
29
- def finalize(cls)
30
- proc do
31
- cls.refs
32
- if cls.ref == 0
33
- cls.environment.close rescue nil
34
- end
35
- end
36
- end
37
- end
38
-
39
- def initialize(cookie_hamster_path)
40
- @cookie_hamster_path = cookie_hamster_path
41
- open_environment
42
- @db = self.class.environment.database('cookies', create: true)
43
- ObjectSpace.define_finalizer(self, self.class.finalize(self.class))
44
- end
45
-
46
- def add(session_id:, cookie:, user:, accessor:)
47
- @db.env.transaction do
48
- @db.put(session_id, Oj.dump([user.class.to_s, user.key], mode: :strict))
49
- @db.put(accessor, cookie)
50
- end
51
- end
52
-
53
- def take_cookie(accessor:)
54
- @db.env.transaction do
55
- cookie = @db.get(accessor)
56
- if cookie
57
- session_info = cookie.split('; ').first
58
- session_id = session_info.split('=').last.strip
59
- @db.put("eaten_#{accessor}", session_id)
60
- @db.delete(accessor)
61
- else
62
- # asked for the same cookie a second time
63
- # can probably only be due to session hijacking
64
- # so delete all sessions associated with that accessor
65
- session_id = @db.get("eaten_#{accessor}")
66
- @db.delete(session_id) if session_id
67
- end
68
- cookie
69
- end
70
- end
71
-
72
- def get_user(session_id:)
73
- json = @db.get(session_id)
74
- if json
75
- user_info = Oj.load(json, mode: :strict)
76
- user_info[0].constantize.load(key: user_info[1]) if user_info
77
- end
78
- end
79
-
80
- def remove(session_id:)
81
- @db.env.transaction do
82
- @db.delete(session_id)
83
- end
84
- end
85
-
86
- private
87
-
88
- def open_environment
89
- return self.class.refa if self.class.environment
90
- FileUtils.mkdir_p(@cookie_hamster_path) unless Dir.exist?(@cookie_hamster_path)
91
- self.class.environment = Isomorfeus::Hamster.new(@cookie_hamster_path)
92
- self.class.refa
93
- end
94
- end
95
- end
96
- end
@@ -1,123 +0,0 @@
1
- module LucidAuthentication
2
- module Mixin
3
- def anonymous?
4
- self.class == Anonymous
5
- end
6
-
7
- if RUBY_ENGINE == 'opal'
8
- def self.included(base)
9
- base.instance_exec do
10
- def execute_login(&block)
11
- end
12
-
13
- def promise_login(user: nil, pass: nil, scheme: :isomorfeus, &block)
14
- send("promise_authentication_with_#{scheme}", user: user, pass: pass, &block)
15
- end
16
-
17
- def promise_authentication_with_isomorfeus(user: nil, pass: nil, &block)
18
- if Isomorfeus.production?
19
- Isomorfeus.raise_error(message: "Connection not secure, can't login!") unless Isomorfeus::Transport.socket.url.start_with?('wss:')
20
- else
21
- `console.warn("Connection not secure, ensure a secure connection in production, otherwise login will fail!")` unless Isomorfeus::Transport.socket.url.start_with?('wss:')
22
- end
23
- Isomorfeus::Transport.promise_send_path('Isomorfeus::Transport::Handler::AuthenticationHandler', 'login', self.name, user, pass).then do |agent|
24
- if agent.processed
25
- agent.result
26
- else
27
- agent.processed = true
28
- if agent.response.key?(:success)
29
- Isomorfeus.store.dispatch(type: 'DATA_LOAD', data: agent.response[:data])
30
- class_name = agent.response[:data].keys.first
31
- key = agent.response[:data][class_name].keys.first
32
- logged_in_user = Isomorfeus.cached_data_class(class_name).new(key: key)
33
- cookie_accessor = agent.response[:session_cookie_accessor]
34
- begin
35
- target = if block_given?
36
- block.call(logged_in_user)
37
- else
38
- `window.location.pathname`
39
- end
40
- unless target.class == String && target.start_with?('/')
41
- Isomorfeus.raise_error(message: "A path must be returned as string starting with '/', returned was #{target}!")
42
- end
43
- rescue
44
- target = `window.location.pathname`
45
- end
46
- cookie_query = "#{Isomorfeus.cookie_eater_path}?#{cookie_accessor}=#{target}"
47
- `window.location = cookie_query` # doing page load and redirect
48
- nil
49
- else
50
- Isomorfeus.raise_error(message: "Login failed with '#{agent.response[:error]}'!") # triggers .fail
51
- end
52
- end
53
- end
54
- end
55
- end
56
- end
57
-
58
- def promise_logout(scheme: :isomorfeus)
59
- send("promise_deauthentication_with_#{scheme}")
60
- end
61
-
62
- def promise_deauthentication_with_isomorfeus
63
- cookie = `document.cookie`
64
- p = Promise.new
65
- begin
66
- logout_query = Isomorfeus.api_logout_path
67
- `window.location = logout_query`
68
- rescue
69
- p.reject
70
- end
71
- end
72
- else
73
- def self.included(base)
74
- Isomorfeus.add_valid_user_class(base)
75
-
76
- base.instance_exec do
77
- def execute_login(&block)
78
- @execute_login_block = block
79
- end
80
-
81
- def promise_login(user: nil, pass: nil, scheme: :isomorfeus, &block)
82
- send("promise_authentication_with_#{scheme}", user: user, pass: pass, &block)
83
- end
84
-
85
- def promise_authentication_with_isomorfeus(user: nil, pass: nil, &block)
86
- promise_or_user = @execute_login_block.call(user: user, pass: pass)
87
- if promise_or_user.class == Promise
88
- if block_given?
89
- promise_or_user.then do |user|
90
- block.call(user)
91
- user
92
- end
93
- else
94
- promise_or_user
95
- end
96
- else
97
- block.call(user) if block_given?
98
- Promise.new.resolve(promise_or_user)
99
- end
100
- end
101
- end
102
- end
103
-
104
- def encrypt_password(password, password_confirmation)
105
- raise "Password and confirmation don't match!" unless password == password_confirmation
106
- BCrypt::Password.create(password).to_s
107
- end
108
-
109
- def passwords_match?(encrypted_password, given_password)
110
- bcrypt_pass = BCrypt::Password.new(encrypted_password)
111
- bcrypt_pass == given_password
112
- end
113
-
114
- def promise_logout(scheme: :isomorfeus)
115
- send("promise_deauthentication_with_#{scheme}")
116
- end
117
-
118
- def promise_deauthentication_with_isomorfeus
119
- Promise.new.resolve(true)
120
- end
121
- end
122
- end
123
- end