glogin 0.2.4 → 0.3
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/.rubocop.yml +1 -1
- data/README.md +6 -0
- data/Rakefile +1 -0
- data/glogin.gemspec +7 -7
- data/lib/glogin/cookie.rb +23 -6
- data/lib/glogin/version.rb +1 -1
- data/test/glogin/test_cookie.rb +31 -0
- metadata +28 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3c071f29aab8173a4e284f3474e9ec61fca2a35
|
4
|
+
data.tar.gz: e79f3c2070e7779837fbd91fd9ed57b238eab102
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 843729ae29be1dc09908a270559dd7358e37ab37709b4a51412c98d8bf94bbe0d4f7ba7967f9e53453db62b3f2b07e4e1bdd2518d78d788fdd952fdad013f22b
|
7
|
+
data.tar.gz: 76185f8c23855c3929d84fe7df2adcdf492ab8efce2508d0b077b77cfbb44280ffd69be2ff4c9f1c644a4e61f702ba503884ceeb015752e4fbd5c32f47763994
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -84,6 +84,12 @@ get '/logout' do
|
|
84
84
|
end
|
85
85
|
```
|
86
86
|
|
87
|
+
It is recommended to provide the third "context" parameter to
|
88
|
+
`GLogin::Cookie::Closed` and `GLogin::Cookie::Open` constructors, in order
|
89
|
+
to enforce stronger security. The context may include the `User-Agent`
|
90
|
+
HTTP header of the user, their IP address, and so on. When anything
|
91
|
+
changes on the user side, they will be forced to re-login.
|
92
|
+
|
87
93
|
One more thing is the login URL you will need for your front page. Here
|
88
94
|
it is:
|
89
95
|
|
data/Rakefile
CHANGED
data/glogin.gemspec
CHANGED
@@ -45,11 +45,11 @@ Gem::Specification.new do |s|
|
|
45
45
|
s.test_files = s.files.grep(%r{^(test|features)/})
|
46
46
|
s.rdoc_options = ['--charset=UTF-8']
|
47
47
|
s.extra_rdoc_files = ['README.md', 'LICENSE.txt']
|
48
|
-
s.add_development_dependency 'codecov', '0.1
|
49
|
-
s.add_development_dependency 'minitest', '5.5
|
50
|
-
s.add_development_dependency 'rake', '12.0
|
51
|
-
s.add_development_dependency 'rdoc', '4.2
|
52
|
-
s.add_development_dependency 'rspec-rails', '3.1
|
53
|
-
s.add_development_dependency 'rubocop', '0.57'
|
54
|
-
s.add_development_dependency 'rubocop-rspec', '1.5
|
48
|
+
s.add_development_dependency 'codecov', '~>0.1'
|
49
|
+
s.add_development_dependency 'minitest', '~>5.5'
|
50
|
+
s.add_development_dependency 'rake', '~>12.0'
|
51
|
+
s.add_development_dependency 'rdoc', '~>4.2'
|
52
|
+
s.add_development_dependency 'rspec-rails', '~>3.1'
|
53
|
+
s.add_development_dependency 'rubocop', '~>0.57'
|
54
|
+
s.add_development_dependency 'rubocop-rspec', '~>1.5'
|
55
55
|
end
|
data/lib/glogin/cookie.rb
CHANGED
@@ -32,15 +32,21 @@ module GLogin
|
|
32
32
|
# Secure cookie
|
33
33
|
#
|
34
34
|
class Cookie
|
35
|
-
# Closed
|
35
|
+
# Closed cookie.
|
36
36
|
class Closed
|
37
|
-
def initialize(text, secret)
|
37
|
+
def initialize(text, secret, context = '')
|
38
38
|
raise 'Text can\'t be nil' if text.nil?
|
39
39
|
@text = text
|
40
40
|
raise 'Secret can\'t be nil' if secret.nil?
|
41
41
|
@secret = secret
|
42
|
+
@context = context.to_s
|
42
43
|
end
|
43
44
|
|
45
|
+
# Returns a hash with two elements: login and avatar.
|
46
|
+
# If the secret is empty, the text will be returned, without
|
47
|
+
# any decryption. If the data is not valid, an exception
|
48
|
+
# OpenSSL::Cipher::CipherError will be raised, which you have
|
49
|
+
# to catch in your applicaiton and ignore the login attempt.
|
44
50
|
def to_user
|
45
51
|
plain =
|
46
52
|
if @secret.empty?
|
@@ -53,25 +59,36 @@ module GLogin
|
|
53
59
|
decrypted << cpr.final
|
54
60
|
decrypted.to_s
|
55
61
|
end
|
56
|
-
parts = plain.split('|')
|
62
|
+
parts = plain.split('|', 3)
|
63
|
+
unless parts[2].to_s == @context
|
64
|
+
raise(
|
65
|
+
OpenSSL::Cipher::CipherError,
|
66
|
+
"Context '#{@context}' expectected, but '#{parts[2]}' found"
|
67
|
+
)
|
68
|
+
end
|
57
69
|
{ login: parts[0], avatar: parts[1] }
|
58
70
|
end
|
59
71
|
end
|
60
72
|
|
61
73
|
# Open
|
62
74
|
class Open
|
63
|
-
|
75
|
+
# Here comes the JSON you receive from Auth.user()
|
76
|
+
def initialize(json, secret, context = '')
|
64
77
|
raise 'JSON can\'t be nil' if json.nil?
|
65
78
|
@json = json
|
66
79
|
raise 'Secret can\'t be nil' if secret.nil?
|
67
80
|
@secret = secret
|
81
|
+
@context = context.to_s
|
68
82
|
end
|
69
83
|
|
84
|
+
# Returns the text you should drop back to the user as a cookie.
|
70
85
|
def to_s
|
71
86
|
cpr = Cookie.cipher
|
72
87
|
cpr.encrypt
|
73
88
|
cpr.key = Cookie.digest(@secret)
|
74
|
-
encrypted = cpr.update(
|
89
|
+
encrypted = cpr.update(
|
90
|
+
"#{@json['login']}|#{@json['avatar_url']}|#{@context}"
|
91
|
+
)
|
75
92
|
encrypted << cpr.final
|
76
93
|
Base64.encode64(encrypted.to_s)
|
77
94
|
end
|
@@ -82,7 +99,7 @@ module GLogin
|
|
82
99
|
end
|
83
100
|
|
84
101
|
def self.cipher
|
85
|
-
OpenSSL::Cipher
|
102
|
+
OpenSSL::Cipher.new('aes-256-cbc')
|
86
103
|
end
|
87
104
|
end
|
88
105
|
end
|
data/lib/glogin/version.rb
CHANGED
data/test/glogin/test_cookie.rb
CHANGED
@@ -39,6 +39,22 @@ class TestCookie < Minitest::Test
|
|
39
39
|
assert_equal(user[:avatar], 'https://avatars1.githubusercontent.com/u/526301')
|
40
40
|
end
|
41
41
|
|
42
|
+
def test_encrypts_and_decrypts_with_context
|
43
|
+
secret = 'kfdj7hjsywhs6hjshr7shsw990s'
|
44
|
+
context = '127.0.0.1'
|
45
|
+
user = GLogin::Cookie::Closed.new(
|
46
|
+
GLogin::Cookie::Open.new(
|
47
|
+
JSON.parse('{"login":"jeffrey","avatar_url":"#"}'),
|
48
|
+
secret,
|
49
|
+
context
|
50
|
+
).to_s,
|
51
|
+
secret,
|
52
|
+
context
|
53
|
+
).to_user
|
54
|
+
assert_equal(user[:login], 'jeffrey')
|
55
|
+
assert_equal(user[:avatar], '#')
|
56
|
+
end
|
57
|
+
|
42
58
|
def test_decrypts_in_test_mode
|
43
59
|
user = GLogin::Cookie::Closed.new(
|
44
60
|
'test|http://example.com', ''
|
@@ -58,4 +74,19 @@ class TestCookie < Minitest::Test
|
|
58
74
|
).to_user
|
59
75
|
end
|
60
76
|
end
|
77
|
+
|
78
|
+
def test_fails_on_wrong_context
|
79
|
+
secret = 'fdjruewoijs789fdsufds89f7ds89fs'
|
80
|
+
assert_raises OpenSSL::Cipher::CipherError do
|
81
|
+
GLogin::Cookie::Closed.new(
|
82
|
+
GLogin::Cookie::Open.new(
|
83
|
+
JSON.parse('{"login":"x","avatar_url":"x"}'),
|
84
|
+
secret,
|
85
|
+
'context-1'
|
86
|
+
).to_s,
|
87
|
+
secret,
|
88
|
+
'context-2'
|
89
|
+
).to_user
|
90
|
+
end
|
91
|
+
end
|
61
92
|
end
|
metadata
CHANGED
@@ -1,113 +1,113 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glogin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yegor Bugayenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: codecov
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.1
|
19
|
+
version: '0.1'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.1
|
26
|
+
version: '0.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: minitest
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 5.5
|
33
|
+
version: '5.5'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 5.5
|
40
|
+
version: '5.5'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 12.0
|
47
|
+
version: '12.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 12.0
|
54
|
+
version: '12.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rdoc
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 4.2
|
61
|
+
version: '4.2'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 4.2
|
68
|
+
version: '4.2'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec-rails
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 3.1
|
75
|
+
version: '3.1'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 3.1
|
82
|
+
version: '3.1'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rubocop
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0.57'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0.57'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rubocop-rspec
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: 1.5
|
103
|
+
version: '1.5'
|
104
104
|
type: :development
|
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: 1.5
|
110
|
+
version: '1.5'
|
111
111
|
description: Enables login/logout functionality for a Ruby web app
|
112
112
|
email: yegor256@gmail.com
|
113
113
|
executables: []
|