Compare commits

...

21 Commits

Author SHA1 Message Date
c1aab3eb84 * Tue Nov 04 2025 Brian Read <brianr@koozali.org> 11.0.0-127.sme
- Move same var declations to outside innner scope [SME: 13073]
2025-11-04 11:44:27 +00:00
18442c0145 * Tue Nov 04 2025 Brian Read <brianr@koozali.org> 11.0.0-126.sme
- Remove debugging dump in portforwarding which crashes if no data  [SME: 13243]
2025-11-04 10:12:42 +00:00
5c227a2032 * Mon Nov 03 2025 Brian Read <brianr@koozali.org> 11.0.0-125.sme
- Arrange that Macaddress, InternalIP and comment cleared out when host entry switched to self [SME: 13207]
2025-11-03 11:34:55 +00:00
8e270ef3fd * Fri Oct 24 2025 Brian Read <brianr@koozali.org> 11.0.0-124.sme
- Adjust CSS for logout button to remove overlap of border and rounding [SME: 13247]
2025-10-24 12:41:51 +01:00
a04097bf5a * Fri Oct 24 2025 Brian Read <brianr@koozali.org> 11.0.0-123.sme
- Take out references to js/jquery files now incorporated in the datatables.min.js [SME:13253]
2025-10-24 10:50:46 +01:00
9437dd792a html comment closure leaks onto panel 2025-10-22 09:44:15 +01:00
f03d82ebf7 * Tue Oct 21 2025 Brian Read <brianr@koozali.org> 11.0.0-122.sme
- Correct code to only show user panels when AdminPanels property is empty or non existent [SME: 13082]
2025-10-21 19:28:04 +01:00
de2f78a089 * Sat Sep 27 2025 Brian Read <brianr@koozali.org> 11.0.0-121.sme
- Sort out ftp public setting [SME: 13194]
2025-09-27 12:29:54 +01:00
b838d9252a * Thu Sep 25 2025 Brian Read <brianr@koozali.org> 11.0.0-120.sme
- Add CSS for multiple result buttons on panel  - used by wireguard[SME: 13185]
2025-09-25 18:45:22 +01:00
9c9ab91869 * Thu Sep 25 2025 Brian Read <brianr@koozali.org> 11.0.0-119.sme
- Change submit button disable/message as method as current method does not send name back as parameter [SME: 13184]
2025-09-25 15:42:28 +01:00
022b85bd69 * Thu Sep 25 2025 Brian Read <brianr@koozali.org> 11.0.0-118.sme
- Remove inline style for legacy panel [SME: 13177]
2025-09-25 10:35:37 +01:00
c6f8378881 * Wed Sep 24 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-117.sme
- set correctly X-Forwarded-Proto for TKT auth [SME: 13175]
  updated CSP for smanager
2025-09-24 15:11:06 -04:00
d720304f1a delete test file 2025-09-16 18:55:08 +02:00
371a05379f Test for sync 2025-09-16 18:52:26 +02:00
7cb9591eb8 * Mon Sep 15 2025 Brian Read <brianr@koozali.org> 11.0.0-116.sme
- Fix other buttons in lists for elinks [SME: 13113]
2025-09-15 11:11:20 +01:00
a0524a7484 * Sat Sep 13 2025 Brian Read <brianr@koozali.org> 11.0.0-115.sme
- Fix login and logout and user table buttons so that they are valid html and work for elinks [SME: 13113]
2025-09-14 11:31:59 +01:00
687e763684 * Sat Sep 13 2025 Brian Read <brianr@koozali.org> 11.0.0-114.sme
- edit intial screen to suppress reconfig message unless admin logged in  [SME: 13112]
2025-09-13 15:53:19 +01:00
74c9beb587 * Mon Aug 11 2025 Brian Read <brianr@koozali.org> 11.0.0-113.sme
- Re-factor all template files to make them nicely formatted  [SME: 13103]
2025-08-12 06:20:31 +01:00
6475521528 * Thu Aug 07 2025 Brian Read <brianr@koozali.org> 11.0.0-112.sme
- Fix sprintf fail in viewlogfiles when % in log line [SME: 13099]
- Fix reboot/shutdown failure - reported by Massimo  - fixed by JC [SME: 13097]
2025-08-07 16:33:12 +01:00
a3fda90a85 * Mon Jul 28 2025 Brian Read <brianr@koozali.org> 11.0.0-111.sme
- Add password strength details to passowrd panels [SME: 13081]
2025-07-28 16:43:41 +01:00
837b855101 * Sat Jul 26 2025 Brian Read <brianr@koozali.org> 11.0.0-110.sme
- Get cifs workstation backup restore to show backup sets [SME: 12645]
  Add lex file for roundcubepanel to provide lex environment for lex strings
2025-07-27 20:24:40 +01:00
133 changed files with 5589 additions and 5329 deletions

View File

