require 'puppet/network/rights'
module Puppet::Network
class AuthConfigParser
def self.new_from_file(file)
self.new(Puppet::FileSystem.read(file, :encoding => 'utf-8'))
end
def initialize(string)
@string = string
end
def parse
Puppet::Network::AuthConfig.new(parse_rights)
end
def parse_rights
rights = Puppet::Network::Rights.new
right = nil
count = 1
@string.each_line { |line|
case line.chomp
when /^\s*#/, /^\s*$/
# skip comments and blank lines
when /^path\s+((?:~\s+)?[^ ]+)\s*$/ # "path /path" or "path ~ regex"
name = $1.chomp
right = rights.newright(name, count, @file)
when /^\s*(allow(?:_ip)?|deny(?:_ip)?|method|environment|auth(?:enticated)?)\s+(.+?)(\s*#.*)?$/
if right.nil?
#TRANSLATORS "path" is a configuration file entry and should not be translated
raise Puppet::ConfigurationError, _("Missing or invalid 'path' before right directive at %{error_location}") %
{ error_location: Puppet::Util::Errors.error_location(@file, count) }
end
parse_right_directive(right, $1, $2, count)
else
error_location_str = Puppet::Util::Errors.error_location(nil, count)
raise Puppet::ConfigurationError, _("Invalid entry at %{error_location}: %{file_text}") %
{ error_location: error_location_str, file_text: line }
end
count += 1
}
# Verify each of the rights are valid.
# We let the check raise an error, so that it can raise an error
# pointing to the specific problem.
rights.each { |name, r|
r.valid?
}
rights
end
def parse_right_directive(right, var, value, count)
value.strip!
case var
when "allow"
modify_right(right, :allow, value, _("allowing %{value} access"), count)
when "deny"
modify_right(right, :deny, value, _("denying %{value} access"), count)
when "allow_ip"
modify_right(right, :allow_ip, value, _("allowing IP %{value} access"), count)
when "deny_ip"
modify_right(right, :deny_ip, value, _("denying IP %{value} access"), count)
when "method"
modify_right(right, :restrict_method, value, _("allowing 'method' %{value}"), count)
when "environment"
modify_right(right, :restrict_environment, value, _("adding environment %{value}"), count)
when /auth(?:enticated)?/
modify_right(right, :restrict_authenticated, value, _("adding authentication %{value}"), count)
else
error_location_str = Puppet::Util::Errors.error_location(nil, count)
raise Puppet::ConfigurationError, _("Invalid argument '%{var}' at %{error_location}") %
{ var: var, error_location: error_location_str }
end
end
def modify_right(right, method, value, msg, count)
value.split(/\s*,\s*/).each do |val|
begin
val.strip!
right.info msg % { value: val }
right.send(method, val)
rescue Puppet::AuthStoreError => detail
error_location_str = Puppet::Util::Errors.error_location(@file, count)
raise Puppet::ConfigurationError, "#{detail} #{error_location_str}", detail.backtrace
end
end
end
end
end
Copyright 2K16 - 2K18 Indonesian Hacker Rulez