<P><BR>Hello Gurus,</P>
<P> </P>
<P>I need to set up FR with SQL (Postgres) backend storing all
users/groups information except clients.conf.</P>
<P>Groups are mission-critical, because the same user can come from different
NASes (WiFi, Dial-Up, VPDN) and should get different settings (IP addresses
etc).</P>
<P>Access to different services is granting through radusergroup table, where
user belong or not belong to corresponding group.</P>
<P>If user doesn't belong do group 'dialup' but come from Dial-Up NAS, it should
be rejected even with correct password.</P>
<P>That access idea seems to me very simple, but I've spend many days
getting it to work state.</P>
<P> </P>
<P>First of all, i realized that documented rlm_sql `read_groups' directive
don't affect on sql_config structure read_groups member.</P>
<P>This patch fixes that issue:</P>
<P>diff ./src/modules/rlm_sql/rlm_sql.c.orig
./src/modules/rlm_sql/rlm_sql.c<BR>104a105,106<BR>>      
{"read_groups",
PW_TYPE_BOOLEAN,<BR>>       
offsetof(SQL_CONFIG,read_groups), NULL, "yes"},</P>
<P> </P>
<P>Well, that didn't fix the problem.</P>
<P>Now rlm_sql successfully find the user in radcheck table, setting found=1,
and then check groups.</P>
<P>The problem is that found remains =1 in case of group check failure
(rlm_sql_process_groups returns 0).</P>
<P>diff ./src/modules/rlm_sql/rlm_sql.c.orig ./src/modules/rlm_sql/rlm_sql.c</P>
<P>This patch fixes that issue (line numbers are correct for original file
without first patch):</P>
<P>988a989,991<BR>>              
} else
{<BR>>                  
/* no matched group found => decline the user
*/<BR>>                  
found = 0;<BR></P>
<P>Well, that also didn't fix the problem.</P>
<P>Now rlm_sql returns RLM_MODULE_NOTFOUND, but for FR it doesn'd mean
 'reject the user immediately',</P>
<P>and after processing of next modules, the user is accepted without any
groups.</P>
<P>This patch fixes that issue:</P>
<P>diff ./src/modules/rlm_sql/rlm_sql.c.orig ./src/modules/rlm_sql/rlm_sql.c</P>
<P>1044c1044<BR><              
return
RLM_MODULE_NOTFOUND;<BR>---<BR>>              
return RLM_MODULE_REJECT;</P>
<P> </P>
<P> </P>
<P>After that patch the FR (CVS 20070605) is working as expected. </P>
<P><BR> </P>
<P>here is some database data:</P>
<P> </P>
<P>radchek table contains only user passwords:</P>
<P># select * from radcheck;</P>
<P> id |  username   |  
attribute    | op
|              
value<BR>----+-------------+----------------+----+------------------------------------<BR>1
| guest       | Crypt-Password | == | $.......</P>
<P>...</P>
<P> </P>
<P>radreply table is empty</P>
<P> </P>
<P>radusergroup table contains user to groups mappings:</P>
<P># select * from radusergroup;</P>
<P>  username   |   groupname   |
priority<BR>-------------+---------------+----------<BR>guest      
| dialup_guests |        3</P>
<P>... </P>
<P> </P>
<P>radgroupcheck table contains attributes to distinguish NASes, set Pool-Names
and some other unimportant things:</P>
<P># select * from radgroupcheck;</P>
<P> id |   groupname    |   
attribute     | op |     
value<BR>----+----------------+------------------+----+------------------<BR>3
| dialup_guests  | NAS-IP-Address   | == | 192.168.0.1</P>
<P>7 | dialup_guests  | Pool-Name       
| := | dialup_pool</P>
<P>...</P>
<P> </P>
<P>radgroupreply table contains nothing special:</P>
<P># select * from radgroupreply;</P>
<P> id |   groupname   |   
attribute    | op |
value<BR>----+---------------+-----------------+----+-------<BR>  1 |
dialup_guests | Session-Timeout | := | 900</P>
<P>...<BR></P>
<P> </P>
<P> </P>
<P>I'm pretty sure that there is more straight way to do the same thing. If
someone have another solution, please tell.</P>
<P>I would be happy if this info will help somebody.</P>
<P>Any comments are greatly appreciated.</P>
<P> </P>
<P><BR>Best regards,<BR>Andrew.<BR></P>