On Apr 14, 2009, at 4:33 AM, Brice Figureau wrote:

>
> On 13/04/09 22:25, Luke Kanies wrote:
>> Hi Brice,
>>
>> This is the only commit in this series I've got comments remaining  
>> on,
>> and I want to stress:  These comments are optional, and the goal with
>> them is that the code be clearer and that less of the code knows  
>> about
>> other parts of the code.  If you think my recommendations don't  
>> result
>> in cleaner, more maintainable code, then please ignore them.  You're
>> the one writing the code, so you're the in best position to judge  
>> what
>> the most maintainable form is.
>
> No, I think you're right. I'll see what's possible.
>
>> On Apr 11, 2009, at 12:39 PM, Brice Figureau wrote:
>>
>>> The idea is to raise an AuthorizationException at the same place
>>> we check the authorization instead of in an upper level to be
>>> able to spot where the authorization took place in the exception
>>> backtrace.
>>>
>>> Moreover, this changes also makes Rights::allowed? to return
>>> the matching acl so that the upper layer can have a chance to
>>> report which ACL resulted in the match.
>>>
>>> Signed-off-by: Brice Figureau <[email protected]>
>>> ---
>>> lib/puppet/network/authconfig.rb                   |    8 ++--
>>> lib/puppet/network/http/handler.rb                 |   13 ++++--
>>> lib/puppet/network/rest_authorization.rb           |   43 +++++++++ 
>>> ++
>>> ++------
>>> lib/puppet/network/rights.rb                       |   22 +++++-----
>>> spec/integration/indirector/certificate/rest.rb    |    2 +-
>>> .../indirector/certificate_request/rest.rb         |    2 +-
>>> .../indirector/certificate_revocation_list/rest.rb |    2 +-
>>> spec/integration/indirector/report/rest.rb         |    2 +-
>>> spec/integration/indirector/rest.rb                |    4 +-
>>> spec/unit/network/http/handler.rb                  |    8 ++--
>>> spec/unit/network/rest_authorization.rb            |   20 +++++++--
>>> spec/unit/network/rights.rb                        |   41 +++++++++ 
>>> ++
>>> ++++---
>>> test/network/rights.rb                             |    6 ++-
>>> 13 files changed, 117 insertions(+), 56 deletions(-)
>>>
>>> diff --git a/lib/puppet/network/authconfig.rb b/lib/puppet/network/
>>> authconfig.rb
>>> index 3e0807a..3aaab9a 100644
>>> --- a/lib/puppet/network/authconfig.rb
>>> +++ b/lib/puppet/network/authconfig.rb
>>> @@ -28,13 +28,13 @@ module Puppet
>>>
>>>            read()
>>>
>>> +            res = false
>>>            if @rights.include?(name)
>>> -                return @rights[name].allowed?(request.name,
>>> request.ip)
>>> +                res, acl = @rights[name].allowed?(request.name,
>>> request.ip)
>>>            elsif @rights.include?(namespace)
>>> -                return @rights[namespace].allowed?(request.name,
>>> request.ip)
>>> -            else
>>> -                return false
>>> +                res, acl = @rights[namespace].allowed?
>>> (request.name, request.ip)
>>
>> I think it's a bit weird that you're passing what is otherwise a
>> private instance (the acl) up the chain.
>
> I was sure you would argue that wasn't a good idea :-)
>
>
>> I feel bad that I keeping
>> pushing you on this, since it's a relatively small thing, but I think
>> something like this might be more appropriate:
>>
>>   if right = @rights[name] || @rights[namespace]
>>     right.fail_unless_allowed(request.name, request.ip)
>>   else
>>     raise AuthorizationError, "Access to %s denied by default" %  
>> [....]
>>   end
>
> Yes, this works for this part of the code which only checks for the
> so-called namespace rights, because there we can find easily the
> matching right and it is unique. For the REST authorization, we have  
> to
> cycle through all the sub-rights before finding the only one that
> matches. What you propose can't be done without breaking completely  
> the
> current allowed? API.
> In fact I tried to keep the allowed? API entry we already have.
> Now if we are willing to break this API (and raise on deny as deeply  
> as
> in the rights instance), then that'd really simpler.
> I can push the check code even deeper than it is now.

