Compare commits
	
		
			14 Commits
		
	
	
		
			11_0_0-16_
			...
			11_0_0-28_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e5b9a012d9 | |||
| fbdf3170ec | |||
| 87d1d072c0 | |||
| d49db26f26 | |||
| c4f9d67abc | |||
| fe62bd3e39 | |||
| df6d21dbc9 | |||
| 9c9592f861 | |||
| 4d2097d2da | |||
| 44a9ecc0e1 | |||
| 785ebcfaaf | |||
| 127ea74a8b | |||
| b9f6392c1d | |||
| 659f060eb6 | 
| @@ -40,5 +40,10 @@ | ||||
|             $OUT .= "        Require ip $localAccess $externalSSLAccess\n"; | ||||
|         } | ||||
|         $OUT .= "    </Location>\n"; | ||||
|         # prevent caching of manager files in browser | ||||
|         $OUT .= "   <LocationMatch \"/$place/.+\.(html|cgi)\$\">\n"; | ||||
|         $OUT .= "                   Header set Cache-Control no-store\n"; | ||||
|         $OUT .= "   </LocationMatch>\n"; | ||||
|  | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -67,5 +67,21 @@ hr.sme-copyrightbar { | ||||
| color: #8ebe43; | ||||
| background-color: #8ebe43; | ||||
|     } | ||||
|        | ||||
| /* flag container no flag */ | ||||
| #flag-container span { | ||||
|   font-size: 24px; | ||||
| } | ||||
|  | ||||
| .fallback-box { | ||||
|   display: inline-block; /* Make it inline-block to fit around the content */ | ||||
|   border: 2px solid gray; /* Change the border color as desired */ | ||||
|   padding: 10px; /* Add some padding */ | ||||
|   border-radius: 10px; /* Round the corners of the box */ | ||||
|   font-size: 60px; /* Adjust size if needed */ | ||||
|   margin-top: 10px; /* Add some margin */ | ||||
|   text-align: center; /* Center text inside the box */ | ||||
| } | ||||
|  | ||||
| HERE | ||||
| } | ||||
|   | ||||
| @@ -25,8 +25,16 @@ use SrvMngr::Plugin::I18N; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr::Model::Main; | ||||
|  | ||||
| use SrvMngr::Plugin::WithoutCache; | ||||
|  | ||||
| our $VERSION = '1.420'; | ||||
| #this is overwrittrn with the "release" by the spec file - release can be "99.el8.sme" | ||||
| our $VERSION = '';  | ||||
| #Extract the release value | ||||
| if ($VERSION =~ /^(\d+)/) { | ||||
|     $VERSION = $1;  # $1 contains the matched numeric digits | ||||
| } else { | ||||
|     $VERSION = '999' #No leading numeric digits found | ||||
| } | ||||
| $VERSION = eval $VERSION; | ||||
|  | ||||
| use Exporter 'import'; | ||||
| @@ -210,6 +218,8 @@ sub setup_plugins { | ||||
|     $self->plugin('TagHelpers'); | ||||
|  | ||||
|     $self->plugin('RenderFile'); | ||||
|      | ||||
|     $self->plugin('SrvMngr::Plugin::WithoutCache'); | ||||
|  | ||||
|     # CSRF protection if production mode | ||||
| #    $self->plugin('Mojolicious::Plugin::CSRFDefender' => { | ||||
|   | ||||
| @@ -12,6 +12,9 @@ use strict; | ||||
| use warnings; | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
|  | ||||
| use constant FALSE => 0; | ||||
| use constant TRUE  => 1; | ||||
|  | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
|  | ||||
| @@ -36,7 +39,7 @@ sub main { | ||||
|     my $title = $c->l('mai_FORM_TITLE'); | ||||
|  | ||||
|     $mai_datas{'trt'} = 'LIST'; | ||||
|     $mai_datas{fetchmailmethod} = $cdb->get_prop('fetchmail', 'Method'); | ||||
|     $mai_datas{fetchmailmethod} = $c->l($cdb->get_prop('fetchmail', 'Method')); | ||||
|  | ||||
|     $c->stash( title => $title, notif => '', mai_datas => \%mai_datas ); | ||||
|     $c->render(template => 'emailsettings'); | ||||
| @@ -56,13 +59,16 @@ sub do_display { | ||||
|     my ($notif, $dest) = ''; | ||||
|  | ||||
|     $mai_datas{'trt'} = $trt; | ||||
| 	$cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|  | ||||
|         if ( $trt eq 'ACC' ) { | ||||
| 	    $dest = 'emailaccess'; | ||||
| 	    $mai_datas{fetchmailmethod} = $cdb->get_prop('fetchmail', 'Method'); | ||||
|         } | ||||
| 	if ( $trt eq 'ACC' )  | ||||
|     { | ||||
| 		$dest = 'emailaccess'; | ||||
| 		$mai_datas{fetchmailmethod} = $cdb->get_prop('fetchmail', 'Method'); | ||||
|     } | ||||
|  | ||||
|         if ( $trt eq 'FIL' ) { | ||||
|     if ( $trt eq 'FIL' )  | ||||
|     { | ||||
| 	    $dest = 'emailfilter'; | ||||
| 	    $mai_datas{'virusstatus'} = $c->get_virus_status(); | ||||
| 	    $mai_datas{'spamstatus'} = $cdb->get_prop('spamassassin', 'status'); | ||||
| @@ -72,9 +78,10 @@ sub do_display { | ||||
| 	    $mai_datas{spamsortspam} = $cdb->get_prop('spamassassin', 'SortSpam'); | ||||
| 	    $mai_datas{spamsubjecttag} = $cdb->get_prop('spamassassin', 'SubjectTag'); | ||||
| 	    $mai_datas{spamsubject} = $cdb->get_prop('spamassassin', 'Subject'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|         if ( $trt eq 'REC' ) { | ||||
|     if ( $trt eq 'REC' )  | ||||
|     { | ||||
| 	    $dest = 'emailreceive'; | ||||
| 	    $mai_datas{fetchmailmethod} = $cdb->get_prop('fetchmail', 'Method'); | ||||
| 	    $mai_datas{freqoffice} = $cdb->get_prop('fetchmail', 'FreqOffice'); | ||||
| @@ -86,9 +93,10 @@ sub do_display { | ||||
| 	    $mai_datas{specifyheader} = get_secondary_mail_use_envelope(); | ||||
| 	    $mai_datas{secondarymailenvelope} = $cdb->get_prop('fetchmail', 'SecondaryMailEnvelope'); | ||||
|  | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|         if ( $trt eq 'DEL' ) { | ||||
|     if ( $trt eq 'DEL' )  | ||||
|     { | ||||
| 	    $dest = 'emaildeliver'; | ||||
| 	    $mai_datas{emailunknownuser} = $cdb->get_value('EmailUnknownUser') || '"returntosender'; | ||||
| 	    $mai_datas{delegatemailserver} = $cdb->get_value('DelegateMailServer'); | ||||
| @@ -96,7 +104,7 @@ sub do_display { | ||||
| 	    $mai_datas{smtpauthproxystatus} = $cdb->get_prop('smtp-auth-proxy', 'status') || 'disabled'; | ||||
| 	    $mai_datas{smtpauthproxyuserid} = $cdb->get_prop('smtp-auth-proxy', 'Userid') || ''; | ||||
| 	    $mai_datas{smtpauthproxypassword} = $cdb->get_prop('smtp-auth-proxy', 'Passwd') || ''; | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|  | ||||
|     $c->stash( title => $title, notif => $notif, mai_datas => \%mai_datas ); | ||||
| @@ -115,103 +123,113 @@ sub do_update { | ||||
|  | ||||
|     my %mai_datas = (); | ||||
|     $mai_datas{trt} = $trt; | ||||
| 	$cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|  | ||||
|     my $title = $c->l('mai_FORM_TITLE'); | ||||
|  | ||||
|     my ($dest, $res, $result) = ''; | ||||
|  | ||||
|     if ( $trt eq 'ACC' ) { | ||||
|     if ( $trt eq 'ACC' )  | ||||
|     { | ||||
|      	$dest = 'emailaccess'; | ||||
| 			#	$mai_datas{xxx}	= $c->param('XXX'); | ||||
| 			 | ||||
| 			# controls | ||||
| 			#	$res = xxxxxxx( $c ); | ||||
| 			#	$result .= $res unless $res eq 'OK'; | ||||
|  | ||||
| 	$dest = 'emailaccess'; | ||||
| #	$mai_datas{xxx}	= $c->param('XXX'); | ||||
| 			if ( ! $result )  | ||||
| 			{ | ||||
| 	    	$res = $c->change_settings_access(); | ||||
| 	    	$result .= $res unless $res eq 'OK'; | ||||
| 	    	if ( ! $result )  | ||||
| 				{  | ||||
| 					$result = $c->l('mai_SUCCESS');  | ||||
|     		} | ||||
| 			} | ||||
|    	} | ||||
|  | ||||
| 	# controls | ||||
| #	$res = xxxxxxx( $c ); | ||||
| #	$result .= $res unless $res eq 'OK'; | ||||
|     if ( $trt eq 'FIL' )  | ||||
| 			{ | ||||
| 			$dest = 'emailfilter'; | ||||
| 			#	$mai_datas{xxx}	= $c->param('XXX'); | ||||
| 			 | ||||
| 			# controls | ||||
| 			#	$res = zzzzzz( $c ); | ||||
| 			#	$result .= $res unless $res eq 'OK'; | ||||
|  | ||||
| 	if ( ! $result ) { | ||||
| 	    $res = $c->change_settings_access(); | ||||
| 	    $result .= $res unless $res eq 'OK'; | ||||
| 	    if ( ! $result ) {  | ||||
| 		$result = $c->l('mai_SUCCESS');  | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
| 			if ( ! $result )  | ||||
| 			{ | ||||
| 	    	$res = $c->change_settings_filtering(); | ||||
| 	    	$result .= $res unless $res eq 'OK'; | ||||
| 	    	if ( ! $result )  | ||||
| 				{  | ||||
| 					$result = $c->l('mai_SUCCESS');  | ||||
|     		} | ||||
| 			} | ||||
|    	} | ||||
|  | ||||
|     if ( $trt eq 'FIL' ) { | ||||
|     if ( $trt eq 'REC' )  | ||||
| 		{ | ||||
| 			$dest = 'emailreceive'; | ||||
| 			#	$mai_datas{xxx}	= $c->param('XXX'); | ||||
| 			 | ||||
| 			# controls | ||||
| 			#	$res = yyyyyyyyy( $c ); | ||||
| 			#	$result .= $res unless $res eq 'OK'; | ||||
|  | ||||
| 	$dest = 'emailfilter'; | ||||
| #	$mai_datas{xxx}	= $c->param('XXX'); | ||||
| 			if ( ! $result )  | ||||
| 			{ | ||||
| 	    	$res = $c->change_settings_reception(); | ||||
| 	    	$result .= $res unless $res eq 'OK'; | ||||
| 	    	if ( ! $result )  | ||||
| 				{  | ||||
| 					$result = $c->l('mai_SUCCESS');  | ||||
|     		} | ||||
| 			} | ||||
|    	} | ||||
|  | ||||
| 	# controls | ||||
| #	$res = zzzzzz( $c ); | ||||
| #	$result .= $res unless $res eq 'OK'; | ||||
|     if ( $trt eq 'DEL' )  | ||||
| 		{ | ||||
| 			$dest = 'emaildeliver'; | ||||
| 			#	$mai_datas{xxx}	= $c->param('XXX'); | ||||
| 			 | ||||
| 			# controls | ||||
| 			$res = $c->ip_number_or_blank( $c->param('DelegateMailServer') ); | ||||
| 			$result .= $res . ' DMS <br>' unless $res eq 'OK'; | ||||
|  | ||||
| 	if ( ! $result ) { | ||||
| 	    $res = $c->change_settings_filtering(); | ||||
| 	    $result .= $res unless $res eq 'OK'; | ||||
| 	    if ( ! $result ) {  | ||||
| 		$result = $c->l('mai_SUCCESS');  | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
| 			$res = $c->validate_smarthost( $c->param('SMTPSmartHost') ); | ||||
| 			$result .= $res . ' SH <br>' unless $res eq 'OK'; | ||||
|  | ||||
|     if ( $trt eq 'REC' ) { | ||||
| 			$res = $c->nonblank_if_smtpauth( $c->param('SMTPSmartHost') ); | ||||
| 			$result .= $res . ' SH <br>' unless $res eq 'OK'; | ||||
|  | ||||
| 	$dest = 'emailreceive'; | ||||
| #	$mai_datas{xxx}	= $c->param('XXX'); | ||||
| 			$res = $c->nonblank_if_smtpauth( $c->param('SMTPAUTHPROXY_Userid') ); | ||||
| 			$result .= $res . ' USR <br>' unless $res eq 'OK'; | ||||
|  | ||||
| 	# controls | ||||
| #	$res = yyyyyyyyy( $c ); | ||||
| #	$result .= $res unless $res eq 'OK'; | ||||
| 			$res = $c->nonblank_if_smtpauth( $c->param('SMTPAUTHPROXY_Passwd') ); | ||||
| 			$result .= $res . ' PWD <br>' unless $res eq 'OK'; | ||||
|  | ||||
| 	if ( ! $result ) { | ||||
| 	    $res = $c->change_settings_reception(); | ||||
| 	    $result .= $res unless $res eq 'OK'; | ||||
| 	    if ( ! $result ) {  | ||||
| 		$result = $c->l('mai_SUCCESS');  | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
|  | ||||
|     if ( $trt eq 'DEL' ) { | ||||
|  | ||||
| 	$dest = 'emaildeliver'; | ||||
| #	$mai_datas{xxx}	= $c->param('XXX'); | ||||
|  | ||||
| 	# controls | ||||
| 	$res = $c->ip_number_or_blank( $c->param('DelegateMailServer') ); | ||||
| 	$result .= $res . ' DMS <br>' unless $res eq 'OK'; | ||||
|  | ||||
| 	$res = $c->validate_smarthost( $c->param('SMTPSmartHost') ); | ||||
| 	$result .= $res . ' SH <br>' unless $res eq 'OK'; | ||||
|  | ||||
| 	$res = $c->nonblank_if_smtpauth( $c->param('SMTPSmartHost') ); | ||||
| 	$result .= $res . ' SH <br>' unless $res eq 'OK'; | ||||
|  | ||||
| 	$res = $c->nonblank_if_smtpauth( $c->param('SMTPAUTHPROXY_Userid') ); | ||||
| 	$result .= $res . ' USR <br>' unless $res eq 'OK'; | ||||
|  | ||||
| 	$res = $c->nonblank_if_smtpauth( $c->param('SMTPAUTHPROXY_Passwd') ); | ||||
| 	$result .= $res . ' PWD <br>' unless $res eq 'OK'; | ||||
|  | ||||
| 	if ( ! $result ) { | ||||
| 	    $res = $c->change_settings_delivery(); | ||||
| 	    $result .= $res unless $res eq 'OK'; | ||||
| 	    if ( ! $result ) {  | ||||
| 		$result = $c->l('mai_SUCCESS'); | ||||
| 	    } | ||||
| 	} | ||||
|     } | ||||
| 			if ( ! $result )  | ||||
| 			{ | ||||
| 				$res = $c->change_settings_delivery(); | ||||
| 				$result .= $res unless $res eq 'OK'; | ||||
| 				if ( ! $result )  | ||||
| 				{  | ||||
| 					$result = $c->l('mai_SUCCESS'); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
|  | ||||
|     # common part | ||||
|  | ||||
|     if ($res ne 'OK') { | ||||
| 	$c->stash( error => $result ); | ||||
| 	$c->stash( title => $title, mai_datas => \%mai_datas ); | ||||
| 	return $c->render( $dest ); | ||||
|     } | ||||
|     if ($res ne 'OK')  | ||||
| 			{ | ||||
| 			$c->stash( error => $result ); | ||||
| 			$c->stash( title => $title, mai_datas => \%mai_datas ); | ||||
| 			return $c->render( $dest ); | ||||
|     	} | ||||
|  | ||||
|     my $message = "emailsettings updates $trt DONE"; | ||||
|     $c->app->log->info($message); | ||||
| @@ -221,7 +239,6 @@ sub do_update { | ||||
|  | ||||
| }; | ||||
|  | ||||
|  | ||||
| sub get_virus_status { | ||||
|  | ||||
|     my ($c, $localise) = @_; | ||||
| @@ -249,10 +266,10 @@ sub localise_status { | ||||
| } | ||||
|  | ||||
|  | ||||
| sub get_prop { | ||||
| sub get_db_prop { | ||||
|  | ||||
|     my ($c, $item, $prop, $default) = @_; | ||||
|  | ||||
|      | ||||
|     return $cdb->get_prop($item, $prop) || $default; | ||||
| } | ||||
|  | ||||
| @@ -364,6 +381,48 @@ sub get_current_imap_access { | ||||
| } | ||||
|  | ||||
|  | ||||
| sub get_current_smtp_ssl_auth { | ||||
|     my ($c, $localise, $soru, $debug) = @_; | ||||
|     die "Error: \$soru must be either 's' or 'u':$soru.\n" unless $soru eq 's' || $soru eq 'u'; | ||||
| 	 | ||||
| 	$cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|  | ||||
|     # Initialize variables with default values | ||||
|     my $smtpStatus = 'none'; | ||||
|     my $smtpAccess = 'none'; | ||||
|     my $smtpAuth = 'disabled';  # assuming 'disabled' as a default | ||||
|      | ||||
|      | ||||
|  | ||||
|     # Fetch SMTP settings based on the value of `$soru` | ||||
|     if ($soru eq "u") { | ||||
|         $smtpStatus = $cdb->get_prop('uqpsmtpd', 'status') || 'enabled'; # Fetch from uqpsmtpd | ||||
|         $smtpAccess = $cdb->get_prop('uqpsmtpd', 'access') || 'public'; | ||||
|         $smtpAuth = 'enabled'; # Assuming authentication is enabled in this context | ||||
|     } else {  | ||||
|         $smtpStatus = $cdb->get_prop('sqpsmtpd', 'status') || 'enabled';  # Fetch from sqpsmtpd | ||||
|         $smtpAccess = $cdb->get_prop('sqpsmtpd', 'access') || 'public';  | ||||
|         $smtpAuth = 'enabled';  # Assuming authentication is enabled in this context | ||||
|     } | ||||
|      | ||||
|     # Retrieve SMTP SSL authentication options | ||||
|     my $options = $c->get_smtp_ssl_auth_options(); | ||||
|  | ||||
|      | ||||
|     if ($soru eq "u" && $debug ) { | ||||
| 		$c->stash('smtp'=>[$smtpStatus,$smtpAccess,$smtpAuth,$soru,$options->{$smtpAccess},$c->l($options->{$smtpAccess})]); | ||||
| #		die "Stop $soru in get_current_smtp_ssl_auth"; | ||||
| 	} | ||||
|      | ||||
|  | ||||
|     # Return appropriate message based on SMTP settings | ||||
|     if ($smtpStatus eq 'enabled' && $smtpAuth eq 'enabled') { | ||||
|         return $localise ? $c->l($options->{$smtpAccess}) : $smtpAccess; | ||||
|     } | ||||
|      | ||||
|     return $localise ? $c->l($options->{disabled}) : 'disabled'; | ||||
| } | ||||
|  | ||||
| sub get_current_smtp_auth { | ||||
|  | ||||
|     my ($c, $localise) = @_; | ||||
| @@ -371,16 +430,13 @@ sub get_current_smtp_auth { | ||||
|     my $smtpStatus = $cdb->get_prop('qpsmtpd', 'status') || 'enabled'; | ||||
|     my $smtpAuth = $cdb->get_prop('qpsmtpd', 'Authentication') || 'enabled'; | ||||
|  | ||||
|     my $smtpsStatus = $cdb->get_prop('sqpsmtpd', 'status') || 'enabled'; | ||||
|     my $smtpsAuth = $cdb->get_prop('sqpsmtpd', 'Authentication') || 'enabled'; | ||||
|  | ||||
|     my $options = get_smtp_auth_options(); | ||||
|  | ||||
|     if ($smtpStatus eq 'enabled' && $smtpAuth eq 'enabled') | ||||
|     if ($smtpStatus eq 'enabled' && $smtpAuth eq 'disabled') | ||||
|     { | ||||
|         return $localise ? $c->l($options->{public}) : 'public'; | ||||
|     } | ||||
|     elsif ($smtpsStatus eq 'enabled' && $smtpsAuth eq 'enabled') | ||||
|     elsif ($smtpStatus eq 'enabled' && $smtpAuth eq 'enabled') | ||||
|     { | ||||
|         return $localise ? $c->l($options->{publicSSL}) : 'publicSSL'; | ||||
|     } | ||||
| @@ -388,6 +444,8 @@ sub get_current_smtp_auth { | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| sub get_current_webmail_status { | ||||
|  | ||||
|   my ($c, $localise) = @_; | ||||
| @@ -395,19 +453,16 @@ sub get_current_webmail_status { | ||||
|   # determine status of webmail | ||||
|   my $WebmailStatus = "disabled"; | ||||
|  | ||||
|   my $IMPStatus = $cdb->get_prop('imp', 'status') || 'disabled'; | ||||
|  | ||||
|   my $HordeStatus = $cdb->get_prop('horde', 'status') || 'disabled'; | ||||
|   my $RoundcubeStatus = $cdb->get_prop('roundcube', 'status') || 'disabled'; | ||||
|  | ||||
|   my $MysqlStatus = $cdb->get_prop('mariadb', 'status') || 'disabled'; | ||||
|  | ||||
|   my $PHPStatus = $cdb->get_prop('php', 'status') || 'disabled'; | ||||
|   my $PHPStatus = $cdb->get_prop('php81-php-fpm', 'status') || 'disabled'; | ||||
|  | ||||
|   my $Networkaccess = $cdb->get_prop('horde','access') || 'disabled'; | ||||
|   my $Networkaccess = $cdb->get_prop('roundcube','access') || 'disabled'; | ||||
|  | ||||
|   # all four components must be on for webmail to be working | ||||
|   if ( ( $IMPStatus eq "enabled" ) | ||||
|        && ( $HordeStatus eq "enabled" ) | ||||
|   # all 3 components must be on for webmail to be working | ||||
|   if ( ( $RoundcubeStatus eq "enabled" ) | ||||
|        && ( $MysqlStatus eq "enabled" ) | ||||
|        && ( $PHPStatus eq "enabled"   )  | ||||
|        && ( $Networkaccess eq "public")) | ||||
| @@ -415,8 +470,7 @@ sub get_current_webmail_status { | ||||
|       $WebmailStatus = "enabledSSL"; | ||||
|     } | ||||
|  | ||||
|   elsif ( ( $IMPStatus eq "enabled" ) | ||||
|        && ( $HordeStatus eq "enabled" ) | ||||
|   elsif ( ( $RoundcubeStatus eq "enabled" ) | ||||
|        && ( $MysqlStatus eq "enabled" ) | ||||
|        && ( $PHPStatus eq "enabled"   ) | ||||
|        && ( $Networkaccess eq "private" )) | ||||
| @@ -491,13 +545,58 @@ sub get_imap_options { | ||||
| } | ||||
|  | ||||
|  | ||||
| sub get_smtp_auth_opt { | ||||
|  | ||||
|     my $c = shift; | ||||
|  | ||||
|     return [[ $c->l('mai_SECURE_SMTP') => 'publicSSL'], | ||||
| 	    [ $c->l('Only allow insecure access') => 'public'], | ||||
| 	    [ $c->l('DISABLED') => 'disabled'] | ||||
| 	    ]; | ||||
| } | ||||
|  | ||||
| sub get_smtp_auth_options { | ||||
|      | ||||
|     my $c = shift; | ||||
|  | ||||
|     my %options = ( disabled => 'DISABLED', publicSSL  => 'mai_SECURE_SMTP', public => 'mai_INSECURE_SMTP'); | ||||
|     my %options = ( publicSSL  => 'mai_SECURE_SMTP', public => 'Only allow insecure access',disabled => 'DISABLED'); | ||||
|  | ||||
|     \%options; | ||||
|     return \%options; | ||||
| } | ||||
|  | ||||
|  | ||||
| sub get_smtp_ssl_auth_options { | ||||
|      | ||||
|     my $c = shift; | ||||
|  | ||||
|     my %options = ( public  => 'Allow public access', local => 'Allow local access only',disabled => 'DISABLED'); | ||||
|  | ||||
|     return \%options; | ||||
| } | ||||
| sub get_smtp_ssl_auth_opt { | ||||
|  | ||||
|     my $c = shift; | ||||
|  | ||||
|     return [[ $c->l('Allow public access') => 'public'], | ||||
| 	    [ $c->l('Allow local access only') => 'local'], | ||||
| 	    [ $c->l('DISABLED') => 'disabled'] | ||||
| 	    ]; | ||||
| } | ||||
|  | ||||
| sub get_key_by_value { | ||||
|     my ($hash_ref, $target_value) = @_; | ||||
|      | ||||
|     # Iterate over the hash | ||||
|     while (my ($key, $value) = each %$hash_ref) { | ||||
|         return $key if $value eq $target_value; | ||||
|     } | ||||
|      | ||||
|     return undef; # Return undef if no match is found | ||||
| } | ||||
| sub get_value_by_key { | ||||
|     my ($hash_ref, $key) = @_; | ||||
|      | ||||
|     return $hash_ref->{$key}; # Return the value associated with the key | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -507,8 +606,7 @@ sub get_webmail_opt { | ||||
|  | ||||
|     return [[ $c->l('DISABLED') => 'disabled' ], | ||||
| 	    [ $c->l('mai_ENABLED_SECURE_ONLY') => 'enabledSSL' ], | ||||
| 	    [ $c->l('mai_ONLY_LOCAL_NETWORK_SSL') => 'localnetworkSSL' ], | ||||
| 	    [ $c->l('mai_ENABLED_BOTH') => 'public' ]]; | ||||
| 	    [ $c->l('mai_ONLY_LOCAL_NETWORK_SSL') => 'localnetworkSSL' ]]; | ||||
|  | ||||
| } | ||||
|  | ||||
| @@ -519,10 +617,10 @@ sub get_webmail_options { | ||||
|  | ||||
|     my %options = (  | ||||
| 		disabled   => 'DISABLED',  | ||||
|                enabledSSL => 'mai_ENABLED_SECURE_ONLY', | ||||
|                localnetworkSSL => 'mai_ONLY_LOCAL_NETWORK_SSL' ); | ||||
| 		enabledSSL => 'mai_ENABLED_SECURE_ONLY', | ||||
| 		localnetworkSSL => 'mai_ONLY_LOCAL_NETWORK_SSL'); | ||||
|  | ||||
|     \%options; | ||||
|     return \%options; | ||||
| } | ||||
|  | ||||
|  | ||||
| @@ -538,15 +636,6 @@ sub get_retrieval_opt { | ||||
| } | ||||
|  | ||||
|  | ||||
| sub get_smtp_auth_opt { | ||||
|  | ||||
|     my $c = shift; | ||||
|  | ||||
|     return [[ $c->l('DISABLED') => 'disabled'], | ||||
| 	    [ $c->l('mai_SECURE_SMTP') => 'publicSSL'], | ||||
| 	    [ $c->l('mai_INSECURE_SMTP') => 'public']]; | ||||
| } | ||||
|  | ||||
|  | ||||
| sub get_emailunknownuser_options { | ||||
|  | ||||
| @@ -658,6 +747,7 @@ sub display_multidrop { | ||||
| sub change_settings_reception { | ||||
|  | ||||
|     my $c = shift; | ||||
|     $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|  | ||||
|     my $FetchmailMethod = ( $c->param('FetchmailMethod') || 'standard' ); | ||||
|  | ||||
| @@ -701,18 +791,47 @@ sub change_settings_reception { | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     my $smtpAuth = ($c->param('SMTPAuth') || 'public'); | ||||
|     if ($smtpAuth eq 'public') { | ||||
|         $cdb->set_prop("qpsmtpd", "Authentication", "enabled" ); | ||||
|         $cdb->set_prop("sqpsmtpd", "Authentication", "enabled" ); | ||||
|     } elsif ($smtpAuth eq 'publicSSL') { | ||||
|         $cdb->set_prop("qpsmtpd", "Authentication", "disabled" ); | ||||
|         $cdb->set_prop("sqpsmtpd", "Authentication", "enabled" ); | ||||
|     } else { | ||||
|         $cdb->set_prop("qpsmtpd", "Authentication", "disabled" ); | ||||
|         $cdb->set_prop("sqpsmtpd", "Authentication", "disabled" ); | ||||
|     } | ||||
| 	# Need code here for all 3 options - 25, 465 ad 587 | ||||
| 	# Options for 25 are enabled and disabled | ||||
| 	#    for 465 and 587 are (access) public, local and (status) disabled | ||||
| 	 | ||||
|      | ||||
|     #my $smtpAuth = ($c->param('SMTPAuth') || 'public'); | ||||
|     #if ($smtpAuth eq 'public') { | ||||
|         #$cdb->set_prop("qpsmtpd", "Authentication", "enabled" ); | ||||
|         #$cdb->set_prop("sqpsmtpd", "Authentication", "enabled" ); | ||||
|     #} elsif ($smtpAuth eq 'publicSSL') { | ||||
|         #$cdb->set_prop("qpsmtpd", "Authentication", "disabled" ); | ||||
|         #$cdb->set_prop("sqpsmtpd", "Authentication", "enabled" ); | ||||
|     #} else { | ||||
|         #$cdb->set_prop("qpsmtpd", "Authentication", "disabled" ); | ||||
|         #$cdb->set_prop("sqpsmtpd", "Authentication", "disabled" ); | ||||
|     #} | ||||
|  | ||||
| 	my @keys = qw(qpsmtpd uqpsmtpd sqpsmtpd); | ||||
|  | ||||
| 	foreach my $key (@keys) { | ||||
| 		my $param_name = $key eq 'qpsmtpd' ? 'SMTPAuth'  | ||||
| 						  : $key eq 'uqpsmtpd' ? 'uSMTPAuth' | ||||
| 						  : 'sSMTPAuth';  # Defaults to 'sSMTPAuth' for 'sqpsmtpd' | ||||
| 		my $SMTPAuth = $c->param($param_name); | ||||
| 		if ($SMTPAuth eq 'disabled') { | ||||
| 			$cdb->set_prop($key, 'status', 'disabled'); | ||||
| 			$cdb->set_prop($key, 'access', 'disabled'); | ||||
| 		} else { | ||||
| 			$cdb->set_prop($key, 'status', 'enabled'); | ||||
| 			if ($key eq 'qpsmtpd') { | ||||
| 				my $auth_status = $SMTPAuth eq 'publicSSL' ? 'enabled' : 'disabled'; | ||||
| 				$cdb->set_prop($key, 'Authentication', $auth_status); | ||||
| 				$cdb->set_prop($key, 'access', 'public'); | ||||
| 			} else { | ||||
| 				$cdb->set_prop($key, 'Authentication', 'enabled'); | ||||
| 				my $auth_key = ($key eq 'uqpsmtpd') ? 'uSMTPAuth' : 'sSMTPAuth'; | ||||
| 				my $access_value = $c->param($auth_key) eq 'public' ? 'public' : 'local'; | ||||
| 				$cdb->set_prop($key, 'access', $access_value); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|     unless ( system( "/sbin/e-smith/signal-event", "email-update" ) == 0 ) | ||||
|     { | ||||
| 	return $c->l('mai_ERROR_UPDATING_CONFIGURATION'); | ||||
| @@ -724,6 +843,7 @@ sub change_settings_reception { | ||||
| sub change_settings_delivery { | ||||
|  | ||||
|     my ($c) = shift; | ||||
|     $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|  | ||||
|     my $EmailUnknownUser = ($c->param('EmailUnknownUser') || 'returntosender'); | ||||
|  | ||||
| @@ -752,7 +872,8 @@ sub change_settings_delivery { | ||||
| sub change_settings_access { | ||||
|  | ||||
|     my $c = shift; | ||||
|  | ||||
| 	$cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|      | ||||
|     my $pop3Access = ($c->param('POPAccess') || 'private'); | ||||
|     if ($pop3Access eq 'disabled') { | ||||
|         $cdb->set_prop('pop3', "status", "disabled" ); | ||||
| @@ -802,38 +923,22 @@ sub change_settings_access { | ||||
|     #------------------------------------------------------------ | ||||
|  | ||||
|     my $webmail = ($c->param('WebMail') || 'disabled'); | ||||
|     if ( $webmail eq "enabled" ) { | ||||
|       $cdb->set_prop('php', "status", $webmail ); | ||||
|       $cdb->set_prop('mariadb',"status", $webmail ); | ||||
|       $cdb->set_prop('imp',"status", $webmail ); | ||||
|       $cdb->set_prop('horde', "status", $webmail ); | ||||
|       $cdb->set_prop('imp',"access", "full" ); | ||||
|       $cdb->set_prop('horde',"access", "public" ); | ||||
|       $cdb->set_prop('horde',"HttpsOnly", "no" ); | ||||
|     } | ||||
|     elsif ( $webmail eq "enabledSSL" ) { | ||||
|       $cdb->set_prop('php',"status", "enabled" ); | ||||
|     if ( $webmail eq "enabledSSL" ) { | ||||
|       $cdb->set_prop('php81-php-fpm',"status", "enabled" ); | ||||
|       $cdb->set_prop('mariadb',"status", "enabled" ); | ||||
|       $cdb->set_prop('imp',"status", 'enabled' ); | ||||
|       $cdb->set_prop('horde',"status", 'enabled' ); | ||||
|       $cdb->set_prop('imp',"access", "SSL" ); | ||||
|       $cdb->set_prop('horde',"access", "public" ); | ||||
|       $cdb->set_prop('horde',"HttpsOnly", "yes" ); | ||||
|       $cdb->set_prop('roundcube',"status", 'enabled' ); | ||||
|       $cdb->set_prop('roundcube',"access", "public" ); | ||||
|     } | ||||
|  | ||||
|     elsif ( $webmail eq "localnetworkSSL" ) { | ||||
|       $cdb->set_prop('php',"status", "enabled" ); | ||||
|       $cdb->set_prop('php81-php-fpm',"status", "enabled" ); | ||||
|       $cdb->set_prop('mariadb',"status", "enabled" ); | ||||
|       $cdb->set_prop('imp',"status", 'enabled' ); | ||||
|       $cdb->set_prop('horde',"status", 'enabled' ); | ||||
|       $cdb->set_prop('imp',"access", "SSL" ); | ||||
|       $cdb->set_prop('horde',"access", "private" ); | ||||
|       $cdb->set_prop('horde',"HttpsOnly", "yes" ); | ||||
|       $cdb->set_prop('roundcube',"status", 'enabled' ); | ||||
|       $cdb->set_prop('roundcube',"access", "private" ); | ||||
|      } | ||||
|  | ||||
|     else { | ||||
|       $cdb->set_prop('imp',"status", 'disabled' ); | ||||
|       $cdb->set_prop('horde',"status", 'disabled' ); | ||||
|       $cdb->set_prop('roundcube',"status", 'disabled' ); | ||||
|     } | ||||
|  | ||||
|     unless ( system( "/sbin/e-smith/signal-event", "email-update" ) == 0 ) { | ||||
| @@ -847,6 +952,8 @@ sub change_settings_access { | ||||
| sub change_settings_filtering { | ||||
|  | ||||
|     my $c = shift; | ||||
|     $cdb = esmith::ConfigDB->open || die "Couldn't open config db"; | ||||
|  | ||||
|  | ||||
|     my $virus_status = ( $c->param('VirusStatus') || 'disabled' ); | ||||
|     $cdb->set_prop("qpsmtpd", 'VirusScan', $virus_status); | ||||
| @@ -860,7 +967,7 @@ sub change_settings_filtering { | ||||
|                         Subject | ||||
| 			SubjectTag) ) | ||||
|     { | ||||
| 	$cdb->set_prop('spamassassin', $param, $c->param("Spam$param")); | ||||
| 	  $cdb->set_prop('spamassassin', $param, $c->param("Spam$param")); | ||||
|     } | ||||
|  | ||||
|     my $patterns_status = $c->adjust_patterns() ? 'enabled' : 'disabled'; | ||||
| @@ -868,7 +975,7 @@ sub change_settings_filtering { | ||||
|  | ||||
|     unless ( system( "/sbin/e-smith/signal-event", "email-update" ) == 0 ) | ||||
|     { | ||||
| 	return $c->l('mai_ERROR_UPDATING_CONFIGURATION'); | ||||
| 	    return $c->l('mai_ERROR_UPDATING_CONFIGURATION'); | ||||
|     } | ||||
|  | ||||
|     return 'OK'; | ||||
| @@ -922,4 +1029,4 @@ sub validate_smarthost { | ||||
| } | ||||
|  | ||||
|  | ||||
| 1; | ||||
| 1; | ||||
| @@ -171,9 +171,11 @@ sub add_portforward { | ||||
| 	#work out which protocol   	 | ||||
| 	my $fdb; | ||||
| 	if ($proto eq 'TCP') { | ||||
| 		$tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n"; | ||||
| 		$fdb = $tcp_db; | ||||
| 	} | ||||
| 	else { | ||||
| 		$udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n"; | ||||
| 		$fdb = $udp_db; | ||||
| 	} | ||||
| 	#Get the other values  | ||||
|   | ||||
| @@ -0,0 +1,46 @@ | ||||
| package SrvMngr::Controller::Roundcubepanel; | ||||
|  | ||||
| #---------------------------------------------------------------------- | ||||
| # heading     : System | ||||
| # description : Roundcube webmail | ||||
| # navigation  : 99999 9999 | ||||
| #---------------------------------------------------------------------- | ||||
| #---------------------------------------------------------------------- | ||||
| # name   : roundcubepanel,    method : get,   url : /roundcubepanel,     ctlact : Roundcubepanel#main | ||||
| # | ||||
| # routes : end | ||||
| #---------------------------------------------------------------------- | ||||
|  | ||||
| use strict; | ||||
| use warnings; | ||||
|  | ||||
| use Mojo::Base 'Mojolicious::Controller'; | ||||
|  | ||||
| use Locale::gettext; | ||||
| use SrvMngr::I18N; | ||||
| use SrvMngr qw(theme_list init_session); | ||||
|  | ||||
| #use SrvMngr::Model::Main; | ||||
|  | ||||
|  | ||||
| sub main { | ||||
|  | ||||
|     my $c = shift; | ||||
|     $c->app->log->info($c->log_req); | ||||
|  | ||||
|     my $title = $c->l('Roundcube Webmail'); | ||||
|     my $roundcube_url = $c->param('url'); | ||||
|     my $roundcube_height = $c->param('height') | 600; | ||||
|     $c->stash( title => $title, modul => $roundcube_url, height => $roundcube_height ); | ||||
|     $c->render(template => 'roundcube'); | ||||
|  | ||||
| } | ||||
|  | ||||
| sub getroundcubeurl { | ||||
| 	my $c = shift; | ||||
| 	my $url = shift; | ||||
| 	return "/smanager/roundcube?url=$url"; | ||||
| } | ||||
|  | ||||
|  | ||||
| 1; | ||||
							
								
								
									
										73
									
								
								root/usr/share/smanager/lib/SrvMngr/Plugin/Cache.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								root/usr/share/smanager/lib/SrvMngr/Plugin/Cache.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
| package SrvMngr::Plugin::Cache; | ||||
| use Mojo::Base -base; | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| Mojolicious::Plugin::Renderer::WithoutCache::Cache - Mojo::Cache that doesn't cache | ||||
|  | ||||
| =head1 VERSION | ||||
|  | ||||
| Version 0.04 | ||||
|  | ||||
| =cut | ||||
|  | ||||
| our $VERSION = '0.04'; | ||||
| $VERSION = eval $VERSION; | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
| You probably don't want to use this directly. | ||||
|  | ||||
|     my $cache = Mojolicious::Plugin::Renderer::WithoutCache::Cache->new; | ||||
|     # this cache does nothing | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| A cache object that's compatible to Mojo::Cache but does nothing. It does | ||||
| not save or return any values. It's always empty. | ||||
|  | ||||
| =head1 METHODS | ||||
|  | ||||
| =head2 get | ||||
|  | ||||
| Does nothing. Returns C<undef>. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| sub get {} | ||||
|  | ||||
| =head2 set | ||||
|  | ||||
| Does nothing. Returns C<$self> so chaining is possible. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| sub set { shift; } | ||||
|  | ||||
| =head2 max_keys | ||||
|  | ||||
| Always returns zero. Can't be set. We don't want any keys. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| sub max_keys { 0 } | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| simbabque, C<< <simbabque at cpan.org> >> | ||||
|  | ||||
| =head1 BUGS | ||||
|  | ||||
| Please report any bugs or feature requests through an issue | ||||
| on github at L<https://github.com/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/issues>. | ||||
|  | ||||
| =head1 LICENSE | ||||
|  | ||||
| Copyright (C) simbabque. | ||||
|  | ||||
| This library is free software; you can redistribute it and/or modify | ||||
| it under the same terms as Perl itself. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| 1; | ||||
							
								
								
									
										94
									
								
								root/usr/share/smanager/lib/SrvMngr/Plugin/WithoutCache.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										94
									
								
								root/usr/share/smanager/lib/SrvMngr/Plugin/WithoutCache.pm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,94 @@ | ||||
| package SrvMngr::Plugin::WithoutCache; | ||||
| use Mojo::Base 'Mojolicious::Plugin'; | ||||
| use SrvMngr::Plugin::Cache; | ||||
|  | ||||
| =head1 NAME | ||||
|  | ||||
| Mojolicious::Plugin::Renderer::WithoutCache - Disable the template cache in your Mojo app | ||||
|  | ||||
| =begin html | ||||
|  | ||||
| <p> | ||||
| <a href="https://travis-ci.org/simbabque/Mojolicious-Plugin-Renderer-WithoutCache"><img src="https://travis-ci.org/simbabque/Mojolicious-Plugin-Renderer-WithoutCache.svg?branch=master"></a> | ||||
| <a href='https://coveralls.io/github/simbabque/Mojolicious-Plugin-Renderer-WithoutCache?branch=master'><img src='https://coveralls.io/repos/github/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/badge.svg?branch=master' alt='Coverage Status' /></a> | ||||
| </p> | ||||
|  | ||||
| =end html | ||||
|  | ||||
| =head1 VERSION | ||||
|  | ||||
| Version 0.04 | ||||
|  | ||||
| =cut | ||||
|  | ||||
| our $VERSION = '0.04'; | ||||
| $VERSION = eval $VERSION; | ||||
|  | ||||
| =head1 SYNOPSIS | ||||
|  | ||||
| This plugin turns off the renderer's cache in L<Mojolicious> and L<Mojo::Lite> applications. | ||||
|  | ||||
|     use Mojolicious::Lite; | ||||
|     plugin 'Renderer::WithoutCache'; | ||||
|  | ||||
| =head1 DESCRIPTION | ||||
|  | ||||
| This does what it says on the box. It turns off caching for the L<Mojolicious::Renderer> | ||||
| or any other renderer that's inside C<$app-E<gt>renderer> by injecting a cache object that | ||||
| does not do anything. This is superior to setting the C<max_keys> of L<Mojo::Cache> | ||||
| to C<0> if you plan to do a lot of uncached requests, because L<Mojolicious::Renderer> | ||||
| will still try to cache, and every time L<Mojo::Cache> sets a value in the cache it | ||||
| looks at the C<max_keys>, and then stops. | ||||
|  | ||||
| Doing nothing at all is cheaper. But not a lot really. | ||||
|  | ||||
| =head1 METHODS | ||||
|  | ||||
| =head2 register | ||||
|  | ||||
| Register the plugin in a L<Mojolicious> application. | ||||
|  | ||||
|     $plugin->register(Mojolicious->new); | ||||
|  | ||||
| =cut | ||||
|  | ||||
| sub register { | ||||
|     my ( $self, $app ) = @_; | ||||
|     $app->renderer->cache( SrvMngr::Plugin::Cache->new ); | ||||
| } | ||||
|  | ||||
| =head1 AUTHOR | ||||
|  | ||||
| simbabque, C<< <simbabque at cpan.org> >> | ||||
|  | ||||
| =head1 BUGS | ||||
|  | ||||
| Please report any bugs or feature requests through an issue | ||||
| on github at L<https://github.com/simbabque/Mojolicious-Plugin-Renderer-WithoutCache/issues>. | ||||
|  | ||||
| =head1 SUPPORT | ||||
|  | ||||
| You can find documentation for this module with the perldoc command. | ||||
|  | ||||
|     perldoc Mojolicious::Plugin::Renderer::WithoutCache | ||||
|  | ||||
| =head2 Why would I want to turn off the cache? | ||||
|  | ||||
| I don't know. | ||||
|  | ||||
| =head1 ACKNOWLEDGEMENTS | ||||
|  | ||||
| This plugin was inspired by Tom Hunt asking about turning the cache off | ||||
| on L<Stack Overflow|http://stackoverflow.com/q/41750243/1331451>. | ||||
|  | ||||
| =head1 LICENSE | ||||
|  | ||||
| Copyright (C) simbabque. | ||||
|  | ||||
| This library is free software; you can redistribute it and/or modify | ||||
| it under the same terms as Perl itself. | ||||
|  | ||||
| =cut | ||||
|  | ||||
| 1; | ||||
|  | ||||
| @@ -1,63 +1,278 @@ | ||||
| document.addEventListener('DOMContentLoaded', () => { | ||||
|   const flagContainer = document.getElementById('flag-container'); | ||||
|  | ||||
|   // Function to get the browser's locale | ||||
|   function getBrowserLocale() { | ||||
|     return navigator.language || navigator.userLanguage; | ||||
|   } | ||||
|         async function getCountryName(countryCode) { | ||||
|             try { | ||||
|                 const response = await fetch(`https://restcountries.com/v3.1/alpha/${countryCode}`); | ||||
|                 if (!response.ok) throw new Error('Country not found'); | ||||
|                 const data = await response.json(); | ||||
|                 // Return the name in the native language | ||||
|                 return data[0].name.common;  | ||||
|             } catch (error) { | ||||
|                 console.error(error); | ||||
|                 return 'Unknown Country'; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|   // Function to map locale to country code | ||||
|   function getCountryCodeFromLocale(locale) { | ||||
|     const localeParts = locale.split('-'); | ||||
|     return localeParts.length > 1 ? localeParts[1] : localeParts[0]; | ||||
|   } | ||||
|         function getFlagEmoji(locale) { | ||||
|             // Split the locale to get the language and country code | ||||
|             const parts = locale.split('-'); | ||||
|             let countryCode; | ||||
|  | ||||
|   // Function to fetch country names from a CDN | ||||
|   async function fetchCountryNames() { | ||||
|     const response = await fetch('https://restcountries.com/v3.1/all'); | ||||
|     const countries = await response.json(); | ||||
|     const countryNames = {}; | ||||
|     for (const country of countries) { | ||||
|       const code = country.cca2.toLowerCase(); // Country code (ISO 3166-1 alpha-2) | ||||
|       const name = country.name.common; // Common name of the country | ||||
|       countryNames[code] = name; | ||||
|     } | ||||
|     return countryNames; | ||||
|   } | ||||
|             // Handle single subtag (language only) or double subtag (language-country) | ||||
|             if (parts.length === 1) { | ||||
|                 countryCode = getCountryCodeFromLanguage(parts[0]); | ||||
|             } else if (parts.length === 2) { | ||||
|                 countryCode = parts[1].toLowerCase(); // Use the country code | ||||
|             } | ||||
|  | ||||
|   // Function to create and display the flag icon | ||||
|   function displayFlagIcon(countryCode, countryName) { | ||||
|     const flagIcon = document.createElement('span'); | ||||
|     flagIcon.className = `flag-icon flag-icon-${countryCode.toLowerCase()}`; | ||||
|     flagIcon.id = 'flag-icon'; | ||||
|     flagIcon.title = countryName; // Set the title for the tooltip | ||||
|             // If country code is not found, set a fallback output | ||||
|             if (!countryCode) { | ||||
|                 const fallback = `? ${locale.toUpperCase()}`; // Just a question mark and the full locale | ||||
|                 return { flag: fallback, isUnknown: true, countryName: 'Unknown Country' }; | ||||
|             } | ||||
|  | ||||
|     // If you want a custom tooltip instead (uncomment the lines below): | ||||
|     /* | ||||
|     const tooltip = document.createElement('span'); | ||||
|     tooltip.className = 'tooltip'; | ||||
|     tooltip.innerText = countryName; | ||||
|     flagIcon.appendChild(tooltip); | ||||
|             // Convert the country code to a flag emoji | ||||
|             return { | ||||
|                 flag: String.fromCodePoint(...[...countryCode.toUpperCase()].map(char => 0x1F1E6 + char.charCodeAt(0) - 'A'.charCodeAt(0))), | ||||
|                 isUnknown: false, | ||||
|                 countryCode: countryCode | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|     flagIcon.addEventListener('mouseenter', () => { | ||||
|       tooltip.style.display = 'block'; | ||||
|     }); | ||||
|         function getCountryCodeFromLanguage(language) { | ||||
|             // Map languages to countries (this is an example, extend as needed) | ||||
|             const languageToCountryMap = { | ||||
|                   // Add more mappings as needed | ||||
|     "af": "NA", | ||||
|     "agq": "CM", | ||||
|     "ak": "GH", | ||||
|     "am": "ET", | ||||
|     "ar": "01", | ||||
|     "as": "IN", | ||||
|     "asa": "TZ", | ||||
|     "ast": "ES", | ||||
|     "az": "rl", | ||||
|     "bas": "CM", | ||||
|     "be": "BY", | ||||
|     "bem": "ZM", | ||||
|     "bez": "TZ", | ||||
|     "bg": "BG", | ||||
|     "bm": "ML", | ||||
|     "bn": "BD", | ||||
|     "bo": "CN", | ||||
|     "br": "FR", | ||||
|     "brx": "IN", | ||||
|     "bs": "rl", | ||||
|     "ca": "AD", | ||||
|     "ccp": "BD", | ||||
|     "ce": "RU", | ||||
|     "cgg": "UG", | ||||
|     "chr": "US", | ||||
|     "ckb": "IQ", | ||||
|     "cs": "CZ", | ||||
|     "cy": "GB", | ||||
|     "da": "DK", | ||||
|     "dav": "KE", | ||||
|     "de": "DE", | ||||
|     "dje": "NE", | ||||
|     "dsb": "DE", | ||||
|     "dua": "CM", | ||||
|     "dyo": "SN", | ||||
|     "dz": "BT", | ||||
|     "ebu": "KE", | ||||
|     "ee": "GH", | ||||
|     "el": "CY", | ||||
|     "en": "01", | ||||
|     "es": "ES", | ||||
|     "et": "EE", | ||||
|     "eu": "ES", | ||||
|     "ewo": "CM", | ||||
|     "fa": "AF", | ||||
|     "ff": "CM", | ||||
|     "fi": "FI", | ||||
|     "fil": "PH", | ||||
|     "fo": "FO", | ||||
|     "fr": "FR", | ||||
|     "fur": "IT", | ||||
|     "fy": "NL", | ||||
|     "ga": "IE", | ||||
|     "gd": "GB", | ||||
|     "gl": "ES", | ||||
|     "gsw": "CH", | ||||
|     "gu": "IN", | ||||
|     "guz": "KE", | ||||
|     "gv": "IM", | ||||
|     "ha": "GH", | ||||
|     "haw": "US", | ||||
|     "he": "IL", | ||||
|     "hi": "IN", | ||||
|     "hr": "HR", | ||||
|     "hsb": "DE", | ||||
|     "hu": "HU", | ||||
|     "hy": "AM", | ||||
|     "id": "ID", | ||||
|     "ig": "NG", | ||||
|     "ii": "CN", | ||||
|     "is": "IS", | ||||
|     "it": "IT", | ||||
|     "ja": "JP", | ||||
|     "jgo": "CM", | ||||
|     "jmc": "TZ", | ||||
|     "ka": "GE", | ||||
|     "kab": "DZ", | ||||
|     "kam": "KE", | ||||
|     "kde": "TZ", | ||||
|     "kea": "CV", | ||||
|     "khq": "ML", | ||||
|     "ki": "KE", | ||||
|     "kk": "KZ", | ||||
|     "kkj": "CM", | ||||
|     "kl": "GL", | ||||
|     "kln": "KE", | ||||
|     "km": "KH", | ||||
|     "kn": "IN", | ||||
|     "ko": "KP", | ||||
|     "kok": "IN", | ||||
|     "ks": "IN", | ||||
|     "ksb": "TZ", | ||||
|     "ksf": "CM", | ||||
|     "ksh": "DE", | ||||
|     "kw": "GB", | ||||
|     "ky": "KG", | ||||
|     "lag": "TZ", | ||||
|     "lb": "LU", | ||||
|     "lg": "UG", | ||||
|     "lkt": "US", | ||||
|     "ln": "AO", | ||||
|     "lo": "LA", | ||||
|     "lrc": "IQ", | ||||
|     "lt": "LT", | ||||
|     "lu": "CD", | ||||
|     "luo": "KE", | ||||
|     "Luo": "KE", | ||||
|     "luy": "KE", | ||||
|     "lv": "LV", | ||||
|     "mas": "KE", | ||||
|     "mer": "KE", | ||||
|     "mfe": "MU", | ||||
|     "mg": "MG", | ||||
|     "mgh": "MZ", | ||||
|     "mgo": "CM", | ||||
|     "mk": "MK", | ||||
|     "ml": "IN", | ||||
|     "mn": "MN", | ||||
|     "mr": "IN", | ||||
|     "ms": "BN", | ||||
|     "mt": "MT", | ||||
|     "mua": "CM", | ||||
|     "my": "MM", | ||||
|     "mzn": "IR", | ||||
|     "naq": "NA", | ||||
|     "nb": "NO", | ||||
|     "nd": "ZW", | ||||
|     "nds": "DE", | ||||
|     "ne": "IN", | ||||
|     "nl": "NL", | ||||
|     "nmg": "CM", | ||||
|     "nn": "NO", | ||||
|     "nnh": "CM", | ||||
|     "nus": "SS", | ||||
|     "nyn": "UG", | ||||
|     "om": "ET", | ||||
|     "or": "IN", | ||||
|     "os": "GE", | ||||
|     "pa": "ab", | ||||
|     "pl": "PL", | ||||
|     "ps": "AF", | ||||
|     "pt": "PT", | ||||
|     "qu": "BO", | ||||
|     "rm": "CH", | ||||
|     "rn": "BI", | ||||
|     "ro": "RO", | ||||
|     "rof": "TZ", | ||||
|     "ru": "RU", | ||||
|     "rw": "RW", | ||||
|     "rwk": "TZ", | ||||
|     "sah": "RU", | ||||
|     "saq": "KE", | ||||
|     "sbp": "TZ", | ||||
|     "se": "SE", | ||||
|     "seh": "MZ", | ||||
|     "ses": "ML", | ||||
|     "sg": "CF", | ||||
|     "shi": "tn", | ||||
|     "si": "LK", | ||||
|     "sk": "SK", | ||||
|     "sl": "SI", | ||||
|     "smn": "FI", | ||||
|     "sn": "ZW", | ||||
|     "so": "SO", | ||||
|     "sq": "AL", | ||||
|     "sr": "rl", | ||||
|     "sv": "AX", | ||||
|     "sw": "CD", | ||||
|     "ta": "IN", | ||||
|     "te": "IN", | ||||
|     "teo": "KE", | ||||
|     "tg": "TJ", | ||||
|     "th": "TH", | ||||
|     "ti": "ER", | ||||
|     "to": "TO", | ||||
|     "tr": "TR", | ||||
|     "tt": "RU", | ||||
|     "twq": "NE", | ||||
|     "tzm": "MA", | ||||
|     "ug": "CN", | ||||
|     "uk": "UA", | ||||
|     "ur": "IN", | ||||
|     "uz": "ab", | ||||
|     "vai": "tn", | ||||
|     "Vai": "tn", | ||||
|     "vi": "VN", | ||||
|     "vun": "TZ", | ||||
|     "wae": "CH", | ||||
|     "wo": "SN", | ||||
|     "xog": "UG", | ||||
|     "yav": "CM", | ||||
|     "yi": "01", | ||||
|     "yo": "BJ", | ||||
|     "yue": "ns", | ||||
|     "zgh": "MA", | ||||
|     "zh": "ns", | ||||
|     "zu": "ZA" | ||||
|  | ||||
|     flagIcon.addEventListener('mouseleave', () => { | ||||
|       tooltip.style.display = 'none'; | ||||
|     }); | ||||
|     */ | ||||
|  | ||||
|     flagContainer.appendChild(flagIcon); | ||||
|   } | ||||
|             }; | ||||
|  | ||||
|   // Main logic | ||||
|   (async () => { | ||||
|     const locale = getBrowserLocale(); | ||||
|     const countryCode = getCountryCodeFromLocale(locale); | ||||
|     const countryNames = await fetchCountryNames(); // Fetch country names | ||||
|             return languageToCountryMap[language] || null; | ||||
|         } | ||||
|  | ||||
|     const countryName = countryNames[countryCode.toLowerCase()] || 'Unknown Country'; // Get the country name | ||||
|     displayFlagIcon(countryCode, countryName); // Display the flag with country name | ||||
|   })(); | ||||
|         async function displayLocaleAndFlag() { | ||||
|             // Get the browser locale | ||||
|             const userLocale = navigator.language || navigator.userLanguage; | ||||
|             const { flag, isUnknown, countryCode } = getFlagEmoji(userLocale); | ||||
|  | ||||
|             // Display the locale and the corresponding flag (or fallback) | ||||
|             //document.getElementById('locale').textContent = `Your Locale: ${userLocale}`; | ||||
|  | ||||
|             if (isUnknown) { | ||||
|                 const fallbackDiv = document.createElement('div'); | ||||
|                 fallbackDiv.className = 'fallback-box'; | ||||
|                 fallbackDiv.textContent = `? ${userLocale.toUpperCase()}`; // Only show ? and locale code inside the box | ||||
|                 //document.getElementById('flag-container').textContent = "Flag: "; | ||||
|                 document.getElementById('flag-container').appendChild(fallbackDiv); | ||||
|                 // Tooltip for fallback | ||||
|                 fallbackDiv.title = "Unknown Country"; // Tooltip for fallback | ||||
|             } else { | ||||
|                 const countryName = await getCountryName(countryCode); | ||||
|                 const flagSpan = document.createElement('span'); | ||||
|                 flagSpan.textContent = flag; // Use flag emoji | ||||
|                 flagSpan.title = countryName; // Tooltip for the flag in country language | ||||
|                 //document.getElementById('flag-container').textContent = "Flag: "; | ||||
|                 document.getElementById('flag-container').appendChild(flagSpan); | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         displayLocaleAndFlag(); | ||||
| }); | ||||
|   | ||||
| @@ -1,12 +1,17 @@ | ||||
| % layout 'default', title => "Sme server 2 - emailreceive"; | ||||
|  | ||||
| % content_for 'module' => begin | ||||
|  | ||||
| % use constant FALSE => 0; | ||||
| % use constant TRUE  => 1; | ||||
|  | ||||
| <div id='module' class='module emailreceive-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $mai_datas | ||||
| 	%= dumper $c->param('SMTPAuth') | ||||
| 	</p> | ||||
|     % } | ||||
|  | ||||
| @@ -26,16 +31,65 @@ | ||||
| 	%=l 'mai_LABEL_MODE' | ||||
| 	</span><span class=input> | ||||
| 	% param 'FetchmailMethod' => $mai_datas->{fetchmailmethod} unless param 'FetchmailMethod'; | ||||
| <!-- | ||||
| 	<pre> | ||||
| 		%= dumper $mai_datas->{fetchmailmethod} | ||||
| 		%= dumper $c->get_retrieval_opt() | ||||
| 		%= param 'FetchmailMethod' | ||||
| 	</pre> | ||||
| --> | ||||
| 	%= select_field 'FetchmailMethod' => $c->get_retrieval_opt(), class => 'input' | ||||
| 	</span></p> | ||||
|  | ||||
| 	%=l 'mai_DESC_SMTP_AUTH_CONTROL' | ||||
| 	%#=l 'mai_DESC_SMTP_AUTH_CONTROL' | ||||
| 	<br /> | ||||
| 	%= l "SMTP port (25) main purpose is to receive emails from another server, STARTTLS is always offered, but auth if offered is only if STARTTLS is also used by client." | ||||
| 	<br /> | ||||
| 	%= l "SMTPS port (465) will require implicit SSL/TLS then authenticate to send." | ||||
| 	<br /> | ||||
| 	%= l "SMTP Submission port (587) will require STARTTLS, then authenticate to send." | ||||
| 	<br /> | ||||
|  | ||||
| 	% my $smtp_mesg=l('SMTP port %u allow client to authenticate:'); | ||||
| 	<p><span class=label> | ||||
| 	%=l 'mai_LABEL_SMTP_AUTH_CONTROL' | ||||
| 		%= sprintf($smtp_mesg,$c->get_db_prop('qpsmtpd','TCPPort',25));  | ||||
| 	</span><span class=input> | ||||
|     	% param 'SMTPAuth' => $c->get_current_smtp_auth() unless param 'SMTPAuth'; | ||||
| 	%= select_field 'SMTPAuth' => $c->get_smtp_auth_opt(), class => 'input' | ||||
|     	% param 'SMTPAuth' => $c->get_current_smtp_auth( FALSE ) unless param 'SMTPAuth'; | ||||
| <!-- | ||||
| 	<pre> | ||||
| 		%= dumper $c->get_smtp_auth_opt() | ||||
| 		%= dumper $c->get_current_smtp_auth(FALSE) | ||||
| 		%= dumper $c->get_db_prop("qpsmtpd","Authentication") | ||||
| 		%= param 'SMTPAuth' | ||||
| 	</pre> | ||||
| --> | ||||
| 		%= select_field 'SMTPAuth' => $c->get_smtp_auth_opt(), class => 'input' | ||||
| 	</span></p> | ||||
|  | ||||
| 	% my $smtp_mesg=l('SMTPS SSL/TLS auth: port %u status:'); | ||||
| 	<p><span class=label> | ||||
| 		%= sprintf($smtp_mesg,$c->get_db_prop('sqpsmtpd','TCPPort',465));  | ||||
| 	</span><span class=input> | ||||
| 		% param 'sSMTPAuth' => $c->get_current_smtp_ssl_auth(FALSE,'s', TRUE) unless param 'sSMTPAuth'; | ||||
| 	 | ||||
| 		%= select_field 'sSMTPAuth' => $c->get_smtp_ssl_auth_opt(), class => 'input' | ||||
| 	</span></p> | ||||
|  | ||||
| 	%my $smtp_mesg=l('Submission port %u status:'); | ||||
| 	<p><span class=label> | ||||
| 		%= sprintf($smtp_mesg,$c->get_db_prop('uqpsmtpd','TCPPort',587));  | ||||
| 	</span><span class=input> | ||||
|     	% param 'uSMTPAuth' => $c->get_current_smtp_ssl_auth(FALSE,'u', TRUE) unless param 'uSMTPAuth'; | ||||
| <!-- | ||||
| 	<pre> | ||||
| 		%= dumper $c->get_smtp_ssl_auth_opt() | ||||
| 		%= dumper $c->get_current_smtp_ssl_auth(FALSE,'s', TRUE) | ||||
| 		%= dumper $c->get_current_smtp_ssl_auth(FALSE,'u', TRUE) | ||||
| 		%= dumper $c->get_db_prop("uqpsmtpd","access") | ||||
| 		%= param 'uSMTPAuth' | ||||
| 	</pre> | ||||
| --> | ||||
| 	%= select_field 'uSMTPAuth' => $c->get_smtp_ssl_auth_opt(), class => 'input' | ||||
| 	</span></p> | ||||
|  | ||||
| 	<hr class="sectionbar" /> | ||||
| @@ -110,4 +164,4 @@ | ||||
|     % end     | ||||
|  | ||||
| </div> | ||||
| %end | ||||
| %end | ||||
| @@ -1,9 +1,13 @@ | ||||
| % layout 'default', title => "Sme server 2 - emailsettings"; | ||||
|  | ||||
| % content_for 'module' => begin | ||||
|  | ||||
| % use constant FALSE => 0; | ||||
| % use constant TRUE  => 1; | ||||
|  | ||||
| <div id='module' class='module emailsettings-panel'> | ||||
|  | ||||
|     % if ($config->{debug} == 1) { | ||||
|     % if ($config->{debug} == TRUE) { | ||||
| 	<p> | ||||
| 	%= dumper $c->current_route | ||||
| 	%= dumper $mai_datas | ||||
| @@ -22,19 +26,19 @@ | ||||
| 	<p><span class=label> | ||||
| 	%=l 'mai_LABEL_POP_ACCESS_CONTROL' | ||||
| 	</span><span class=data2> | ||||
| 	%= $c->get_current_pop3_access( 1 ) | ||||
| 	%= $c->get_current_pop3_access( TRUE ) | ||||
| 	</span></p> | ||||
|  | ||||
| 	<p><span class=label> | ||||
| 	%=l 'mai_LABEL_IMAP_ACCESS_CONTROL' | ||||
| 	</span><span class=data2> | ||||
| 	%= $c->get_current_imap_access( 1 ) | ||||
| 	%= $c->get_current_imap_access( TRUE ) | ||||
| 	</span></p> | ||||
|  | ||||
| 	<p><span class=label> | ||||
| 	%=l 'mai_LABEL_WEBMAIL' | ||||
| 	</span><span class=data2> | ||||
| 	%= $c->get_current_webmail_status( 1 ) | ||||
| 	%= $c->get_current_webmail_status( TRUE ) | ||||
| 	</span></p> | ||||
|  | ||||
|     % 	my $btn = l('mai_DESC_STATE_ACCESS_BUTTON'); | ||||
| @@ -51,19 +55,19 @@ | ||||
| 	<p><span class=label> | ||||
| 	%=l 'mai_LABEL_VIRUS_SCAN' | ||||
| 	</span><span class=data2> | ||||
| 	%= $c->get_virus_status(1) | ||||
| 	%= $c->get_virus_status(TRUE) | ||||
| 	</span></p> | ||||
|  | ||||
| 	<p><span class=label> | ||||
| 	%=l 'mai_LABEL_SPAM_SCAN' | ||||
| 	</span><span class=data2> | ||||
| 	%= $c->get_spam_status(1) | ||||
| 	%= $c->get_spam_status(TRUE) | ||||
| 	</span></p> | ||||
|  | ||||
| 	<p><span class=label> | ||||
| 	%=l 'mai_LABEL_BLOCK_EXECUTABLE_CONTENT' | ||||
| 	</span><span class=data2> | ||||
| 	%= $c->get_patterns_status(1) | ||||
| 	%= $c->get_patterns_status(TRUE) | ||||
| 	</span></p> | ||||
|  | ||||
|     % 	my $btn = l('mai_DESC_STATE_FILTERING_BUTTON'); | ||||
| @@ -83,12 +87,28 @@ | ||||
| 	%= $mai_datas->{fetchmailmethod} | ||||
| 	</span></p> | ||||
|  | ||||
| 	% my $smtp_mesg=l('SMTP port %u allow client to authenticate:'); | ||||
| 	<p><span class=label> | ||||
| 	%=l 'mai_LABEL_SMTP_AUTH_CONTROL' | ||||
| 		%= sprintf($smtp_mesg,$c->get_db_prop('qpsmtpd','TCPPort',25));  | ||||
| 	</span><span class=data2> | ||||
| 	%= $c->get_current_smtp_auth( 1 ) | ||||
| 	%= $c->get_current_smtp_auth( TRUE ) | ||||
| 	</span></p> | ||||
|  | ||||
| 	% my $smtp_mesg=l('SMTPS SSL/TLS auth: port %u status:'); | ||||
| 	<p><span class=label> | ||||
| 		%= sprintf($smtp_mesg,$c->get_db_prop('sqpsmtpd','TCPPort',465));  | ||||
| 	</span><span class=data2> | ||||
| 	%= $c->get_current_smtp_ssl_auth( TRUE, 's', FALSE ) | ||||
| 	</span></p> | ||||
|  | ||||
| 	%my $smtp_mesg=l 'Submission port %u status:'; | ||||
| 	<p><span class=label> | ||||
| 		%= sprintf($smtp_mesg,$c->get_db_prop('uqpsmtpd','TCPPort',587));  | ||||
| 	</span><span class=data2> | ||||
| 	%= $c->get_current_smtp_ssl_auth( TRUE,'u', FALSE ) | ||||
| 	</span></p> | ||||
| 	<br /> | ||||
|  | ||||
|     % 	my $btn = l('mai_DESC_STATE_RECEPTION_BUTTON'); | ||||
|     <div class='center'> | ||||
| 	%= submit_button "$btn", class => 'action' | ||||
| @@ -103,7 +123,7 @@ | ||||
| 	<p><span class=label> | ||||
| 	%=l 'mai_LABEL_UNKNOWN' | ||||
| 	</span><span class=data2> | ||||
| 	%= $c->get_emailunknownuser_status( 1 ) | ||||
| 	%= $c->get_emailunknownuser_status( TRUE ) | ||||
| 	</span></p> | ||||
|  | ||||
| 	<p><span class=label> | ||||
| @@ -127,4 +147,4 @@ | ||||
|     % end     | ||||
|  | ||||
| </div> | ||||
| %end | ||||
| %end | ||||
| @@ -35,6 +35,19 @@ | ||||
|  | ||||
| 	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/3.5.0/css/flag-icon.min.css"> | ||||
| 	%= stylesheet '/css/sme-jquery-overrides.css' | ||||
| 	 | ||||
| 	<style> | ||||
| 	#busy-indicator { | ||||
| 		display: none; | ||||
| 		margin-top: 10px; | ||||
| 		font-weight: bold; | ||||
| 		color: red; | ||||
| 	} | ||||
| 	.busy { | ||||
| 		cursor: wait; /* Change the cursor to a 'wait' cursor */ | ||||
| 	} | ||||
| 	</style> | ||||
|  | ||||
|  | ||||
| </head> | ||||
|  | ||||
| @@ -94,6 +107,22 @@ | ||||
|     % } | ||||
|  | ||||
| %= javascript '/js/sme-dataTable-setup.js' | ||||
|  | ||||
| 	<script> | ||||
| 		$(document).ready(function() { | ||||
| 			// Handle form submission for any form | ||||
| 			$('form').on('submit', function(event) { | ||||
| 				// Disable the submit button | ||||
| 				$(this).find('button[type="submit"], input[type="submit"]').prop('disabled', true); | ||||
| 				// Show the busy indicator | ||||
| //				$('#busy-indicator').show(); | ||||
| 				 | ||||
| 				// Change the cursor to "wait" | ||||
| 				$('body').addClass('busy'); | ||||
| 			}); | ||||
| 		}); | ||||
| 	</script> | ||||
|  | ||||
|    | ||||
| </body> | ||||
| </html> | ||||
|   | ||||
| @@ -3,7 +3,7 @@ | ||||
| <a href="https://mojolicious.org" target="_blank"><img src="images/sme-mojo-logo-white.png" style="position:relative;"></a> | ||||
| <font class="sme-copyright"> | ||||
| %	if ( $c->is_logged_in ) { | ||||
| 	SME Server <%= session 'releaseVersion' %> - Manager <%= $c->app->VERSION %> | ||||
| 	SME Server <%= session 'releaseVersion' %>-<%= $c->app->VERSION %> Manager II | ||||
| % } | ||||
| <br>Copyright 1999-2006 Mitel Corporation<br> | ||||
| %= session 'copyRight' | ||||
|   | ||||
| @@ -76,11 +76,17 @@ | ||||
|     % 			$actionRemove = "<a href='useraccountsd?CsrfDef=TOKEN&trt=DEL&user=" . $username . "'>" . "<button class='sme-remove-button' title=".l("REMOVE").">".l("REMOVE")."</button></a>";  | ||||
|     %		} | ||||
|     %	    } | ||||
|     %		 | ||||
|     %		my $thisdomain = session 'SystemName'; | ||||
|     %		$thisdomain .= ".".session 'DomainName'; | ||||
|     %#		my $thisdomain = "localhost"; | ||||
|  | ||||
|     	    <td class='sme-border' style="min-width:35em"> | ||||
| 				<%= $c->render_to_string(inline => $actionModify) %> | ||||
| 				<%= $c->render_to_string(inline => $actionResetPw) %> | ||||
| 				<%= $c->render_to_string(inline => $actionLock) %> | ||||
| 				<%= $c->render_to_string(inline => $actionRemove) %> | ||||
| 				<a href="<%= "roundcubepanel/?url=https://".$thisdomain."/" %>roundcube?_user=<%= $username %>"><button class="sme-email-button" title="<%= l('EMAIL') %>"><%= l('EMAIL') %></button></a> | ||||
|     	    </td> | ||||
|     	</tr> | ||||
|     %    } | ||||
|   | ||||
| @@ -0,0 +1,39 @@ | ||||
| % layout 'default', title => "Sme server 2 -  roundcube"; | ||||
|  | ||||
| % content_for 'module' => begin | ||||
|  | ||||
|  | ||||
| <div id='roundcube' class='roundcube roundcube-panel'> | ||||
|     % if ($config->{debug} == 1) { | ||||
| 		<p> | ||||
| 			%= dumper $c->current_route | ||||
| 		</p> | ||||
|     % } | ||||
|     % if ( stash 'error' ) { | ||||
|     	<br><div class=sme-error> | ||||
| 			%= $c->render_to_string(inline => stash 'error')  | ||||
| 		</div> | ||||
|     %} | ||||
|     <h1> roundcube - <%=$title %></h1><br> | ||||
|     <p>If the roundcube panel does not appear after logging in, then please check your password.</p><br /> | ||||
|  | ||||
|     % my $thisdomain = session 'SystemName'; | ||||
|     % $thisdomain .= ".".session 'DomainName'; | ||||
|     % my $url = $c->stash('modul'); | ||||
|     % my $username = 'admin'; | ||||
|     % if ($url =~ /[?&]_user=([^&]+)/) { | ||||
| 	%	$username = $1; | ||||
| 	%} | ||||
| 	 | ||||
| 	<a href="<%= "https://".$thisdomain."/" %>roundcube?_user=<%= $username %>"><button class="sme-fullwindow1-button" width=20em title="<%= l('Full Window') %>"><%= l('Full Window') %></button></a> | ||||
|  | ||||
|     % my $height = $c->stash('height') | '600px'; | ||||
|     % if ($height !~ /px$/) { $height = $height.'px';} | ||||
|     % if ($url eq "") { | ||||
| 	%	$url = "https://".$thisdomain."/roundcube"; | ||||
| 	%} | ||||
| 	<object id="roundcube" class="roundcube" data="<%=$url %>" style="width:99%;height:<%= $height %>;" title="<%= $c->stash('title') %>"  type="text/html" ><%= $c->stash('title') %> not found</object> | ||||
| </div> | ||||
|  | ||||
|  | ||||
| %end | ||||
| @@ -79,9 +79,9 @@ | ||||
|  | ||||
|     	%=  hidden_field 'trt' => 'CONF' | ||||
| 	<br> | ||||
|     <div class='center'> | ||||
|     <!--<div class='center'>--> | ||||
| 	%= submit_button $c->l('SAVE'), class => 'action' | ||||
|     </div> | ||||
|     <!--</div>--> | ||||
|  | ||||
|     % end | ||||
|  | ||||
|   | ||||
| @@ -47,9 +47,9 @@ | ||||
|  | ||||
|     	%=  hidden_field 'trt' => 'INST' | ||||
| 	<br><br> | ||||
|     <div class='center'> | ||||
|     <!-- <div class='center'>--> | ||||
| 	%= submit_button $c->l('yum_INSTALL_SOFTWARE'), class => 'action' | ||||
|     </div> | ||||
|     <!--</div>--> | ||||
|  | ||||
|     % end | ||||
|  | ||||
|   | ||||
| @@ -34,9 +34,9 @@ | ||||
|     	%=  hidden_field 'trt' => 'PSTU' | ||||
|     	%=  hidden_field 'reconf' => $yum_datas->{reconf} | ||||
| 	<br> | ||||
|     <div class='center'> | ||||
|     <!-- <div class='center'>--> | ||||
| 	%= submit_button "$btn", class => 'action' | ||||
|     </div> | ||||
|     <!--</div>--> | ||||
|  | ||||
|     % end | ||||
|  | ||||
|   | ||||
| @@ -46,9 +46,9 @@ | ||||
|  | ||||
|     	%=  hidden_field 'trt' => 'REMO' | ||||
| 	<br> | ||||
|     <div class='center'> | ||||
|     <!--<div class='center'>--> | ||||
| 	%= submit_button $c->l('REMOVE'), class => 'action' | ||||
|     </div> | ||||
|     <!--</div>--> | ||||
|  | ||||
|     % end | ||||
|  | ||||
|   | ||||
| @@ -33,9 +33,9 @@ | ||||
|  | ||||
|     	%=  hidden_field 'trt' => 'UPDT' | ||||
| 	<br> | ||||
|     <div class='center'> | ||||
|     <!--<div class='center'>--> | ||||
| 	%= submit_button $c->l('yum_INSTALL_UPDATES'), class => 'action' | ||||
|     </div> | ||||
|     <!--</div>--> | ||||
|  | ||||
|     % end | ||||
|  | ||||
|   | ||||
| @@ -2,7 +2,7 @@ Summary: Sme server  navigation module : manager 2 | ||||
| %define name smeserver-manager | ||||
| Name: %{name} | ||||
| %define version 11.0.0 | ||||
| %define release 16 | ||||
| %define release 28 | ||||
| Version: %{version} | ||||
| Release: %{release}%{?dist} | ||||
| License: GPL | ||||
| @@ -49,6 +49,11 @@ This RPM contributes the navigation bars for the smeserver-manager. New Mojolici | ||||
| %setup | ||||
|  | ||||
| %build | ||||
|  | ||||
| #extract the release number and drop it in to the version for SM2 footer. | ||||
| sed -i "s/our \$VERSION = '[^']*'/our \$VERSION = '%{release}'/g" root/usr/share/smanager/lib/SrvMngr.pm | ||||
|  | ||||
|  | ||||
| perl createlinks | ||||
|  | ||||
| # Force creation of potentially empty directories | ||||
| @@ -108,6 +113,45 @@ true | ||||
| %defattr(-,root,root) | ||||
|  | ||||
| %changelog | ||||
| * Fri Oct 18 2024 Brian Read <brianr@koozali.org> 11.0.0-28.sme | ||||
| - Add in emailsettings for port 25,465 and 587  [SME: 12750] | ||||
| - Comment out change to localhost for roundcube in _user_list email icon setting [SME: 12751] | ||||
|  | ||||
| * Sun Oct 06 2024 Brian Read <brianr@koozali.org> 11.0.0-27.sme | ||||
| - Add in change to _user_list.html.ep for access to roundcube email from useraccounts [SME: 12751] | ||||
|  | ||||
| * Fri Oct 04 2024 Brian Read <brianr@koozali.org> 11.0.0-26.sme | ||||
| - Add in email link to roundcube from user accounts [SME: 12751] | ||||
|  | ||||
| * Wed Oct 02 2024 Brian Read <brianr@koozali.org> 11.0.0-25.sme | ||||
| - Add in cursor change when save/submit pressed to indicate processing [SME: 12748] | ||||
|  | ||||
| * Wed Oct 02 2024 Brian Read <brianr@koozali.org> 11.0.0-24.sme | ||||
| - Messed up build - finger trouble [SME: 12753] | ||||
|  | ||||
| * Wed Oct 02 2024 Brian Read <brianr@koozali.org> 11.0.0-23.sme | ||||
| - Add release number to footer  [SME: 12753] | ||||
|  | ||||
| * Tue Sep 24 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-22.sme | ||||
| - fix typos, and tidy tabs [SME: 12744] | ||||
|  | ||||
| * Mon Sep 23 2024 Brian Read <brianr@koozali.org> 11.0.0-21.sme | ||||
| - Remove both option for webmail [SME: 12744] | ||||
| - Add in re-open DB for portforwarding and email settings. | ||||
|  | ||||
| * Mon Sep 23 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-20.sme | ||||
| - webmail switch panel to use roundcube [SME: 12742] | ||||
| - prevent browser from caching [SME: 12695] | ||||
|  | ||||
| * Thu Sep 05 2024 Brian Read <brianr@koozali.org> 11.0.0-19.sme | ||||
| - Add in mojo plugin WithoutCache [SME: 12695] | ||||
|  | ||||
| * Sun Aug 25 2024 Brian Read <brianr@koozali.org> 11.0.0-18.sme | ||||
| - Move flag to emojii from downloaded jpg. Fix singleton locale issue[SME: 12706] | ||||
|  | ||||
| * Thu Aug 22 2024 Brian Read <brianr@koozali.org> 11.0.0-17.sme | ||||
| - Left Align Software Install panels Submit button [SME: 12727] | ||||
|  | ||||
| * Wed Aug 21 2024 Brian Read <brianr@koozali.org> 11.0.0-16.sme | ||||
| - Typo uc DNF changed to lc dnf in Yum.pm [SME: 127245] | ||||
| - Monitor dnf running using dnf status file  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user