Compare commits

...

4 Commits

Author SHA1 Message Date
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
121 changed files with 5365 additions and 5270 deletions

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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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

@@ -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 113
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>
@@ -146,6 +146,20 @@ true
%defattr(-,root,root)
%changelog
* 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]