Weird problem between windows and mac versions of some code

peruse the following:

Mac version ruby-1.9.2-p180 :005 > @u=User.find(:first, :conditions=>["login = ?", "rgtest"]) => #<User id: 1068138631, login: "rgtest", crypted_password: "a13970eb729c1f0761242f1995a2d2f7b2e52e5a", salt: "122a37f8c048d7eacb8d62008790be7406c85cdc", email_address: "rgtest", created_at: "2011-07-12 12:03:20", updated_at: "2011-07-12 18:30:08", first_name: "rgtest", last_name: "rgtest">

Windows Version irb(main):001:0> @u=User.find(:first, :conditions=>["login = ?", "rgtest"]) => #<User id: 1068138631, login: "rgtest", crypted_password: "a13970eb729c1f0761242f1995a2d2f7b2e52e5\x00\x00", salt: "122a37f8c048d7eacb8d62008790be7406c85cd\x00\x00", email_address: "rgtest", created_at: "2011-07-12 12:03:20", updated_at: "2011-07-12 18:30:08", first_name: "rgtest", last_name: "rgtest"> irb(main):002:0>

Notice the differences between the crypted_password and salt strings returned, this is causing the authentication to fail. Has anyone else seen this or have any ideas how this may be happening?

Tom

Here is the environment and code: Info: Gemfile gem 'rails', '3.0.6' gem 'activerecord-sqlserver-adapter' ,'3.0.15 gem 'ruby-odbc' ,'0.99994' gem 'mongrel', '>=1.2.0.pre2' gem 'composite_primary_keys', '=3.1.0'

Local gems: bstract (1.0.0) actionmailer (3.0.6, 3.0.5) actionpack (3.0.6, 3.0.5) activemodel (3.0.9, 3.0.6, 3.0.5) activerecord (3.0.6, 3.0.5) activerecord-sqlserver-adapter (3.0.15, 3.0.14, 3.0.12, 3.0.10) activeresource (3.0.6, 3.0.5) activesupport (3.0.9, 3.0.6, 3.0.5) arel (2.0.10, 2.0.9) builder (2.1.2) bundler (1.0.10) composite_primary_keys (3.1.10, 3.1.0) daemons (1.0.10) erubis (2.6.6) gem_plugin (0.2.3) i18n (0.5.0) mail (2.2.19, 2.2.15) mime-types (1.16) mongrel (1.2.0.pre2) mysql2 (0.3.6, 0.3.0, 0.2.7, 0.2.6) polyglot (0.3.1) rack (1.2.3, 1.2.2) rack-mount (0.6.14, 0.6.13) rack-test (0.5.7) rails (3.0.6, 3.0.5) railties (3.0.6, 3.0.5) rake (0.9.2, 0.8.7) ruby-odbc (0.99994) sqlite3 (1.3.3) thor (0.14.6) treetop (1.4.9) tzinfo (0.3.29, 0.3.27, 0.3.26, 0.3.25)

Crypto parts of the user.rb model

   def create_salt      self.salt = Digest::SHA1.hexdigest("--#{Time.now.to_s}-- #{login}--")    end    def encrypt_password      create_salt      self.crypted_password = encrypt(password)    end    # Encrypts the password with the user salt    def encrypt(password)      self.class.encrypt(password, salt)    end    # Encrypts some data with the salt.    def self.encrypt(password, salt)      Digest::SHA1.hexdigest("--#{salt}--#{password}--")    end    def self.authenticate(login, password)      u=find(:first, :conditions=>["login = ?", login])      return u if u && u.authenticated?(password)      nil    end    def authenticated?(password)       crypted_password == encrypt(password)    end    def password_required?      crypted_password.blank? || !password.blank?    end

Questions:

1) Are you accessing the records created from the mac? Or you're re- creating it from scratch? Are you pulling it from an existing database?

2) Can you tell us what version of Ruby *and* version of OpenSSL are you using in both environments? E.g.:

