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
  open(@path,"a").close unless File::exist?(@path)
  reload
end

Instance Method Details

#add(group, members) ⇒ Object

Add an Array of members to group



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

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
# File 'lib/webrick/httpauth/htgroup.rb', line 64

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



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

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
    open(@path){|io|
      while line = io.gets
        line.chomp!
        group, members = line.split(/:\s*/)
        @group[group] = members.split(/\s+/)
      end
    }
    @mtime = mtime
  end
end