123456789_123456789_123456789_123456789_123456789_

Class: WEBrick::HTTPAuth::Htdigest

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Instance Chain:
self, UserDB
Inherits: Object
Defined in: lib/webrick/httpauth/htdigest.rb

Overview

Htdigest accesses apache-compatible digest password files. Passwords are matched to a realm where they are valid. For security, the path for a digest password database should be stored outside of the paths available to the HTTP server.

Htdigest is intended for use with DigestAuth and stores passwords using cryptographic hashes.

htpasswd = WEBrick::HTTPAuth::Htdigest.new 'my_password_file'
htpasswd.set_passwd 'my realm', 'username', 'password'
htpasswd.flush

Class Method Summary

Instance Attribute Summary

UserDB - Included

#auth_type

The authentication type.

Instance Method Summary

UserDB - Included

#get_passwd

Retrieves a password in realm for user for the auth_type of this database.

#make_passwd

Creates an obscured password in realm with user and password using the auth_type of this database.

#set_passwd

Sets a password in realm with user and password for the auth_type of this database.

Constructor Details

.new(path) ⇒ Htdigest

Open a digest password database at path

[ GitHub ]

  
# File 'lib/webrick/httpauth/htdigest.rb', line 36

def initialize(path)
  @path = path
  @mtime = Time.at(0)
  @digest = Hash.new
  @mutex = Mutex::new
  @auth_type = DigestAuth
  open(@path,"a").close unless File::exist?(@path)
  reload
end

Instance Method Details

#delete_passwd(realm, user)

Removes a password from the database for user in realm.

[ GitHub ]

  
# File 'lib/webrick/httpauth/htdigest.rb', line 112

def delete_passwd(realm, user)
  if hash = @digest[realm]
    hash.delete(user)
  end
end

#each

Iterate passwords in the database.

[ GitHub ]

  
# File 'lib/webrick/httpauth/htdigest.rb', line 121

def each # :yields: [user, realm, password_hash]
  @digest.keys.sort.each{|realm|
    hash = @digest[realm]
    hash.keys.sort.each{|user|
      yield([user, realm, hash[user]])
    }
  }
end

#flush(output = nil)

Flush the password database. If output is given the database will be written there instead of to the original path.

[ GitHub ]

  
# File 'lib/webrick/httpauth/htdigest.rb', line 71

def flush(output=nil)
  output ||= @path
  tmp = Tempfile.create("htpasswd", File::dirname(output))
  renamed = false
  begin
    each{|item| tmp.puts(item.join(":")) }
    tmp.close
    File::rename(tmp.path, output)
    renamed = true
  ensure
    tmp.close if !tmp.closed?
    File.unlink(tmp.path) if !renamed
  end
end

#get_passwd(realm, user, reload_db)

Retrieves a password from the database for user in realm. If reload_db is true the database will be reloaded first.

[ GitHub ]

  
# File 'lib/webrick/httpauth/htdigest.rb', line 90

def get_passwd(realm, user, reload_db)
  reload() if reload_db
  if hash = @digest[realm]
    hash[user]
  end
end

#reload

Reloads passwords from the database

[ GitHub ]

  
# File 'lib/webrick/httpauth/htdigest.rb', line 49

def reload
  mtime = File::mtime(@path)
  if mtime > @mtime
    @digest.clear
    open(@path){|io|
      while line = io.gets
        line.chomp!
        user, realm, pass = line.split(/:/, 3)
        unless @digest[realm]
          @digest[realm] = Hash.new
        end
        @digest[realm][user] = pass
      end
    }
    @mtime = mtime
  end
end

#set_passwd(realm, user, pass)

Sets a password in the database for user in realm to pass.

[ GitHub ]

  
# File 'lib/webrick/httpauth/htdigest.rb', line 100

def set_passwd(realm, user, pass)
  @mutex.synchronize{
    unless @digest[realm]
      @digest[realm] = Hash.new
    end
    @digest[realm][user] = make_passwd(realm, user, pass)
  }
end