| 
1 | 1 | # -*- ruby encoding: utf-8 -*-  | 
2 | 2 | require 'digest/sha1'  | 
3 | 3 | require 'digest/md5'  | 
 | 4 | +require 'base64'  | 
4 | 5 | 
 
  | 
5 | 6 | class Net::LDAP::Password  | 
6 | 7 |   class << self  | 
7 | 8 |     # Generate a password-hash suitable for inclusion in an LDAP attribute.  | 
8 |  | -    # Pass a hash type (currently supported: :md5 and :sha) and a plaintext  | 
 | 9 | +    # Pass a hash type as a symbol (:md5, :sha, :ssha) and a plaintext  | 
9 | 10 |     # password. This function will return a hashed representation.  | 
10 | 11 |     #  | 
11 | 12 |     #--  | 
12 | 13 |     # STUB: This is here to fulfill the requirements of an RFC, which  | 
13 | 14 |     # one?  | 
14 | 15 |     #  | 
15 |  | -    # TODO, gotta do salted-sha and (maybe)salted-md5. Should we provide  | 
16 |  | -    # sha1 as a synonym for sha1? I vote no because then should you also  | 
17 |  | -    # provide ssha1 for symmetry?  | 
 | 16 | +    # TODO:  | 
 | 17 | +    # * maybe salted-md5  | 
 | 18 | +    # * Should we provide sha1 as a synonym for sha1? I vote no because then  | 
 | 19 | +    #   should you also provide ssha1 for symmetry?  | 
 | 20 | +    #  | 
 | 21 | +    attribute_value = ""  | 
18 | 22 |     def generate(type, str)  | 
19 |  | -      digest, digest_name = case type  | 
20 |  | -                            when :md5  | 
21 |  | -                              [Digest::MD5.new, 'MD5']  | 
22 |  | -                            when :sha  | 
23 |  | -                              [Digest::SHA1.new, 'SHA']  | 
24 |  | -                            else  | 
25 |  | -                              raise Net::LDAP::LdapError, "Unsupported password-hash type (#{type})"  | 
26 |  | -                            end  | 
27 |  | -      digest << str.to_s  | 
28 |  | -      return "{#{digest_name}}#{[digest.digest].pack('m').chomp }"  | 
 | 23 | +       case type  | 
 | 24 | +         when :md5  | 
 | 25 | +            attribute_value = '{MD5}' + Base64.encode64(Digest::MD5.digest(str)).chomp!   | 
 | 26 | +         when :sha  | 
 | 27 | +            attribute_value = '{SHA}' + Base64.encode64(Digest::SHA1.digest(str)).chomp!   | 
 | 28 | +         when :ssha  | 
 | 29 | +            srand; salt = (rand * 1000).to_i.to_s   | 
 | 30 | +            attribute_value = '{SSHA}' + Base64.encode64(Digest::SHA1.digest(str + salt) + salt).chomp!  | 
 | 31 | +         else  | 
 | 32 | +            raise Net::LDAP::LdapError, "Unsupported password-hash type (#{type})"  | 
 | 33 | +         end  | 
 | 34 | +      return attribute_value  | 
29 | 35 |     end  | 
30 | 36 |   end  | 
31 | 37 | end  | 
0 commit comments