From 36397e399ff44293a652e15a45df3f7e17fda105 Mon Sep 17 00:00:00 2001 From: Stephanowicz Date: Tue, 19 Sep 2017 18:54:35 +0200 Subject: [PATCH 1/6] Update Voucher.php adding expiry time --- .../mvc/app/library/OPNsense/Auth/Voucher.php | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php b/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php index d59b4b0e6..2a0e010db 100644 --- a/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php +++ b/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php @@ -105,6 +105,8 @@ class Voucher extends Base implements IAuthConnector , vouchergroup varchar2 -- group of vouchers , validity integer -- voucher credits , starttime integer -- voucher start at + , expirytime integer -- voucher valid until - '0' = disabled + , vouchertype varchar2 -- (not implemented) voucher type , primary key (username) ); @@ -177,9 +179,10 @@ class Voucher extends Base implements IAuthConnector * @param int $count number of vouchers to generate * @param int $validity time (in seconds) * @param int $starttime valid from + * @param int $expirytime valid until ('0' means no expiry time) * @return array list of generated vouchers */ - public function generateVouchers($vouchergroup, $count, $validity, $starttime = null) + public function generateVouchers($vouchergroup, $count, $validity, $expirytime, $starttime = null) { $response = array(); if ($this->dbHandle != null) { @@ -220,6 +223,7 @@ class Voucher extends Base implements IAuthConnector // generate new vouchers $vouchersGenerated = 0; + $expirytime = $expirytime == 0 ? 0 : $expirytime + time(); while ($vouchersGenerated < $count) { $generatedUsername = ''; $random_bytes = openssl_random_pseudo_bytes($this->usernameLength); @@ -237,13 +241,14 @@ class Voucher extends Base implements IAuthConnector // save user, hash password first $generatedPasswordHash = crypt($generatedPassword, '$6$'); $stmt = $this->dbHandle->prepare(' - insert into vouchers(username, password, vouchergroup, validity, starttime) - values (:username, :password, :vouchergroup, :validity, :starttime) + insert into vouchers(username, password, vouchergroup, validity, expirytime, starttime) + values (:username, :password, :vouchergroup, :validity, :expirytime,:starttime) '); $stmt->bindParam(':username', $generatedUsername); $stmt->bindParam(':password', $generatedPasswordHash); $stmt->bindParam(':vouchergroup', $vouchergroup); $stmt->bindParam(':validity', $validity); + $stmt->bindParam(':expirytime', $expirytime); $stmt->bindParam(':starttime', $starttime); $stmt->execute(); @@ -251,6 +256,7 @@ class Voucher extends Base implements IAuthConnector 'password' => $generatedPassword, 'vouchergroup' => $vouchergroup, 'validity' => $validity, + 'expirytime' => $expirytime, 'starttime' => $starttime ); $response[] = $row; @@ -299,7 +305,7 @@ class Voucher extends Base implements IAuthConnector { $response = array(); $stmt = $this->dbHandle->prepare(' - select username, validity, starttime, vouchergroup + select username, validity, expirytime, starttime, vouchergroup from vouchers where vouchergroup = :vouchergroup'); $stmt->bindParam(':vouchergroup', $vouchergroup); @@ -308,13 +314,14 @@ class Voucher extends Base implements IAuthConnector $record = array(); $record['username'] = $row['username']; $record['validity'] = $row['validity']; + $record['expirytime'] = $row['expirytime']; # always calculate a starttime, if not registered yet, use now. $record['starttime'] = empty($row['starttime']) ? time() : $row['starttime']; $record['endtime'] = $record['starttime'] + $row['validity']; - if (empty($row['starttime'])) { + if (empty($row['starttime']) && ($record['expirytime'] == 0|| ($record['expirytime'] > 0 && time() < $record['expirytime']))) { $record['state'] = 'unused'; - } elseif (time() < $record['endtime']) { + } elseif (time() < $record['endtime'] && ($record['expirytime'] == 0 || ($record['expirytime'] > 0 && time() < $record['expirytime']))) { $record['state'] = 'valid'; } else { $record['state'] = 'expired'; @@ -357,7 +364,7 @@ class Voucher extends Base implements IAuthConnector from vouchers where vouchergroup = :vouchergroup and starttime is not null - and starttime + validity < :endtime + and (starttime + validity < :endtime or (expirytime > 0 and expirytime < :endtime)) '); $stmt->bindParam(':vouchergroup', $vouchergroup); $endtime = time(); @@ -385,7 +392,7 @@ class Voucher extends Base implements IAuthConnector public function authenticate($username, $password) { $stmt = $this->dbHandle->prepare(' - select username, password,validity, starttime + select username, password,validity, expirytime, starttime from vouchers where username = :username '); @@ -402,8 +409,10 @@ class Voucher extends Base implements IAuthConnector $this->setStartTime($username, $row['starttime']); } if (time() - $row['starttime'] < $row['validity']) { - $this->lastAuthProperties['session_timeout'] = $row['validity'] - (time() - $row['starttime']); - return true; + if($row['expirytime'] == 0 || ($row['expirytime'] > 0 && $row['expirytime'] > time())) { + $this->lastAuthProperties['session_timeout'] = $row['validity'] - (time() - $row['starttime']); + return true; + } } } } From 0dc9c15b4156db328ee9229dc44b1f75ce9681b3 Mon Sep 17 00:00:00 2001 From: Stephanowicz Date: Tue, 19 Sep 2017 19:34:31 +0200 Subject: [PATCH 2/6] Update Voucher.php added space after comma on line 245 --- src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php b/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php index 2a0e010db..93caf5f55 100644 --- a/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php +++ b/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php @@ -242,7 +242,7 @@ class Voucher extends Base implements IAuthConnector $generatedPasswordHash = crypt($generatedPassword, '$6$'); $stmt = $this->dbHandle->prepare(' insert into vouchers(username, password, vouchergroup, validity, expirytime, starttime) - values (:username, :password, :vouchergroup, :validity, :expirytime,:starttime) + values (:username, :password, :vouchergroup, :validity, :expirytime, :starttime) '); $stmt->bindParam(':username', $generatedUsername); $stmt->bindParam(':password', $generatedPasswordHash); From 9285f94e0ad2faaed6d5d33acc5f14c441212215 Mon Sep 17 00:00:00 2001 From: Stephanowicz Date: Tue, 19 Sep 2017 20:31:37 +0200 Subject: [PATCH 3/6] Update Voucher.php line 366/367: changed query for expired vouchers in fct dropExpired --- src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php b/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php index 93caf5f55..f2b71d59f 100644 --- a/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php +++ b/src/opnsense/mvc/app/library/OPNsense/Auth/Voucher.php @@ -363,7 +363,7 @@ class Voucher extends Base implements IAuthConnector delete from vouchers where vouchergroup = :vouchergroup - and starttime is not null + and ((starttime is not null) or (expirytime > 0)) and (starttime + validity < :endtime or (expirytime > 0 and expirytime < :endtime)) '); $stmt->bindParam(':vouchergroup', $vouchergroup); From c65bb6b9430a22c654d4f443dbe84fc3f4b5b015 Mon Sep 17 00:00:00 2001 From: Stephanowicz Date: Tue, 19 Sep 2017 18:57:50 +0200 Subject: [PATCH 4/6] Update VoucherController.php add expiry time (cherry picked from commit 2eedaa7c4dc30b403717e0c00108df23a3029ef4) --- .../OPNsense/CaptivePortal/Api/VoucherController.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/opnsense/mvc/app/controllers/OPNsense/CaptivePortal/Api/VoucherController.php b/src/opnsense/mvc/app/controllers/OPNsense/CaptivePortal/Api/VoucherController.php index de88c9707..a1557cad4 100644 --- a/src/opnsense/mvc/app/controllers/OPNsense/CaptivePortal/Api/VoucherController.php +++ b/src/opnsense/mvc/app/controllers/OPNsense/CaptivePortal/Api/VoucherController.php @@ -138,13 +138,14 @@ class VoucherController extends ApiControllerBase if ($auth != null && method_exists($auth, 'generateVouchers')) { $count = $this->request->getPost('count', 'int', 0); $validity = $this->request->getPost('validity', 'int', 0); + $expirytime = $this->request->getPost('expirytime', 'int', 0); $vouchergroup = $this->request->getPost('vouchergroup', 'striptags', '---'); // remove characters which are known to provide issues when using in the url foreach (array("&", "#") as $skip_chars) { $vouchergroup = str_replace($skip_chars, "", $vouchergroup); } if ($count > 0 && $count <= 10000 && $validity > 0) { - return $auth->generateVouchers($vouchergroup, $count, $validity); + return $auth->generateVouchers($vouchergroup, $count, $validity, $expirytime); } } } From 4621c7ba382e14096734ecf4ce66a72d6956aa99 Mon Sep 17 00:00:00 2001 From: Stephanowicz Date: Tue, 19 Sep 2017 18:59:35 +0200 Subject: [PATCH 5/6] Update vouchers.volt add expiry time (cherry picked from commit 37491f871adab95a296430545b0c406752ec567b) --- .../OPNsense/CaptivePortal/vouchers.volt | 64 +++++++++++++++---- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/src/opnsense/mvc/app/views/OPNsense/CaptivePortal/vouchers.volt b/src/opnsense/mvc/app/views/OPNsense/CaptivePortal/vouchers.volt index 63ec11d77..926a0599c 100644 --- a/src/opnsense/mvc/app/views/OPNsense/CaptivePortal/vouchers.volt +++ b/src/opnsense/mvc/app/views/OPNsense/CaptivePortal/vouchers.volt @@ -110,7 +110,7 @@ POSSIBILITY OF SUCH DAMAGE. if (status == "success") { $("#grid-vouchers > tbody").html(''); $.each(data, function (key, value) { - var fields = ["username", "starttime", "endtime", "state"]; + var fields = ["username", "starttime", "endtime", "expirytime", "state"]; tr_str = ''; for (var i = 0; i < fields.length; i++) { if (value[fields[i]] != null) { @@ -178,12 +178,13 @@ POSSIBILITY OF SUCH DAMAGE. $('#generatevouchererror').hide(); var voucher_provider = $('#voucher-providers').find("option:selected").val(); var voucher_validity = $("#voucher-validity").val(); + var voucher_expirytime = $("#voucher-expiry").val(); var voucher_quantity = $("#voucher-quantity").val(); var voucher_groupname = $("#voucher-groupname").val(); - if (!$.isNumeric(voucher_validity) || !$.isNumeric(voucher_quantity)) { - // don't try to generate vouchers then validity or quantity are invalid + if (!$.isNumeric(voucher_validity) || !$.isNumeric(voucher_quantity) || !$.isNumeric(voucher_expirytime)) { + // don't try to generate vouchers when validity, expirytime or quantity are invalid var error = $('

'); - error.text("{{ lang._('The validity and the quantity of vouchers must be integers.') }}"); + error.text("{{ lang._('The validity, expiry time and the quantity of vouchers must be integers.') }}"); $('#generatevouchererror').append(error); $('#generatevouchererror').show(); return; @@ -192,14 +193,16 @@ POSSIBILITY OF SUCH DAMAGE. sendData={ 'count':voucher_quantity, 'validity':voucher_validity, - 'vouchergroup': voucher_groupname + 'expirytime':voucher_expirytime, + 'vouchergroup':voucher_groupname }, callback=function(data,status){ // convert json to csv data - var output_data = 'username,password,vouchergroup,validity\n'; + var output_data = 'username,password,vouchergroup,expirytime,validity\n'; $.each(data, function( key, value ) { output_data = output_data.concat('"', value['username'], '",'); output_data = output_data.concat('"', value['password'], '",'); output_data = output_data.concat('"', value['vouchergroup'], '",'); + output_data = output_data.concat('"', value['expirytime'], '",'); output_data = output_data.concat('"', value['validity'], '"\n'); }); @@ -304,6 +307,16 @@ POSSIBILITY OF SUCH DAMAGE. $("#voucher-validity-custom-data").keyup(function(){ $("#voucher-validity-custom").val($(this).val()*60); }); + $("#voucher-expiry").change(function(){ + if ($(this).children(":selected").attr("id") == 'voucher-expiry-custom') { + $("#voucher-expiry-custom-data").show(); + } else { + $("#voucher-expiry-custom-data").hide(); + } + }); + $("#voucher-expiry-custom-data").keyup(function(){ + $("#voucher-expiry-custom").val($(this).val()*3600); + }); $("#voucher-quantity").change(function(){ if ($(this).children(":selected").attr("id") == 'voucher-quantity-custom') { @@ -343,6 +356,7 @@ POSSIBILITY OF SUCH DAMAGE. {{ lang._('Voucher') }} {{ lang._('Valid from') }} {{ lang._('Valid to') }} + {{ lang._('Expires at') }} {{ lang._('State') }} @@ -392,15 +406,9 @@ POSSIBILITY OF SUCH DAMAGE.