@@ -3,16 +3,14 @@
$haveSSL = (exists ${modSSL}{status} and ${modSSL}{status} eq "enabled") ? 'yes' : 'no';
$plainTextAccess = ${'httpd-admin'}{PermitPlainTextAccess} || 'no';
$plainPort = ${'httpd-e-smith'}{TCPPort} || '80';
$adminPort2 = ${'smanager'}{TCPPort} || '982';
$adminAccess = ${'smanager'}{access} || 'private';
$sslPort = ${modSSL}{TCPPort} || '443';
$OUT = '';
foreach $place ('smanager')
{
if (($port eq $plainPort) && ($haveSSL eq 'yes') && ($plainTextAccess ne 'yes'))
if (($port eq $httpPort) && ($haveSSL eq 'yes') && ($plainTextAccess ne 'yes'))
{
$OUT .= ' RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$' . "\n";
$OUT .= " RewriteRule ^/$place(/.*|\$) https://%{HTTP_HOST}/$place\$1 [L,R]\n";
@@ -24,14 +22,18 @@
$OUT .= " ProxyPreserveHost On\n";
$OUT .= " ProxyPass /$place http://127.0.0.1:$adminPort2 keepalive=On\n";
$OUT .= " ProxyPassReverse /$place http://127.0.0.1:$adminPort2\n";
$OUT .= " RequestHeader set X-Forwarded-Proto 'http'\n";
if ($port eq $httpsPort)
{
# mod_auth_tkt needs to know the protocol to write 307 redirection
$OUT .= " RequestHeader set X-Forwarded-Proto \"https\"\n";
}
$OUT .= " <Location '/$place'>\n";
if ($port eq $plainPort)
if ($port eq $httpPort)
{
$OUT .= ' Require ip 127.0.0.1' . "\n";
}
elsif (($haveSSL eq 'yes') && ($port eq $sslPort) && ($adminAccess eq 'public'))
elsif (($haveSSL eq 'yes') && ($port eq $httpsPort) && ($adminAccess eq 'public'))
{
$OUT .= "# public access requested in conf db\n";
$OUT .= " Require all granted\n";
@@ -41,14 +43,24 @@
}
# any smanager script or style added in line should be hashed and added here to run in a modern browser
$OUT .= " Header set Content-Security-Policy \"script-src 'self' 'unsafe-eval' 'unsafe-hashes' "
." 'sha256-X8Qwlk0M9iDTQZqFVpbVcThRjBqQXpwTOZCLX8I+Frk=' 'sha256-inQ04nmqTZI75Z5g/tAzjahedNugPFfrhxHyoFezFkM=' 'sha256-5IsIX+Vbow7wwy2RjR3+5X06R/0CQZPkw3OHj/228cM=' 'sha256-tfVskwioRaNsV75h89itf7FujMgIrodfs1Ea4UAJNpE=' 'sha256-P51OyslUh5bGkoWk9qY+o4Su4HuwNFoQcFCeNxF7Ms8=' ; "
# list of hashes for script-src we accept and reference to find them
." 'sha256-T5nv1LP9Xxdv7I1tsdTYprjvwoZyVEvfe8Y4TLx59pk='" # $(document).ready(function() \{ $('#tognav').click(function()
." 'sha256-TxVHbw3t1mXreukND/yBI+H+CscZDpyxPoNoBrRhmSE=' " # (function($) \{ $.fn.swapClass = function(class1, class2)
." 'sha256-30Xxu25YbRvjbQ2ngJ8EyneSz0No788PqjM9XbQh+qM=' " # ...const togglePassword...
." 'sha256-5PrS/6zSCY/wROLKhAm4ymOuYsfvvScrC9Vp8FtOpxU=' " # nutups:316 window.onload = function() \{ SelectInput();
." 'sha256-pxCVW6zyLaFSTIpOP2p4ULot8y+QsEmSEjKE54zDTWQ=' " # nutups:317 window.onload = function() \{ SelectInput();
#." 'sha256-X8Qwlk0M9iDTQZqFVpbVcThRjBqQXpwTOZCLX8I+Frk=' 'sha256-inQ04nmqTZI75Z5g/tAzjahedNugPFfrhxHyoFezFkM=' 'sha256-5IsIX+Vbow7wwy2RjR3+5X06R/0CQZPkw3OHj/228cM=' 'sha256-tfVskwioRaNsV75h89itf7FujMgIrodfs1Ea4UAJNpE=' 'sha256-P51OyslUh5bGkoWk9qY+o4Su4HuwNFoQcFCeNxF7Ms8=' " #need valiation if still needed
." ; "
." style-src 'self' 'unsafe-hashes' "
#'sha256-EhT63KK1JBrsUM27H+5RMNifDFpVB+GXcTtavKXwCK8=' #h2l1
#'sha256-msdEhWmYTu7vqzGaQHDfvy6lzlDsbKkouwvN2R6Co9E=' #busy-indicator
#'sha256-iYwYhiMcsGmXCUzLEpEzZNz5dINrlkqf1sLbLhEcqGM=' _footer.html.ep style="position:relative;"
#'sha256-bOTFT8zacR4Rfja/WIKXgAQQXVaPyG3oBlvAhU4ga8g=' _usr_list style="min-width:35em"
#'sha256-CP93jJ1Y8nMwUoDzFbo1srdgsbADPasAc0Wjig1ahpY=' groups style="min-width:15em"
." 'sha256-msdEhWmYTu7vqzGaQHDfvy6lzlDsbKkouwvN2R6Co9E=' 'sha256-iYwYhiMcsGmXCUzLEpEzZNz5dINrlkqf1sLbLhEcqGM=' 'sha256-bOTFT8zacR4Rfja/WIKXgAQQXVaPyG3oBlvAhU4ga8g=' 'sha256-CP93jJ1Y8nMwUoDzFbo1srdgsbADPasAc0Wjig1ahpY=' 'sha256-EhT63KK1JBrsUM27H+5RMNifDFpVB+GXcTtavKXwCK8=' ;"
# list of hashes for style-src we accept and reference to find them
." 'sha256-EhT63KK1JBrsUM27H+5RMNifDFpVB+GXcTtavKXwCK8=' " #h2l1
." 'sha256-msdEhWmYTu7vqzGaQHDfvy6lzlDsbKkouwvN2R6Co9E=' " # busy-indicator
." 'sha256-iYwYhiMcsGmXCUzLEpEzZNz5dINrlkqf1sLbLhEcqGM=' " # _footer.html.ep style="position:relative;"
." 'sha256-bOTFT8zacR4Rfja/WIKXgAQQXVaPyG3oBlvAhU4ga8g=' " # _usr_list style="min-width:35em"
." 'sha256-CP93jJ1Y8nMwUoDzFbo1srdgsbADPasAc0Wjig1ahpY=' " # groups style="min-width:15em"
." 'sha256-0Mf27W7YqYYDBxV28E9yUhPk/SHgCYEyL73kR5dJkDM=' " # useraccounts:410 useraccounts:506 and useraccounts:602 style = background:pink;
." 'sha256-65hozXHuXYaN7oOyWz8cFCjqLsPmy6O7++aP2PECi5M=' " # legacypanel:306 style="width:99%;height:1784px;
." ;"
." \"\n";
$OUT .= " </Location>\n";
# prevent caching of manager files in browser

View File

@@ -33,11 +33,13 @@ use esmith::I18N;
use esmith::ConfigDB::UTF8;
use esmith::NavigationDB; # no UTF8 raw is ok for ASCII only flat file
use Data::Dumper;
# Import the function(s) you need
use SrvMngr_Auth qw(check_admin_access);
#this is overwrittrn with the "release" by the spec file - release can be "99.el8.sme"
our $VERSION = '94.el8.sme';
our $VERSION = '121.el8.sme';
#Extract the release value
if ($VERSION =~ /^(\d+)/) {
$VERSION = $1; # $1 contains the matched numeric digits
@@ -607,19 +609,21 @@ sub getNavigation {
# Added: Check if user is non-admin and get their allowed panels
if ($username ne '') {
# Get the AccountsDB to check user permissions
$is_admin = 0; # User is non-admin with specific panel access
my $accountsdb = esmith::AccountsDB::UTF8->open_ro() or
die "Couldn't open AccountsDB\n";
# Check if user has AdminPanels property
my $user_rec = $accountsdb->get($username);
if (defined $user_rec && $user_rec->prop('AdminPanels')) {
$is_admin = 0; # User is non-admin with specific panel access
# Get comma-separated list of allowed admin panels
my $admin_panels = $user_rec->prop('AdminPanels');
@allowed_admin_panels = split(/,/, $admin_panels);
@allowed_admin_panels = $admin_panels eq '' ? () : split(/,/, $admin_panels);
#@allowed_admin_panels = split(/,/, $admin_panels);
}
}
#-----------------------------------------------------
# Determine the directory where the functions are kept
#-----------------------------------------------------
@@ -720,20 +724,20 @@ sub getNavigation {
# Added: Check if this is an admin menu item and if user has access
if ($menucat eq 'A' && !$is_admin) {
# Skip this admin panel if user doesn't have access to it
# By default, deny access if no allowed_admin_panels are specified
my $has_access = 0;
if (@allowed_admin_panels) {
my $file_no_ext = $file;
$file_no_ext =~ s/\.pm$//; # Remove .pm extension if present
foreach my $allowed_panel (@allowed_admin_panels) {
if ($file_no_ext eq lc($allowed_panel)) {
#die("Here!!$file $file_no_ext $allowed_panel ");
$has_access = 1;
last;
}
}
}
next if !$has_access;
}
next if $menu ne $menucat;
#--------------------------------------------------
@@ -772,7 +776,7 @@ sub getNavigation {
MENUCAT => $menucat
};
}
#die(Dumper(\%nav));
return \%nav;
}

View File

@@ -25,6 +25,8 @@ use esmith::AccountsDB::UTF8;
use esmith::util;
use File::Basename;
use File::Find;
# Set to avoid using link counts as it may not work for cifs shares.
$File::Find::dont_use_nlink = 1;
use File::Path qw(make_path remove_tree);
use esmith::Backup;
use esmith::BackupHistoryDB; #no UTF8 and not in use
@@ -1670,7 +1672,7 @@ sub get_Backupset_options () {
my $err;
$mntdir = "/$smbshare" if ($VFSType eq 'usb');
my $setbackuplist = sub {
$c->app->log->info("File presented: $_");
if ($_ =~ /\.dar/) {
my $dir = $File::Find::dir;
my $backupref;
@@ -1696,6 +1698,7 @@ sub get_Backupset_options () {
}
# Finding existing backups
find { wanted => \&$setbackuplist, untaint => 1, untaint_pattern => qr|^([-+@\w\s./]+)$| }, $mntbkdir;
my %blabels = ();
my @list;
@@ -1703,6 +1706,7 @@ sub get_Backupset_options () {
foreach $key (sort keys %backupfiles) {
my $labkey = $mntbkdir . '/' . $backupfiles{$key}[0] . '/' . $backupfiles{$key}[1];
$blabels{$labkey} = $backupfiles{$key}[1] . " (" . $backupfiles{$key}[0] . ")";
$c->app->log->info("Pushing $blabels{$labkey} to $labkey");
push @list, [ "$blabels{$labkey}" => "$labkey" ];
} ## end foreach $key (sort keys %backupfiles)
$error_message .= $c->bunmount($mntdir, $VFSType);

View File

@@ -116,16 +116,39 @@ sub do_update {
$ndb = esmith::NetworksDB::UTF8->open || die "Couldn't open networks db";
my $notif = '';
my $result = '';
$hos_datas{'name'} = lc $c->param('Name');
$hos_datas{'domain'} = lc $c->param('Domain');
$hos_datas{'hostname'} = $c->param('Hostname');
$hos_datas{'comment'} = $c->param('Comment');
$hos_datas{'hosttype'} = $c->param('Hosttype');
$hos_datas{'internalip'} = $c->param('Internalip');
$hos_datas{'macaddress'} = $c->param('Macaddress');
$hos_datas{'externalip'} = $c->param('Externalip');
# Fetch parameters with forced scalar context and default empty string if undefined
$hos_datas{'name'} = lc(scalar $c->param('Name') // '');
$hos_datas{'domain'} = lc(scalar $c->param('Domain') // '');
$hos_datas{'hostname'} = scalar $c->param('Hostname') // '';
$hos_datas{'comment'} = scalar $c->param('Comment') // '';
$hos_datas{'hosttype'} = scalar $c->param('Hosttype') // '';
$hos_datas{'internalip'} = scalar $c->param('Internalip') // '';
$hos_datas{'externalip'} = scalar $c->param('Externalip') // '';
my $hostname = "$hos_datas{'name'}.$hos_datas{'domain'}";
if (my $hostrec = $hdb->get($hostname)) {
my $hosttype = $hostrec->prop('HostType') // '';
#$c->app->log->info("$hosttype $hos_datas{'hosttype'} $hos_datas{'comment'} $hostrec->prop('Comment')");
# Clear comment if hosttype changes to 'self' and comment was not intentionally changed
if ($hosttype ne 'Self'
&& $hos_datas{'hosttype'} eq 'Self'
&& $hos_datas{'comment'} eq $hostrec->prop('Comment')) {
$hos_datas{'comment'} = '';
}
}
# Clear MAC address if hosttype is 'self', otherwise get from param
if ($hos_datas{'hosttype'} eq 'Self') {
$hos_datas{'macaddress'} = '';
$hos_datas{'internalip'} = '';
#$c->app->log->info("yes $hos_datas{'hosttype'} $hos_datas{'macaddress'}");
} else {
$hos_datas{'macaddress'} = scalar $c->param('Macaddress') // '';
#$c->app->log->info("no $hos_datas{'hosttype'} $hos_datas{'macaddress'}");
}
if ($trt eq 'ADD') {
$hos_datas{'hostname'} = $hostname;

View File

@@ -163,7 +163,7 @@ sub get_ftp_access {
my $status = get_prop('', 'ftp', 'status') || 'disabled';
return 'off' unless $status eq 'enabled';
my $access = get_prop('', 'ftp', 'access') || 'private';
return ($access eq 'public') ? 'normal' : 'private';
return ($access eq 'public') ? 'public' : 'private';
} ## end sub get_ftp_access
#sub get_pptp_sessions {
@@ -320,7 +320,7 @@ sub change_settings {
$rec->set_prop('status', 'disabled');
$rec->set_prop('access', 'private');
$rec->set_prop('LoginAccess', 'private');
} elsif ($rma_datas{ftpAccess} eq "normal") {
} elsif ($rma_datas{ftpAccess} eq "public") {
$rec->set_prop('status', 'enabled');
$rec->set_prop('access', 'public');
$rec->set_prop('LoginAccess', $rma_datas{ftpPasswordAccess});

View File

@@ -120,6 +120,20 @@ sub do_display {
}
$c->stash(useraccounts => \@useraccounts);
} ## end if ($trt eq 'LIST')
my $cdb = esmith::ConfigDB::UTF8->open_ro || die "Couldn't open configuration db";
my $rec = $cdb->get('passwordstrength');
$usr_datas{passwdlength} = ($rec ? ($rec->prop('length') || 12) : 12);
if ($trt eq 'PWS'){
$usr_datas{passwdstrength} = ($rec ? ($rec->prop('Admin') || 'none') : 'none');
} else {
$usr_datas{passwdstrength} = ($rec ? ($rec->prop('Users') || 'none') : 'none');
}
if ( !(defined $usr_datas{passwdstrength} && $usr_datas{passwdstrength} =~ /^(none|normal|intermediate|strong)$/)) {
$usr_datas{passwdstrength} = 'strong';
}
$c->stash(title => $title, notif => $notif, usr_datas => \%usr_datas);
$c->render(template => 'useraccounts');
} ## end sub do_display

View File

@@ -50,6 +50,18 @@ sub main {
$pwd_datas{jwt} = $jwt;
$c->flash(success => $c->l('pwd_OK_FOR_RESET'));
} ## end else [ if ($c->is_logged_in) ]
my $cdb = esmith::ConfigDB::UTF8->open_ro || die "Couldn't open configuration db";
my $rec = $cdb->get('passwordstrength');
$pwd_datas{passwdlength} = ($rec ? ($rec->prop('length') || 12) : 12);
if ($c->is_admin){
$pwd_datas{passwdstrength} = ($rec ? ($rec->prop('Admin') || 'none') : 'none');
} else {
$pwd_datas{passwdstrength} = ($rec ? ($rec->prop('Users') || 'none') : 'none');
}
if ( !(defined $pwd_datas{passwdstrength} && $pwd_datas{passwdstrength} =~ /^(none|normal|intermediate|strong)$/)) {
$pwd_datas{passwdstrength} = 'strong';
}
$c->stash(pwd_datas => \%pwd_datas);
$c->render('userpassword');
} ## end sub main

View File

@@ -211,8 +211,8 @@ sub showlogFile {
$_ = timestamp2local($_);
$_ = HTML::Entities::encode_entities($_);
($log_datas{highlightpattern} && /$log_datas{highlightpattern}/)
? $out .= sprintf("<b>$_</b>")
: $out .= sprintf("$_");
? $out .= "<b>$_</b>"
: $out .= "$_";
} ## end while (<LOGFILE>)
$out .= sprintf("</PRE>");

View File

@@ -60,3 +60,8 @@
'usr_NEW_SYSTEM_PASSWORD_VERIFY' => 'New system password (verify)',
'usr_LABEL_IPSECRW_DOWNLOAD' => 'Download digital certificate to IPSec client',
'usr_ERR_OCCURRED_DELETING' => 'An error occurred while trying to delete the user.',
'usr_NONE_PASSWORD_DESCRIPTION' => 'The password must be composed of at least [_1] characters.',
'usr_NORMAL_PASSWORD_DESCRIPTION' => 'The password must be composed of at least [_1] characters with uppercase and lowercase letters.',
'usr_INTERMEDIATE_PASSWORD_DESCRIPTION' => 'The password must be composed of at least [_1] characters with uppercase and lowercase letters and must pass a dictionary check.',
'usr_STRONG_PASSWORD_DESCRIPTION' => 'The password must be composed of at least [_1] characters with uppercase and lowercase letters, numbers and special characters and must pass a dictionary check.',
'usr_PASSWORD_WIKI' => "If you want to know more about passwords, then please refer to the <a href='https://wiki.koozali.org/SME_Server:Documentation:Administration_Manual:Chapter9#Changing_User_Passwords'>Wiki</a>",

View File

@@ -19,5 +19,8 @@
'pwd_PASSWORD_CHANGE_SUCCESS' => 'Your password has been successfully changed.',
'pwd_DESCRIPTION' => '<P>To change your account password, please fill out the following form. You will need to provide the name of your account, your old password, and your desired new password. (You must type the new password twice.)</P><P>If you cannot change your password because you have forgotten the old one, your local system administrator can reset your password using the <EM>server manager</EM>.</P>',
'pwd_DESCRIPTION_RESET' => '<P>To reset your account password, please fill out the following form. You will need to provide your desired new password. (You must type it twice.)</P><P>In cas of problem, your local system administrator can reset your password using the <EM>server manager</EM>.</P>',
'pwd_PASSWORD_DESCRIPTION' => 'The password must be composed of at least twelve characters with uppercase and lowercase letters, numbers and non-alphanumeric characters.',
'pwd_PASSWORD_WIKI' => "If you want to know more about passwords, then please refer to the <a href='https://wiki.koozali.org/Useful_Commands#Password_strength'>Wiki</a>",
'pwd_NONE_PASSWORD_DESCRIPTION' => 'The password must be composed of at least [_1] characters.',
'pwd_NORMAL_PASSWORD_DESCRIPTION' => 'The password must be composed of at least [_1] characters with uppercase and lowercase letters.',
'pwd_INTERMEDIATE_PASSWORD_DESCRIPTION' => 'The password must be composed of at least [_1] characters with uppercase and lowercase letters and must pass a dictionary check.',
'pwd_STRONG_PASSWORD_DESCRIPTION' => 'The password must be composed of at least [_1] characters with uppercase and lowercase letters, numbers and special characters and must pass a dictionary check.',
'pwd_PASSWORD_WIKI' => "If you want to know more about passwords, then please refer to the <a href='https://wiki.koozali.org/SME_Server:Documentation:Administration_Manual:Chapter9#Changing_User_Passwords'>Wiki</a>",

View File

@@ -0,0 +1,4 @@
.legacy-embedded {
width: 99%;
height: 600px; /* fallback default, matches your $height default */
}

View File

@@ -503,3 +503,19 @@ div.roundcube #roundcube{
width:100%;
height:600px;
}
.center {
display: flex;
align-items: center;
width: 100%; /* adjust as needed */
}
.left-btn {
/* Left aligned */
}
.center-btn {
/* Center aligned */
margin-left: auto!important;
margin-right: auto;
}

View File

@@ -63,7 +63,7 @@
position: absolute;
left: 7%;
transform: translateX(-50%);
background-color: #4caf50b8;
background-color: #4caf50;
color: white !important;
border: none;
padding: 8px;

View File

@@ -0,0 +1,6 @@
document.addEventListener('DOMContentLoaded', function() {
var obj = document.getElementById('legacy-embedded');
if (obj && obj.dataset.legacyHeight) {
obj.style.height = obj.dataset.legacyHeight;
}
});

View File

@@ -30,14 +30,27 @@ $(document).ready(function() {
});
});
// and busy cursor
$(document).ready(function() {
// Handle form submission for any form
$('form').on('submit', function(event) {
// Disable all submit buttons and update their labels
$(this).find('button[type="submit"]').prop('disabled', true).text('Please wait...');
$(this).find('input[type="submit"]').prop('disabled', true).val('Please wait...');
// Add busy cursor
// Change submit buttons to look disabled and update their labels without disabling
$(this).find('button[type="submit"]').each(function() {
$(this).text('Please wait...').addClass('visually-disabled').css({
'pointer-events': 'none',
'opacity': '0.6',
'cursor': 'not-allowed'
});
});
$(this).find('input[type="submit"]').each(function() {
$(this).val('Please wait...').addClass('visually-disabled').css({
'pointer-events': 'none',
'opacity': '0.6',
'cursor': 'not-allowed'
});
});
// Add busy cursor to body
$('body').addClass('busy');
// Allow form to submit normally without disabling the buttons
});
});

View File

@@ -55,14 +55,14 @@
%= l 'bac_local removable disk'
</span><span class=data>
% param 'BackupwkFolder' => $bac_datas->{mount} unless param 'BackupwkFolder';
%= select_field 'BackupwkFolder' => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => 'input'
%= select_field 'BackupwkFolder' => $c->get_BackupwkDest_options( $bac_datas->{vfstype} ), class => 'input';
</span><br>
% } elsif ( $bac_datas->{vfstype} eq 'mnt') {
<span class=label>
%= l 'bac_Mounted disk'
</span><span class=data>
% param 'BackupwkFolder' => $bac_datas->{folder} unless param 'BackupwkFolder';
%= select_field 'BackupwkFolder' => $c->get_BackupwkDest_options( $bac_datas->{vfstype}), class => 'input'
%= select_field 'BackupwkFolder' => $c->get_BackupwkDest_options( $bac_datas->{vfstype} ), class => 'input';
</span><br>
% } else {
<span class=label>

View File

@@ -28,7 +28,7 @@
% if ($bac_datas->{status} ne 'enabled') {
%= $c->render_to_string( inline => ( l 'bac_CONFIGURATION_TO_BE_DONE' ) )
% } else {
%= $c->render_to_string(inline => (l 'bac_RESTORE_CONF_FROM_WORKSTN_DESC') . ' ' . $c->get_shared_folder_to_verify())
%= $c->render_to_string( inline => ( l 'bac_RESTORE_CONF_FROM_WORKSTN_DESC' ) . ' ' . $c->get_shared_folder_to_verify() );
% }
<br><br><span class=label>

View File

@@ -1,8 +1,8 @@
% layout 'default', title => "Sme server 2 - restore";
%= stylesheet '/css/backup.css'
% content_for 'module' => begin
<div id='module' class='module back_workstn_restore1-panel'>
%= javascript '/js/backup_workstation_restore.js'
% if (config->{debug} == 1) {
<p>
%= dumper $c->current_route
@@ -23,9 +23,32 @@
<h2>
%= l 'bac_WORKSTN_RESTORE'
</h2>
<fieldset>
<div id="status-container">
<div><strong>Stage:</strong> <span id="stage">-</span></div>
<div id="progress-bar" aria-label="progress bar" role="progressbar" aria-valuemin="0" aria-valuemax="100">
<div id="progress-bar-inner">0%</div>
</div>
<div id="message-log-container">
<h3>Console Output:</h3>
<div id="message-log"></div>
</div>
<div id="completion-status"></div>
</div>
</fieldset>
<!--
<p>
<fieldset>
%= $c->render_to_string( inline => $bac_datas->{restore_log} )
</p><p>
</fieldset>
</p>
-->
<p>
%= l 'bac_YOU_MUST_REBOOT'
</p>
%= hidden_field 'Function' => $bac_datas->{'function'}

View File

@@ -22,7 +22,7 @@
<h2><%= l 'bac_WORKSTN_SEL_RESTORE' %></h2>
%= $c->render_to_string(inline => (l 'bac_WORKSTN_SEL_REST_DESC') . ' ' . $c->get_shared_folder_to_verify())
%= $c->render_to_string( inline => ( l 'bac_WORKSTN_SEL_REST_DESC' ) . ' ' . $c->get_shared_folder_to_verify() );
<h3><%= l 'bac_BACKUP_CHOICE' %></h3>

View File

@@ -28,7 +28,7 @@
<br><span class=label>
%= l 'bac_SELECT_FILES_TO_RESTORE'
</span><span class=data>
%= select_field 'Restorefiles' => $c->get_Restorefiles_options($bac_datas->{'filterexp'},$bac_datas->{'backupset'}), class => 'input', multiple => 1, size => 15
%= select_field 'Restorefiles' => $c->get_Restorefiles_options( $bac_datas->{'filterexp'}, $bac_datas->{'backupset'} ), class => 'input', multiple => 1, size => 15;
</span><br>
<br><span class=label>

View File

@@ -26,7 +26,7 @@
% if ($bac_datas->{status} ne 'enabled') {
%= $c->render_to_string( inline => ( l 'bac_CONFIGURATION_TO_BE_DONE' ) )
% } else {
%= $c->render_to_string(inline => (l 'bac_VERIFY_WORKSTN_BACKUP_DESC') . ' ' . $c->get_shared_folder_to_verify())
%= $c->render_to_string( inline => ( l 'bac_VERIFY_WORKSTN_BACKUP_DESC' ) . ' ' . $c->get_shared_folder_to_verify() );
% }
<br><br><span class=label>
%= l 'bac_SELECT_BACKUP_FILE'

View File

@@ -1,11 +1,14 @@
<%
my $backups = esmith::BackupHistoryDB->open; # no UTF8
my $now = time();
my $backup_rec = $backups->new_record($now, {
type => 'backup_record', BackupType => 'desktop',
my $backup_rec = $backups->new_record(
$now,
{
type => 'backup_record',
BackupType => 'desktop',
StartEpochTime => $now,
});
}
);
# Dump the current mysql tables so that they are part of the image.
# The events handle cases where mysqld is not enabled, and/or is not running.
@@ -48,7 +51,8 @@
$c->write_chunk( $buffer, $cb );
};
$c->$cb;
} else {
}
else {
$c->render( text => "Failed to execute command: $!", status => 500 );
}

View File

@@ -1,7 +1,6 @@
% layout 'default', title => "Sme server 2 - backup";
% content_for 'module' => begin
<div id='module' class='module backup-panel'>
% if (config->{debug} == 1) {
<p>

View File

@@ -19,7 +19,7 @@
%= l 'clm_LABEL_FILESYSTEM_SCAN_PERIOD'
</span><span class=data>
% param 'FilesystemScan' => $clm_datas->{FilesystemScan} unless param 'FilesystemScan';
%= select_field 'FilesystemScan' => [[ (l 'clm_DAILY') => 'daily'], [ (l 'clm_NEVER') => 'disabled'], [ (l 'clm_WEEKLY') => 'weekly']], class => 'input'
%= select_field 'FilesystemScan' => [ [ ( l 'clm_DAILY' ) => 'daily' ], [ ( l 'clm_NEVER' ) => 'disabled' ], [ ( l 'clm_WEEKLY' ) => 'weekly' ] ], class => 'input';
</span>
</p>
<p>
@@ -27,7 +27,7 @@
%= l 'clm_LABEL_QUARANTINE'
</span><span class=data>
% param 'Quarantine' => $clm_datas->{Quarantine} unless param 'Quarantine';
%= select_field 'Quarantine' => [[ (l 'ENABLED') => 'enabled'], [ (l 'DISABLED') => 'disabled']], class => 'input'
%= select_field 'Quarantine' => [ [ ( l 'ENABLED' ) => 'enabled' ], [ ( l 'DISABLED' ) => 'disabled' ] ], class => 'input';
<br>
</span>
</p>

View File

@@ -1 +1 @@
<script src='js/jquery.min.js' type='text/javascript'></script>
<!--<script src='js/jquery.min.js' type='text/javascript'></script>-->

View File

@@ -27,12 +27,12 @@
<% my $btn = l('SAVE'); %>
<br /><br />
<span>
%= label_for 'real-time-clock' => $c->l('dat_The_time_is_currently'), class => 'datetime-clock-label'
%= label_for 'real-time-clock' => $c->l('dat_The_time_is_currently'), class => 'datetime-clock-label';
</span><span class=data2>
<!--
<div id="real-time-clock"></div>
-->
%= text_field 'clock', id => 'real-time-clock', readonly => 'readonly', class => 'datetime-clock' , value => $dat_data->{currentdatetime}
%= text_field 'clock', id => 'real-time-clock', readonly => 'readonly', class => 'datetime-clock', value => $dat_data->{currentdatetime};
</span>
% if ($dat_data->{ntpstatus} eq 'disabled') {
<div class='datetime-set-ntp'>
@@ -74,7 +74,7 @@
<div class=datetime-fields-col>
% my $server_check = '^([a-zA-Z0-9][a-zA-Z0-9\.\-]{0,253}[a-zA-Z0-9]|(\d{1,3}\.){3}\d{1,3})$';
% param 'ntpserver' => $dat_data->{ntpserver} unless param 'ntpserver';
%= text_field ntpserver => placeholder => 'e.g. smeserver.pool.ntp.org', id => 'ntpserver', pattern => $server_check, title => 'Enter a valid hostname or IPv4 address', required => 'required'
%= text_field ntpserver => placeholder => 'e.g. smeserver.pool.ntp.org', id => 'ntpserver', pattern => $server_check, title => 'Enter a valid hostname or IPv4 address', required => 'required';
<button type="button" id="test-ntp-btn" class="btn btn-primary ml-2">Test Server</button>
<span id="ntp-test-result" class="ntp-test-result ml-2"></span>
</div>
@@ -106,7 +106,7 @@
%= label_for day => $c->l('Day:')
% param 'day' => ( $dat_data->{day} ) unless param 'day';
%= text_field day => id => 'day', size => 2, maxlength => 2, placeholder => 'DD', pattern => '^(0[1-9]|[12][0-9]|3[01])$', title => 'Day (01-31)', required => 'required', inputmode => 'numeric', autocomplete => 'off'
%= text_field day => id => 'day', size => 2, maxlength => 2, placeholder => 'DD', pattern => '^(0[1-9]|[12][0-9]|3[01])$', title => 'Day (01-31)', required => 'required', inputmode => 'numeric', autocomplete => 'off';
</fieldset>
<fieldset>
@@ -118,12 +118,12 @@
%= label_for minute => $c->l('Minute:')
% param 'minute' => ( $dat_data->{minute} ) unless param 'minute';
%= text_field minute => id => 'minute', size => 2, maxlength => 2, placeholder => 'MM', pattern => '^[0-5][0-9]$', title => 'Minute (00-59)', required => 'required', inputmode => 'numeric', autocomplete => 'off'
%= text_field minute => id => 'minute', size => 2, maxlength => 2, placeholder => 'MM', pattern => '^[0-5][0-9]$', title => 'Minute (00-59)', required => 'required', inputmode => 'numeric', autocomplete => 'off';
&nbsp;
%= label_for second => $c->l('Second:')
% param 'second' => ( $dat_data->{second} ) unless param 'second';
%= text_field second => id => 'second', size => 2, maxlength => 2, placeholder => 'SS', pattern => '^[0-5][0-9]$', title => 'Second (00-59)', required => 'required', inputmode => 'numeric', autocomplete => 'off'
%= text_field second => id => 'second', size => 2, maxlength => 2, placeholder => 'SS', pattern => '^[0-5][0-9]$', title => 'Second (00-59)', required => 'required', inputmode => 'numeric', autocomplete => 'off';
</fieldset>
</div>
</div>

View File

@@ -13,8 +13,7 @@
<h1><%= $title %></h1>
<br>
<%= $modul %>
<% my $btn = l('SAVE');
%>
<% my $btn = l('SAVE'); %>
%= form_for 'directory' => ( method => 'POST' ) => begin
@@ -33,7 +32,7 @@
%= l 'dir_DIRECTORY_ACCESS', class => 'label'
</span><span class=data>
% param 'access' => $dir_datas->{access} unless param 'access';
%= select_field 'access' => [[ (l 'NETWORKS_ALLOW_LOCAL') => 'private'], [ (l 'NETWORKS_ALLOW_PUBLIC') => 'public']], class => 'input', id => 'access'
%= select_field 'access' => [ [ ( l 'NETWORKS_ALLOW_LOCAL' ) => 'private' ], [ ( l 'NETWORKS_ALLOW_PUBLIC' ) => 'public' ] ], class => 'input', id => 'access';
</span>
</p>
<p>
@@ -75,7 +74,7 @@
<span class=label>
%= l 'dir_EXISTING', class => 'label'
</span><span class=data>
%= select_field 'existing'=> [[ (l 'dir_LEAVE') => 'leave'], [ (l 'dir_UPDATE') => 'update' ]], class => 'input'
%= select_field 'existing' => [ [ ( l 'dir_LEAVE' ) => 'leave' ], [ ( l 'dir_UPDATE' ) => 'update' ] ], class => 'input';
</span>
</p>
<p>

View File

@@ -14,10 +14,18 @@
</div>
% }
<h1> Embedded - <%= $title %></h1><br>
<p>If the legacy panel does not appear, then you may not be logged into the original Server manager.<br />You can log in by clicking <a href="/server-manager" target='_blank'>here</a>. Or by clicking on the "Legacy SM" button at the top of the window.</p>
% my $height = $c->stash('height') | '600px';
<p>If the legacy panel does not appear, then you may not be logged into the original Server manager.<br />You can log in by clicking <a href="/server-manager" target='_blank'>here</a>.</p>
% my $height = $c->stash('height') || '600px';
% if ( $height !~ /px$/ ) { $height = $height . 'px'; }
<object id="legacy-embedded" class="legacy-embedded" data="<%=$c->stash('modul') %>" style="width:99%;height:<%= $height %>;" title="<%= $c->stash('title') %>" type="text/html" ><%= $c->stash('title') %> not found</object>
% # Add the height as a data attribute
<object id="legacy-embedded"
class="legacy-embedded"
data="<%= $c->stash('modul') %>"
data-legacy-height="<%= $height %>"
title="<%= $c->stash('title') %>"
type="text/html">
<%= $c->stash('title') %> not found
</object>
</div>
% end

View File

@@ -21,12 +21,12 @@
%= javascript '/js/datatables.min.js'
%= stylesheet '/js/jquery-ui.min.css'
%= javascript '/js/jquery-ui.min.js'
%= javascript '/js/dataTables.buttons.min.js'
%= javascript '/js/jszip.min.js'
%= javascript '/js/pdfmake.min.js'
%#= javascript '/js/dataTables.buttons.min.js'
%#= javascript '/js/jszip.min.js'
%#= javascript '/js/pdfmake.min.js'
%= javascript '/js/vfs_fonts.js'
%= javascript '/js/buttons.html5.min.js'
%= javascript '/js/buttons.print.min.js'
%#= javascript '/js/buttons.html5.min.js'
%#= javascript '/js/buttons.print.min.js'
%= javascript '/js/flag-by-locale.js'
%= javascript '/js/sme-password.js'

View File

@@ -43,7 +43,7 @@
<p><span class=label>
%= l 'PASSWORD'
</span><span class=input>
%= password_field 'Password', id => 'id_password', autocomplete => 'current-password', class=>'sme-password'
%= password_field 'Password', id => 'id_password', autocomplete => 'current-password', class => 'sme-password';
% if (config 'hasJquery') {
%# <a href='#' id='togglePassword' class='toggle-password tg-icon'> <img src="images/visible.png" height="16" alt="Visible"></a>
% }

View File

@@ -51,10 +51,12 @@
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $domain_name = $domain->{Domain}; # Domain name extracted from the data structure
% my $actionModify = qq{
% <a href="domains2?CsrfDef=$csrf_token&trt=UPD&Domain=$domain_name">
% <button type='button' class='sme-modify-button' title='$modify_text' >
% $modify_text
% </button>
% <a href="domains2?CsrfDef=$csrf_token&trt=UPD&Domain=$domain_name"
% class="sme-modify-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$modify_text" aria-label="$modify_text"
% style="background:white;">
% <span class="ui-icon ui-icon-pencil"></span>
% <span class="ui-button-text">$modify_text</span>
% </a>
% };
% my $removable = ( $domain->{Removable} || 'yes' );
@@ -64,10 +66,12 @@
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $domain_name = $domain->{Domain}; # Domain name extracted from the data structure
% $actionRemove = qq{
% <a href="domains2?CsrfDef=$csrf_token&trt=DEL&Domain=$domain_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% <a href="domains2?CsrfDef=$csrf_token&trt=DEL&Domain=$domain_name"
% class="sme-remove-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$remove_text" aria-label="$remove_text"
% style="background:white;">
% <span class="ui-icon ui-icon-delete"></span>
% <span class="ui-button-text">$remove_text</span>
% </a>
% };
%# $actionRemove = "<a href='domains2?CsrfDef=TOKEN&trt=DEL&Domain=" . $domain->{Domain} . "'>" . "<button class='sme-remove-button' title=".l('REMOVE').">".l('REMOVE')."</button>" . "</a>";

View File

@@ -35,28 +35,30 @@
% foreach my $group (@$groups)
% {
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $group_name = $group->key; # group name extracted from the data structure
<tr>
%= t td => ( class => 'sme-border' ) => $group->key
%= t td => ( class => 'sme-border' ) => $group->prop('Description')
<td class='sme-border' style="min-width:15em">
% my $modify_text = l('MODIFY'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $group_name = $group->key; # group name extracted from the data structure
% my $actionModify = qq{
% <a href="groups2?CsrfDef=$csrf_token&trt=UPD&group=$group_name">
% <button type='button' class='sme-modify-button' title='$modify_text' >
% $modify_text
% </button>
% <a href="groups2?CsrfDef=$csrf_token&trt=UPD&group=$group_name"
% class="sme-modify-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$modify_text" aria-label="$modify_text"
% style="background:white;">
% <span class="ui-icon ui-icon-pencil"></span>
% <span class="ui-button-text">$modify_text</span>
% </a>
% };
% my $remove_text = l('REMOVE'); # Localized text
%my $csrf_token = "TOKEN"; # CSRF token for security
%my $group_name = $group->key; # group name extracted from the data structure
% my $actionRemove = qq{
% <a href="groups2?CsrfDef=$csrf_token&trt=DEL&group=$group_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% <a href="groups2?CsrfDef=$csrf_token&trt=DEL&group=$group_name"
% class="sme-remove-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$remove_text" aria-label="$remove_text"
% style="background:white;">
% <span class="ui-icon ui-icon-delete"></span>
% <span class="ui-button-text">$remove_text</span>
% </a>
% };
<%= $c->render_to_string( inline => $actionModify ) %> <%= $c->render_to_string( inline => $actionRemove ) %>

View File

@@ -2,9 +2,10 @@
<div id="header2" class="hd2 module gradient-panel">
<img src="images/KoozaliServerManager.png" alt="Koozali Logo" class="logo" >
% if ( not defined $c->session->{username} ) {
<button type='button' class="login-button"><a class = "no-visited-state" target="_parent" href="login">Login</a></button>
<a class="login-button no-visited-state" target="_parent" href="/smanager/login">Login</a>
% } else {
<button type='button' class="login-button"><a class = "no-visited-state" target="_parent" href="logout">Logout <%= $c->session->{username} %></a></button>
<!--<button type='button' class="login-button"><a class = "no-visited-state" target="_parent" href="/smanager/logout">Logout <%= $c->session->{username} %></a></button>xxx-->
<a class="login-button no-visited-state" target="_parent" href="/smanager/logout">Logout <%= $c->session->{username} %></a>
% }
<div id="flag-container" class = "flag-style">
<!-- The flag icon will be inserted here -->

View File

@@ -57,20 +57,24 @@
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $hostentries_name = $_->{'HostName'}; # hostentries name extracted from the data structure
% $actionModify = qq{
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=UPD&Hostname=$hostentries_name">
% <button type='button' class='sme-modify-button' title='$modify_text' >
% $modify_text
% </button>
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=UPD&Hostname=$hostentries_name"
% class="sme-modify-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$modify_text" aria-label="$modify_text"
% style="background:white;">
% <span class="ui-icon ui-icon-pencil"></span>
% <span class="ui-button-text">$modify_text</span>
% </a>
% };
% my $remove_text = l('REMOVE'); # Localized text
% $csrf_token = "TOKEN"; # CSRF token for security
%# my $hostentries_name = $_->{'HostName'}; # hostentries name extracted from the data structure
% $actionRemove = qq{
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=DEL&Hostname=$hostentries_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% <a href="hostentriesd?CsrfDef=$csrf_token&trt=DEL&Hostname=$hostentries_name"
% class="sme-remove-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$remove_text" aria-label="$remove_text"
% style="background:white;">
% <span class="ui-icon ui-icon-delete"></span>
% <span class="ui-button-text">$remove_text</span>
% </a>
% };
% }

View File

@@ -53,10 +53,12 @@
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $ibays_entry_name = $ibay->key; # ibays_entry name extracted from the data structure
% $actionModify = qq{
% <a href="ibaysd?CsrfDef=$csrf_token&trt=UPD&ibay=$ibays_entry_name">
% <button type='button' class='sme-modify-button' title='$modify_text' >
% $modify_text
% </button>
% <a href="ibaysd?CsrfDef=$csrf_token&trt=UPD&ibay=$ibays_entry_name"
% class="sme-modify-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$modify_text" aria-label="$modify_text"
% style="background:white;">
% <span class="ui-icon ui-icon-pencil"></span>
% <span class="ui-button-text">$modify_text</span>
% </a>
% };
% }
@@ -75,10 +77,12 @@
% };
% } else {
% $actionResetPw = qq{
% <a href="ibaysd?CsrfDef=$csrf_token&trt=PWD&ibay=$ibays_entry_name">
% <button type='button' class='sme-password-button' title='$password_text' >
% $password_text
% </button>
% <a href="ibaysd?CsrfDef=$csrf_token&trt=PWD&ibay=$ibays_entry_name"
% class="sme-password-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$password_text" aria-label="$password_text"
% style="background:white;">
% <span class="ui-icon ui-icon-refresh"></span>
% <span class="ui-button-text">$password_text</span>
% </a>
% };
% }
@@ -90,10 +94,12 @@
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $ibays_entry_name = $ibay->key; # ibays_entry name extracted from the data structure
% $actionRemove = qq{
% <a href="ibaysd?CsrfDef=$csrf_token&trt=DEL&ibay=$ibays_entry_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% <a href="ibaysd?CsrfDef=$csrf_token&trt=DEL&ibay=$ibays_entry_name"
% class="sme-remove-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$remove_text" aria-label="$remove_text"
% style="background:white;">
% <span class="ui-icon ui-icon-delete"></span>
% <span class="ui-button-text">$remove_text</span>
% </a>
% };
% }

View File

@@ -71,7 +71,7 @@
%= l 'iba_ALLOW_DYNAMIC_CONTENT'
</span><span class=data>
% param 'CgiBin' => $iba_datas->{CgiBin} unless param 'CgiBin';
%= select_field 'CgiBin' => [[ (l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
%= select_field 'CgiBin' => [ [ ( l 'DISABLED' ) => 'disabled' ], [ ( l 'ENABLED' ) => 'enabled' ] ], class => 'input';
<br>
</span>
</p>
@@ -81,7 +81,7 @@
%= l 'iba_HTTPS_Only'
</span><span class=data>
% param 'SSL' => $iba_datas->{SSL} unless param 'SSL';
%= select_field 'SSL' => [[ (l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
%= select_field 'SSL' => [ [ ( l 'DISABLED' ) => 'disabled' ], [ ( l 'ENABLED' ) => 'enabled' ] ], class => 'input';
<br>
</span>
</p>

View File

@@ -4,7 +4,7 @@
<div class="sme-error module"><h5>
Warning: you have not yet changed the default system password.</h5></div>
<% } %>
<% if ( $c->is_unsafe ) { %>
<% if ( $c->is_unsafe && $c->is_logged_in && $c->is_admin) { %>
<div class="sme-error module"><h5>
Warning: a reconfigure and reboot is required before proceeding! Failure to do so now
may leave your system in an unknown state!</h5></div>

View File

@@ -80,10 +80,12 @@
% my $local_network_entry = $localnetwork->key;
% my $csrf_token = "TOKEN"; # CSRF token for security
% $actionRemove = qq{
% <a href="localnetworksd?CsrfDef=$csrf_token&trt=DEL&localnetwork=$local_network_entry">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% <a href="localnetworksd?CsrfDef=$csrf_token&trt=DEL&localnetwork=$local_network_entry"
% class="sme-remove-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$remove_text" aria-label="$remove_text"
% style="background:white;">
% <span class="ui-icon ui-icon-delete"></span>
% <span class="ui-button-text">$remove_text</span>
% </a>
% };
% }

View File

@@ -65,7 +65,7 @@
%= l 'mai_LABEL_SMARTHOST_SMTPAUTH_STATUS'
</span><span class=input>
% param 'SMTPAUTHPROXY_status' => $mai_data->{smtpauthproxystatus} unless param 'SMTPAUTHPROXY_status';
%= select_field 'SMTPAUTHPROXY_status' => [[(l 'DISABLED') => 'disabled'], [(l 'ENABLED') => 'enabled']], class => 'input'
%= select_field 'SMTPAUTHPROXY_status' => [ [ ( l 'DISABLED' ) => 'disabled' ], [ ( l 'ENABLED' ) => 'enabled' ] ], class => 'input';
</span></p>
<p><span class=label>

View File

@@ -26,7 +26,7 @@
%= l 'mai_LABEL_VIRUS_SCAN'
</span><span class=input>
% param 'VirusStatus' => $mai_data->{virusstatus} unless param 'VirusStatus';
%= select_field 'VirusStatus' => [[(l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
%= select_field 'VirusStatus' => [ [ ( l 'DISABLED' ) => 'disabled' ], [ ( l 'ENABLED' ) => 'enabled' ] ], class => 'input';
</span><br></p>
%= l 'mai_DESC_SPAM_SCAN'
@@ -35,7 +35,7 @@
%= l 'mai_LABEL_SPAM_SCAN'
</span><span class=input>
% param 'Spamstatus' => $mai_data->{spamstatus} unless param 'Spamstatus';
%= select_field 'Spamstatus' => [[(l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
%= select_field 'Spamstatus' => [ [ ( l 'DISABLED' ) => 'disabled' ], [ ( l 'ENABLED' ) => 'enabled' ] ], class => 'input';
</span></p>
<p><span class=label>
@@ -63,7 +63,7 @@
%= l 'mai_LABEL_SORTSPAM'
</span><span class=input>
% param 'SpamSortSpam' => $mai_data->{spamsortspam} unless param 'SpamSortSpam';
%= select_field 'SpamSortSpam' => [[(l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
%= select_field 'SpamSortSpam' => [ [ ( l 'DISABLED' ) => 'disabled' ], [ ( l 'ENABLED' ) => 'enabled' ] ], class => 'input';
</span></p>
%= l 'mai_DESC_SPAM_SUBJECT'
@@ -72,7 +72,7 @@
%= l 'mai_LABEL_SPAM_SUBJECTTAG'
</span><span class=input>
% param 'SpamSubjectTag' => $mai_data->{spamsubjecttag} unless param 'SpamSubjectTag';
%= select_field 'SpamSubjectTag' => [[(l 'DISABLED') => 'disabled'], [ (l 'ENABLED') => 'enabled']], class => 'input'
%= select_field 'SpamSubjectTag' => [ [ ( l 'DISABLED' ) => 'disabled' ], [ ( l 'ENABLED' ) => 'enabled' ] ], class => 'input';
</span></p>
<p><span class=label>
@@ -88,7 +88,7 @@
%= l 'mai_LABEL_CONTENT_TO_BLOCK'
</span><span class=input>
% param 'BlockExecutableContent' => $c->get_patterns_current_opt() unless param 'BlockExecutableContent';
%= select_field 'BlockExecutableContent' => $c->get_patterns_opt(), class => 'input', multiple => "1"
%= select_field 'BlockExecutableContent' => $c->get_patterns_opt(), class => 'input', multiple => "1";
</span></p>
%# ....

View File

@@ -142,7 +142,7 @@
%= l 'mai_LABEL_SORT_METHOD'
</span><span class=input>
% param 'SpecifyHeader' => $mai_data->{specifyheader} unless param 'SpecifyHeader';
%= select_field 'SpecifyHeader' => [[(l 'mai_DEFAULT') => 'off'], [(l 'mai_SPECIFY_BELOW') => 'on']], class => 'input'
%= select_field 'SpecifyHeader' => [ [ ( l 'mai_DEFAULT' ) => 'off' ], [ ( l 'mai_SPECIFY_BELOW' ) => 'on' ] ], class => 'input';
</span></p>
<p><span class=label>

View File

@@ -2,14 +2,14 @@
% my %nav = %{ SrvMngr->getNavigation( $c->languages(), 'N' ) };
<div id='navmenu'>
<!-- <a href='#' id='tognav' class='menu-title'>NAVIGATION</a> -->
<!-- <a href='#' id='tognav' class='menu-title'>NAVIGATION</a> ffff-->
<div id='menunav'>
% my $cc = 200;
% foreach my $h (sort { ($nav{$a}{'WEIGHT'}/$nav{$a}{'COUNT'})
% <=> ($nav{$b}{'WEIGHT'}/$nav{$b}{'COUNT'}) } keys %nav) {
%
<!-- div class='section section-title'><%= $h %></div -->
<!-- div class='section section-title'><%= $h %></div gggg-->
<div><a href='#' class='section section-title'><%= $h %></a></div>
<div class='togms'>
% my ( $classNew, $target, $href ) = '';

View File

@@ -2,7 +2,7 @@
% my %nav = %{ SrvMngr->getNavigation( $c->languages(), 'A' ) };
<div id='navigat2'>
<!-- ><div><a href='#' id='togadm' class='menu-title'>ADMINISTRATION</a></div> -->
<!-- <div><a href='#' id='togadm' class='menu-title'>ADMINISTRATION</a></div> dddd-->
<div id='menuadm'>
% my $cc = 100;

View File

@@ -96,10 +96,12 @@
% my $remove_text = l('REMOVE'); # Localized text
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $actionRemove = qq{
% <a href="portforwardingd?CsrfDef=$csrf_token&trt=DEL&sport=$sport&proto=$proto">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% <a href="portforwardingd?CsrfDef=$csrf_token&trt=DEL&sport=$sport&proto=$proto"
% class="sme-remove-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$remove_text" aria-label="$remove_text"
% style="background:white;">
% <span class="ui-icon ui-icon-delete"></span>
% <span class="ui-button-text">$remove_text</span>
% </a>
% };
<%= $c->render_to_string( inline => $actionRemove ) %>

View File

@@ -62,10 +62,12 @@
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $printer_name = $printer->key;
% my $actionRemove = qq{
% <a href="printers2?CsrfDef=$csrf_token&trt=DEL&&printer=$printer_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% <a href="printers2?CsrfDef=$csrf_token&trt=DEL&&printer=$printer_name"
% class="sme-remove-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$remove_text" aria-label="$remove_text"
% style="background:white;">
% <span class="ui-icon ui-icon-delete"></span>
% <span class="ui-button-text">$remove_text</span>
% </a>
% };
<%= $c->render_to_string( inline => $actionRemove ) %>

View File

@@ -61,10 +61,12 @@
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $pseudonyms_entry_name = $pseudonym->key; # pseudonyms_entry name extracted from the data structure
% $actionModify = qq{
% <a href="pseudonyms2?CsrfDef=$csrf_token&trt=UPD&pseudonym=$pseudonyms_entry_name">
% <button type='button' class='sme-modify-button' title='$modify_text' >
% $modify_text
% </button>
% <a href="pseudonyms2?CsrfDef=$csrf_token&trt=UPD&pseudonym=$pseudonyms_entry_name"
% class="sme-modify-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$modify_text" aria-label="$modify_text"
% style="background:white;">
% <span class="ui-icon ui-icon-pencil"></span>
% <span class="ui-button-text">$modify_text</span>
% </a>
% };
% }
@@ -74,10 +76,12 @@
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $pseudonyms_entry_name = $pseudonym->key; # pseudonyms_entry name extracted from the data structure
% $actionRemove = qq{
% <a href="pseudonyms2?CsrfDef=$csrf_token&trt=DEL&pseudonym=$pseudonyms_entry_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% <a href="pseudonyms2?CsrfDef=$csrf_token&trt=DEL&pseudonym=$pseudonyms_entry_name"
% class="sme-remove-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$remove_text" aria-label="$remove_text"
% style="background:white;">
% <span class="ui-icon ui-icon-delete"></span>
% <span class="ui-button-text">$remove_text</span>
% </a>
% };
% }

View File

@@ -35,7 +35,7 @@
%= l 'pse_SELECT_INTERNAL', class => 'label'
</span><span class=data>
% param 'Internal' => $pse_datas->{internal} unless param 'Internal';
%= select_field 'Internal' => [ [(l 'YES') => 'YES'], [(l 'NO') => 'NO'] ], class => 'input'
%= select_field 'Internal' => [ [ ( l 'YES' ) => 'YES' ], [ ( l 'NO' ) => 'NO' ] ], class => 'input';
</span>
</p>

View File

@@ -62,10 +62,12 @@
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $quota_user_name = $user->key; # quotas_entry name extracted from the data structure
% my $actionModify = qq{
% <a href="quotad?CsrfDef=$csrf_token&trt=UPD&user=$quota_user_name">
% <button type='button' class='sme-modify-button' title='$modify_text' >
% $modify_text
% </button>
% <a href="quotad?CsrfDef=$csrf_token&trt=UPD&user=$quota_user_name"
% class="sme-modify-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$modify_text" aria-label="$modify_text"
% style="background:white;">
% <span class="ui-icon ui-icon-pencil"></span>
% <span class="ui-button-text">$modify_text</span>
% </a>
% };
<%= $c->render_to_string( inline => $actionModify ) %>

View File

@@ -9,7 +9,7 @@
% my $cc = 300;
% foreach my $h (sort { ($nav{$a}{'WEIGHT'}/$nav{$a}{'COUNT'})
% <=> ($nav{$b}{'WEIGHT'}/$nav{$b}{'COUNT'}) } keys %nav) {
<!-- div class='section'><%= $h %></div -->
<!-- div class='section'><%= $h %></div> nnnn-->
% my ( $classNew, $target, $href ) = '';
% foreach (sort { $a->{'WEIGHT'} <=> $b->{'WEIGHT'} } @{$nav{$h}{'DESCRIPTIONS'}}) {
% next if ( $_->{'MENUCAT'} ne 'A' && $_->{'MENUCAT'} ne 'U' ); # menu User

View File

@@ -66,53 +66,60 @@
% my $password_text = l("PASSWORD_RESET");
% if ($useraccounts_user_name eq 'admin') {
% $actionModify = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=UPS&user=$useraccounts_user_name">
% <button type='button' class='sme-modify-button' title='$modify_text'>
% $modify_text
% </button>
% <a href="useraccountsd?CsrfDef=$csrf_token&trt=UPS&user=$useraccounts_user_name"
% class="sme-modify-button ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$modify_text" aria-label="$modify_text">
% <span class="ui-icon ui-icon-pencil"></span>
% <span class="ui-button-text">$modify_text</span>
% </a>
% };
% $actionResetPw = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=PWS&user=$useraccounts_user_name">
% <button type='button' class='sme-password-button' title='$password_text' >
% $password_text
% </button>
% <a href="useraccountsd?CsrfDef=$csrf_token&trt=PWS&user=$useraccounts_user_name"
% class="sme-password-button ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$password_text" aria-label="$password_text">
% <span class="ui-icon ui-icon-refresh"></span>
% <span class="ui-button-text">$password_text</span>
% </a>
% };
% } else {
% $actionModify = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=UPD&user=$useraccounts_user_name">
% <button type='button' class='sme-modify-button' title='$modify_text' >
% $modify_text
% </button>
% <a href="useraccountsd?CsrfDef=$csrf_token&trt=UPD&user=$useraccounts_user_name"
% class="sme-modify-button ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$modify_text" aria-label="$modify_text">
% <span class="ui-icon ui-icon-pencil"></span>
% <span class="ui-button-text">$modify_text</span>
% </a>
% };
% }
% if ($password_set ne 'yes') {
% $actionLock = l('ACCOUNT_LOCKED');
% $actionResetPw = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=PWD&user=$useraccounts_user_name">
% <button type='button' class='sme-password-button unset' title="$password_text - currently unset" style = background:pink; >
% $password_text
% </button>
% <a href="useraccountsd?CsrfDef=$csrf_token&trt=PWD&user=$useraccounts_user_name"
% class="sme-password-button unset ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$password_text" aria-label="$password_text"
% style="background:pink;">
% <span class="ui-icon ui-icon-refresh"></span>
% <span class="ui-button-text">$password_text</span>
% </a>
% };
% } elsif ($useraccounts_user_name ne 'admin') {
% my $lock_text = l('ACCOUNT LOCKED'); # Localized text
% my $lock_text = l('LOCK_ACCOUNT'); # Localized text
% my $csrf_token = "TOKEN"; # CSRF token for security
% my $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
% $actionLock = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=LCK&user=$useraccounts_user_name">
% <button type='button' class='sme-lock-button' title='$lock_text' >
% $lock_text
% </button>
% <a href="useraccountsd?CsrfDef=$csrf_token&trt=LCK&user=$useraccounts_user_name"
% class="sme-lock-button ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$lock_text" aria-label="$lock_text">
% <span class="ui-icon ui-icon-locked"></span>
% <span class="ui-button-text">$lock_text</span>
% </a>
% };
% $actionResetPw = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=PWD&user=$useraccounts_user_name">
% <button type='button' class='sme-password-button' title='$password_text' >
% $password_text
% </button>
% <a href="useraccountsd?CsrfDef=$csrf_token&trt=PWD&user=$useraccounts_user_name"
% class="sme-password-button ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$password_text" aria-label="$password_text">
% <span class="ui-icon ui-icon-refresh"></span>
% <span class="ui-button-text">$password_text</span>
% </a>
% };
% }
@@ -120,10 +127,11 @@
% my $remove_text = l('REMOVE'); # Localized text
% my $csrf_token = "TOKEN"; # CSRF token for security
% $actionRemove = qq{
%<a href="useraccountsd?CsrfDef=$csrf_token&trt=DEL&user=$useraccounts_user_name">
% <button type='button' class='sme-remove-button' title='$remove_text' >
% $remove_text
% </button>
% <a href="useraccountsd?CsrfDef=$csrf_token&trt=DEL&user=$useraccounts_user_name"
% class="sme-remove-button ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$remove_text" aria-label="$remove_text">
% <span class="ui-icon ui-icon-trash"></span>
% <span class="ui-button-text">$remove_text</span>
% </a>
% };
% }
@@ -133,10 +141,11 @@
% $csrf_token = "TOKEN"; # CSRF token for security
% $useraccounts_user_name = $user->key; # useraccountss_entry name extracted from the data structure
% $actionroundcube = qq{
%<a href="roundcubepanel?CsrfDef=$csrf_token&url=https://$thisdomain/roundcube?_user=$useraccounts_user_name&height=600px">
% <button type='button' class='sme-email-button' title='$roundcube_text' >
% $roundcube_text
% </button>
% <a href="roundcubepanel?CsrfDef=$csrf_token&url=https://$thisdomain/roundcube?_user=$useraccounts_user_name&height=600px"
% class="sme-email-button ui-button ui-corner-all ui-widget ui-button-icon-only"
% title="$roundcube_text" aria-label="$roundcube_text">
% <span class="ui-icon ui-icon-mail-closed"></span>
% <span class="ui-button-text">$roundcube_text</span>
% </a>
% };
<td class='sme-border' style="min-width:35em">

View File

@@ -14,6 +14,14 @@
%= l 'usr_RESET_DESC2'
</p>
<p>
% my $strength = uc( $usr_datas->{passwdstrength} );
<%= $c->render_to_string( inline => l( 'usr_' . $strength . '_PASSWORD_DESCRIPTION', $usr_datas->{passwdlength} ) ); %>
<br /><br />
<%= $c->render_to_string( inline => l('usr_PASSWORD_WIKI') ) %>
</p>
<p>
<span class=label>
%= l 'PASSWORD_NEW', class => 'label'

View File

@@ -7,6 +7,14 @@
%= l 'usr_SYSTEM_PASSWORD_DESCRIPTION'
</p>
<p>
% my $strength = uc( $usr_datas->{passwdstrength} );
<%= $c->render_to_string( inline => l( 'usr_' . $strength . '_PASSWORD_DESCRIPTION', $usr_datas->{passwdlength} ) ); %>
<br /><br />
<%= $c->render_to_string( inline => l('usr_PASSWORD_WIKI') ) %>
</p>
<p>
<span class=label>
%= l 'usr_CURRENT_SYSTEM_PASSWORD', class => 'label'

View File

@@ -105,7 +105,7 @@
%= l 'usr_VPN_CLIENT_ACCESS'
</span><span class=data>
% param 'VPNClientAccess' => $usr_datas->{vpnclientaccess} unless param 'VPNClientAccess';
%= select_field 'VPNClientAccess' => [[ (l 'NO') => 'no'], [ (l 'YES') => 'yes']], class => 'input'
%= select_field 'VPNClientAccess' => [ [ ( l 'NO' ) => 'no' ], [ ( l 'YES' ) => 'yes' ] ], class => 'input';
</span>
</p>

View File

@@ -57,7 +57,7 @@
%= l 'usr_VPN_CLIENT_ACCESS'
</span><span class=data>
% param 'VPNClientAccess' => $usr_datas->{vpnclientaccess} unless param 'VPNClientAccess';
%= select_field 'VPNClientAccess' => [[ (l 'NO') => 'no'], [ (l 'YES') => 'yes']], class => 'input'
%= select_field 'VPNClientAccess' => [ [ ( l 'NO' ) => 'no' ], [ ( l 'YES' ) => 'yes' ] ], class => 'input';
</span>
</p>

View File

@@ -5,11 +5,8 @@
% if (config->{debug} == 1) {
<p>
%= dumper "<pf>".$c->current_route
%= dumper $c->stash("ret")
%= dumper $c->stash("portforwarding")
% my $ref = $pf_datas->{portforwarding};
%= dumper $ref->{TCP}->[0]."</pf>"
%= dumper $c->current_route
%= dumper $pf_datas
</p>
% }

View File

@@ -21,7 +21,7 @@
%= l 'prx_HTTP_PROXY_STATUS_LABEL'
</span><span class=data>
% param 'http_proxy_status' => $prx_datas->{http_proxy_status} unless param 'http_proxy_status';
%= select_field 'http_proxy_status' => [[ (l 'ENABLED') => 'enabled'], [ (l 'DISABLED') => 'disabled']], class => 'input', id => 'htproxstat'
%= select_field 'http_proxy_status' => [ [ ( l 'ENABLED' ) => 'enabled' ], [ ( l 'DISABLED' ) => 'disabled' ] ], class => 'input', id => 'htproxstat';
</span>
</p>
% if ( $prx_datas->{smtp_proxy_status} ) {
@@ -32,7 +32,7 @@
%= l 'prx_SMTP_PROXY_STATUS_LABEL'
</span><span class=data>
% param 'smtp_proxy_status' => $prx_datas->{smtp_proxy_status} unless param 'smtp_proxy_status';
%= select_field 'smtp_proxy_status' => [[ (l 'ENABLED') => 'transparent'], [ (l 'DISABLED') => 'disabled'], [ (l 'prx_BLOCKED') => 'blocked']], class => 'input', id => 'smproxstat', default => $prx_datas->{smtp_proxy_status}
%= select_field 'smtp_proxy_status' => [ [ ( l 'ENABLED' ) => 'transparent' ], [ ( l 'DISABLED' ) => 'disabled' ], [ ( l 'prx_BLOCKED' ) => 'blocked' ] ], class => 'input', id => 'smproxstat', default => $prx_datas->{smtp_proxy_status};
<br><br>
</span>
</p>

View File

@@ -33,7 +33,7 @@
<span class=label>
%= label_for email_address => 'Email Address:'
</span><span class=data>
%= email_field 'email_address', placeholder => 'Enter email address', id => 'email_address_group'
%= email_field 'email_address', placeholder => 'Enter email address', id => 'email_address_group';
</span>
</div>

View File

@@ -134,7 +134,7 @@
%= l 'rma_LABEL_SSH_ADMIN'
</span><span class=data>
% param 'SshPermitRootLogin' => $rma_datas->{sshPermitRootLogin} unless param 'SshPermitRootLogin';
%= select_field 'SshPermitRootLogin' => [[(l 'NO'), 'no'], [(l 'YES'), 'yes']], class => 'input'
%= select_field 'SshPermitRootLogin' => [ [ ( l 'NO' ), 'no' ], [ ( l 'YES' ), 'yes' ] ], class => 'input';
</span>
<br>
@@ -142,7 +142,7 @@
%= l 'rma_LABEL_SSH_PASSWORD_ACCESS'
</span><span class=data>
% param 'SshPasswordAuthentication' => $c->get_ssh_password_auth() unless param 'SshPasswordAuthentication';
%= select_field 'SshPasswordAuthentication' => [[(l 'NO'), 'no'], [(l 'YES'), 'yes']], class => 'input'
%= select_field 'SshPasswordAuthentication' => [ [ ( l 'NO' ), 'no' ], [ ( l 'YES' ), 'yes' ] ], class => 'input';
</span>
<br>

View File

@@ -27,7 +27,9 @@
%= $c->render_to_string( inline => l('pwd_DESCRIPTION') );
<p>
<%= $c->render_to_string( inline => l('pwd_PASSWORD_DESCRIPTION')) %><br />
% my $strength = uc( $pwd_datas->{passwdstrength} );
<%= $c->render_to_string( inline => l( 'pwd_' . $strength . '_PASSWORD_DESCRIPTION', $pwd_datas->{passwdlength} ) ); %>
<br /><br />
<%= $c->render_to_string( inline => l('pwd_PASSWORD_WIKI') ) %>
</p>

View File

@@ -54,7 +54,7 @@
% if ($log_datas->{'default_op'} eq 'download') {
% param 'Operation' => 'download';
% }
%= select_field 'Operation' => [[(l 'log_VIEW') => 'view'],[(l 'DOWNLOAD') => 'download']], class => 'input'
%= select_field 'Operation' => [ [ ( l 'log_VIEW' ) => 'view' ], [ ( l 'DOWNLOAD' ) => 'download' ] ], class => 'input';
</span>
</p>

View File

@@ -14,8 +14,7 @@
<h1><%= $title %></h1>
<br>
<%= $modul %>
<% my $btn = l('SAVE');
%>
<% my $btn = l('SAVE'); %>
%= form_for 'workgroup' => ( method => 'POST' ) => begin
<p>
@@ -24,7 +23,7 @@
<span class=label>
%= l 'wkg_LABEL_WORKGROUP', class => 'label'
</span><span class=data>
%= text_field 'Workgroup' => $wkg_datas->{Workgroup}, class => 'input' , pattern=>".{1,15}", title=>"Limited to 15 characters by the NETBIOS"
%= text_field 'Workgroup' => $wkg_datas->{Workgroup}, class => 'input', pattern => ".{1,15}", title => "Limited to 15 characters by the NETBIOS";
</span>
</p>
<p>
@@ -43,7 +42,7 @@
%= l 'wkg_LABEL_PDC', class => 'label'
</span><span class=data>
% param 'ServerRole' => $wkg_datas->{ServerRole} unless param 'ServerRole';
%= select_field 'ServerRole' => [[ (l 'YES') => 'PDC'], [ (l 'NO') => 'WS']], class => 'input'
%= select_field 'ServerRole' => [ [ ( l 'YES' ) => 'PDC' ], [ ( l 'NO' ) => 'WS' ] ], class => 'input';
</span>
</p>
<p>
@@ -53,7 +52,7 @@
%= l 'wkg_LABEL_ROAM', class => 'label'
</span><span class=data>
% param 'RoamingProfiles' => $wkg_datas->{RoamingProfiles} unless param 'RoamingProfiles';
%= select_field 'RoamingProfiles' => [[ (l 'YES') => 'yes'], [ (l 'NO') => 'no']], class => 'input'
%= select_field 'RoamingProfiles' => [ [ ( l 'YES' ) => 'yes' ], [ ( l 'NO' ) => 'no' ] ], class => 'input';
</span>
</p>
<p>

View File

@@ -34,7 +34,7 @@
%= l 'yum_LABEL_YUM_PACKAGEFUNCTIONS'
</span><span class=data>
% param 'yum_PackageFunctions' => $c->get_status('PackageFunctions') unless param 'yum_PackageFunctions';
%= select_field 'yum_PackageFunctions' => [[ $c->l('DISABLED') => 'disabled'], [ $c->l('ENABLED') => 'enabled']]
%= select_field 'yum_PackageFunctions' => [ [ $c->l('DISABLED') => 'disabled' ], [ $c->l('ENABLED') => 'enabled' ] ];
</span></p>
<br>
@@ -44,7 +44,7 @@
%= l 'yum_LABEL_ENABLED_REPOSITORIES'
</span><span class=data>
% param 'SelectedRepositories' => $c->get_repository_current_options() unless param 'SelectedRepositories';
%= select_field 'SelectedRepositories' => $c->get_repository_options2(), class => 'input', multiple => '1'
%= select_field 'SelectedRepositories' => $c->get_repository_options2(), class => 'input', multiple => '1';
</span></p>
<br>
@@ -54,7 +54,7 @@
%= l 'yum_LABEL_YUM_DELTARPMPROCESS'
</span><span class=data>
% param 'yum_DeltaRpmProcess' => $c->get_status('DeltaRpmProcess') unless param 'yum_DeltaRpmProcess';
%= select_field 'yum_DeltaRpmProcess' => [[ $c->l('DISABLED') => 'disabled'], [ $c->l('ENABLED') => 'enabled']]
%= select_field 'yum_DeltaRpmProcess' => [ [ $c->l('DISABLED') => 'disabled' ], [ $c->l('ENABLED') => 'enabled' ] ];
</span></p>
<br>
@@ -64,7 +64,7 @@
%= l 'yum_LABEL_YUM_DOWNLOADONLY'
</span><span class=data>
% param 'yum_DownloadOnly' => $c->get_status('DownloadOnly') unless param 'yum_DownloadOnly';
%= select_field 'yum_DownloadOnly' => [[ $c->l('DISABLED') => 'disabled'], [ $c->l('ENABLED') => 'enabled']]
%= select_field 'yum_DownloadOnly' => [ [ $c->l('DISABLED') => 'disabled' ], [ $c->l('ENABLED') => 'enabled' ] ];
</span></p>
<br>
@@ -74,7 +74,7 @@
%= l 'yum_LABEL_YUM_AUTOINSTALLUPDATES'
</span><span class=data>
% param 'yum_AutoInstallUpdates' => $c->get_status('AutoInstallUpdates') unless param 'yum_AutoInstallUpdates';
%= select_field 'yum_AutoInstallUpdates' => [[ $c->l('DISABLED') => 'disabled'], [ $c->l('ENABLED') => 'enabled']]
%= select_field 'yum_AutoInstallUpdates' => [ [ $c->l('DISABLED') => 'disabled' ], [ $c->l('ENABLED') => 'enabled' ] ];
</span></p>
%= hidden_field 'trt' => 'CONF'

View File

@@ -29,7 +29,7 @@
%= l 'yum_LABEL_AVAILABLE_GROUPS'
</span><span class=data>
% param 'SelectedGroups' => $c->get_names2( 'updates', 'group' ) unless param 'SelectedGroups';
%= select_field 'SelectedGroups' => $c->get_options2('available', 'group'), class => 'input', multiple => "1"
%= select_field 'SelectedGroups' => $c->get_options2( 'available', 'group' ), class => 'input', multiple => "1";
</span></p>
% }
<br>
@@ -39,7 +39,7 @@
%= l 'yum_LABEL_AVAILABLE_PACKAGES'
</span><span class=data>
% param 'SelectedPackages' => $c->get_names2( 'updates', 'package' ) unless param 'SelectedPackages';
%= select_field 'SelectedPackages' => $c->get_options2('available', 'package'), class => 'input', multiple => "1"
%= select_field 'SelectedPackages' => $c->get_options2( 'available', 'package' ), class => 'input', multiple => "1";
</span></p>
% }

View File

@@ -29,7 +29,7 @@
<p><span class=label>
%= l 'yum_LABEL_INSTALLED_GROUPS'
</span><span class=data>
%= select_field 'SelectedGroups' => $c->get_options2('installed', 'group'), class => 'input', multiple => "1"
%= select_field 'SelectedGroups' => $c->get_options2( 'installed', 'group' ), class => 'input', multiple => "1";
</span></p>
% }
<br>
@@ -38,7 +38,7 @@
<p><span class=label>
%= l 'yum_LABEL_INSTALLED_PACKAGES'
</span><span class=data>
%= select_field 'SelectedPackages' => $c->get_options2('installed', 'package'), class => 'input', multiple => "1"
%= select_field 'SelectedPackages' => $c->get_options2( 'installed', 'package' ), class => 'input', multiple => "1";
</span></p>
% }

View File

@@ -26,7 +26,7 @@
%= l 'yum_LABEL_AVAILABLE_UPDATES'
</span><span class=data>
% param 'SelectedPackages' => $c->get_names2( 'updates', 'package' ) unless param 'SelectedPackages';
%= select_field 'SelectedPackages' => $c->get_options2('updates', 'package'), class => 'input', multiple => "1"
%= select_field 'SelectedPackages' => $c->get_options2( 'updates', 'package' ), class => 'input', multiple => "1";
</span></p>
<!-- $c->print_skip_header() -->

View File

View File

@@ -1,8 +1,8 @@
Summary: Sme server navigation module : manager 2
Summary: Sme Server Configuration : Manager 2
%define name smeserver-manager
Name: %{name}
%define version 11.0.0
%define release 109
%define release 127
Version: %{version}
Release: %{release}%{?dist}
License: GPL
@@ -17,7 +17,7 @@ BuildRequires: smeserver-devtools
#BuildRequires: perl >= 0:5.016
#BuildRequires: perl(Test::More)
#BuildRequires: perl(Test::Mojo)
#BuildRequires: perl(Mojolicious) >= 7.56
#BuildRequires: perl(Mojolicious) >= 9.39
#BuildRequires: perl(Mojolicious::Plugin::I18N) >= 1.6
#BuildRequires: perl(Net::Netmask) >= 1.9
#</Build tests>
@@ -35,10 +35,11 @@ Requires: perl(Mojolicious::Plugin::CSRFDefender) >= 0.0.8
Requires: perl(Net::Netmask) >= 1.9
Requires: perl(DBM::Deep) >= 2.0011-1
Requires: perl(Mojo::JWT) >= 0.08-1
#Requires: perl(IPS:Run) >= 0.99-1 - needed for enahnced qmailanalog run of pflogsumm
#Requires: perl(Time::TAI64) >= 2.11
Requires: perl(Data::Validate::IP)
Requires: mutt >= 1.5.21
Requires: smeserver-manager-jsquery >= 1.0
Requires: smeserver-manager-jsquery >= 11.0.0-11
Requires: smeserver-certificates >= 11.0
#Requires: js-jquery > 2.2.4-3 (optional)
@@ -146,6 +147,63 @@ true
%defattr(-,root,root)
%changelog
* Tue Nov 04 2025 Brian Read <brianr@koozali.org> 11.0.0-127.sme
- Move same var declations to outside innner scope [SME: 13073]
* Tue Nov 04 2025 Brian Read <brianr@koozali.org> 11.0.0-126.sme
- Remove debugging dump in portforwarding which crashes if no data [SME: 13243]
* Mon Nov 03 2025 Brian Read <brianr@koozali.org> 11.0.0-125.sme
- Arrange that Macaddress, InternalIP and comment cleared out when host entry switched to self [SME: 13207]
* Fri Oct 24 2025 Brian Read <brianr@koozali.org> 11.0.0-124.sme
- Adjust CSS for logout button to remove overlap of border and rounding [SME: 13247]
* Fri Oct 24 2025 Brian Read <brianr@koozali.org> 11.0.0-123.sme
- Take out references to js/jquery files now incorporated in the datatables.min.js [SME:13253]
* Tue Oct 21 2025 Brian Read <brianr@koozali.org> 11.0.0-122.sme
- Correct code to only show user panels when AdminPanels property is empty or non existent [SME: 13082]
* Sat Sep 27 2025 Brian Read <brianr@koozali.org> 11.0.0-121.sme
- Sort out ftp public setting [SME: 13194]
* Thu Sep 25 2025 Brian Read <brianr@koozali.org> 11.0.0-120.sme
- Add CSS for multiple result buttons on panel - used by wireguard[SME: 13185]
* Thu Sep 25 2025 Brian Read <brianr@koozali.org> 11.0.0-119.sme
- Change submit button disable/message as method as current method does not send name back as parameter [SME: 13184]
* Thu Sep 25 2025 Brian Read <brianr@koozali.org> 11.0.0-118.sme
- Remove inline style for legacy panel [SME: 13177]
* Wed Sep 24 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-117.sme
- set correctly X-Forwarded-Proto for TKT auth [SME: 13175]
updated CSP for smanager
* Mon Sep 15 2025 Brian Read <brianr@koozali.org> 11.0.0-116.sme
- Fix other buttons in lists for elinks [SME: 13113]
* Sat Sep 13 2025 Brian Read <brianr@koozali.org> 11.0.0-115.sme
- Fix login and logout and user table buttons so that they are valid html and work for elinks [SME: 13113]
* Sat Sep 13 2025 Brian Read <brianr@koozali.org> 11.0.0-114.sme
- edit intial screen to suppress reconfig message unless admin logged in [SME: 13112]
* Mon Aug 11 2025 Brian Read <brianr@koozali.org> 11.0.0-113.sme
- Re-factor all template files to make them nicely formatted [SME: 13103]
* Thu Aug 07 2025 Brian Read <brianr@koozali.org> 11.0.0-112.sme
- Fix sprintf fail in viewlogfiles when % in log line [SME: 13099]
- Fix reboot/shutdown failure - reported by Massimo - fixed by JC [SME: 13097]
* Mon Jul 28 2025 Brian Read <brianr@koozali.org> 11.0.0-111.sme
- Add password strength details to password panels [SME: 13081]
* Sat Jul 26 2025 Brian Read <brianr@koozali.org> 11.0.0-110.sme
- Get cifs workstation backup restore to show backup sets [SME: 12645]
Add lex file for roundcubepanel to provide lex environment for lex strings
* Wed Jul 16 2025 Brian Read <brianr@koozali.org> 11.0.0-109.sme
- A few more error message corrections [SME: 13078]