Using configuration items in strings

Alan DeKok aland at deployingradius.com
Sat Feb 15 17:22:31 CET 2014


Arran Cudbard-Bell wrote:
> 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.

  I just pushed a fix for that.  Including unit tests.  <woo>!

> Doesn't contain a % surely?

  Yes.

> I meant:
> 
> ${foo} -> %{User-Name}

  That should just be a string substitution.

> 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.

  The evalaution wasn't being skipped (until my recent patch).  It was
always being done.

> 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.

  The conditions *are* being evaluated.  But not any more.

> 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.

  Yes.

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

  Because they weren't.

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

  With the changes I pushed, if you have:

	if ('foo' == 'bar') {
		...
	}

  The entire block *disappears* from the run-time configuration.  You
will *never* see the "if" section being evaluated.  The "if" condition
is evaluated when the server loads, and the block is skipped.  i.e. not
even compiled.

  Which means you can do:

	if ('never' == 'always') { # FALSE!
		roses_are_red
		violets_are_blue
		freeradius_is_great
		and_so_are_you
	}

  And the server will start up correctly, and run.  Even though there's
no module called "roses_are_red".  The server notices that the block is
useless, and ignores it completely.

  Alan DeKok


More information about the Freeradius-Users mailing list