Class: WEBrick::HTTPAuth::Htgroup

Inherits:
Object
  • Object
show all
Defined in:
lib/webrick/httpauth/htgroup.rb

Overview

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

Instance Method Summary collapse

Constructor Details

#initialize(path) ⇒ Htgroup

Open a group database at path



34
35
36
37
38
39
40
# File 'lib/webrick/httpauth/htgroup.rb', line 34

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

Instance Method Details

#add(group, members) ⇒ Object

Add an Array of members to group



88
89
90
# File 'lib/webrick/httpauth/htgroup.rb', line 88

def add(group, members)
  @group[group] = members(group) | members
end

#flush(output = nil) ⇒ Object

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



63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/webrick/httpauth/htgroup.rb', line 63

def flush(output=nil)
  output ||= @path
  tmp = Tempfile.new("htgroup", File::dirname(output))
  begin
    @group.keys.sort.each{|group|
      tmp.puts(format("%s: %s", group, self.members(group).join(" ")))
    }
    tmp.close
    File::rename(tmp.path, output)
  rescue
    tmp.close(true)
  end
end

#members(group) ⇒ Object

Retrieve the list of members from group



80
81
82
83
# File 'lib/webrick/httpauth/htgroup.rb', line 80

def members(group)
  reload
  @group[group] || []
end

#reloadObject

Reload groups from the database



45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/webrick/httpauth/htgroup.rb', line 45

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