scim-shady 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.gitlab-ci.yml +15 -0
- data/.travis.yml +1 -0
- data/lib/scim/shady.rb +19 -1
- data/lib/scim/shady/address.rb +41 -0
- data/lib/scim/shady/buildable.rb +21 -0
- data/lib/scim/shady/builders.rb +14 -0
- data/lib/scim/shady/builders/addresses.rb +24 -0
- data/lib/scim/shady/builders/bulk.rb +19 -0
- data/lib/scim/shady/builders/emails.rb +16 -0
- data/lib/scim/shady/builders/filter.rb +17 -0
- data/lib/scim/shady/builders/groups.rb +16 -0
- data/lib/scim/shady/builders/instant_messengers.rb +16 -0
- data/lib/scim/shady/builders/metadata.rb +29 -0
- data/lib/scim/shady/builders/name.rb +27 -0
- data/lib/scim/shady/builders/phone_numbers.rb +16 -0
- data/lib/scim/shady/builders/photos.rb +16 -0
- data/lib/scim/shady/builders/resource.rb +26 -0
- data/lib/scim/shady/builders/service_provider_configuration.rb +83 -0
- data/lib/scim/shady/builders/user.rb +96 -0
- data/lib/scim/shady/builders/x509_certificates.rb +16 -0
- data/lib/scim/shady/group.rb +25 -0
- data/lib/scim/shady/instant_messenger.rb +21 -0
- data/lib/scim/shady/metadata.rb +45 -0
- data/lib/scim/shady/name.rb +17 -0
- data/lib/scim/shady/phone_number.rb +29 -0
- data/lib/scim/shady/photo.rb +29 -0
- data/lib/scim/shady/resource.rb +25 -0
- data/lib/scim/shady/schemas.rb +17 -0
- data/lib/scim/shady/service_provider_configuration.rb +71 -0
- data/lib/scim/shady/user.rb +71 -0
- data/lib/scim/shady/version.rb +1 -1
- data/lib/scim/shady/x509_certificate.rb +17 -0
- data/scim-shady.gemspec +5 -3
- metadata +62 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8bdfa18d1a406fd72885524c3c29ec078063cd78e48fadc87bb90cf44da67502
|
4
|
+
data.tar.gz: cee21c5eee72ad6ce0aaa696e0c51277b87657a7a025a096f70106c9742f6743
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5dd9051bbcf1dcbde1a5118a66ac37860fac7eab5a4324aa1ce9362e17609e3627728f71c0c7b19128f7ea1a6b892e9a5e387249b94a9a2d607193da8aa6bc22
|
7
|
+
data.tar.gz: 4c092ab94c3ac821682af4e09113e8eaa384db6739bbd47aca2ef2b929f02792866640c190bb812805ad35a24ced46c1fe1c9fd86ce231dc88b9e88e9cb113d1
|
data/.gitignore
CHANGED
data/.gitlab-ci.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
image: ruby:2.2
|
2
|
+
|
3
|
+
before_script:
|
4
|
+
- apt-get update && apt-get install -y locales
|
5
|
+
- echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
|
6
|
+
- locale-gen
|
7
|
+
- export LC_ALL=en_US.UTF-8
|
8
|
+
- ruby -v
|
9
|
+
- which ruby
|
10
|
+
- gem install bundler --no-ri --no-rdoc
|
11
|
+
- bundle install --jobs $(nproc) "${FLAGS[@]}"
|
12
|
+
|
13
|
+
rspec:
|
14
|
+
script:
|
15
|
+
- bundle exec rspec
|
data/.travis.yml
CHANGED
data/lib/scim/shady.rb
CHANGED
@@ -1,7 +1,25 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
require "json"
|
3
|
+
require "time"
|
4
|
+
require "active_support/concern"
|
5
|
+
|
6
|
+
require "scim/shady/address"
|
7
|
+
require "scim/shady/buildable"
|
8
|
+
require "scim/shady/builders"
|
9
|
+
require "scim/shady/group"
|
10
|
+
require "scim/shady/instant_messenger"
|
11
|
+
require "scim/shady/metadata"
|
12
|
+
require "scim/shady/name"
|
13
|
+
require "scim/shady/phone_number"
|
14
|
+
require "scim/shady/photo"
|
15
|
+
require "scim/shady/resource"
|
16
|
+
require "scim/shady/schemas"
|
17
|
+
require "scim/shady/service_provider_configuration"
|
18
|
+
require "scim/shady/user"
|
1
19
|
require "scim/shady/version"
|
20
|
+
require "scim/shady/x509_certificate"
|
2
21
|
|
3
22
|
module Scim
|
4
23
|
module Shady
|
5
|
-
# Your code goes here...
|
6
24
|
end
|
7
25
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
class Address
|
4
|
+
def initialize(hash)
|
5
|
+
@hash = hash
|
6
|
+
end
|
7
|
+
|
8
|
+
def street_address
|
9
|
+
to_h['streetAddress']
|
10
|
+
end
|
11
|
+
|
12
|
+
def locality
|
13
|
+
to_h['locality']
|
14
|
+
end
|
15
|
+
|
16
|
+
def region
|
17
|
+
to_h['region']
|
18
|
+
end
|
19
|
+
|
20
|
+
def postal_code
|
21
|
+
to_h['postalCode']
|
22
|
+
end
|
23
|
+
|
24
|
+
def country
|
25
|
+
to_h['country']
|
26
|
+
end
|
27
|
+
|
28
|
+
def formatted
|
29
|
+
"#{street_address}\n#{locality}, #{region} #{postal_code} #{country}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def primary?
|
33
|
+
to_h['primary']
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_h
|
37
|
+
@hash
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Buildable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
class_methods do
|
7
|
+
def build
|
8
|
+
builder do |builder|
|
9
|
+
yield builder if block_given?
|
10
|
+
end.build
|
11
|
+
end
|
12
|
+
|
13
|
+
def builder
|
14
|
+
builder = builder_class.new
|
15
|
+
yield builder if block_given?
|
16
|
+
builder
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "scim/shady/builders/addresses"
|
2
|
+
require "scim/shady/builders/bulk"
|
3
|
+
require "scim/shady/builders/emails"
|
4
|
+
require "scim/shady/builders/filter"
|
5
|
+
require "scim/shady/builders/groups"
|
6
|
+
require "scim/shady/builders/instant_messengers"
|
7
|
+
require "scim/shady/builders/metadata"
|
8
|
+
require "scim/shady/builders/name"
|
9
|
+
require "scim/shady/builders/phone_numbers"
|
10
|
+
require "scim/shady/builders/photos"
|
11
|
+
require "scim/shady/builders/resource"
|
12
|
+
require "scim/shady/builders/service_provider_configuration"
|
13
|
+
require "scim/shady/builders/user"
|
14
|
+
require "scim/shady/builders/x509_certificates"
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class Addresses
|
5
|
+
def add(type:, street_address:, locality:, region:, postal_code:, country:, primary: false)
|
6
|
+
@items ||= []
|
7
|
+
@items.push(
|
8
|
+
type: type,
|
9
|
+
streetAddress: street_address,
|
10
|
+
locality: locality,
|
11
|
+
region: region,
|
12
|
+
postalCode: postal_code,
|
13
|
+
country: country,
|
14
|
+
primary: primary,
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_h
|
19
|
+
{ 'addresses' => @items }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class Bulk
|
5
|
+
attr_accessor :supported
|
6
|
+
attr_accessor :max_operations
|
7
|
+
attr_accessor :max_payload_size
|
8
|
+
|
9
|
+
def to_h
|
10
|
+
{
|
11
|
+
'supported' => supported,
|
12
|
+
'maxOperations' => max_operations,
|
13
|
+
'maxPayloadSize' => max_payload_size,
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class Emails
|
5
|
+
def add(email, type: :work, primary: false)
|
6
|
+
@items ||= []
|
7
|
+
@items.push(value: email, type: type, primary: primary)
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_h
|
11
|
+
{ 'emails' => @items }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class Groups
|
5
|
+
def add(id, url, display_name)
|
6
|
+
@items ||= []
|
7
|
+
@items.push(value: id, '$ref' => url, display: display_name)
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_h
|
11
|
+
{ 'groups' => @items }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class Metadata
|
5
|
+
attr_accessor :created_at
|
6
|
+
attr_accessor :updated_at
|
7
|
+
attr_accessor :location
|
8
|
+
attr_accessor :version
|
9
|
+
|
10
|
+
def initialize(resource)
|
11
|
+
@resource = resource
|
12
|
+
@created_at = @updated_at = Time.now
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_h
|
16
|
+
{
|
17
|
+
'meta' => {
|
18
|
+
'resourceType' => @resource.class.name.split(/::/).last,
|
19
|
+
'created' => created_at.to_time.utc.iso8601,
|
20
|
+
'lastModified' => updated_at.to_time.utc.iso8601,
|
21
|
+
'location' => location,
|
22
|
+
'version' => version,
|
23
|
+
},
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class Name
|
5
|
+
attr_accessor :family_name
|
6
|
+
attr_accessor :given_name
|
7
|
+
attr_accessor :middle_name
|
8
|
+
attr_accessor :honorific_prefix
|
9
|
+
attr_accessor :honorific_suffix
|
10
|
+
attr_accessor :formatted
|
11
|
+
|
12
|
+
def to_h
|
13
|
+
{
|
14
|
+
'name' => {
|
15
|
+
'formatted' => formatted,
|
16
|
+
'familyName' => family_name,
|
17
|
+
'givenName' => given_name,
|
18
|
+
'middleName' => middle_name,
|
19
|
+
'honorificPrefix' => honorific_prefix,
|
20
|
+
'honorificSuffix' => honorific_suffix,
|
21
|
+
}
|
22
|
+
}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class PhoneNumbers
|
5
|
+
def add(phone_number, type: :work)
|
6
|
+
@items ||= []
|
7
|
+
@items.push(value: phone_number, type: type)
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_h
|
11
|
+
{ 'phoneNumbers' => @items }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class Resource
|
5
|
+
extend Forwardable
|
6
|
+
attr_accessor :id
|
7
|
+
def_delegators :@meta, :created_at=, :updated_at=, :location=, :version=
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@meta = Metadata.new(self)
|
11
|
+
end
|
12
|
+
|
13
|
+
def meta
|
14
|
+
yield @meta
|
15
|
+
end
|
16
|
+
|
17
|
+
def to_h
|
18
|
+
{
|
19
|
+
'schemas' => [],
|
20
|
+
'id' => id,
|
21
|
+
}.merge(@meta.to_h)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class ServiceProviderConfiguration
|
5
|
+
extend Forwardable
|
6
|
+
def_delegators :@meta, :created_at=, :updated_at=, :location=, :version=
|
7
|
+
def_delegators :@meta, :created_at, :updated_at, :location, :version
|
8
|
+
attr_accessor :documentation_uri
|
9
|
+
attr_accessor :patch
|
10
|
+
attr_accessor :change_password_supported
|
11
|
+
attr_accessor :sort_supported
|
12
|
+
attr_accessor :etag_supported
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@authentication_schemes = []
|
16
|
+
@created_at = @updated_at = Time.now
|
17
|
+
@meta = Metadata.new(self)
|
18
|
+
end
|
19
|
+
|
20
|
+
def bulk
|
21
|
+
@bulk = Bulk.new
|
22
|
+
yield @bulk
|
23
|
+
end
|
24
|
+
|
25
|
+
def filter
|
26
|
+
@filter = Filter.new
|
27
|
+
yield @filter
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_authentication_scheme(type)
|
31
|
+
if :oauth_bearer_token == type
|
32
|
+
@authentication_schemes.push({
|
33
|
+
"name" => "OAuth Bearer Token",
|
34
|
+
"description" => "Authentication scheme using the OAuth Bearer Token Standard",
|
35
|
+
"specUri" => "http://www.rfc-editor.org/info/rfc6750",
|
36
|
+
"documentationUri" => "http://example.com/help/oauth.html",
|
37
|
+
"type" => "oauthbearertoken",
|
38
|
+
})
|
39
|
+
elsif :http_basic == type
|
40
|
+
@authentication_schemes.push({
|
41
|
+
"name" => "HTTP Basic",
|
42
|
+
"description" => "Authentication scheme using the HTTP Basic Standard",
|
43
|
+
"specUri" => "http://www.rfc-editor.org/info/rfc2617",
|
44
|
+
"documentationUri" => "http://example.com/help/httpBasic.html",
|
45
|
+
"type" => "httpbasic",
|
46
|
+
})
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def build
|
51
|
+
Scim::Shady::ServiceProviderConfiguration.new(to_json)
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_json
|
55
|
+
JSON.generate(to_h)
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_h
|
59
|
+
{
|
60
|
+
'schemas' => [Schemas::SERVICE_PROVIDER_CONFIG],
|
61
|
+
'documentationUri' => documentation_uri,
|
62
|
+
'patch' => { "supported" => patch },
|
63
|
+
'bulk' => @bulk.to_h,
|
64
|
+
'filter' => @filter.to_h,
|
65
|
+
'changePassword' => {
|
66
|
+
'supported' => change_password_supported,
|
67
|
+
},
|
68
|
+
'sort' => {
|
69
|
+
'supported' => sort_supported,
|
70
|
+
},
|
71
|
+
'etag' => {
|
72
|
+
'supported' => etag_supported,
|
73
|
+
},
|
74
|
+
'authenticationSchemes' => @authentication_schemes.each_with_index.map do |scheme, index|
|
75
|
+
scheme['primary'] = true if index.zero?
|
76
|
+
scheme
|
77
|
+
end
|
78
|
+
}.merge(@meta.to_h)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class User < Resource
|
5
|
+
attr_accessor :external_id
|
6
|
+
attr_accessor :username
|
7
|
+
attr_accessor :display_name
|
8
|
+
attr_accessor :nick_name
|
9
|
+
attr_accessor :profile_url
|
10
|
+
attr_accessor :user_type
|
11
|
+
attr_accessor :title
|
12
|
+
attr_accessor :preferred_language
|
13
|
+
attr_accessor :locale
|
14
|
+
attr_accessor :timezone
|
15
|
+
attr_accessor :active
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@name = Name.new
|
19
|
+
@emails = Emails.new
|
20
|
+
@addresses = Addresses.new
|
21
|
+
@phone_numbers = PhoneNumbers.new
|
22
|
+
@instant_messengers = InstantMessengers.new
|
23
|
+
@photos = Photos.new
|
24
|
+
@groups = Groups.new
|
25
|
+
@x509_certificates = X509Certificates.new
|
26
|
+
super
|
27
|
+
end
|
28
|
+
|
29
|
+
def name
|
30
|
+
yield @name
|
31
|
+
end
|
32
|
+
|
33
|
+
def emails
|
34
|
+
yield @emails
|
35
|
+
end
|
36
|
+
|
37
|
+
def addresses
|
38
|
+
yield @addresses
|
39
|
+
end
|
40
|
+
|
41
|
+
def phone_numbers
|
42
|
+
yield @phone_numbers
|
43
|
+
end
|
44
|
+
|
45
|
+
def instant_messengers
|
46
|
+
yield @instant_messengers
|
47
|
+
end
|
48
|
+
|
49
|
+
def photos
|
50
|
+
yield @photos
|
51
|
+
end
|
52
|
+
|
53
|
+
def groups
|
54
|
+
yield @groups
|
55
|
+
end
|
56
|
+
|
57
|
+
def x509_certificates
|
58
|
+
yield @x509_certificates
|
59
|
+
end
|
60
|
+
|
61
|
+
def build
|
62
|
+
Scim::Shady::User.new(to_json)
|
63
|
+
end
|
64
|
+
|
65
|
+
def to_json
|
66
|
+
JSON.generate(to_h)
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_h
|
70
|
+
super.merge({
|
71
|
+
'schemas' => [Schemas::USER],
|
72
|
+
'externalId' => external_id,
|
73
|
+
'userName' => username,
|
74
|
+
'displayName' => display_name,
|
75
|
+
'nickName' => nick_name,
|
76
|
+
'profile_url' => profile_url,
|
77
|
+
'userType' => user_type,
|
78
|
+
'title' => title,
|
79
|
+
'preferredLanguage' => preferred_language,
|
80
|
+
'locale' => locale,
|
81
|
+
'timezone' => timezone,
|
82
|
+
'active' => active,
|
83
|
+
})
|
84
|
+
.merge(@name.to_h)
|
85
|
+
.merge(@emails.to_h)
|
86
|
+
.merge(@addresses.to_h)
|
87
|
+
.merge(@phone_numbers.to_h)
|
88
|
+
.merge(@instant_messengers.to_h)
|
89
|
+
.merge(@photos.to_h)
|
90
|
+
.merge(@groups.to_h)
|
91
|
+
.merge(@x509_certificates.to_h)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
module Builders
|
4
|
+
class X509Certificates
|
5
|
+
def add(certificate)
|
6
|
+
@items ||= []
|
7
|
+
@items.push(value: certificate.to_pem.gsub(/-----BEGIN CERTIFICATE-----/, '').gsub(/-----END CERTIFICATE-----/, ''))
|
8
|
+
end
|
9
|
+
|
10
|
+
def to_h
|
11
|
+
{ 'x509Certificates' => @items }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
class Group
|
4
|
+
def initialize(hash)
|
5
|
+
@hash = hash
|
6
|
+
end
|
7
|
+
|
8
|
+
def value
|
9
|
+
to_h['value']
|
10
|
+
end
|
11
|
+
|
12
|
+
def reference
|
13
|
+
to_h['$ref']
|
14
|
+
end
|
15
|
+
|
16
|
+
def display
|
17
|
+
to_h['display']
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_h
|
21
|
+
@hash
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
class Metadata
|
4
|
+
def initialize(hash)
|
5
|
+
@hash = hash
|
6
|
+
end
|
7
|
+
|
8
|
+
def created
|
9
|
+
created_at
|
10
|
+
end
|
11
|
+
|
12
|
+
def created_at
|
13
|
+
DateTime.parse(to_h['meta']['created'])
|
14
|
+
end
|
15
|
+
|
16
|
+
def last_modified
|
17
|
+
updated_at
|
18
|
+
end
|
19
|
+
|
20
|
+
def updated_at
|
21
|
+
DateTime.parse(to_h['meta']['lastModified'])
|
22
|
+
end
|
23
|
+
|
24
|
+
def version
|
25
|
+
to_h['meta']['version']
|
26
|
+
end
|
27
|
+
|
28
|
+
def location
|
29
|
+
to_h['meta']['location']
|
30
|
+
end
|
31
|
+
|
32
|
+
def resource_type
|
33
|
+
to_h['meta']['resourceType']
|
34
|
+
end
|
35
|
+
|
36
|
+
def user?
|
37
|
+
resource_type == 'User'
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_h
|
41
|
+
@hash
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
class PhoneNumber
|
4
|
+
def initialize(hash)
|
5
|
+
@hash = hash
|
6
|
+
end
|
7
|
+
|
8
|
+
def value
|
9
|
+
to_h['value']
|
10
|
+
end
|
11
|
+
|
12
|
+
def type
|
13
|
+
to_h['type']
|
14
|
+
end
|
15
|
+
|
16
|
+
def work?
|
17
|
+
type == 'work'
|
18
|
+
end
|
19
|
+
|
20
|
+
def mobile?
|
21
|
+
type == 'mobile'
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_h
|
25
|
+
@hash
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
class Photo
|
4
|
+
def initialize(hash)
|
5
|
+
@hash = hash
|
6
|
+
end
|
7
|
+
|
8
|
+
def value
|
9
|
+
to_h['value']
|
10
|
+
end
|
11
|
+
|
12
|
+
def type
|
13
|
+
to_h['type']
|
14
|
+
end
|
15
|
+
|
16
|
+
def photo?
|
17
|
+
type == 'photo'
|
18
|
+
end
|
19
|
+
|
20
|
+
def thumbnail?
|
21
|
+
type == 'thumbnail'
|
22
|
+
end
|
23
|
+
|
24
|
+
def to_h
|
25
|
+
@hash
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
class Resource
|
4
|
+
def initialize(json)
|
5
|
+
@json = json
|
6
|
+
end
|
7
|
+
|
8
|
+
def meta
|
9
|
+
Metadata.new(to_h)
|
10
|
+
end
|
11
|
+
|
12
|
+
def id
|
13
|
+
to_h['id']
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_h
|
17
|
+
@json_hash ||= JSON.parse(to_json)
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_json
|
21
|
+
@json
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
class Schemas
|
4
|
+
CORE = "urn:ietf:params:scim:schemas:core:2.0"
|
5
|
+
GROUP = "#{CORE}:Group"
|
6
|
+
SERVICE_PROVIDER_CONFIG = "#{CORE}:ServiceProviderConfig"
|
7
|
+
USER = "#{CORE}:User"
|
8
|
+
end
|
9
|
+
|
10
|
+
class Messages
|
11
|
+
CORE = "urn:ietf:params:scim:api:messages:2.0"
|
12
|
+
LIST_RESPONSE = "#{CORE}:ListResponse"
|
13
|
+
SEARCH_REQUEST = "#{CORE}:SearchRequest"
|
14
|
+
ERROR = "#{CORE}:Error"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
class ServiceProviderConfiguration
|
4
|
+
include Buildable
|
5
|
+
|
6
|
+
def initialize(json)
|
7
|
+
@json = json
|
8
|
+
end
|
9
|
+
|
10
|
+
def meta
|
11
|
+
Metadata.new(to_h)
|
12
|
+
end
|
13
|
+
|
14
|
+
def documentation_uri
|
15
|
+
to_h['documentationUri']
|
16
|
+
end
|
17
|
+
|
18
|
+
def patch
|
19
|
+
to_h['patch']['supported']
|
20
|
+
end
|
21
|
+
|
22
|
+
def bulk_supported
|
23
|
+
to_h['bulk']['supported']
|
24
|
+
end
|
25
|
+
|
26
|
+
def bulk_max_operations
|
27
|
+
to_h['bulk']['maxOperations']
|
28
|
+
end
|
29
|
+
|
30
|
+
def bulk_max_payload_size
|
31
|
+
to_h['bulk']['maxPayloadSize']
|
32
|
+
end
|
33
|
+
|
34
|
+
def filter_supported
|
35
|
+
to_h['filter']['supported']
|
36
|
+
end
|
37
|
+
|
38
|
+
def filter_max_results
|
39
|
+
to_h['filter']['maxResults']
|
40
|
+
end
|
41
|
+
|
42
|
+
def change_password_supported
|
43
|
+
to_h['changePassword']['supported']
|
44
|
+
end
|
45
|
+
|
46
|
+
def sort_supported
|
47
|
+
to_h['sort']['supported']
|
48
|
+
end
|
49
|
+
|
50
|
+
def etag_supported
|
51
|
+
to_h['etag']['supported']
|
52
|
+
end
|
53
|
+
|
54
|
+
def authentication_schemes
|
55
|
+
to_h['authenticationSchemes']
|
56
|
+
end
|
57
|
+
|
58
|
+
def to_h
|
59
|
+
@hash ||= JSON.parse(to_json)
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_json
|
63
|
+
@json
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.builder_class
|
67
|
+
Scim::Shady::Builders::ServiceProviderConfiguration
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module Scim
|
2
|
+
module Shady
|
3
|
+
class User < Resource
|
4
|
+
include Buildable
|
5
|
+
|
6
|
+
def username
|
7
|
+
to_h['userName']
|
8
|
+
end
|
9
|
+
|
10
|
+
def external_id
|
11
|
+
to_h['externalId']
|
12
|
+
end
|
13
|
+
|
14
|
+
def name
|
15
|
+
Name.new(to_h)
|
16
|
+
end
|
17
|
+
|
18
|
+
def addresses
|
19
|
+
to_h['addresses'].map { |x| Address.new(x) }
|
20
|
+
end
|
21
|
+
|
22
|
+
def phone_numbers
|
23
|
+
to_h['phoneNumbers'].map { |x| PhoneNumber.new(x) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def instant_messengers
|
27
|
+
to_h['ims'].map { |x| InstantMessenger.new(x) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def photos
|
31
|
+
to_h['photos'].map { |x| Photo.new(x) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def user_type
|
35
|
+
to_h['userType']
|
36
|
+
end
|
37
|
+
|
38
|
+
def title
|
39
|
+
to_h['title']
|
40
|
+
end
|
41
|
+
|
42
|
+
def preferred_language
|
43
|
+
to_h['preferredLanguage']
|
44
|
+
end
|
45
|
+
|
46
|
+
def locale
|
47
|
+
to_h['locale']
|
48
|
+
end
|
49
|
+
|
50
|
+
def timezone
|
51
|
+
to_h['timezone']
|
52
|
+
end
|
53
|
+
|
54
|
+
def active?
|
55
|
+
to_h['active']
|
56
|
+
end
|
57
|
+
|
58
|
+
def groups
|
59
|
+
to_h['groups'].map { |x| Group.new(x) }
|
60
|
+
end
|
61
|
+
|
62
|
+
def x509_certificates
|
63
|
+
to_h['x509Certificates'].map { |x| X509Certificate.new(x) }
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.builder_class
|
67
|
+
Scim::Shady::Builders::User
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
data/lib/scim/shady/version.rb
CHANGED
data/scim-shady.gemspec
CHANGED
@@ -7,10 +7,10 @@ Gem::Specification.new do |spec|
|
|
7
7
|
spec.name = "scim-shady"
|
8
8
|
spec.version = Scim::Shady::VERSION
|
9
9
|
spec.authors = ["mo"]
|
10
|
-
spec.email = ["mo
|
10
|
+
spec.email = ["mo@mokhan.ca"]
|
11
11
|
|
12
|
-
spec.summary = %q{
|
13
|
-
spec.description = %q{
|
12
|
+
spec.summary = %q{A simple toolkit for implementing SCIM schema. https://tools.ietf.org/html/rfc7643}
|
13
|
+
spec.description = %q{A simple toolkit for implementing SCIM schema. https://tools.ietf.org/html/rfc7643}
|
14
14
|
spec.homepage = "http://www.mokhan.ca/"
|
15
15
|
spec.license = "MIT"
|
16
16
|
|
@@ -21,7 +21,9 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
+
spec.add_dependency "activesupport", ">= 4.2.0"
|
24
25
|
spec.add_development_dependency "bundler", "~> 1.16"
|
25
26
|
spec.add_development_dependency "rake", "~> 10.0"
|
26
27
|
spec.add_development_dependency "rspec", "~> 3.0"
|
28
|
+
spec.add_development_dependency "ffaker"
|
27
29
|
end
|
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scim-shady
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 4.2.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.2.0
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: bundler
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,14 +66,29 @@ dependencies:
|
|
52
66
|
- - "~>"
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '3.0'
|
55
|
-
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: ffaker
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
description: A simple toolkit for implementing SCIM schema. https://tools.ietf.org/html/rfc7643
|
56
84
|
email:
|
57
|
-
- mo
|
85
|
+
- mo@mokhan.ca
|
58
86
|
executables: []
|
59
87
|
extensions: []
|
60
88
|
extra_rdoc_files: []
|
61
89
|
files:
|
62
90
|
- ".gitignore"
|
91
|
+
- ".gitlab-ci.yml"
|
63
92
|
- ".rspec"
|
64
93
|
- ".travis.yml"
|
65
94
|
- Gemfile
|
@@ -69,7 +98,35 @@ files:
|
|
69
98
|
- bin/console
|
70
99
|
- bin/setup
|
71
100
|
- lib/scim/shady.rb
|
101
|
+
- lib/scim/shady/address.rb
|
102
|
+
- lib/scim/shady/buildable.rb
|
103
|
+
- lib/scim/shady/builders.rb
|
104
|
+
- lib/scim/shady/builders/addresses.rb
|
105
|
+
- lib/scim/shady/builders/bulk.rb
|
106
|
+
- lib/scim/shady/builders/emails.rb
|
107
|
+
- lib/scim/shady/builders/filter.rb
|
108
|
+
- lib/scim/shady/builders/groups.rb
|
109
|
+
- lib/scim/shady/builders/instant_messengers.rb
|
110
|
+
- lib/scim/shady/builders/metadata.rb
|
111
|
+
- lib/scim/shady/builders/name.rb
|
112
|
+
- lib/scim/shady/builders/phone_numbers.rb
|
113
|
+
- lib/scim/shady/builders/photos.rb
|
114
|
+
- lib/scim/shady/builders/resource.rb
|
115
|
+
- lib/scim/shady/builders/service_provider_configuration.rb
|
116
|
+
- lib/scim/shady/builders/user.rb
|
117
|
+
- lib/scim/shady/builders/x509_certificates.rb
|
118
|
+
- lib/scim/shady/group.rb
|
119
|
+
- lib/scim/shady/instant_messenger.rb
|
120
|
+
- lib/scim/shady/metadata.rb
|
121
|
+
- lib/scim/shady/name.rb
|
122
|
+
- lib/scim/shady/phone_number.rb
|
123
|
+
- lib/scim/shady/photo.rb
|
124
|
+
- lib/scim/shady/resource.rb
|
125
|
+
- lib/scim/shady/schemas.rb
|
126
|
+
- lib/scim/shady/service_provider_configuration.rb
|
127
|
+
- lib/scim/shady/user.rb
|
72
128
|
- lib/scim/shady/version.rb
|
129
|
+
- lib/scim/shady/x509_certificate.rb
|
73
130
|
- scim-shady.gemspec
|
74
131
|
homepage: http://www.mokhan.ca/
|
75
132
|
licenses:
|
@@ -94,5 +151,5 @@ rubyforge_project:
|
|
94
151
|
rubygems_version: 2.7.3
|
95
152
|
signing_key:
|
96
153
|
specification_version: 4
|
97
|
-
summary:
|
154
|
+
summary: A simple toolkit for implementing SCIM schema. https://tools.ietf.org/html/rfc7643
|
98
155
|
test_files: []
|