rbsso 0.1.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 75980e68e3d92bcfc59318aa7cdd6b36cc543ca6
4
+ data.tar.gz: bd94e5d7917823d74151cf238afaa2e92ca72a5a
5
+ SHA512:
6
+ metadata.gz: f8572edfafd1de42e05e74c642225c648213bcb4e2d4223b4eecd58d598bffefa08e7c8f0cf49bf73d9b53577508bfb5dc550da06a5f708f872de6d328a15736
7
+ data.tar.gz: a06367346e63c690e1777cd8746d31f2da22612ec1d2ea8ce7253fd0f618e04eb97c6b46167a125999e73dc4abc1970d04959dd67f4d1b1672888aa72dc749c3
data/lib/rbsso.rb ADDED
@@ -0,0 +1,2 @@
1
+ require 'rbsso/client'
2
+ require 'rbsso/server'
@@ -0,0 +1,25 @@
1
+ require 'rbnacl'
2
+ require 'rbsso/ticket'
3
+ require 'rbsso/content'
4
+
5
+ module RbSSO
6
+ class Client
7
+
8
+ def initialize(key)
9
+ if !key || key !~ /[0-9a-f]{64}/i
10
+ raise ArgumentError, "key MUST be 32 bytes, hex encoded string, was: #{key}"
11
+ end
12
+ key = RbNaCl::VerifyKey.new [key].pack('H*')
13
+ @verify_key = key
14
+ end
15
+
16
+ def open(ticket_string)
17
+ ticket = RbSSO::Ticket.open ticket_string, verify_key
18
+ content = RbSSO::Content.parse ticket.content
19
+ content.to_info
20
+ end
21
+
22
+ protected
23
+ attr_reader :verify_key
24
+ end
25
+ end
@@ -0,0 +1,41 @@
1
+ module RbSSO
2
+ class Content
3
+ VERSION = 3
4
+
5
+ attr_reader :user, :service, :domain, :groups, :expires
6
+
7
+ def initialize(user:, service:, domain:, groups: [], ttl: 3600, expires: nil)
8
+ @user, @service, @domain, @groups = user, service, domain, groups
9
+ @expires = expires || (Time.now + ttl).to_i
10
+ end
11
+
12
+ def self.parse(string)
13
+ version, user, service, domain, expires, groups = string.split '|'
14
+ groups ||= ''
15
+ groups = groups.split ','
16
+ expires = expires.to_i
17
+ new user: user, service: service, domain: domain, expires: expires, groups: groups
18
+ end
19
+
20
+ def to_s
21
+ content.join '|'
22
+ end
23
+
24
+ def to_info
25
+ { name: user, email: user + '@' + domain }
26
+ end
27
+
28
+ def content
29
+ [VERSION, user, service, domain, expires.to_s, groups.join(',')]
30
+ end
31
+
32
+ def ==(other)
33
+ user == other.user &&
34
+ service == other.service &&
35
+ domain == other.domain &&
36
+ groups == other.groups &&
37
+ expires == other.expires
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,29 @@
1
+ require 'rbsso/content'
2
+ require 'rbsso/ticket'
3
+
4
+ module RbSSO
5
+ class Server
6
+
7
+ def initialize(secret)
8
+ if !secret || secret !~ /[0-9a-f]{64}/i
9
+ raise ArgumentError, "seed MUST be 32 bytes, hex encoded string"
10
+ end
11
+ seed_binary = [secret].pack('H*')
12
+ @key = RbNaCl::SigningKey.new seed_binary
13
+ end
14
+
15
+ def ticket(user, service, domain)
16
+ content = RbSSO::Content.new user: user, service: service, domain: domain
17
+ ticket = RbSSO::Ticket.sign content, key
18
+ return ticket.to_base64
19
+ end
20
+
21
+ def verify_key
22
+ key.verify_key.to_s.unpack('H*').first
23
+ end
24
+
25
+ protected
26
+
27
+ attr_reader :key
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ require 'base64'
2
+
3
+ module RbSSO
4
+ class Ticket
5
+ attr_reader :content, :signature
6
+
7
+ def self.sign(content, key)
8
+ new content.to_s, key.sign(content.to_s), key.verify_key
9
+ end
10
+
11
+ def self.open(encoded, verify_key)
12
+ decoded = Base64.urlsafe_decode64 encoded
13
+ new decoded[64..-1], decoded[0..63], verify_key
14
+ end
15
+
16
+ def initialize(content, signature, verify_key)
17
+ verify_key.verify(signature, content)
18
+ @content = content
19
+ @signature = signature
20
+ end
21
+
22
+ def to_base64
23
+ Base64.urlsafe_encode64(signature + content)
24
+ end
25
+ end
26
+ end
metadata ADDED
@@ -0,0 +1,99 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rbsso
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Azul
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-12 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rbnacl
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 3.4.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '5.0'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 3.4.0
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '12.0'
40
+ type: :development
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '12.0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: minitest
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '5.0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '5.0'
61
+ description: |
62
+ This is a ruby version based on libsodium of "ai sso"(https://git.autistici.org/ai/sso).
63
+
64
+ We'll provide an omniauth strategy. It could also be used in bonafide server to sign sso tickets to be consumed by soledad server.
65
+ email: azul@riseup.net
66
+ executables: []
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - lib/rbsso.rb
71
+ - lib/rbsso/client.rb
72
+ - lib/rbsso/content.rb
73
+ - lib/rbsso/server.rb
74
+ - lib/rbsso/ticket.rb
75
+ homepage: https://0xacab.org/azul/rbsso
76
+ licenses:
77
+ - MIT
78
+ metadata: {}
79
+ post_install_message:
80
+ rdoc_options: []
81
+ require_paths:
82
+ - lib
83
+ required_ruby_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ requirements: []
94
+ rubyforge_project:
95
+ rubygems_version: 2.5.1
96
+ signing_key:
97
+ specification_version: 4
98
+ summary: Ruby implementation for ai's libsso
99
+ test_files: []