I'm comfortable breaking the existing api, since it's an entirely  
internal api.

>
>> That way the ACL isn't exposed anywhere it shouldn't be, and the  
>> ACL's
>> failure method can take into account any info it does or doesn't have
>> available:
>>
>>   def fail_unless_allowed(name, ip)
>>     return if allowed?(name, ip)
>>     msg = "Access to %s denied to %s(%s)" % [path, name, ip]
>>     msg += " in file %s" % file if file
>>     msg += " at line %s" % line if line
>>
>>     raise AuthorizationError, msg
>>   end
>
> I think I can move fail_unless_allowed in Rights (not Rights::Right),
> without breaking allowed? too much.
> Hmm, let me try this. I'll repost (only) this patch when done to see  
> if
> that's better for you.

That sounds good.

>
>> Note that Puppet::Error actually has line/file attributes, and it  
>> will
>> add them automatically, so if your AuthorizationError inherits from
>> it, you could do:
>>
>>   ...
>>   error = Puppet::Error.new("Access....")
>
> shouldn't it be:
> error = AuthorizationError.new(...) ?

Ayup.

>
>>   error.line = self.line
>>   error.file = self.file
>>   raise error
>>
>> Then... (below)...
>>
>>>            end
>>> +            return res
>>>        end
>>>
>>>        # Does the file exist?  Puppetmasterd does not require it,  
>>> but
>>> diff --git a/lib/puppet/network/http/handler.rb b/lib/puppet/ 
>>> network/
>>> http/handler.rb
>>> index 20234b2..12cdf9b 100644
>>> --- a/lib/puppet/network/http/handler.rb
>>> +++ b/lib/puppet/network/http/handler.rb
>>> @@ -40,11 +40,9 @@ module Puppet::Network::HTTP::Handler
>>>    def process(request, response)
>>>        indirection_request = uri2indirection(http_method(request),
>>> path(request), params(request))
>>>
>>> -        if authorized?(indirection_request)
>>> -            send("do_%s" % indirection_request.method,
>>> indirection_request, request, response)
>>> -        else
>>> -            return do_exception(response, "Request forbidden by
>>> configuration %s %s" % [indirection_request.indirection_name,
>>> indirection_request.key], 403)
>>> -        end
>>> +        check_authorization(indirection_request)
>>> +
>>> +        send("do_%s" % indirection_request.method,
>>> indirection_request, request, response)
>>>    rescue Exception => e
>>>        return do_exception(response, e)
>>>    end
>>> @@ -60,6 +58,11 @@ module Puppet::Network::HTTP::Handler
>>>    end
>>>
>>>    def do_exception(response, exception, status=400)
>>> +        if exception.is_a?(Puppet::Network::AuthorizationError)
>>> +            # make sure we return the correct status code
>>> +            # for authorization issues
>>> +            status = 403 if status == 400
>>> +        end
>>>        if exception.is_a?(Exception)
>>>            puts exception.backtrace if Puppet[:trace]
>>>            Puppet.err(exception)
>>> diff --git a/lib/puppet/network/rest_authorization.rb b/lib/puppet/
>>> network/rest_authorization.rb
>>> index 3278640..3d84cdd 100644
>>> --- a/lib/puppet/network/rest_authorization.rb
>>> +++ b/lib/puppet/network/rest_authorization.rb
>>> @@ -2,12 +2,13 @@ require 'puppet/network/client_request'
>>> require 'puppet/network/rest_authconfig'
>>>
>>> module Puppet::Network
>>> -    # Most of our subclassing is just so that we can get
>>> -    # access to information from the request object, like
>>> -    # the client name and IP address.
>>> -    class InvalidClientRequest < Puppet::Error; end
>>> +
>>> +    # this exception is thrown when a request is not authenticated
>>> +    class AuthorizationError < RuntimeError; end
>>> +
>>>    module RestAuthorization
>>>
>>> +
>>>        # Create our config object if necessary. If there's no
>>> configuration file
>>>        # we install our defaults
>>>        def authconfig
>>> @@ -18,30 +19,44 @@ module Puppet::Network
>>>            @authconfig
>>>        end
>>>
>>> +        def authenticated_to_s(request)
>>> +            request.authenticated? ? "authenticated" :
>>> "unauthenticated"
>>> +        end
>>> +
>>>        # Verify that our client has access.  We allow untrusted
>>> access to
>>>        # certificates terminus but no others.
>>> -        def authorized?(request)
>>> +        def check_authorization(request)
>>>            msg = "%s client %s access to %s [%s]" %
>>> -                   [ request.authenticated? ? "authenticated" :
>>> "unauthenticated",
>>> +                   [ authenticated_to_s(request),
>>>                    (request.node.nil? ? request.ip :
>>> "#{request.node}(#{request.ip})"),
>>>                    request.indirection_name, request.method ]
>>>
>>> -            if request.authenticated?
>>> -                res = authenticated_authorized?(request, msg )
>>> -            else
>>> -                res = unauthenticated_authorized?(request, msg)
>>> +            method = authenticated_to_s(request) + "_authorized?"
>>> +
>>> +            res, acl = send(method.to_sym, request)
>>> +            unless res
>>> +                unless acl.nil?
>>> +                    msg += " matching rule: '#{acl.name}'"
>>> +                    if acl.line != 0 and authconfig.exists?
>>> +                        msg += " of #{authconfig} line:  
>>> #{acl.line}"
>>> +                    else
>>> +                        msg += " from default ACLs"
>>> +                    end
>>> +                end
>>> +                Puppet.notice("Denying "+ msg)
>>> +                raise AuthorizationError, "Request forbidden by
>>> configuration %s %s" % [request.indirection_name, request.key]
>>
>> Keeping in mind that you've got to inform both sides of the  
>> connection
>> (server and client), I'd prefer if each side got exactly the same
>> information.  And shouldn't the server side should get the log as a
>> 'warning', rather than notice?
>
> Fair enough. Note that it is a notice in the namespaceauth code, so I
> kept it. Warning makes more sense I think.

Ah; yeah, that should be changed, then.

>
>> Basically, I would do something like:
>>
>>   Puppet.warning "Denying " + msg
>>   raise AuthorizationError, "Request forbidden: %s" % msg
>>
>> I expect this will entail a slight separation between the server and
>> client messages, but they should be able to be almost the same.
>
> OK.
>
>> I just know that, for some reason, people tend not to look at server
>> logs when they see exceptions on the client, so we have to both log
>> useful info on the server *and* propagate that same info to the  
>> client.
>
> OK.
>
>> If you follow my advice from above (failing locally), then you could
>> just do something like this:
>>
>>   begin
>>     ....perform authorization checks....
>>   rescue AuthorizationError => error
>>     # Log on the server side
>>     Puppet.warning "Client %s(%s) denied: %s" % [request.name,
>> request.ip, error]
>>     raise # send the error back to the client
>>   end
>>
>>>            end
>>> -            Puppet.notice((res ? "Allowing " : "Denying ") + msg)
>>> -            return res
>>> +
>>> +            Puppet.notice("Allowing "+ msg)
>>>        end
>>>
>>>        # delegate to our authorization file
>>> -        def authenticated_authorized?(request, msg)
>>> +        def authenticated_authorized?(request)
>>>            authconfig.allowed?(request)
>>>        end
>>>
>>>        # allow only certificate requests when not authenticated
>>> -        def unauthenticated_authorized?(request, msg)
>>> +        def unauthenticated_authorized?(request)
>>>            request.indirection_name == :certificate or
>>> request.indirection_name == :certificate_request
>>>        end
>>>    end
>>> diff --git a/lib/puppet/network/rights.rb b/lib/puppet/network/
>>> rights.rb
>>> index 7f4bed7..959b004 100755
>>> --- a/lib/puppet/network/rights.rb
>>> +++ b/lib/puppet/network/rights.rb
>>> @@ -18,6 +18,7 @@ class Puppet::Network::Rights
>>>        end
>>>    end
>>>
>>> +    # Check that name is allowed or not
>>>    def allowed?(name, *args)
>>>        res = :nomatch
>>>        right = @rights.find do |acl|
>>> @@ -27,14 +28,15 @@ class Puppet::Network::Rights
>>>            if match = acl.match?(name)
>>>                args << match
>>>                if (res = acl.allowed?(*args)) != :dunno
>>> -                    return res
>>> +                    return res, acl
>>>                end
>>> +                args.pop
>>>            end
>>>            false
>>>        end
>>>
>>>        # if allowed or denied, tell it to the world
>>> -        return res unless res == :nomatch
>>> +        return res, nil unless (res == :nomatch or res == :dunno)
>>>
>>>        # there were no rights allowing/denying name
>>>        # if name is not a path, let's throw
>>> @@ -42,7 +44,7 @@ class Puppet::Network::Rights
>>>
>>>        # but if this was a path, we implement a deny all policy by
>>> default
>>>        # on unknown rights.
>>> -        return false
>>> +        return false, nil
>>>    end
>>>
>>>    def initialize()
>>> @@ -144,14 +146,12 @@ class Puppet::Network::Rights
>>>            return :dunno if acl_type == :regex and not
>>> @methods.include?(method)
>>>            return :dunno if acl_type == :regex and
>>> @environment.size > 0 and not @environment.include?(environment)
>>>
>>> -            if acl_type == :regex and match # make sure any capture
>>> are replaced
>>> -                interpolate(match)
>>> -            end
>>> -
>>> -            res = super(name,ip)
>>> -
>>> -            if acl_type == :regex
>>> -                reset_interpolation
>>> +            begin
>>> +                # make sure any capture are replaced if needed
>>> +                interpolate(match) if acl_type == :regex and match
>>> +                res = super(name,ip)
>>> +            ensure
>>> +                reset_interpolation if acl_type == :regex
>>>            end
>>>            res
>>>        end
>>> diff --git a/spec/integration/indirector/certificate/rest.rb b/spec/
>>> integration/indirector/certificate/rest.rb
>>> index c42bafb..8512fa9 100755
>>> --- a/spec/integration/indirector/certificate/rest.rb
>>> +++ b/spec/integration/indirector/certificate/rest.rb
>>> @@ -48,7 +48,7 @@ describe "Certificate REST Terminus" do
>>>        @mock_model = stub('faked model', :name => "certificate")
>>>
>>> Puppet
>>> ::Indirector 
>>> ::Request.any_instance.stubs(:model).returns(@mock_model)
>>>
>>> -
>>> Puppet
>>> ::Network
>>> ::HTTP::WEBrickREST.any_instance.stubs(:authorized?).returns(true)
>>> +
>>> Puppet
>>> ::Network
>>> ::HTTP
>>> ::WEBrickREST.any_instance.stubs(:check_authorization).returns(true)
>>>    end
>>>
>>>    after do
>>> diff --git a/spec/integration/indirector/certificate_request/rest.rb
>>> b/spec/integration/indirector/certificate_request/rest.rb
>>> index 1381876..a1dc5c0 100755
>>> --- a/spec/integration/indirector/certificate_request/rest.rb
>>> +++ b/spec/integration/indirector/certificate_request/rest.rb
>>> @@ -53,7 +53,7 @@ describe "Certificate Request REST Terminus" do
>>>        @mock_model = stub('faked model', :name => "certificate
>>> request")
>>>
>>> Puppet
>>> ::Indirector 
>>> ::Request.any_instance.stubs(:model).returns(@mock_model)
>>>
>>> -
>>> Puppet
>>> ::Network
>>> ::HTTP::WEBrickREST.any_instance.stubs(:authorized?).returns(true)
>>> +
>>> Puppet
>>> ::Network
>>> ::HTTP
>>> ::WEBrickREST.any_instance.stubs(:check_authorization).returns(true)
>>>    end
>>>
>>>    after do
>>> diff --git a/spec/integration/indirector/ 
>>> certificate_revocation_list/
>>> rest.rb b/spec/integration/indirector/certificate_revocation_list/
>>> rest.rb
>>> index a1ba4f9..dce0cf0 100755
>>> --- a/spec/integration/indirector/certificate_revocation_list/ 
>>> rest.rb
>>> +++ b/spec/integration/indirector/certificate_revocation_list/ 
>>> rest.rb
>>> @@ -57,7 +57,7 @@ describe "Certificate REST Terminus" do
>>>        @mock_model = stub('faked model', :name => "certificate")
>>>
>>> Puppet
>>> ::Indirector 
>>> ::Request.any_instance.stubs(:model).returns(@mock_model)
>>>
>>> -
>>> Puppet
>>> ::Network
>>> ::HTTP::WEBrickREST.any_instance.stubs(:authorized?).returns(true)
>>> +
>>> Puppet
>>> ::Network
>>> ::HTTP
>>> ::WEBrickREST.any_instance.stubs(:check_authorization).returns(true)
>>>    end
>>>
>>>    after do
>>> diff --git a/spec/integration/indirector/report/rest.rb b/spec/
>>> integration/indirector/report/rest.rb
>>> index 1150075..7903ac9 100644
>>> --- a/spec/integration/indirector/report/rest.rb
>>> +++ b/spec/integration/indirector/report/rest.rb
>>> @@ -50,7 +50,7 @@ describe "Report REST Terminus" do
>>>        @mock_model = stub_everything 'faked model', :name =>
>>> "report", :convert_from => @report
>>>
>>> Puppet
>>> ::Indirector 
>>> ::Request.any_instance.stubs(:model).returns(@mock_model)
>>>
>>> -
>>> Puppet
>>> ::Network
>>> ::HTTP::WEBrickREST.any_instance.stubs(:authorized?).returns(true)
>>> +
>>> Puppet
>>> ::Network 
>>> ::HTTP::WEBrickREST.any_instance.stubs(:check_authorization)
>>>    end
>>>
>>>    after do
>>> diff --git a/spec/integration/indirector/rest.rb b/spec/integration/
>>> indirector/rest.rb
>>> index 34619c4..ede073d 100755
>>> --- a/spec/integration/indirector/rest.rb
>>> +++ b/spec/integration/indirector/rest.rb
>>> @@ -78,7 +78,7 @@ describe Puppet::Indirector::REST do
>>>
>>> Puppet
>>> ::Indirector 
>>> ::Request.any_instance.stubs(:model).returns(@mock_model)
>>>
>>>            # do not trigger the authorization layer
>>> -
>>> Puppet
>>> ::Network
>>> ::HTTP::WEBrickREST.any_instance.stubs(:authorized?).returns(true)
>>> +
>>> Puppet
>>> ::Network
>>> ::HTTP
>>> ::WEBrickREST.any_instance.stubs(:check_authorization).returns(true)
>>>        end
>>>
>>>        describe "when finding a model instance over REST" do
>>> @@ -311,7 +311,7 @@ describe Puppet::Indirector::REST do
>>>
>>> Puppet
>>> ::Indirector 
>>> ::Request.any_instance.stubs(:model).returns(@mock_model)
>>>
>>>            # do not trigger the authorization layer
>>> -
>>> Puppet
>>> ::Network
>>> ::HTTP::MongrelREST.any_instance.stubs(:authorized?).returns(true)
>>> +
>>> Puppet
>>> ::Network
>>> ::HTTP
>>> ::MongrelREST.any_instance.stubs(:check_authorization).returns(true)
>>>        end
>>>
>>>        after do
>>> diff --git a/spec/unit/network/http/handler.rb b/spec/unit/network/
>>> http/handler.rb
>>> index 7b7ef47..743830a 100755
>>> --- a/spec/unit/network/http/handler.rb
>>> +++ b/spec/unit/network/http/handler.rb
>>> @@ -49,7 +49,7 @@ describe Puppet::Network::HTTP::Handler do
>>>
>>>            @result = stub 'result', :render => "mytext"
>>>
>>> -            @handler.stubs(:authorized?).returns(true)
>>> +            @handler.stubs(:check_authorization)
>>>
>>>            stub_server_interface
>>>        end
>>> @@ -97,7 +97,7 @@ describe Puppet::Network::HTTP::Handler do
>>>
>>>            @handler.expects(:do_mymethod).with(request, @request,
>>> @response)
>>>
>>> -
>>> @handler.expects(:authorized?).with(request).returns(true)
>>> +            @handler.expects(:check_authorization).with(request)
>>>
>>>            @handler.process(@request, @response)
>>>        end
>>> @@ -108,9 +108,9 @@ describe Puppet::Network::HTTP::Handler do
>>>
>>>            @handler.expects(:do_mymethod).never
>>>
>>> -
>>> @handler.expects(:authorized?).with(request).returns(false)
>>> +
>>> @handler
>>> .expects
>>> (:check_authorization
>>> ).with(request).raises(Puppet::Network::AuthorizationError)
>>>
>>> -            @handler.expects(:set_response)#.with { |response,
>>> body, status| status == 403 }
>>> +            @handler.expects(:set_response).with { |response, body,
>>> status| status == 403 }
>>>
>>>            @handler.process(@request, @response)
>>>        end
>>> diff --git a/spec/unit/network/rest_authorization.rb b/spec/unit/
>>> network/rest_authorization.rb
>>> index 15351b1..46274bb 100644
>>> --- a/spec/unit/network/rest_authorization.rb
>>> +++ b/spec/unit/network/rest_authorization.rb
>>> @@ -29,14 +29,14 @@ describe Puppet::Network::RestAuthorization do
>>>            [ :certificate, :certificate_request].each do |
>>> indirection|
>>>                it "should allow #{indirection}" do
>>>
>>> @request.stubs(:indirection_name).returns(indirection)
>>> -                    @auth.authorized?(@request).should be_true
>>> +                    lambda
>>> { @auth.check_authorization(@request) }.should_not raise_error
>>> Puppet::Network::AuthorizationError
>>>                end
>>>            end
>>>
>>>
>>> [ :facts
>>> , :file_metadata
>>> , :file_content, :catalog, :report, :checksum, :runner ].each do |
>>> indirection|
>>>                it "should not allow #{indirection}" do
>>>
>>> @request.stubs(:indirection_name).returns(indirection)
>>> -                    @auth.authorized?(@request).should be_false
>>> +                    lambda
>>> { @auth.check_authorization(@request) }.should raise_error
>>> Puppet::Network::AuthorizationError
>>>                end
>>>            end
>>>        end
>>> @@ -47,9 +47,21 @@ describe Puppet::Network::RestAuthorization do
>>>            end
>>>
>>>            it "should delegate to the current rest authconfig" do
>>> -                @authconfig.expects(:allowed?).with(@request)
>>> +
>>> @authconfig.expects(:allowed?).with(@request).returns(true)
>>>
>>> -                @auth.authorized?(@request)
>>> +                @auth.check_authorization(@request)
>>> +            end
>>> +
>>> +            it "should raise an AuthorizationError if request is
>>> not allowed" do
>>> +
>>> @authconfig.expects(:allowed?).with(@request).returns(false)
>>> +
>>> +                lambda
>>> { @auth.check_authorization(@request) }.should raise_error
>>> Puppet::Network::AuthorizationError
>>> +            end
>>> +
>>> +            it "should not raise an AuthorizationError if request
>>> is allowed" do
>>> +
>>> @authconfig.expects(:allowed?).with(@request).returns(true)
>>> +
>>> +                lambda
>>> { @auth.check_authorization(@request) }.should_not raise_error
>>> Puppet::Network::AuthorizationError
>>>            end
>>>        end
>>>    end
>>> diff --git a/spec/unit/network/rights.rb b/spec/unit/network/ 
>>> rights.rb
>>> index 97094f8..6d7577e 100644
>>> --- a/spec/unit/network/rights.rb
>>> +++ b/spec/unit/network/rights.rb
>>> @@ -244,7 +244,18 @@ describe Puppet::Network::Rights do
>>>                @long_acl.stubs(:match?).returns(true)
>>>                @long_acl.stubs(:allowed?).returns(:returned)
>>>
>>> -                @right.allowed?("/path/to/there/and/
>>> there", :args).should == :returned
>>> +                res, acl = @right.allowed?("/path/to/there/and/
>>> there", :args)
>>> +                res.should == :returned
>>> +            end
>>> +
>>> +            it "should return the matched acl" do
>>> +                @right.newright("/path/to/there", 0)
>>> +
>>> +                @long_acl.stubs(:match?).returns(true)
>>> +                @long_acl.stubs(:allowed?).returns(:returned)
>>> +
>>> +                res, acl = @right.allowed?("/path/to/there/and/
>>> there", :args)
>>> +                acl.should == @long_acl
>>>            end
>>>
>>>            it "should not raise an error if this path acl doesn't
>>> exist" do
>>> @@ -252,7 +263,8 @@ describe Puppet::Network::Rights do
>>>            end
>>>
>>>            it "should return false if no path match" do
>>> -                @right.allowed?("/path", :args).should be_false
>>> +                res, acl = @right.allowed?("/path", :args)
>>> +                res.should be_false
>>>            end
>>>        end
>>>
>>> @@ -313,7 +325,18 @@ describe Puppet::Network::Rights do
>>>                @regex_acl1.stubs(:match?).returns(true)
>>>                @regex_acl1.stubs(:allowed?).returns(:returned)
>>>
>>> -                @right.allowed?("/files/repository/myfile/
>>> other", :args).should == :returned
>>> +                res, acl = @right.allowed?("/files/repository/
>>> myfile/other", :args)
>>> +                res.should == :returned
>>> +            end
>>> +
>>> +            it "should return the matched acl" do
>>> +                @right.newright("~ /files/(.*)/myfile", 0)
>>> +
>>> +                @regex_acl1.stubs(:match?).returns(true)
>>> +                @regex_acl1.stubs(:allowed?).returns(:returned)
>>> +
>>> +                res, acl = @right.allowed?("/files/repository/
>>> myfile/other", :args)
>>> +                acl.should == @regex_acl1
>>>            end
>>>
>>>            it "should not raise an error if no regex acl match" do
>>> @@ -321,7 +344,8 @@ describe Puppet::Network::Rights do
>>>            end
>>>
>>>            it "should return false if no regex match" do
>>> -                @right.allowed?("/path", :args).should be_false
>>> +                res, acl = @right.allowed?("/path", :args)
>>> +                res.should be_false
>>>            end
>>>
>>>        end
>>> @@ -403,14 +427,16 @@ describe Puppet::Network::Rights do
>>>            it "should return :dunno if this right is not restricted
>>> to the given method" do
>>>                @acl.restrict_method(:destroy)
>>>
>>> -                @acl.allowed?("me","127.0.0.1", :save).should
>>> == :dunno
>>> +                res,acl = @acl.allowed?("me","127.0.0.1", :save)
>>> +                res.should == :dunno
>>>            end
>>>
>>>            it "should return allow/deny if this right is restricted
>>> to the given method" do
>>>                @acl.restrict_method(:save)
>>>                @acl.allow("127.0.0.1")
>>>
>>> -                @acl.allowed?("me","127.0.0.1", :save).should  
>>> be_true
>>> +                res, acl = @acl.allowed?("me","127.0.0.1", :save)
>>> +                res.should be_true
>>>            end
>>>
>>>            it "should return :dunno if this right is not restricted
>>> to the given environment" do
>>> @@ -418,7 +444,8 @@ describe Puppet::Network::Rights do
>>>
>>>                @acl.restrict_environment(:production)
>>>
>>> -                @acl.allowed?
>>> ("me","127.0.0.1", :save, :development).should == :dunno
>>> +                res, acl = @acl.allowed?
>>> ("me","127.0.0.1", :save, :development)
>>> +                res.should == :dunno
>>>            end
>>>
>>>            it "should interpolate allow/deny patterns with the
>>> given match" do
>>> diff --git a/test/network/rights.rb b/test/network/rights.rb
>>> index e1d9f8a..89c6797 100755
>>> --- a/test/network/rights.rb
>>> +++ b/test/network/rights.rb
>>> @@ -23,9 +23,13 @@ class TestRights < Test::Unit::TestCase
>>>            @store.newright(:write)
>>>        }
>>>
>>> -        assert(! @store.allowed?(:write, "host.madstop.com",
>>> "0.0.0.0"),
>>> +        res, acl = @store.allowed?(:write, "host.madstop.com",
>>> "0.0.0.0")
>>> +        assert(! res,
>>>            "Defaulted to allowing access")
>>>
>>> +        assert(! acl.nil?,
>>> +            "returned matching rights is not nil")
>>> +
>>>        assert_nothing_raised {
>>>            @store[:write].info "This is a log message"
>>>        }
>>> -- 
>>> 1.6.0.2
>>>
>>>
>>
>>
>
>
> -- 
> Brice Figureau
> Days of Wonder
> http://www.daysofwonder.com
>
> >


-- 
Don't throw away the old bucket until you know whether the new one
holds water. -- Swedish Proverb
---------------------------------------------------------------------
Luke Kanies | http://reductivelabs.com | http://madstop.com


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to