Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
smradius
smradius
Commits
9440002c
Commit
9440002c
authored
Sep 24, 2016
by
Nigel Kukard
Browse files
Merge branch 'nk-fixes' into 'master'
Nk fixes See merge request
!418
parents
14376d0c
4aaea3ad
Pipeline
#286
passed with stages
in 3 minutes and 3 seconds
Changes
11
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
lib/smradius/daemon.pm
View file @
9440002c
...
...
@@ -718,7 +718,7 @@ sub process_request {
if
(
$module
->
{'
User_find
'})
{
$self
->
log
(
LOG_DEBUG
,"
[SMRADIUS] FIND: Trying plugin '
"
.
$module
->
{'
Name
'}
.
"
' for username '
"
.
$user
->
{'
Username
'}
.
"
'
");
my
(
$res
,
$user
db_d
ata
)
=
$module
->
{'
User_find
'}(
$self
,
$user
,
$pkt
);
my
(
$res
,
$user
DB_D
ata
)
=
$module
->
{'
User_find
'}(
$self
,
$user
,
$pkt
);
# Check result
if
(
!
defined
(
$res
))
{
...
...
@@ -733,7 +733,9 @@ sub process_request {
}
elsif
(
$res
==
MOD_RES_ACK
)
{
$self
->
log
(
LOG_DEBUG
,"
[SMRADIUS] FIND: Username found with '
"
.
$module
->
{'
Name
'}
.
"
'
");
$user
->
{'
_UserDB
'}
=
$module
;
$user
->
{'
_UserDB_Data
'}
=
$userdb_data
;
$user
->
{'
_UserDB_Data
'}
=
$userDB_Data
;
# The user ID is supposed to be global unique, on the same level as the username
$user
->
{'
ID
'}
=
$user
->
{'
_UserDB_Data
'}
->
{'
ID
'};
last
;
# Or a negative result
...
...
lib/smradius/modules/accounting/mod_accounting_sql.pm
View file @
9440002c
...
...
@@ -35,12 +35,10 @@ use Math::BigFloat;
# Exporter stuff
require
Exporter
;
our
(
@ISA
,
@EXPORT
,
@EXPORT_OK
);
@ISA
=
qw(Exporter)
;
@EXPORT
=
qw(
use
base
qw(Exporter)
;
our
@EXPORT
=
qw(
)
;
@EXPORT_OK
=
qw(
our
@EXPORT_OK
=
qw(
)
;
...
...
@@ -333,7 +331,10 @@ sub getUsage
foreach
my
$attr
(
$packet
->
attributes
)
{
$template
->
{'
request
'}
->
{
$attr
}
=
$packet
->
rawattr
(
$attr
)
}
$template
->
{'
user
'}
=
$user
;
# Add user details
$template
->
{'
user
'}
->
{'
ID
'}
=
$user
->
{'
ID
'};
$template
->
{'
user
'}
->
{'
Username
'}
=
$user
->
{'
Username
'};
# Current PeriodKey
my
$now
=
DateTime
->
now
->
set_time_zone
(
$server
->
{'
smradius
'}
->
{'
event_timezone
'});
...
...
@@ -354,7 +355,7 @@ sub getUsage
# Fetch data
my
$sth
=
DBSelect
(
@dbDoParams
);
if
(
!
$sth
)
{
$server
->
log
(
LOG_ERR
,"
[MOD_ACCOUNTING_SQL] Database query failed:
"
.
AWITPT::DB::DBLayer::
Error
());
$server
->
log
(
LOG_ERR
,"
[MOD_ACCOUNTING_SQL] Database query failed:
%s
",
AWITPT::DB::DBLayer::
Error
());
return
;
}
...
...
@@ -438,8 +439,9 @@ sub acct_log
# Fix event timestamp
$template
->
{'
request
'}
->
{'
Timestamp
'}
=
$user
->
{'
_Internal
'}
->
{'
Timestamp
'};
# Add user
$template
->
{'
user
'}
=
$user
;
# Add user details
$template
->
{'
user
'}
->
{'
ID
'}
=
$user
->
{'
ID
'};
$template
->
{'
user
'}
->
{'
Username
'}
=
$user
->
{'
Username
'};
# Current PeriodKey
my
$now
=
DateTime
->
now
->
set_time_zone
(
$server
->
{'
smradius
'}
->
{'
event_timezone
'});
...
...
@@ -461,7 +463,7 @@ sub acct_log
# Fetch previous records of the same session
my
$sth
=
DBSelect
(
@dbDoParams
);
if
(
!
$sth
)
{
$server
->
log
(
LOG_ERR
,"
[MOD_ACCOUNTING_SQL] Database query failed:
"
.
AWITPT::DB::DBLayer::
Error
());
$server
->
log
(
LOG_ERR
,"
[MOD_ACCOUNTING_SQL] Database query failed:
%s
",
AWITPT::DB::DBLayer::
Error
());
return
;
}
...
...
@@ -609,7 +611,7 @@ sub acct_log
# Update database (status)
my
$sth
=
DBDo
(
@dbDoParams
);
if
(
!
$sth
)
{
$server
->
log
(
LOG_ERR
,"
[MOD_ACCOUNTING_SQL] Failed to update accounting STOP record:
"
.
AWITPT::DB::DBLayer::
Error
());
$server
->
log
(
LOG_ERR
,"
[MOD_ACCOUNTING_SQL] Failed to update accounting STOP record:
%s
",
AWITPT::DB::DBLayer::
Error
());
return
MOD_RES_NACK
;
}
}
...
...
@@ -631,7 +633,7 @@ sub fixDuplicates
# Select duplicates
my
$sth
=
DBSelect
(
@dbDoParams
);
if
(
!
$sth
)
{
$server
->
log
(
LOG_ERR
,"
[MOD_ACCOUNTING_SQL] Database query failed:
"
.
AWITPT::DB::DBLayer::
Error
());
$server
->
log
(
LOG_ERR
,"
[MOD_ACCOUNTING_SQL] Database query failed:
%s
",
AWITPT::DB::DBLayer::
Error
());
return
;
}
...
...
@@ -654,7 +656,7 @@ sub fixDuplicates
# Delete duplicates
$sth
=
DBDo
(
@dbDoParams
);
if
(
!
$sth
)
{
$server
->
log
(
LOG_ERR
,"
[MOD_ACCOUNTING_SQL] Database query failed:
"
.
AWITPT::DB::DBLayer::
Error
());
$server
->
log
(
LOG_ERR
,"
[MOD_ACCOUNTING_SQL] Database query failed:
%s
",
AWITPT::DB::DBLayer::
Error
());
DBRollback
();
return
;
}
...
...
@@ -851,5 +853,6 @@ sub cleanup
}
1
;
# vim: ts=4
lib/smradius/modules/accounting/mod_accounting_test.pm
View file @
9440002c
# Test accounting database
# Copyright (C) 2007-201
5
, AllWorldIT
#
# Copyright (C) 2007-201
6
, AllWorldIT
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
...
...
@@ -99,7 +99,10 @@ Acct-Delay-Time: %{accounting.Acct-Delay-Time}
foreach
my
$attr
(
$packet
->
attributes
)
{
$template
->
{'
accounting
'}
->
{
$attr
}
=
$packet
->
attr
(
$attr
)
}
$template
->
{'
user
'}
=
$user
;
# Add user details
$template
->
{'
user
'}
->
{'
ID
'}
=
$user
->
{'
ID
'};
$template
->
{'
user
'}
->
{'
Username
'}
=
$user
->
{'
Username
'};
if
(
$packet
->
rawattr
('
Acct-Status-Type
')
eq
"
1
")
{
$server
->
log
(
LOG_DEBUG
,"
Start Packet:
"
.
$packet
->
dump
());
...
...
lib/smradius/modules/features/mod_feature_capping.pm
View file @
9440002c
...
...
@@ -32,6 +32,8 @@ use POSIX qw(floor);
# Load exporter
use
base
qw(Exporter)
;
our
@EXPORT
=
qw(
)
;
our
@EXPORT_OK
=
qw(
)
;
...
...
lib/smradius/modules/features/mod_feature_update_user_stats_sql.pm
View file @
9440002c
# Support for updating of user stats
# Copyright (C) 2007-201
1
, AllWorldIT
#
# Copyright (C) 2007-201
6
, AllWorldIT
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
...
...
@@ -109,9 +109,9 @@ sub updateUserStats
# Skip MAC authentication
return
MOD_RES_SKIP
if
(
defined
(
$user
->
{'
_UserDB
'}
->
{'
Name
'})
&&
return
MOD_RES_SKIP
if
(
defined
(
$user
->
{'
_UserDB
'}
->
{'
Name
'})
&&
$user
->
{'
_UserDB
'}
->
{'
Name
'}
eq
"
SQL User Database (MAC authentication)
");
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_UPDATE_USER_STATS_SQL] UPDATE USER STATS HOOK
");
# Build template
...
...
@@ -119,7 +119,10 @@ sub updateUserStats
foreach
my
$attr
(
$packet
->
attributes
)
{
$template
->
{'
request
'}
->
{
$attr
}
=
$packet
->
rawattr
(
$attr
)
}
$template
->
{'
user
'}
=
$user
;
# Add user details
$template
->
{'
user
'}
->
{'
ID
'}
=
$user
->
{'
ID
'};
$template
->
{'
user
'}
->
{'
Username
'}
=
$user
->
{'
Username
'};
# Current PeriodKey
my
$now
=
DateTime
->
now
->
set_time_zone
(
$server
->
{'
smradius
'}
->
{'
event_timezone
'});
...
...
lib/smradius/modules/features/mod_feature_validity.pm
View file @
9440002c
# Validity support
# Copyright (C) 2007-201
1
, AllWorldIT
#
# Copyright (C) 2007-201
6
, AllWorldIT
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
...
...
@@ -28,12 +28,10 @@ use DateTime;
use
Date::
Parse
;
# Exporter stuff
require
Exporter
;
our
(
@ISA
,
@EXPORT
,
@EXPORT_OK
);
@ISA
=
qw(Exporter)
;
@EXPORT
=
qw(
use
base
qw(Exporter)
;
our
@EXPORT
=
qw(
)
;
@EXPORT_OK
=
qw(
our
@EXPORT_OK
=
qw(
)
;
...
...
@@ -41,7 +39,7 @@ our (@ISA,@EXPORT,@EXPORT_OK);
our
$pluginInfo
=
{
Name
=>
"
User Validity Feature
",
Init
=>
\
&init
,
# Authentication hook
'
Feature_Post-Authentication_hook
'
=>
\
&checkValidity
,
'
Feature_Post-Accounting_hook
'
=>
\
&checkValidity
...
...
@@ -148,15 +146,15 @@ sub checkValidity
if
(
defined
(
$validFrom
))
{
# Convert string to datetime
my
$validFrom_unixtime
=
str2time
(
$validFrom
);
my
$validFrom_unixtime
=
str2time
(
$validFrom
,
$server
->
{'
smradius
'}
->
{'
event_timezone
'}
);
if
(
!
defined
(
$validFrom_unixtime
))
{
$server
->
log
(
LOG_NOTICE
,"
[MOD_FEATURE_VALIDITY] Date conversion failed on '
"
.
$validFrom
.
"
'
"
);
$server
->
log
(
LOG_NOTICE
,"
[MOD_FEATURE_VALIDITY] Date conversion failed on '
%s'
",
$validFrom
);
# If current time before start of valid pariod
}
elsif
(
$now
<
$validFrom_unixtime
)
{
my
$pretty_dt
=
DateTime
->
from_epoch
(
epoch
=>
$validFrom_unixtime
)
->
strftime
('
%Y-%m-%d %H:%M:%S
');
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_VALIDITY] Current date outside valid start date: '
"
.
$pretty_dt
.
"
', rejecting
");
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_VALIDITY] Current date outside valid start date: '
%s
', rejecting
"
,
$pretty_dt
);
# Date not within valid period, must be disconnected
return
MOD_RES_NACK
;
...
...
@@ -167,14 +165,14 @@ sub checkValidity
if
(
defined
(
$validTo
))
{
# Convert string to datetime
my
$validTo_unixtime
=
str2time
(
$validTo
);
my
$validTo_unixtime
=
str2time
(
$validTo
,
$server
->
{'
smradius
'}
->
{'
event_timezone
'}
);
if
(
!
defined
(
$validTo_unixtime
))
{
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_VALIDITY] Date conversion failed on '
"
.
$validTo
.
"
'
"
);
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_VALIDITY] Date conversion failed on '
%s'
",
$validTo
);
# If current time after start of valid pariod
}
elsif
(
$now
>
$validTo_unixtime
)
{
my
$pretty_dt
=
DateTime
->
from_epoch
(
epoch
=>
$validTo_unixtime
)
->
strftime
('
%Y-%m-%d %H:%M:%S
');
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_VALIDITY] Current date outside valid end date: '
"
.
$pretty_dt
.
"
', rejecting
");
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_VALIDITY] Current date outside valid end date: '
%s
', rejecting
"
,
$pretty_dt
);
# Date not within valid period, must be disconnected
return
MOD_RES_NACK
;
...
...
@@ -194,18 +192,20 @@ sub checkValidity
# If current time after start of valid pariod
if
(
$now
>
$validUntil
)
{
my
$pretty_dt
=
DateTime
->
from_epoch
(
epoch
=>
$validUntil
)
->
strftime
('
%Y-%m-%d %H:%M:%S
');
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_VALIDITY] Current date outside valid window end date: '
"
.
$pretty_dt
.
"
', rejecting
");
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_VALIDITY] Current date outside valid window end date: '%s',
"
.
"
rejecting
",
$pretty_dt
);
# Date not within valid window, must be disconnected
return
MOD_RES_NACK
;
}
}
}
else
{
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_VALIDITY] No users_data 'global/FirstLogin' found for user '
"
.
$user
->
{'
Username
'}
.
"
'
");
$server
->
log
(
LOG_DEBUG
,"
[MOD_FEATURE_VALIDITY] No users_data 'global/FirstLogin' found for user '%s'
",
$user
->
{'
Username
'});
}
# if (defined(my $res = $module->{'Users_data_get'}($server,$user,'global','FirstLogin'))) {
}
else
{
$server
->
log
(
LOG_WARN
,"
[MOD_FEATURE_VALIDITY] UserDB module '
"
.
$user
->
{'
_UserDB
'}
->
{'
Name
'}
.
"
' does not support 'users_data'. Therefore no
support for Validity Window feature
");
$server
->
log
(
LOG_WARN
,"
[MOD_FEATURE_VALIDITY] UserDB module '
%s' does not support 'users_data'. Therefore no
"
.
"
support for Validity Window feature
"
,
$user
->
{'
_UserDB
'}
->
{'
Name
'}
);
}
# if (defined($user->{'_UserDB'}->{'Users_data_get'})) {
}
...
...
lib/smradius/modules/system/mod_config_sql_topups.pm
View file @
9440002c
...
...
@@ -28,21 +28,18 @@ use AWITPT::Util;
use
smradius::
util
;
use
smradius::
attributes
;
use
POSIX
qw(ceil
strftime
)
;
use
POSIX
qw(ceil)
;
use
DateTime
;
use
Date::
Parse
;
use
Math::
BigInt
;
use
Math::
BigFloat
;
# Exporter stuff
require
Exporter
;
our
(
@ISA
,
@EXPORT
,
@EXPORT_OK
);
@ISA
=
qw(Exporter)
;
@EXPORT
=
qw(
use
base
qw(Exporter)
;
our
@EXPORT
=
qw(
)
;
@EXPORT_OK
=
qw(
our
@EXPORT_OK
=
qw(
)
;
...
...
@@ -185,7 +182,7 @@ sub getTopups
# Query database
my
$sth
=
DBSelect
(
$config
->
{'
get_topups_summary_query
'},
$periodKey
,
$username
);
if
(
!
$sth
)
{
$server
->
log
(
LOG_ERR
,"
Failed to get topup information:
"
.
AWITPT::DB::DBLayer::
Error
());
$server
->
log
(
LOG_ERR
,"
Failed to get topup information:
%s
",
AWITPT::DB::DBLayer::
Error
());
return
MOD_RES_NACK
;
}
while
(
my
$row
=
hashifyLCtoMC
(
$sth
->
fetchrow_hashref
(),
qw(Balance Type ID)
))
{
...
...
@@ -196,7 +193,7 @@ sub getTopups
# Query database
$sth
=
DBSelect
(
$config
->
{'
get_topups_query
'},
$thisMonth
->
ymd
,
$now
->
ymd
,
$username
);
if
(
!
$sth
)
{
$server
->
log
(
LOG_ERR
,"
Failed to get topup information:
"
.
AWITPT::DB::DBLayer::
Error
());
$server
->
log
(
LOG_ERR
,"
Failed to get topup information:
%s
",
AWITPT::DB::DBLayer::
Error
());
return
MOD_RES_NACK
;
}
# Fetch all new topups
...
...
@@ -532,7 +529,7 @@ sub cleanup
if
(
defined
(
$row
->
{'
ValidTo
'}))
{
# Convert string to unix time
my
$unix_validTo
=
str2time
(
$row
->
{'
ValidTo
'});
my
$unix_validTo
=
str2time
(
$row
->
{'
ValidTo
'}
,
$server
->
{'
smradius
'}
->
{'
event_timezone
'}
);
# Process traffic topup
if
(
_isTrafficTopup
(
$row
->
{'
Type
'}))
{
push
(
@trafficSummary
,
{
...
...
@@ -600,7 +597,7 @@ sub cleanup
while
(
my
$row
=
hashifyLCtoMC
(
$sth
->
fetchrow_hashref
(),
qw(ID Value Type ValidTo)
))
{
# Convert string to unix time
my
$unix_validTo
=
str2time
(
$row
->
{'
ValidTo
'});
my
$unix_validTo
=
str2time
(
$row
->
{'
ValidTo
'}
,
$server
->
{'
smradius
'}
->
{'
event_timezone
'}
);
# If this is a traffic topup ...
if
(
_isTrafficTopup
(
$row
->
{'
Type
'}))
{
push
(
@trafficTopups
,
{
...
...
lib/smradius/modules/userdb/mod_userdb_macauth_sql.pm
View file @
9440002c
...
...
@@ -130,7 +130,8 @@ sub find
foreach
my
$attr
(
$packet
->
attributes
)
{
$template
->
{'
request
'}
->
{
$attr
}
=
$packet
->
rawattr
(
$attr
)
}
$template
->
{'
user
'}
=
$user
;
# Add MAC address details
$template
->
{'
user
'}
->
{'
MACAddress
'}
=
$macAddress
;
# Replace template entries
...
...
lib/smradius/modules/userdb/mod_userdb_sql.pm
View file @
9440002c
...
...
@@ -91,7 +91,7 @@ sub init
FROM
@TP@group_attributes, @TP@users_to_groups
WHERE
@TP@users_to_groups.UserID = %{user
db
.ID}
@TP@users_to_groups.UserID = %{user.ID}
AND @TP@group_attributes.GroupID = @TP@users_to_groups.GroupID
AND @TP@group_attributes.Disabled = 0
';
...
...
@@ -102,7 +102,7 @@ sub init
FROM
@TP@user_attributes
WHERE
UserID = %{user
db
.ID}
UserID = %{user.ID}
AND Disabled = 0
';
...
...
@@ -111,7 +111,7 @@ sub init
@TP@users_data (UserID, LastUpdated, Name, Value)
VALUES
(
%{user
db
.ID},
%{user.ID},
%{query.LastUpdated},
%{query.Name},
%{query.Value}
...
...
@@ -125,7 +125,7 @@ sub init
LastUpdated = %{query.LastUpdated},
Value = %{query.Value}
WHERE
UserID = %{user
db
.ID}
UserID = %{user.ID}
AND Name = %{query.Name}
';
...
...
@@ -135,7 +135,7 @@ sub init
FROM
@TP@users_data
WHERE
UserID = %{user
db
.ID}
UserID = %{user.ID}
AND Name = %{query.Name}
';
...
...
@@ -143,7 +143,7 @@ sub init
DELETE FROM
@TP@users_data
WHERE
UserID = %{user
db
.ID}
UserID = %{user.ID}
AND Name = %{query.Name}
';
...
...
@@ -264,7 +264,9 @@ sub find
foreach
my
$attr
(
$packet
->
attributes
)
{
$template
->
{'
request
'}
->
{
$attr
}
=
$packet
->
rawattr
(
$attr
)
}
$template
->
{'
user
'}
=
$user
;
# Add user details, not user ID is available here as thats what we are retrieving
$template
->
{'
user
'}
->
{'
Username
'}
=
$user
->
{'
Username
'};
# Replace template entries
my
@dbDoParams
=
templateReplace
(
$config
->
{'
userdb_find_query
'},
$template
);
...
...
@@ -320,6 +322,11 @@ sub get
foreach
my
$attr
(
$packet
->
attributes
)
{
$template
->
{'
request
'}
->
{
$attr
}
=
$packet
->
rawattr
(
$attr
)
}
# Add user details
$template
->
{'
user
'}
->
{'
ID
'}
=
$user
->
{'
ID
'};
$template
->
{'
user
'}
->
{'
Username
'}
=
$user
->
{'
Username
'};
# Add in userdb data
foreach
my
$item
(
keys
%
{
$user
->
{'
_UserDB_Data
'}})
{
$template
->
{'
userdb
'}
->
{
$item
}
=
$user
->
{'
_UserDB_Data
'}
->
{
$item
};
...
...
@@ -381,16 +388,21 @@ sub data_set
# Build template
my
$template
;
# Last updated time would be now
$template
->
{'
query
'}
->
{'
LastUpdated
'}
=
$user
->
{'
_Internal
'}
->
{'
Timestamp
'};
$template
->
{'
q
uer
y
'}
->
{'
Name
'}
=
sprintf
('
%s/%s
',
$module
,
$name
)
;
$template
->
{'
q
uer
y
'}
->
{'
Value
'}
=
$value
;
# Add user details
$template
->
{'
u
s
er
'}
->
{'
ID
'}
=
$user
->
{'
ID
'}
;
$template
->
{'
u
s
er
'}
->
{'
Username
'}
=
$user
->
{'
Username
'}
;
# Add in userdb data
foreach
my
$item
(
keys
%
{
$user
->
{'
_UserDB_Data
'}})
{
$template
->
{'
userdb
'}
->
{
$item
}
=
$user
->
{'
_UserDB_Data
'}
->
{
$item
};
}
# Last updated time would be now
$template
->
{'
query
'}
->
{'
LastUpdated
'}
=
$user
->
{'
_Internal
'}
->
{'
Timestamp
'};
$template
->
{'
query
'}
->
{'
Name
'}
=
sprintf
('
%s/%s
',
$module
,
$name
);
$template
->
{'
query
'}
->
{'
Value
'}
=
$value
;
# Replace template entries
my
@dbDoParams
=
templateReplace
(
$config
->
{'
users_data_update_query
'},
$template
);
...
...
@@ -453,13 +465,18 @@ sub data_get
# Build template
my
$template
;
$template
->
{'
query
'}
->
{'
Name
'}
=
sprintf
('
%s/%s
',
$module
,
$name
);
# Add user details
$template
->
{'
user
'}
->
{'
ID
'}
=
$user
->
{'
ID
'};
$template
->
{'
user
'}
->
{'
Username
'}
=
$user
->
{'
Username
'};
# Add in userdb data
foreach
my
$item
(
keys
%
{
$user
->
{'
_UserDB_Data
'}})
{
$template
->
{'
userdb
'}
->
{
$item
}
=
$user
->
{'
_UserDB_Data
'}
->
{
$item
};
}
$template
->
{'
query
'}
->
{'
Name
'}
=
sprintf
('
%s/%s
',
$module
,
$name
);
# If we using caching, check how old the result is
if
(
defined
(
$config
->
{'
userdb_data_cache_time
'}))
{
my
(
$res
,
$val
)
=
cacheGetComplexKeyPair
('
mod_userdb_sql(data_get)
',
...
...
lib/smradius/util.pm
View file @
9440002c
# SMRadius Utility Functions
# Copyright (C) 2007-201
5
, AllWorldIT
# Copyright (C) 2007-201
6
, AllWorldIT
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
...
...
@@ -16,41 +16,78 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
## @class smradius::util
# Utility functions
=encoding utf8
=head1 NAME
smradius::util - SMRadius utils
=head1 SYNOPSIS
my ($str,@vals) = templateReplace("SELECT * FROM abc WHERE %{abc} = ?",{ 'abc' => "some value" });
my $str = quickTemplateToolkit('someval is "[% someval %]"',{ 'someval' = "hello world" });
=head1 DESCRIPTION
The smradius::util class provides utility classes for SMRadius.
=cut
package
smradius::
util
;
use
parent
qw(Exporter)
;
use
strict
;
use
warnings
;
# Exporter stuff
require
Exporter
;
our
(
@ISA
,
@EXPORT
);
@ISA
=
qw(Exporter)
;
our
(
@EXPORT_OK
,
@EXPORT
);
@EXPORT_OK
=
qw(
)
;
@EXPORT
=
qw(
templateReplace
quickTemplateToolkit
)
;
use
Template
;
## @fn templateReplace($string,$hashref)
# Template string replacer function
#
# @param string String to replace template items in
# @param hashref Hashref containing the hash of tempalte items & values
#
# @return String with replaced items
=head1 METHODS
The following utility methods are available.
=cut
=head2 templateReplace
my ($str,@vals) = templateReplace("SELECT * FROM abc WHERE %{abc} = ?",{ 'abc' => "some value" });
The C<templatereplace> method is used to replace variables with a placeholder. This is very useful for SQL templates. The values
are returned in the second and subsequent array items.
=over
=back
=cut
# Replace hashed variables with placeholders and return an array with the values.
sub
templateReplace
{
my
(
$string
,
$hashref
)
=
@_
;
my
(
$string
,
$hashref
,
$placeholder
)
=
@_
;
my
@valueArray
=
();
$placeholder
//
=
'
?
';
# Replace blanks
while
(
my
(
$entireMacro
,
$section
,
$item
,
$default
)
=
(
$string
=~
/(\%{([a-z]+)\.([a-z0-9\-]+)(?:=([^}]*))?})/i
))
{
# Replace macro with ?
$string
=~
s/$entireMacro/
\?
/
;
$string
=~
s/$entireMacro/
$placeholder
/
;
# Get value to substitute
my
$value
=
(
defined
(
$hashref
->
{
$section
})
&&
defined
(
$hashref
->
{
$section
}
->
{
$item
}))
?
...
...
@@ -64,5 +101,71 @@ sub templateReplace
}
=head2 quickTemplateToolkit
my $str = quickTemplateToolkit('someval is "[% someval %]"',{ 'someval' = "hello world" });
The C<quickTemplateToolkit> is a quick and easy template toolkit function.