diff --git a/smradius/attributes.pm b/smradius/attributes.pm index 31ccde8fb8e5101ea73fad1293f7d631534c6b97..96e8ffd7a816498428b5664801cbfe9a4a310b30 100644 --- a/smradius/attributes.pm +++ b/smradius/attributes.pm @@ -30,7 +30,8 @@ our (@ISA,@EXPORT); @EXPORT = qw( addAttribute checkAuthAttribute - getReplyAttribute + setReplyAttribute + setReplyVAttribute processConfigAttribute getAttributeValue @@ -310,13 +311,13 @@ sub checkAuthAttribute -## @fn getReplyAttribute($server,$attributes,$attribute) +## @fn setReplyAttribute($server,$attributes,$attribute) # Function which sees if we must reply with this attribute # # @param server Server instance # @param attributes Hashref of reply attributes # @param attribute Attribute to check -sub getReplyAttribute +sub setReplyAttribute { my ($server,$attributes,$attribute) = @_; @@ -327,9 +328,6 @@ sub getReplyAttribute return 2 if ($attribute->{'Name'} eq $ignoredAttr); } - # Did we find a match - my $matched = 0; - # Figure out our attr values my @attrValues; if (ref($attribute->{'Value'}) eq "ARRAY") { @@ -405,6 +403,101 @@ sub getReplyAttribute +## @fn setReplyVAttribute($server,$attributes,$attribute) +# Function which sees if we must reply with this attribute +# +# @param server Server instance +# @param attributes Hashref of reply attributes +# @param attribute Attribute to check +sub setReplyVAttribute +{ + my ($server,$attributes,$attribute) = @_; + + + # Check ignore list + foreach my $ignoredAttr (@attributeIgnoreList) { + # 2 = IGNORE, so return IGNORE for all ignored items + return 2 if ($attribute->{'Name'} eq $ignoredAttr); + } + + # Did we find a match + my $matched = 0; + + # Figure out our attr values + my @attrValues; + if (ref($attribute->{'Value'}) eq "ARRAY") { + @attrValues = @{$attribute->{'Value'}}; + } else { + @attrValues = ( $attribute->{'Value'} ); + } + + $server->log(LOG_DEBUG,"[VATTRIBUTES] Processing REPLY attribute: '". + $attribute->{'Name'}."' ".$attribute->{'Operator'}." '".join("','",@attrValues)."'"); + + + # Operator: = + # + # Use: Attribute = Value + # Not allowed as a check item for RADIUS protocol attributes. It is allowed for server + # configuration attributes (Auth-Type, etc), and sets the value of on attribute, + # only if there is no other item of the same attribute. + # + # As a reply item, it means "add the item to the reply list, but only if there is + # no other item of the same attribute. + + if ($attribute->{'Operator'} eq '=') { + # If item does not exist + if (!defined($attributes->{$attribute->{'Vendor'}}->{$attribute->{'Name'}})) { + # Then add + $server->log(LOG_DEBUG,"[VATTRIBUTES] - Attribute '".$attribute->{'Name'}. + "' no value exists, setting value to '".join("','",@attrValues)."'"); + @{$attributes->{$attribute->{'Vendor'}}->{$attribute->{'Name'}}} = @attrValues; + } + + + # Operator: := + # + # Use: Attribute := Value + # Always matches as a check item, and replaces in the configuration items any attribute of the same name. + # If no attribute of that name appears in the request, then this attribute is added. + # + # As a reply item, it has an itendtical meaning, but for the reply items, instead of the request items. + + } elsif ($attribute->{'Operator'} eq ':=') { + # Overwrite + $server->log(LOG_DEBUG,"[VATTRIBUTES] - Attribute '".$attribute->{'Name'}. + "' setting attribute value to '".join("','",@attrValues)."'"); + @{$attributes->{$attribute->{'Vendor'}}->{$attribute->{'Name'}}} = @attrValues; + + + # Operator: += + # + # Use: Attribute += Value + # Always matches as a check item, and adds the current + # attribute with value to the list of configuration items. + # + # As a reply item, it has an itendtical meaning, but the + # attribute is added to the reply items. + + } elsif ($attribute->{'Operator'} eq '+=') { + # Then add + $server->log(LOG_DEBUG,"[VATTRIBUTES] - Attribute '".$attribute->{'Name'}. + "' appending values '".join("','",@attrValues)."'"); + push(@{$attributes->{$attribute->{'Vendor'}}->{$attribute->{'Name'}}},@attrValues); + + # Attributes that are not defined + } else { + # Ignore and b0rk out + $server->log(LOG_NOTICE,"[VATTRIBUTES] - Attribute '".$attribute->{'Name'}."' ignored, invalid operator?"); + last; + } + + return; +} + + + + ## @fn processConfigAttribute($server,$packetAttributes,$attribute) # Function to process a configuration attribute #