rbsso 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: []