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



35
36
37
38
39
40
41
# 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

Instance Method Details

#add(group, members) ⇒ Object

Add an Array of members to group



92
93
94
# File 'lib/webrick/httpauth/htgroup.rb', line 92

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.



64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# 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) ⇒ Object

Retrieve the list of members from group



84
85
86
87
# File 'lib/webrick/httpauth/htgroup.rb', line 84

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

#reloadObject

Reload groups from the database



46
47
48
49
50
51
52
53
54
55
56
57
58
# 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*/, 2)
        @group[group] = members.split(/\s+/)
      end
    }
    @mtime = mtime
  end
end