$ ruby -v ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10.6.0]

$ ruby -ropenssl -e "puts OpenSSL::OPENSSL_VERSION" OpenSSL 0.9.8l 5 Nov 2009

3) What "Digest::SHA1.hexdigest("something")" returns to you?

$ ruby -rdigest/sha1 -e 'puts Digest::SHA1.hexdigest("something").inspect' "1af17e73721dbe0c40011b82ed4bb1a7dbe3ce29"

Do you see the trailing garbage there?

3) Have you tried doing chomp to remove the trail garbage?

Thanks Luis. Sorry for not providing the additional info in the first post.

1) Are you accessing the records created from the mac? Or you're re- creating it from scratch? Are you pulling it from an existing database?

I am accessing records created from the Mac and Windows and the results are the same regardless of which source creates them. Examples: created on a mac, read on a mac: => #<User id: 1068138635, login: "umac", crypted_password: "1f305dba421a8b5b789f83fe20427115e081528f", salt: "e9517ee84c0a3945ac07ff59b323f2356b1405d1", email_address: "umac@123.com", created_at: "2011-07-13 15:51:10", updated_at: "2011-07-13 15:51:10", first_name: "user", last_name: "created on mac"> created on a mac, read on a pc: irb(main):001:0> @u=User.find(:first, :conditions=>["login = ?", "umac"]) => #<User id: 1068138635, login: "umac", crypted_password: "1f305dba421a8b5b789f83fe20427115e081528\x00\x00", salt: "e9517ee84c0a3945ac07ff59b323f2356b1405d\x00\x00" , email_address: "umac@123.com", created_at: "2011-07-13 15:51:10", updated_at: "2011-07-13 15:51:10", first_name: "user", last_name: "created on mac">

created on a pc, read on a mac: ruby-1.9.2-p180 :003 > @u=User.find(:first, :conditions=>["login = ?", "userpc"]) => #<User id: 1068138636, login: "userpc", crypted_password: "51aa6cba52ed4c5b40da4aad9a66c2082b7cf3f9", salt: "a1d3bc09a0df6cc8a548f8ac8ada5f272d8ab127", email_address: "userpc@123.com", created_at: "2011-07-13 19:34:27", updated_at: "2011-07-13 19:34:27", first_name: "user", last_name: "createdonapc"> created on a pc, read on a pc: irb(main):002:0> @u=User.find(:first, :conditions=>["login = ?", "userpc"]) => #<User id: 1068138636, login: "userpc", crypted_password: "51aa6cba52ed4c5b40da4aad9a66c2082b7cf3f\x00\x00", salt: "a1d3bc09a0df6cc8a548f8ac8ada5f272d8ab12\x00\x00", email_address: "userpc@123.com", created_at: "2011-07-13 19:34:27", updated_at: "2011-07-13 19:34:27", first_name: "user", last_name: "createdonapc"> I am creating them from scratch and using a newly created database for this app and Rails 3.0+

2) Can you tell us what version of Ruby *and* version of OpenSSL are

you using in both environments? E.g.:

Mac: Ruby 1.9.2 and Rails 3.0.6,OpenSSL 0.9.8l 5 Nov 2009 PC: Ruby 1.9.2 and Rails 3.0.6,OpenSSL 0.9.8q 2 Dec 2010

3) What "Digest::SHA1.hexdigest("something")" returns to you? Mac:

ruby -rdigest/sha1 -e 'puts Digest::SHA1.hexdigest("something").inspect' "1af17e73721dbe0c40011b82ed4bb1a7dbe3ce29"

PC: ruby -rdigest/sha1 -e 'puts Digest::SHA1.hexdigest("something").inspect' "1af17e73721dbe0c40011b82ed4bb1a7dbe3ce29"

3) Have you tried doing chomp to remove the trail garbage?

No because the problem is not that the garbage is there but the \x00\x00 actually replaces the last character in a valid salt.

Thanks for spending your time to look at this. Tom