# class WEBrick::HTTPAuth::Htgroup

`Htgroup` accesses apache-compatible group files. `Htgroup` can be used to provide group-based authentication for users. Currently `Htgroup` is not directly integrated with any authenticators in `WEBrick`. For security, the path for a digest password database should be stored outside of the paths available to the HTTP server.

Example:

    htgroup = WEBrick::HTTPAuth::Htgroup.new 'my_group_file'
    htgroup.add 'superheroes', %w[spiderman batman]

    htgroup.members('superheroes').include? 'magneto' # => false

### Public Class Methods

new(path) click to toggle source

Open a group database at `path`

    # File lib/webrick/httpauth/htgroup.rb, line 35
    def initialize(path)
      @path = path
      @mtime = Time.at(0)
      @group = Hash.new
      File.open(@path,"a").close unless File.exist?(@path)
      reload
    end

### Public Instance Methods

add(group, members) click to toggle source

Add an `Array` of `members` to `group`

    # File lib/webrick/httpauth/htgroup.rb, line 92
    def add(group, members)
      @group[group] = members(group) | members
    end

flush(output=nil) click to toggle source

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

    # File lib/webrick/httpauth/htgroup.rb, line 64
    def flush(output=nil)
      output ||= @path
      tmp = Tempfile.create("htgroup", File::dirname(output))
      begin
        @group.keys.sort.each{|group|
          tmp.puts(format("%s: %s", group, self.members(group).join(" ")))
        }
      ensure
        tmp.close
        if $!
          File.unlink(tmp.path)
        else
          return File.rename(tmp.path, output)
        end
      end
    end

members(group) click to toggle source

Retrieve the list of members from `group`

    # File lib/webrick/httpauth/htgroup.rb, line 84
    def members(group)
      reload
      @group[group] || []
    end

reload() click to toggle source

Reload groups from the database

    # File lib/webrick/httpauth/htgroup.rb, line 46
    def reload
      if (mtime = File::mtime(@path)) > @mtime
        @group.clear
        File.open(@path){|io|
          while line = io.gets
            line.chomp!
            group, members = line.split(/:\s*/)
            @group[group] = members.split(/\s+/)
          end
        }
        @mtime = mtime
      end
    end