* Thu Sep 25 2025 Brian Read <brianr@koozali.org> 1.0-25.sme

- Sort outy Remove panel placement and operation of buttons [SME: 13168]
This commit is contained in:
2025-09-25 19:02:35 +01:00
parent bd88797db8
commit 2e7e5047d8
3 changed files with 332 additions and 388 deletions

View File

@@ -15,71 +15,56 @@ package SrvMngr::Controller::Wireguard;
use strict; use strict;
use warnings; use warnings;
use Mojo::Base 'Mojolicious::Controller'; use Mojo::Base 'Mojolicious::Controller';
use Locale::gettext; use Locale::gettext;
use SrvMngr::I18N; use SrvMngr::I18N;
use SrvMngr qw( theme_list init_session is_normal_password ); use SrvMngr qw( theme_list init_session is_normal_password );
use esmith::ConfigDB; use esmith::ConfigDB;
use Net::IP; use Net::IP;
my $adb; my $adb;
my $cdb; my $cdb;
my $wdb; my $wdb;
my $ndb; my $ndb;
sub main { sub main {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my %wrg_datas = (); my %wrg_datas = ();
$wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard'); $wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard');
my $title = $c->l('wrg_FORM_TITLE'); my $title = $c->l('wrg_FORM_TITLE');
$wrg_datas{'trt'} = 'LST'; $wrg_datas{'trt'} = 'LST';
$cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n"; $cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n";
my $wg = $cdb->get('wg-quick@wg0'); my $wg = $cdb->get('wg-quick@wg0');
$wrg_datas{'wgpub'} = $wg->prop('public'); $wrg_datas{'wgpub'} = $wg->prop('public');
$wrg_datas{'wgip'} = $wg->prop('ip'); $wrg_datas{'wgip'} = $wg->prop('ip');
$wrg_datas{'wgmask'} = $wg->prop('mask'); $wrg_datas{'wgmask'} = $wg->prop('mask');
$wrg_datas{'wgport'} = $wg->prop('UDPPort'); $wrg_datas{'wgport'} = $wg->prop('UDPPort');
$wrg_datas{'sstatus'} = $wg->prop('status'); $wrg_datas{'sstatus'} = $wg->prop('status');
my @wgstatus = `/usr/bin/wg show wg0 dump`; my @wgstatus = `/usr/bin/wg show wg0 dump`;
my $type = 'wg0'; my $type = 'wg0';
my @wgconf = $wdb->get_all_by_prop(type => $type); my @wgconf = $wdb->get_all_by_prop(type => $type);
$c->stash(
$c->stash( title => $title, wrg_datas => \%wrg_datas, title => $title,
wgstatus => \@wgstatus, wgconf => \@wgconf ); wrg_datas => \%wrg_datas,
wgstatus => \@wgstatus,
wgconf => \@wgconf
);
$c->render(template => 'wireguard'); $c->render(template => 'wireguard');
} ## end sub main
};
sub do_display { sub do_display {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || ''); my $trt = ($c->param('trt') || '');
my $wgconf = $c->param('Wgconf') || ''; my $wgconf = $c->param('Wgconf') || '';
my %wrg_datas = (); my %wrg_datas = ();
my $title = $c->l('wrg_FORM_TITLE'); my $title = $c->l('wrg_FORM_TITLE');
my $modul = ''; my $modul = '';
$adb = esmith::AccountsDB->open() || die "Couldn't open accounts DB\ndb"; $adb = esmith::AccountsDB->open() || die "Couldn't open accounts DB\ndb";
$cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n"; $cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n";
$wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard'); $wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard');
#$ndb = esmith::NetworksDB->open_ro || die "Error opening networks DB\n";
#$ndb = esmith::NetworksDB->open_ro || die "Error opening networks DB\n";
$wrg_datas{'trt'} = $trt; $wrg_datas{'trt'} = $trt;
if ($trt eq 'QRC') { if ($trt eq 'QRC') {
@@ -89,6 +74,7 @@ sub do_display {
if ($trt eq 'MOD') { if ($trt eq 'MOD') {
$wrg_datas{'wgconf'} = $wgconf; $wrg_datas{'wgconf'} = $wgconf;
my $rec = $wdb->get($wgconf); my $rec = $wdb->get($wgconf);
if ($rec) { if ($rec) {
$wrg_datas{'info'} = $rec->prop('info') || ''; $wrg_datas{'info'} = $rec->prop('info') || '';
$wrg_datas{'allowedips'} = $rec->prop('allowedips') || ''; $wrg_datas{'allowedips'} = $rec->prop('allowedips') || '';
@@ -97,8 +83,8 @@ sub do_display {
$wrg_datas{'account'} = $rec->prop('user') || ''; $wrg_datas{'account'} = $rec->prop('user') || '';
$wrg_datas{'status'} = $rec->prop('status') || ''; $wrg_datas{'status'} = $rec->prop('status') || '';
$wrg_datas{'dns'} = $rec->prop('dns') || ''; $wrg_datas{'dns'} = $rec->prop('dns') || '';
} } ## end if ($rec)
} } ## end if ($trt eq 'MOD')
if ($trt eq 'REM') { if ($trt eq 'REM') {
$wrg_datas{'wgconf'} = $wgconf; $wrg_datas{'wgconf'} = $wgconf;
@@ -107,6 +93,7 @@ sub do_display {
} }
if ($trt eq 'NEW') { if ($trt eq 'NEW') {
# nothing for a new client # nothing for a new client
} }
@@ -117,110 +104,111 @@ sub do_display {
$wrg_datas{'private'} = $wg->prop('private'); $wrg_datas{'private'} = $wg->prop('private');
$wrg_datas{'public'} = $wg->prop('public'); $wrg_datas{'public'} = $wg->prop('public');
$wrg_datas{'status'} = $wg->prop('status'); $wrg_datas{'status'} = $wg->prop('status');
} } ## end if ($trt eq 'UPD')
if ($trt eq 'LST') { if ($trt eq 'LST') {
my @wgss = $adb->wgss(); my @wgss = $adb->wgss();
$c->stash(wgss => \@wgss); $c->stash(wgss => \@wgss);
} }
$c->stash(title => $title, modul => $modul, wrg_datas => \%wrg_datas); $c->stash(title => $title, modul => $modul, wrg_datas => \%wrg_datas);
$c->render(template => 'wireguard'); $c->render(template => 'wireguard');
} ## end sub do_display
};
sub do_action { sub do_action {
my $c = shift; my $c = shift;
$c->app->log->info($c->log_req); $c->app->log->info($c->log_req);
my $rt = $c->current_route; my $rt = $c->current_route;
my $trt = ($c->param('trt') || ''); my $trt = ($c->param('trt') || '');
my %wrg_datas = (); my %wrg_datas = ();
my $title = $c->l('wrg_FORM_TITLE'); my $title = $c->l('wrg_FORM_TITLE');
$wrg_datas{'trt'} = $trt; $wrg_datas{'trt'} = $trt;
my $result = ''; my $result = '';
my $res = ''; my $res = '';
$adb = esmith::AccountsDB->open() || die "Couldn't open accounts DB\ndb"; $adb = esmith::AccountsDB->open() || die "Couldn't open accounts DB\ndb";
$cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n"; $cdb = esmith::ConfigDB->open() || die "Couldn't open config DB\n";
$wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard'); $wdb = esmith::ConfigDB->open('wireguard') || esmith::ConfigDB->create('wireguard');
$ndb = esmith::NetworksDB->open_ro || die "Error opening networks DB\n"; $ndb = esmith::NetworksDB->open_ro || die "Error opening networks DB\n";
if ($trt eq 'QRC') { if ($trt eq 'QRC') {
# NEVER # NEVER
} }
if ($trt eq 'LST') { if ($trt eq 'LST') {
# NEVER # NEVER
} }
if ($trt eq 'MOD') { if ($trt eq 'MOD') {
$wrg_datas{'wgconf'} = $c->param('Wgconf'); $wrg_datas{'wgconf'} = $c->param('Wgconf');
# controls # controls
$res = 'OK'; # no controls here... $res = 'OK'; # no controls here...
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$res = performModifyClient($c); $res = performModifyClient($c);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('wrg_SUCCESSFULLY_MODIFIED_CONF'); $result = $c->l('wrg_SUCCESSFULLY_MODIFIED_CONF');
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'MOD')
if ($trt eq 'REM') { if ($trt eq 'REM') {
if ($c->param("cancel")) { if ($c->param("cancel")) {
$c->stash(error => $c->l('wrg_CANCELLED')); $c->stash(error => $c->l('wrg_CANCELLED'));
$c->redirect_to('/wireguard'); $c->redirect_to('/wireguard');
} }
# controls # controls
$res = 'OK'; # no controls here... $res = 'OK'; # no controls here...
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$res = performRemoveClient($c); $res = performRemoveClient($c);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('wrg_SUCCESSFULLY_REMOVED_CONF'); $result = $c->l('wrg_SUCCESSFULLY_REMOVED_CONF');
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'REM')
if ($trt eq 'NEW') { if ($trt eq 'NEW') {
# controls # controls
$res = 'OK'; # no controls here... $res = 'OK'; # no controls here...
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$res = performCreateClient($c); $res = performCreateClient($c);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('wrg_SUCCESSFULLY_ADDED_CONF'); $result = $c->l('wrg_SUCCESSFULLY_ADDED_CONF');
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'NEW')
if ($trt eq 'UPD') { if ($trt eq 'UPD') {
# controls # controls
$res = 'OK'; # no controls here... $res = 'OK'; # no controls here...
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$res = performUpdateConfig($c); $res = performUpdateConfig($c);
$result .= $res unless $res eq 'OK'; $result .= $res unless $res eq 'OK';
if (!$result) { if (!$result) {
$result = $c->l('wrg_SUCCESSFULLY_UPDATED_CONF'); $result = $c->l('wrg_SUCCESSFULLY_UPDATED_CONF');
} }
} } ## end if (!$result)
} } ## end if ($trt eq 'UPD')
# common parts # common parts
if ($res ne 'OK') { if ($res ne 'OK') {
$c->stash(error => $result); $c->stash(error => $result);
$c->stash(title => $title, wrg_datas => \%wrg_datas); $c->stash(title => $title, wrg_datas => \%wrg_datas);
@@ -229,21 +217,16 @@ sub do_action {
#force reload as successfull (for Main) #force reload as successfull (for Main)
$wdb = esmith::ConfigDB->open('wireguard'); $wdb = esmith::ConfigDB->open('wireguard');
my $message = "'Wireguard' update ($trt) DONE"; my $message = "'Wireguard' update ($trt) DONE";
$c->app->log->info($message); $c->app->log->info($message);
$c->flash(success => $result); $c->flash(success => $result);
$c->redirect_to('/wireguard'); $c->redirect_to('/wireguard');
} } ## end sub do_action
# action for 'MOD' # action for 'MOD'
sub performModifyClient { sub performModifyClient {
my $c = shift; my $c = shift;
my $msg = "OK"; my $msg = "OK";
my $wgacc = $c->param('Wgconf'); my $wgacc = $c->param('Wgconf');
my $account = $c->param('Account'); my $account = $c->param('Account');
my $private = $c->param('Private') || ''; my $private = $c->param('Private') || '';
@@ -253,52 +236,44 @@ sub performModifyClient{
my $allowedips = $c->param('Allowedips') || ''; my $allowedips = $c->param('Allowedips') || '';
#todo validate fields #todo validate fields
# Untaint info and account before use in system() # Untaint info and account before use in system()
($info) = $info =~ /([A-Za-z0-9_\-. ]+)/; ($info) = $info =~ /([A-Za-z0-9_\-. ]+)/;
# trim both ends # trim both ends
$info =~ s/^ +| +$//g; $info =~ s/^ +| +$//g;
($account) = $account =~ /([A-Za-z0-9_-]+)/; ($account) = $account =~ /([A-Za-z0-9_-]+)/;
return $c->l('wrg_ERROR_FIELD_CONTENT') unless ($account and $info); return $c->l('wrg_ERROR_FIELD_CONTENT') unless ($account and $info);
my %props = (
my %props = ('user' => $account 'user' => $account,
,'private' => $private 'private' => $private,
,'public' => $public 'public' => $public,
,'info' => $info 'info' => $info,
,'status' => $status 'status' => $status,
,'allowedips' => $allowedips 'allowedips' => $allowedips
); );
$wdb->get($wgacc)->merge_props(%props) $wdb->get($wgacc)->merge_props(%props)
or $msg = "Error occurred while modifying pseudonym in database."; or $msg = "Error occurred while modifying pseudonym in database.";
# Untaint before use in system() # Untaint before use in system()
($wgacc) = ($wgacc =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/); ($wgacc) = ($wgacc =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/);
system( "/sbin/e-smith/signal-event", "wireguard-user-modify", "$wgacc",) system("/sbin/e-smith/signal-event", "wireguard-user-modify", "$wgacc",) == 0
== 0 or $msg = "Error occurred while modifying wirequard account."; or $msg = "Error occurred while modifying wirequard account.";
return "$msg";
return "$msg" } ## end sub performModifyClient
}
# action for 'NEW' # action for 'NEW'
sub performCreateClient { sub performCreateClient {
my $c = shift; my $c = shift;
my $type = shift; my $type = shift;
my $username = $c->param('Account'); my $username = $c->param('Account');
my $info = $c->param('Info'); my $info = $c->param('Info');
# Untaint info and account before use in system() # Untaint info and account before use in system()
($info) = $info =~ /([A-Za-z0-9_\-. ]+)/; ($info) = $info =~ /([A-Za-z0-9_\-. ]+)/;
# trim both ends # trim both ends
$info =~ s/^ +| +$//g; $info =~ s/^ +| +$//g;
($username) = $username =~ /([A-Za-z0-9_-]+)/; ($username) = $username =~ /([A-Za-z0-9_-]+)/;
return $c->l('wrg_ERROR_FIELD_CONTENT') unless ($username and $info); return $c->l('wrg_ERROR_FIELD_CONTENT') unless ($username and $info);
#get username #get username
@@ -310,17 +285,13 @@ sub performCreateClient {
unless (system("/sbin/e-smith/signal-event", "wireguard-user-create", "$username", "$info") == 0) { unless (system("/sbin/e-smith/signal-event", "wireguard-user-create", "$username", "$info") == 0) {
return $c->error('wrg_ERROR_OCCURED'); return $c->error('wrg_ERROR_OCCURED');
} }
return 'OK'; return 'OK';
} } ## end sub performCreateClient
# action for 'UPD' # action for 'UPD'
sub performUpdateConfig { sub performUpdateConfig {
my $c = shift; my $c = shift;
my $msg = "OK"; my $msg = "OK";
my $ip = $c->param('Ip'); my $ip = $c->param('Ip');
my $mask = $c->param('Mask'); my $mask = $c->param('Mask');
my $private = $c->param('Private'); my $private = $c->param('Private');
@@ -335,72 +306,69 @@ sub performUpdateConfig {
# we get number of entries in wireguard db # we get number of entries in wireguard db
my @num = $wdb->get_all_by_prop(type => "wg0"); my @num = $wdb->get_all_by_prop(type => "wg0");
if (scalar @num > 0) { if (scalar @num > 0) {
# we get current values # we get current values
my $pprivate = $cdb->get('wg-quick@wg0')->prop('private'); my $pprivate = $cdb->get('wg-quick@wg0')->prop('private');
my $ppublic = $cdb->get('wg-quick@wg0')->prop('public'); my $ppublic = $cdb->get('wg-quick@wg0')->prop('public');
my $pip = $cdb->get('wg-quick@wg0')->prop('ip'); my $pip = $cdb->get('wg-quick@wg0')->prop('ip');
my $pmask = $cdb->get('wg-quick@wg0')->prop('mask'); my $pmask = $cdb->get('wg-quick@wg0')->prop('mask');
# if # entries >0 and private |public | ip is chnaged then we push an error and stop # if # entries >0 and private |public | ip is chnaged then we push an error and stop
if ($pprivate ne $private || $ppublic ne $public || $pip ne $ip || $mask ne $pmask) { if ($pprivate ne $private || $ppublic ne $public || $pip ne $ip || $mask ne $pmask) {
return $c->l('wrg_CLIENTS_ALREADY_CONFIGURED'); return $c->l('wrg_CLIENTS_ALREADY_CONFIGURED');
} }
} } ## end if (scalar @num > 0)
#todo validate fields #todo validate fields
my %props = (
my %props = ('ip' => $ip 'ip' => $ip,
,'mask' => $mask 'mask' => $mask,
,'private' => $private 'private' => $private,
,'public' => $public 'public' => $public,
,'status' => $status 'status' => $status
); );
# Test Ip is inside CIDR # Test Ip is inside CIDR
if (!test_for_private_ip($ip, $mask)) { if (!test_for_private_ip($ip, $mask)) {
$msg = "IP must be in private range"; $msg = "IP must be in private range";
#$fm->error($msg);return; #$fm->error($msg);return;
} }
$cdb->get('wg-quick@wg0')->merge_props(%props) $cdb->get('wg-quick@wg0')->merge_props(%props)
or $msg = "Error occurred while modifying server details."; or $msg = "Error occurred while modifying server details.";
if ($msg eq "OK") { if ($msg eq "OK") {
# Untaint before use in system() # Untaint before use in system()
($ip) = ($ip =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/); ($ip) = ($ip =~ /(\d+\.+\d+\.+\d+\.+\d+\.+\/\d+\.+)/);
system( "/sbin/e-smith/signal-event", "wireguard-conf-modify", "$ip",) system("/sbin/e-smith/signal-event", "wireguard-conf-modify", "$ip",) == 0
== 0 or $msg = "Error occurred while modifying wireguard conf."; or $msg = "Error occurred while modifying wireguard conf.";
} } ## end if ($msg eq "OK")
return "$msg"; return "$msg";
} ## end sub performUpdateConfig
}
# action for 'REM' # action for 'REM'
sub performRemoveClient { sub performRemoveClient {
my ($c) = @_; my ($c) = @_;
my $conf = $c->param('Wgconf'); my $conf = $c->param('Wgconf');
if ($c->param("remove")) { if ($c->param("remove")) {
unless ($wdb->get($conf)->delete()) { unless ($wdb->get($conf)->delete()) {
return $c->l('wrg_ERROR_OCCURED'); return $c->l('wrg_ERROR_OCCURED');
} }
unless (system("/sbin/e-smith/signal-event", "wireguard-user-delete") == 0) { unless (system("/sbin/e-smith/signal-event", "wireguard-user-delete") == 0) {
return $c->l('wrg_ERROR_OCCURED'); return $c->l('wrg_ERROR_OCCURED');
} }
return 'OK'; return 'OK';
} } ## end if ($c->param("remove"...))
return $c->l('wrg_CANCELLED'); return $c->l('wrg_CANCELLED');
} ## end sub performRemoveClient
}
# called from templates # called from templates
sub get_existing_accounts { sub get_existing_accounts {
my $c = shift; my $c = shift;
my @existingAccounts = ('Administrator'); my @existingAccounts = ('Administrator');
@@ -408,42 +376,31 @@ sub get_existing_accounts {
push @existingAccounts, $account->key; push @existingAccounts, $account->key;
} }
return \@existingAccounts; return \@existingAccounts;
} ## end sub get_existing_accounts
}
# called from templates # called from templates
sub get_wgs_info { sub get_wgs_info {
my ($c, $attr, $data) = @_; my ($c, $attr, $data) = @_;
return undef if (not defined $attr or not defined $data); return undef if (not defined $attr or not defined $data);
my $value; my $value;
$value = $wdb->get("$data")->prop('info') if ($attr eq 'info' and $wdb->get("$data")); $value = $wdb->get("$data")->prop('info') if ($attr eq 'info' and $wdb->get("$data"));
$value = $wdb->get("$data")->prop('user') if ($attr eq 'user' and $wdb->get("$data")); $value = $wdb->get("$data")->prop('user') if ($attr eq 'user' and $wdb->get("$data"));
return $value; return $value;
} ## end sub get_wgs_info
}
# called from templates # called from templates
sub get_conf_info { sub get_conf_info {
my ($c, $ipacc) = @_; my ($c, $ipacc) = @_;
##my $ipacc = $c->param('Wgconf'); ##my $ipacc = $c->param('Wgconf');
#untaint #untaint
($ipacc) = $ipacc =~ /(\d+\.\d+\.\d+\.\d+\/\d+)/; ($ipacc) = $ipacc =~ /(\d+\.\d+\.\d+\.\d+\/\d+)/;
#get from db
#get from db
# return if does not exist # return if does not exist
my $acc = $wdb->get($ipacc) or return undef; my $acc = $wdb->get($ipacc) or return undef;
# return if current user is not admin or the user # return if current user is not admin or the user
return undef unless $c->is_admin; return undef unless $c->is_admin;
my $key = $acc->key; my $key = $acc->key;
my $info = $acc->prop('info'); my $info = $acc->prop('info');
my $private = $acc->prop('private'); my $private = $acc->prop('private');
@@ -461,7 +418,6 @@ sub get_conf_info {
#DNS #DNS
my $IPAddress = $cdb->get('InternalInterface')->prop('IPAddress'); my $IPAddress = $cdb->get('InternalInterface')->prop('IPAddress');
my $dns = ($allowedips =~ /0.0.0.0\/0/) ? "DNS = $IPAddress" : ""; my $dns = ($allowedips =~ /0.0.0.0\/0/) ? "DNS = $IPAddress" : "";
my $fulltext = "#configuration for $key $info my $fulltext = "#configuration for $key $info
[Interface] [Interface]
PrivateKey = $private PrivateKey = $private
@@ -474,24 +430,16 @@ AllowedIPs = $allowedips
Endpoint = $ExternalIP:$Port Endpoint = $ExternalIP:$Port
"; ";
my @fulltext = split("\n", $fulltext); my @fulltext = split("\n", $fulltext);
return \@fulltext; return \@fulltext;
} ## end sub get_conf_info
}
# called from templates # called from templates
sub get_conf_qr { sub get_conf_qr {
my ($c, $fulltext, $type) = @_; my ($c, $fulltext, $type) = @_;
my $qr = `echo "$fulltext" |qrencode -t PNG -o - |base64`; my $qr = `echo "$fulltext" |qrencode -t PNG -o - |base64`;
return $qr; return $qr;
} }
sub get_internet_ip_address { sub get_internet_ip_address {
#we could use DNS to do this faster but some provider will block DNS #we could use DNS to do this faster but some provider will block DNS
@@ -501,7 +449,6 @@ sub get_internet_ip_address {
use Net::DNS; use Net::DNS;
use LWP::Simple; use LWP::Simple;
my $timeout = 1; my $timeout = 1;
my @httpslist = qw( my @httpslist = qw(
checkip.amazonaws.com checkip.amazonaws.com
myexternalip.com/raw myexternalip.com/raw
@@ -523,9 +470,7 @@ eth0.me/ );
[ 'myip.opendns.com', 'resolver4.opendns.com', 'A' ], [ 'myip.opendns.com', 'resolver4.opendns.com', 'A' ],
[ 'whoami.akamai.net', 'ns1-1.akamaitech.net', 'A' ], [ 'whoami.akamai.net', 'ns1-1.akamaitech.net', 'A' ],
[ 'o-o.myaddr.l.google.com', 'ns1.google.com', 'TXT' ] [ 'o-o.myaddr.l.google.com', 'ns1.google.com', 'TXT' ]
); );
my $ip; my $ip;
#foreach my $i ( 0 .. $#dns) { #foreach my $i ( 0 .. $#dns) {
@@ -536,40 +481,40 @@ eth0.me/ );
udp_timeout => $timeout, udp_timeout => $timeout,
tcp_timeout => $timeout tcp_timeout => $timeout
); );
my $reply = $res->search($dns[$i][0], $dns[$i][2]); my $reply = $res->search($dns[$i][0], $dns[$i][2]);
if ($reply) { if ($reply) {
foreach my $rr ($reply->answer) { foreach my $rr ($reply->answer) {
$ip = $rr->txtdata if $rr->can("txtdata"); $ip = $rr->txtdata if $rr->can("txtdata");
$ip = $rr->address if $rr->can("address"); $ip = $rr->address if $rr->can("address");
# untaint, dns output is tainted # untaint, dns output is tainted
($ip) = $ip =~ /(\d+\.\d+\.\d+\.\d+)/; ($ip) = $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
return $ip if $ip =~ /(\d+\.\d+\.\d+\.\d+)/; return $ip if $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
} } ## end foreach my $rr ($reply->answer)
} else { } else {
warn "query failed: ", $res->errorstring, "\n"; warn "query failed: ", $res->errorstring, "\n";
} }
#}
#}
# https calls # https calls
my $ii = 0; my $ii = 0;
my $service; my $service;
while ($ii < 5) { while ($ii < 5) {
$service = $httpslist[ rand(@httpslist) ]; $service = $httpslist[ rand(@httpslist) ];
$ip = (get "https://$service"); $ip = (get "https://$service");
chomp $ip; chomp $ip;
$ii++; $ii++;
last if $ip =~ /(\d+\.\d+\.\d+\.\d+)/; last if $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
} } ## end while ($ii < 5)
# not needed but in case, untaint # not needed but in case, untaint
($ip) = $ip =~ /(\d+\.\d+\.\d+\.\d+)/; ($ip) = $ip =~ /(\d+\.\d+\.\d+\.\d+)/;
return $ip; return $ip;
} ## end sub get_internet_ip_address
}
sub test_for_private_ip { sub test_for_private_ip {
use NetAddr::IP; use NetAddr::IP;
$_ = shift; $_ = shift;
my $mask = shift; my $mask = shift;
@@ -577,10 +522,6 @@ sub test_for_private_ip {
my $iprange = NetAddr::IP->new($1, "$mask"); my $iprange = NetAddr::IP->new($1, "$mask");
return unless $iprange; return unless $iprange;
return ($iprange->first()->is_rfc1918() and $iprange->last()->is_rfc1918()); return ($iprange->first()->is_rfc1918() and $iprange->last()->is_rfc1918());
} ## end sub test_for_private_ip
}
1 1
__END__ __END__

View File

@@ -8,7 +8,7 @@
<p><br><span class=label> <p><br><span class=label>
%=l 'wrg_CONF_NAME' %=l 'wrg_CONF_NAME'
</span> </span>
%= $wrg_datas->{wgconf} %= $wrg_datas->{account}
<br></p> <br></p>
<p><span class=label> <p><span class=label>
@@ -17,13 +17,13 @@
%= $wrg_datas->{wgcomment} %= $wrg_datas->{wgcomment}
<br></p> <br></p>
<div class='center'> <div class="center">
%= submit_button l('CANCEL'), name => 'cancel', class => 'action' %= submit_button l('REMOVE'), name => 'remove', class => 'action left-btn'
%= submit_button l('REMOVE'), name => 'remove', class => 'action' %= submit_button l('CANCEL'), name => 'cancel', class => 'action center-btn'
</div> </div>
%= hidden_field 'trt' => $wrg_datas->{trt} %= hidden_field 'trt' => $wrg_datas->{trt}
%= hidden_field 'Wgconf' => $wrg_datas->{wgconf} %= hidden_field 'Wgconf' => $wrg_datas->{account}
% end % end

View File

@@ -1,4 +1,4 @@
%define release 24 %define release 25
%define version 1.0 %define version 1.0
%define debug_package %{nil} %define debug_package %{nil}
@@ -61,6 +61,9 @@ fi
%changelog %changelog
* Thu Sep 25 2025 Brian Read <brianr@koozali.org> 1.0-25.sme
- Sort outy Remove panel placement and operation of buttons [SME: 13168]
* Wed Sep 24 2025 Brian Read <brianr@koozali.org> 1.0-24.sme * Wed Sep 24 2025 Brian Read <brianr@koozali.org> 1.0-24.sme
- Sort out access to DB vis a vis caching [SME: 13168] - Sort out access to DB vis a vis caching [SME: 13168]