package connect
import (
"github.com/hashicorp/consul/acl"
"github.com/hashicorp/consul/agent/structs"
)
// AuthorizeIntentionTarget determines whether the destination is covered by the given intention
// and whether the intention action allows a connection.
// This is a generalized version of the old CertURI.Authorize(), and can be evaluated against sources or destinations.
//
// The return value of `auth` is only valid if the second value `match` is true.
// If `match` is false, then the intention doesn't match this target and any result should be ignored.
func AuthorizeIntentionTarget (
target , targetNS , targetAP string ,
ixn * structs . Intention ,
matchType structs . IntentionMatchType ,
) ( auth bool , match bool ) {
switch matchType {
case structs . IntentionMatchDestination :
if acl . PartitionOrDefault ( ixn . DestinationPartition ) != acl . PartitionOrDefault ( targetAP ) {
return false , false
}
if ixn . DestinationNS != structs . WildcardSpecifier && ixn . DestinationNS != targetNS {
// Non-matching namespace
return false , false
}
if ixn . DestinationName != structs . WildcardSpecifier && ixn . DestinationName != target {
// Non-matching name
return false , false
}
case structs . IntentionMatchSource :
if acl . PartitionOrDefault ( ixn . SourcePartition ) != acl . PartitionOrDefault ( targetAP ) {
return false , false
}
if ixn . SourceNS != structs . WildcardSpecifier && ixn . SourceNS != targetNS {
// Non-matching namespace
return false , false
}
if ixn . SourceName != structs . WildcardSpecifier && ixn . SourceName != target {
// Non-matching name
return false , false
}
default :
// Reject on any un-recognized match type
return false , false
}
// The name and namespace match, so the destination is covered
return ixn . Action == structs . IntentionActionAllow , true
}