adap 0.0.20 → 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 +4 -4
- data/Gemfile.lock +1 -1
- data/lib/adap/adap.rb +45 -13
- data/lib/adap/version.rb +1 -1
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3158307760aaffe02f99a06d508783b569321759652824029bf91615cdfea9ea
|
4
|
+
data.tar.gz: 96bf2d0170c919e0a1946d5532c1d9e929dba0003548d6b091ba7d242d3238fd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b22800cef66237c05002282ee1b63cc2e6070d151ef899ed67af75a4069b994aeb2f11987b13ff2882864b237fccc8dca9274dba0a35fa25b8da897618dc998e
|
7
|
+
data.tar.gz: fd5bbdb231aa7c046335c8849af2898c30dd0e564a6b82faab86a4a63a77c8ebd2bd63611c28c8fe5c7ea70bcbad35019ec843497ef54f187051f1034cf2c775
|
data/Gemfile.lock
CHANGED
data/lib/adap/adap.rb
CHANGED
@@ -28,6 +28,15 @@ class Adap
|
|
28
28
|
# List of attributes for user in LDAP
|
29
29
|
@ldap_user_required_attributes = [:cn, :sn, :uid, :uidnumber, :gidnumber, :displayname, :loginshell, :gecos, :givenname, :description, :mail, :homedirectory]
|
30
30
|
|
31
|
+
# List of supported hash algorithms keys and string values to operate
|
32
|
+
@supported_hash_algorithms_map = {
|
33
|
+
:md5 => "{MD5}",
|
34
|
+
:sha => "{SHA}",
|
35
|
+
:ssha => "{SSHA}",
|
36
|
+
:virtual_crypt_sha256 => "virtualCryptSHA256",
|
37
|
+
:virtual_crypt_sha512 => "virtualCryptSHA512"
|
38
|
+
}
|
39
|
+
|
31
40
|
@ad_host = params[:ad_host]
|
32
41
|
@ad_port = (params[:ad_port] ? params[:ad_port] : 389)
|
33
42
|
@ad_binddn = params[:ad_binddn]
|
@@ -40,8 +49,17 @@ class Adap
|
|
40
49
|
@ldap_basedn = params[:ldap_basedn]
|
41
50
|
@ldap_user_basedn = params[:ldap_user_basedn]
|
42
51
|
@ldap_auth = (params.has_key?(:ldap_password) ? { :method => :simple, :username => @ldap_binddn, :password => params[:ldap_password] } : nil )
|
43
|
-
|
44
|
-
|
52
|
+
|
53
|
+
# A password-hash algorithm to sync to the LDAP.
|
54
|
+
# Popular LDAP products like Open LDAP usually supports md5({MD5}), sha1({SHA}) and ssha({SSHA}) algorithms.
|
55
|
+
# If you want to use virtualCryptSHA256 or virtualCryptSHA512, you have to set additional configurations to OpenLDAP.
|
56
|
+
@password_hash_algorithm = (params[:password_hash_algorithm] ? params[:password_hash_algorithm] : :ssha)
|
57
|
+
# TODO: Check a hash algorithm is supported or not
|
58
|
+
unless @supported_hash_algorithms_map.has_key?(@password_hash_algorithm) then
|
59
|
+
raise "This program only supports :md5, :sha, :ssha(default), :virtual_crypt_sha256 and :virtual_crypt_sha512 " \
|
60
|
+
+ "as :password_hash_algorithm. " \
|
61
|
+
+ "An algorithm you chose #{@password_hash_algorithm.is_a?(Symbol) ? ":" : ""}#{@password_hash_algorithm} was unsupported."
|
62
|
+
end
|
45
63
|
|
46
64
|
# Phonetics are listed in https://lists.samba.org/archive/samba/2017-March/207308.html
|
47
65
|
@map_ad_msds_phonetics = {}
|
@@ -112,20 +130,33 @@ class Adap
|
|
112
130
|
attributes
|
113
131
|
end
|
114
132
|
|
115
|
-
def
|
116
|
-
|
117
|
-
|
118
|
-
|
133
|
+
def get_password_hash(username, password)
|
134
|
+
case @password_hash_algorithm
|
135
|
+
when :md5, :sha, :ssha then
|
136
|
+
if password.nil? then
|
137
|
+
raise "Password must not be nil when you chose the algorithm of password-hash is :md5 or :sha or :ssha. Pass password of #{username} please."
|
138
|
+
end
|
139
|
+
result = Net::LDAP::Password.generate(@password_hash_algorithm, password)
|
140
|
+
else
|
141
|
+
# Expects :virtual_crypt_sha256(virtualCryptSHA256) or :virtual_crypt_sha512(virtualCryptSHA512)
|
142
|
+
result = get_raw_password_from_ad(username, @supported_hash_algorithms_map[@password_hash_algorithm])
|
143
|
+
end
|
144
|
+
|
145
|
+
if result.nil? or result.empty? then
|
146
|
+
raise "Failed to get hashed password with algorithm :#{@password_hash_algorithm} of user #{username}. " +
|
147
|
+
"Its result was nil. If you chose hash-algorithm :virtual_crypt_sha256 or :virtual_crypt_sha512, " +
|
148
|
+
"did you enabled AD to store passwords as virtualCryptSHA256 and/or virtualCryptSHA512 in your smb.conf? " +
|
149
|
+
"This program requires the configuration to get password from AD as virtualCryptSHA256 or virtualCryptSHA512."
|
119
150
|
end
|
120
151
|
|
121
|
-
|
152
|
+
result.chomp
|
122
153
|
end
|
123
154
|
|
124
|
-
def
|
155
|
+
def get_raw_password_from_ad(username, algo)
|
125
156
|
`samba-tool user getpassword #{username} --attribute #{algo} 2> /dev/null | grep -E '^virtualCrypt' -A 1 | tr -d ' \n' | cut -d ':' -f 2`
|
126
157
|
end
|
127
158
|
|
128
|
-
def sync_user(uid)
|
159
|
+
def sync_user(uid, password=nil)
|
129
160
|
ad_entry = nil
|
130
161
|
ldap_entry = nil
|
131
162
|
ad_dn = get_ad_dn(uid)
|
@@ -137,6 +168,7 @@ class Adap
|
|
137
168
|
end
|
138
169
|
ret_code = @ad_client.get_operation_result.code
|
139
170
|
|
171
|
+
# Return 32 means that the object does not exist
|
140
172
|
return {
|
141
173
|
:code => ret_code,
|
142
174
|
:operations => nil,
|
@@ -156,11 +188,11 @@ class Adap
|
|
156
188
|
|
157
189
|
ret = nil
|
158
190
|
if !ad_entry.nil? and ldap_entry.nil? then
|
159
|
-
ret = add_user(ldap_dn, ad_entry,
|
191
|
+
ret = add_user(ldap_dn, ad_entry, get_password_hash(uid, password))
|
160
192
|
elsif ad_entry.nil? and !ldap_entry.nil? then
|
161
193
|
ret = delete_user(ldap_dn)
|
162
194
|
elsif !ad_entry.nil? and !ldap_entry.nil? then
|
163
|
-
ret = modify_user(ldap_dn, ad_entry, ldap_entry,
|
195
|
+
ret = modify_user(ldap_dn, ad_entry, ldap_entry, get_password_hash(uid, password))
|
164
196
|
else
|
165
197
|
# ad_entry.nil? and ldap_entry.nil? then
|
166
198
|
return {:code => 0, :operations => nil, :message => "There are not any data of #{uid} to sync."}
|
@@ -183,7 +215,7 @@ class Adap
|
|
183
215
|
|
184
216
|
def add_user(ldap_user_dn, ad_entry, password)
|
185
217
|
if password == nil || password.empty?
|
186
|
-
raise "
|
218
|
+
raise "add_user() requires password. Set a hashed password of the user #{ad_entry[:cn]} please."
|
187
219
|
end
|
188
220
|
|
189
221
|
attributes = create_ldap_attributes(ad_entry)
|
@@ -211,7 +243,7 @@ class Adap
|
|
211
243
|
return {
|
212
244
|
:code => ret_code,
|
213
245
|
:operations => [:add_user],
|
214
|
-
:message => "Failed to modify a user #{ldap_user_dn} in add_user() - " + @ldap_client.get_operation_result.error_message
|
246
|
+
:message => "Failed to modify a user #{ldap_user_dn} to add userPassword in add_user() - " + @ldap_client.get_operation_result.error_message
|
215
247
|
} if ret_code != 0
|
216
248
|
|
217
249
|
return {:code => ret_code, :operations => [:add_user], :message => nil}
|
data/lib/adap/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: adap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tsutomu Nakamura
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -79,7 +79,7 @@ homepage: https://github.com/TsutomuNakamura/adap
|
|
79
79
|
licenses: []
|
80
80
|
metadata:
|
81
81
|
homepage_uri: https://github.com/TsutomuNakamura/adap
|
82
|
-
post_install_message:
|
82
|
+
post_install_message:
|
83
83
|
rdoc_options: []
|
84
84
|
require_paths:
|
85
85
|
- lib
|
@@ -94,8 +94,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
94
|
- !ruby/object:Gem::Version
|
95
95
|
version: '0'
|
96
96
|
requirements: []
|
97
|
-
rubygems_version: 3.1.
|
98
|
-
signing_key:
|
97
|
+
rubygems_version: 3.1.3
|
98
|
+
signing_key:
|
99
99
|
specification_version: 4
|
100
100
|
summary: LDAP migration tool from AD to NT schema
|
101
101
|
test_files: []
|