Issue #12833 has been updated by Ben Ford.

My client this week will be hit by this when we try to manage users tomorrow. 
I'm going to attempt to backport this tonight....
----------------------------------------
Bug #12833: Password property for User type is broke in OS X 10.8
https://projects.puppetlabs.com/issues/12833#change-79165

Author: Gary Larizza
Status: Merged - Pending Release
Priority: Normal
Assignee: 
Category: OSX
Target version: 3.0.2
Affected Puppet version: 
Keywords: password user mac mountain lion os x
Branch: https://github.com/puppetlabs/puppet/pull/1306


Setting users passwords is broke in 10.8 due to the fact that Apple moved to 
PBKDF2 passwords in 10.8:


<pre>
Garys-Mac:~ glarizza$ sudo puppet resource user glarizza
Password:
/Library/Ruby/Site/1.8/puppet/provider/nameservice/directoryservice.rb:379:in 
`get_password': undefined method `string' for nil:NilClass (NoMethodError)
        from 
/Library/Ruby/Site/1.8/puppet/provider/nameservice/directoryservice.rb:199:in 
`generate_attribute_hash'
        from 
/Library/Ruby/Site/1.8/puppet/provider/nameservice/directoryservice.rb:235:in 
`single_report'
        from 
/Library/Ruby/Site/1.8/puppet/provider/nameservice/directoryservice.rb:76:in 
`instances'
        from 
/Library/Ruby/Site/1.8/puppet/provider/nameservice/directoryservice.rb:75:in 
`collect'
        from 
/Library/Ruby/Site/1.8/puppet/provider/nameservice/directoryservice.rb:75:in 
`instances'
        from /Library/Ruby/Site/1.8/puppet/type.rb:889:in `instances'
        from /Library/Ruby/Site/1.8/puppet/type.rb:882:in `collect'
        from /Library/Ruby/Site/1.8/puppet/type.rb:882:in `instances'
        from /Library/Ruby/Site/1.8/puppet/indirector/resource/ral.rb:4:in 
`find'
        from /Library/Ruby/Site/1.8/puppet/indirector/indirection.rb:196:in 
`find'
        from /Library/Ruby/Site/1.8/puppet/application/resource.rb:222:in 
`find_or_save_resources'
        from /Library/Ruby/Site/1.8/puppet/application/resource.rb:144:in `main'
        from /Library/Ruby/Site/1.8/puppet/application.rb:317:in `run_command'
        from /Library/Ruby/Site/1.8/puppet/application.rb:309:in `run'
        from /Library/Ruby/Site/1.8/puppet/application.rb:413:in `hook'
        from /Library/Ruby/Site/1.8/puppet/application.rb:309:in `run'
        from /Library/Ruby/Site/1.8/puppet/application.rb:404:in `exit_on_fail'
        from /Library/Ruby/Site/1.8/puppet/application.rb:309:in `run'
        from /Library/Ruby/Site/1.8/puppet/util/command_line.rb:69:in `execute'
        from /usr/bin/puppet:4
</pre>

It's from this code (line 379 in 
lib/puppet/provider/nameservice/directoryservice.rb):

<pre>
          password_hash = 
converted_hash_plist['SALTED-SHA512'].string.unpack("H*")[0]
</pre>


So, I'm trying to update Puppet to be able to handle/change the user's password 
in 10.8 and I notice that the methodology I need to access/generate/change it 
has changed from 10.7 to 10.8.  Since our product uses Ruby, I'll be displaying 
the steps in Ruby.  In 10.7 I used this methodology to access the password:
 
<pre>
require 'facter/util/plist'
users_plist = Plist::parse_xml(`plutil -convert xml1 -o /dev/stdout 
/var/db/dslocal/nodes/Default/users/brit_xml.plist`)
password_hash_plist = users_plist['ShadowHashData'][0].string
IO.popen('plutil -convert xml1 -o - -', mode='r+') do |io|
  io.write password_hash_plist
  io.close_write
  @converted_plist = io.read
end


converted_hash_plist = Plist::parse_xml(@converted_plist)
password_hash = converted_hash_plist['SALTED-SHA512'].string.unpack("H*")[0]
puts password_hash
</pre>

 
This is all well and good since the value of 
converted_hash_plist['SALTED-SHA512'] was a StringIO object containing the 
binary version of the salted sha512 password.  In 10.8, all of the steps are 
the same up to a point - it seems the value of converted_hash_plist is 
different:
 
<pre>
>> pp converted_hash_plist
{"SALTED-SHA512-PBKDF2"=>
  {"salt"=>#<StringIO:0x10f31e498>,
   "entropy"=>#<StringIO:0x10f31e998>,
   "iterations"=>15174}}
=> nil
 </pre>

Indeed, this looks like a 128 byte PBKDF2 password (since the value of 
converted_hash_plist['SALTED-SHA512-PBKDF2']['entropy'].string.unpack('H*').first
 is 256 characters).  This makes sense since it looks like Apple has dabbled in 
PBKDF2 before http://people.cis.ksu.edu/~sakthi/src/data/filevault_sakthi.pdf.  
Ruby does have a PBKDF2 gem (https://github.com/emerose/pbkdf2-ruby), but of 
course there's no built-in method to handle passwords in this fashion.

Basically, the format has changed.


-- 
You have received this notification because you have either subscribed to it, 
or are involved in it.
To change your notification preferences, please click here: 
http://projects.puppetlabs.com/my/account

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Bugs" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/puppet-bugs?hl=en.

Reply via email to