Using configuration items in strings

Arran Cudbard-Bell a.cudbardb at freeradius.org
Sat Feb 15 17:04:44 CET 2014


On 15 Feb 2014, at 15:26, Alan DeKok <aland at deployingradius.com> wrote:

> Arran Cudbard-Bell wrote:
>> Hm, no. Using RFC terms, and assuming were going for optimum efficiency:
>> 
>> if (${foo})
>> 
>> MUST NOT be optimised away, it is a attribute or rcode check with the value of the CONF_PAIR ${foo}
> 
>  I'm not sure what you mean by "optimized away".  

If the result of the condition cannot change during the processing of a request
the condition is not evaluated during the processing of a request.

if ('foo' == 'foo') {

}

Will always be true, so there's no need to strcmp foo and foo on every request.

> ${foo} gets replaced
> with the value of configuration item 'foo', by the configuration file
> reader.  This happens *before* any analysis is done of the condition.

Yep.

> 
>  e.g.
> 
> 	foo = 0
> 	if (${foo}) { ...
> 
>  and
> 
> 	if (0) { ...
> 
>  are identical.
> 
>  It sounds like your analysis is mixing up the two passes.

No, I'm aware they're different steps and ${} substitutions are done
before everything else, my examples just weren't clear enough.

> 
> 1) string substitution ${foo} --> value of configuration item "foo"
> 
> 2) compilation to string xlat, attribute reference, etc.
> 
>> if ("${foo}") 
>> 
>> SHOULD be optimised away, it is an XLAT expansion only containing string literals.
> 
>  Only if the string inside of the double quotes contains a % character.

Doesn't contain a % surely?

>> Where ${foo} -> '%{User-Name}'
>> 
>> MUST NOT be optimised away, it is an XLAT expansion containing an attribute reference.
> 
>  Be careful with the single quotes.  %{User-Name} is an xlat saying
> "the value of the User-Name attribute".  '%{User-Name}' is a
> single-quoted string with contents %{User-Name}.  The contents are a
> *static* string, and aren't dynamically expanded.

Sorry I wasn't being clear with the examples.

I meant:

${foo} -> %{User-Name}

> 
>> Ready to process requests.
>> rad_recv: Access-Request packet from host 127.0.0.1 port 51784, id=52, length=38
>> 	User-Password = 'foo'
>> (0) # Executing section authorize from file /usr/local/freeradius-3.0.x/etc/raddb/sites-enabled/default
>> (0)   authorize {
>> (0)   ? if (!'User-Name') 
>> (0)   ? if (!'User-Name')  -> FALSE
> 
>  Yes.  'User-Name' is a non-NULL string, so it's always TRUE.  !TRUE is
> FALSE.
> 

Sure there was just no indication to show whether the evaluation was actually
being skipped, it looked like it was still being performed, when as you say
'User-Name' is always true.

>> (0)   ? if (!"User-Name")  -> FALSE
> 
>  The same applies here.

Same.

> 
>> (0)   ? if (!User-Name)  -> TRUE
> 
>  Here, User-Name is an attribute reference.  The packet you sent didn't
> include a User-Name.  So the check for existence of User-Name is FALSE,
> and !FALSE is TRUE.

Yep, that's correct, i'm not questioning the results of the evaluations
they're all as I would expect. I was just pointing out that it's not clear
that the condition isn't actually being evaluated.

>> (0)   ? if (!('User-Name' == 'bar'))  -> TRUE
> 
>  That's correct.  The string 'User-Name' is not the same as the string
> 'bar'.  So that evaluates to FALSE.  And !FALSE is TRUE.

Yep.

>> But I may be miss-understanding on how it's meant to operate.
> 
>  The string substitution for ${var} is very simple, and is *completely*
> independent of the step which parses conditions.  The "parse condition"
> step just sees text strings.  All of the ${foo} magic has gone away.

I'm aware of that. It makes it much easier to comprehend what's going on
when you think of ${} expansions as doing something to C preprocessor 
macros.

It's just the output didn't look any different for conditions I expected
to be pre-evaluated.

If it's all happening transparently behind the scenes then that's fine.

Arran Cudbard-Bell <a.cudbardb at freeradius.org>
FreeRADIUS Development Team

FD31 3077 42EC 7FCD 32FE 5EE2 56CF 27F9 30A8 CAA2

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 881 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.freeradius.org/pipermail/freeradius-users/attachments/20140215/cc56b96e/attachment.pgp>


More information about the Freeradius-Users mailing list