Compare commits
	
		
			31 Commits
		
	
	
		
			11_0_0-63_
			...
			11_0_0-89_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1a8f935431 | |||
| e8d6d39583 | |||
| 91201b7b02 | |||
| c85022c49e | |||
| fd076895ba | |||
| 
						 | 
					d993bd9d19 | ||
| 
						 | 
					a31806f205 | ||
| b44f1c5000 | |||
| 2538ac9ea0 | |||
| dbfeaa18a3 | |||
| ced08b28d4 | |||
| c74a71dee1 | |||
| 96b002e7a9 | |||
| f30b4ab2b5 | |||
| fa286e966d | |||
| 9bb2128891 | |||
| accf96df0d | |||
| 1c601f0ace | |||
| cffbe53fb4 | |||
| aad1a458f4 | |||
| 252bf20410 | |||
| ebbe7af9a7 | |||
| 36de44fcef | |||
| 750ab7dd11 | |||
| 77ca17c851 | |||
| 535d78eacb | |||
| 88ee369253 | |||
| 5be2152e89 | |||
| 63973f2bb4 | |||
| 82ff48e641 | |||
| c5d863b3a0 | 
							
								
								
									
										12
									
								
								createlinks
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								createlinks
									
									
									
									
									
								
							@@ -8,12 +8,12 @@ use esmith::Build::CreateLinks  qw(:all);
 | 
			
		||||
my $mngrdir = '/usr/share/smanager';
 | 
			
		||||
 | 
			
		||||
# templates to expand
 | 
			
		||||
for (  qw( sme_core.css sme_main.css sme_menu.css styles.css ) )
 | 
			
		||||
{
 | 
			
		||||
    templates2events("$mngrdir/themes/default/public/css/$_", qw(
 | 
			
		||||
        bootstrap-console-save smeserver-manager-update
 | 
			
		||||
        ));
 | 
			
		||||
}
 | 
			
		||||
#for (  qw( sme_core.css sme_main.css sme_menu.css styles.css ) )
 | 
			
		||||
#{
 | 
			
		||||
#    templates2events("$mngrdir/themes/default/public/css/$_", qw(
 | 
			
		||||
#        bootstrap-console-save smeserver-manager-update
 | 
			
		||||
#        ));
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
templates2events("$mngrdir/conf/srvmngr.conf", 
 | 
			
		||||
        qw( smeserver-manager-update smanager-theme-change smanager-modify bootstrap-console-save ));
 | 
			
		||||
 
 | 
			
		||||
@@ -1,250 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT = <<'EOF';
 | 
			
		||||
 | 
			
		||||
/*	from e-smith-manager to smanager (smeserver_manager2)  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* This is the stylesheet used as the basis for older broswers.
 | 
			
		||||
 | 
			
		||||
Note that you CANNOT simly add styles here and hope they work.  ONLY CSS
 | 
			
		||||
level 1 styles should be in this file.  Everyting else goes into the other 3
 | 
			
		||||
files.
 | 
			
		||||
 | 
			
		||||
These basic styles ensire that browsers that don't understand the @import
 | 
			
		||||
method will still be usable.  All modern browsers will use the styles in
 | 
			
		||||
sme_main.css, sme_menu.css or sme_header.css depending on the frame in which
 | 
			
		||||
the page is found.   
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/* Default HTML styles */
 | 
			
		||||
body {
 | 
			
		||||
    background: #ffffff;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    border-width: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table, tr, td, div, p, form {
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
p {
 | 
			
		||||
    margin-top: 8px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
form {
 | 
			
		||||
    margin-top: 2px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.notsmall {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h1, .h1 {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    color: #333333;
 | 
			
		||||
    font-size: 18px;
 | 
			
		||||
    margin-bottom: 4px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h2, .h2 {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    color: #333333;
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
    margin-bottom: 3px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h3, .h3 {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    color: #333333;
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h4, .h4 {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-style: italic;
 | 
			
		||||
    color: #333333;
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
    margin-top: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ol, ul, li {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    color: black;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ul {
 | 
			
		||||
    list-style-type: circle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Core styles for use with sme_header.css*/
 | 
			
		||||
body.header { 
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background: #cccccc; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.hilightbar {
 | 
			
		||||
    background-color: #ffc50a;
 | 
			
		||||
    font-size: 4px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.infobar {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background-color: #cccccc;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.darkergrey {
 | 
			
		||||
    color: #666666;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.darkgrey {
 | 
			
		||||
    background-color: #888888;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.update {
 | 
			
		||||
    color: red;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background: #cccccc; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Core styles for use with sme_menu.css */
 | 
			
		||||
 | 
			
		||||
body.menu { 
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.section {
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    padding-top: 8px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.section {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item { 
 | 
			
		||||
    color: #00008b;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background: #e8f3e1; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.sl { 
 | 
			
		||||
    color: green;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background: #e8f3e1; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.alert { 
 | 
			
		||||
    color: red;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background: #e8f3e1; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Core styles for use with sme_main.css */
 | 
			
		||||
body.main { 
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px; 
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-noborders-label {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    width: 33%;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
hr.sectionbar {
 | 
			
		||||
    color: #666666;
 | 
			
		||||
    background-color: #666666;
 | 
			
		||||
    height: 1px;
 | 
			
		||||
    width: 80%;
 | 
			
		||||
    border: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
hr.sme-copyrightbar {
 | 
			
		||||
    color: #dddddd;
 | 
			
		||||
    background-color: #dddddd;
 | 
			
		||||
    height: 1px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    border: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sme-copyright {
 | 
			
		||||
    color: #777777;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*These style definitions were found int he old css file (manager.css)
 | 
			
		||||
but don't seem to ever be referenced in the code.  They're here
 | 
			
		||||
for reference.
 | 
			
		||||
 | 
			
		||||
.centerit {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
.highlight {
 | 
			
		||||
    background: #ffc61e;
 | 
			
		||||
}
 | 
			
		||||
.subheading {
 | 
			
		||||
    background: #ffffff;
 | 
			
		||||
    color: #1e385b;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -1,96 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT =<<'HERE';
 | 
			
		||||
 | 
			
		||||
/*	from e-smith-manager to smanager (smeserver_manager2)  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*contribs.org styling 
 | 
			
		||||
*/
 | 
			
		||||
body.header {
 | 
			
		||||
background: #bee6a2;
 | 
			
		||||
    }
 | 
			
		||||
.hilightbar {
 | 
			
		||||
background-color: #ffffff;
 | 
			
		||||
    }
 | 
			
		||||
.infobar {
 | 
			
		||||
background-color: #98d36e;
 | 
			
		||||
    }
 | 
			
		||||
a.update {
 | 
			
		||||
font-size: 11px;
 | 
			
		||||
background: #98d36e;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
/* Core styles for use with sme_menu.css */
 | 
			
		||||
body.menu {
 | 
			
		||||
background-color: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
td.section {
 | 
			
		||||
background-color: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
a.item {
 | 
			
		||||
background: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
a.sl {
 | 
			
		||||
background: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
a.alert {
 | 
			
		||||
background: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
/* Core Styles for use with sme_main.css */
 | 
			
		||||
hr.sectionbar {
 | 
			
		||||
color: #8ebe43;
 | 
			
		||||
background-color: #8ebe43;
 | 
			
		||||
    }
 | 
			
		||||
hr.sme-copyrightbar {
 | 
			
		||||
color: #8ebe43;
 | 
			
		||||
background-color: #8ebe43;
 | 
			
		||||
    }
 | 
			
		||||
      
 | 
			
		||||
/* flag container*/
 | 
			
		||||
#flag-container span {
 | 
			
		||||
	font-size: 24px;
 | 
			
		||||
    display: flex;                     /* Allows for easy centering */
 | 
			
		||||
    justify-content: center;           /* Center horizontally */
 | 
			
		||||
    align-items: center;               /* Center vertically */
 | 
			
		||||
    width: 100%;                       /* Full width of parent */
 | 
			
		||||
    height: 24px;                      /* Set a fixed height */
 | 
			
		||||
    border: 1px solid #ccc;            /* Light gray border */
 | 
			
		||||
    border-radius: 5px;                /* Rounded corners */
 | 
			
		||||
    cursor: default;                   /* Prevent text cursor */
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.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
 | 
			
		||||
}
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
 | 
			
		||||
@@ -1,440 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT = <<'EOF';
 | 
			
		||||
 | 
			
		||||
/*	from e-smith-manager to smanager (smeserver_manager2)  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/*	This is the stylesheet used in the main panels only.  
 | 
			
		||||
 | 
			
		||||
   This file inherits the styles use in sme_core in the "header" section, and
 | 
			
		||||
   as noted in the code below. Note that some of the styles here are empty.  
 | 
			
		||||
	This is because the style definition has moved safely to sme_core.css
 | 
			
		||||
	and the placeholder is left here for reference or future use.
 | 
			
		||||
 | 
			
		||||
   There are a lot of styles in here, so read carefully.  Each one is documented.
 | 
			
		||||
 | 
			
		||||
	Styles that were in the old stylesheets, but are not used in the UI are at the
 | 
			
		||||
	bottom, commented out.  These can be removed at the end of the 6.0 cycle */
 | 
			
		||||
 | 
			
		||||
/* general page properties */
 | 
			
		||||
body, body.main { 
 | 
			
		||||
    margin-top: 5px; 
 | 
			
		||||
    margin-right: 20px; 
 | 
			
		||||
    margin-bottom: 5px; 
 | 
			
		||||
    margin-left: 5px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Table properties ****************************************/
 | 
			
		||||
/* There are THREE  types of tables
 | 
			
		||||
   1. *.sme-layout*     is used for layout purposes.  It is the "master
 | 
			
		||||
	                      container" on a page.  It controls the top-level table
 | 
			
		||||
                         inside of which everything else is put.
 | 
			
		||||
	2. *.sme-noborders*  is used for layout, and defines a borderless table and 
 | 
			
		||||
	                      cells used within it.
 | 
			
		||||
	2. *.sme-border*     is used for tabular data, and defines a header row and borders
 | 
			
		||||
	                      for tables that need borders
 | 
			
		||||
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
/*First, some defaults */
 | 
			
		||||
td {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
sme-layout* : Used for top-level layout
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
table.sme-layout {
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
	 margin-bottom: 2px;
 | 
			
		||||
	 margin-top: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tr.sme-layout {
 | 
			
		||||
    border: 1px solid #dddddd; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-layout {
 | 
			
		||||
    border: 1px solid #dddddd; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*This special style is actually used only for the button row along the bottom of each page*/
 | 
			
		||||
th.sme-layout {
 | 
			
		||||
    border: 1px solid #dddddd; 
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 9pt;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    text-align: right; 
 | 
			
		||||
    padding: 4px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
sme-noborders* : Used for mid-level layout
 | 
			
		||||
*/
 | 
			
		||||
table.sme-noborders {
 | 
			
		||||
    padding: 0px;
 | 
			
		||||
    margin-top: 0px;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    margin-right: 0px;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
td.sme-noborders-label {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    /*width: 250px;*/
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    /*vertical-align: top;*/
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
td.sme-noborders-content {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    vertical-align: top;	
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
td.sme-noborders-info, div.sme-noborders-info {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    vertical-align: top;	
 | 
			
		||||
}
 | 
			
		||||
/* Used for a left-most column of radio buttons (see date/time panel) */
 | 
			
		||||
td.sme-radiobutton {
 | 
			
		||||
    width: 30px;
 | 
			
		||||
}
 | 
			
		||||
/* 
 | 
			
		||||
sme-border* : Used for tabular data
 | 
			
		||||
*/
 | 
			
		||||
table.sme-border {
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
    border: 2px solid #cccccc;
 | 
			
		||||
    empty-cells: show;
 | 
			
		||||
    margin: 5px 5px 5px 2px;	 
 | 
			
		||||
}
 | 
			
		||||
td.sme-border,
 | 
			
		||||
td.sme-border-warning,
 | 
			
		||||
td.sme-border-right,
 | 
			
		||||
td.sme-border-center {
 | 
			
		||||
    border: 1px solid #cccccc;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    padding-left: 2px;
 | 
			
		||||
    padding-right: 2px;
 | 
			
		||||
    padding-top: 3px;
 | 
			
		||||
    padding-bottom: 3px;
 | 
			
		||||
}
 | 
			
		||||
td.sme-border-warning {
 | 
			
		||||
    color: red;
 | 
			
		||||
	 }
 | 
			
		||||
td.sme-border-right {text-align: right;}
 | 
			
		||||
td.sme-border-center {text-align: center;}
 | 
			
		||||
th.sme-border {
 | 
			
		||||
    border: 1px solid #cccccc; 
 | 
			
		||||
    background-color: #bee6a2;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
	 vertical-align: bottom;
 | 
			
		||||
    padding-left: 2px;
 | 
			
		||||
    padding-right: 2px;
 | 
			
		||||
    padding-left: 3px;
 | 
			
		||||
    padding-right: 3px;
 | 
			
		||||
    padding-top: 3px;
 | 
			
		||||
    padding-bottom: 3px;
 | 
			
		||||
	 /*border-width: 1px;
 | 
			
		||||
	 border-style: solid;
 | 
			
		||||
    border-color: #F2F0EE #75736E #75736E #F2F0EE ;*/ 
 | 
			
		||||
}
 | 
			
		||||
td.sme-border a, td.sme-border-right a, td.sme-border-center a {
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* misc layout stuff*/
 | 
			
		||||
/* these two are for any error messages that pop up*/
 | 
			
		||||
div.error, div.sme-error, span.error, span.sme-error {
 | 
			
		||||
    color: red;
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: red ; 
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    margin-left: 20px;
 | 
			
		||||
    margin-right: 20px;
 | 
			
		||||
    margin-top:0px;
 | 
			
		||||
    margin-bottom:0px;
 | 
			
		||||
	 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.error-noborders, div.sme-error-noborders,
 | 
			
		||||
span.error-noborders, span.sme-error-noborders
 | 
			
		||||
{
 | 
			
		||||
    color: red;
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    border-width: 0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.error h2, span.error h2,
 | 
			
		||||
div.error p, span.error p
 | 
			
		||||
{
 | 
			
		||||
    color: red;
 | 
			
		||||
}
 | 
			
		||||
/* These are for the special case of a link being inside an error message */
 | 
			
		||||
div.sme-error a, div.error a, span.error a, span.sme-error a,
 | 
			
		||||
div.error-noborders a, div.sme-error-noborders a,
 | 
			
		||||
span.error-noborders a, span.sme-error-noborders a
 | 
			
		||||
{
 | 
			
		||||
    color: #ff0000;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    text-decoration: underline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* For when a link is the error message */
 | 
			
		||||
a.error:link, a.error:visited, a.error:hover, a.error:active {
 | 
			
		||||
    color: #ff0000;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    text-decoration: underline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* these two are for any success messages that pop up*/
 | 
			
		||||
div.success, span.success {
 | 
			
		||||
    color: #006400;
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: #006400 ; 
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    margin-left: 20px;
 | 
			
		||||
    margin-right: 20px;
 | 
			
		||||
    margin-top:0px;
 | 
			
		||||
    margin-bottom:0px;
 | 
			
		||||
	 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* These two are for the special case of a link being inside a success message */
 | 
			
		||||
div.success a, span.success a 
 | 
			
		||||
{
 | 
			
		||||
    color: #006400;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    text-decoration: underline;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.success h2, span.success h2,
 | 
			
		||||
div.success p, span.success p
 | 
			
		||||
{
 | 
			
		||||
    color: green;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*These two define the copyright footer styles, one for the line and one for the text*/
 | 
			
		||||
hr.sme-copyrightbar {
 | 
			
		||||
}
 | 
			
		||||
.sme-copyright {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* These ones define styles for the links that are made to look like
 | 
			
		||||
   standard form submit buttons */
 | 
			
		||||
a.button-like:link, 
 | 
			
		||||
a.button-like:visited,
 | 
			
		||||
a.button-like:hover,
 | 
			
		||||
a.button-like:active,
 | 
			
		||||
a.button-like-small:link, 
 | 
			
		||||
a.button-like-small:visited,
 | 
			
		||||
a.button-like-small:hover,
 | 
			
		||||
a.button-like-small:active { 
 | 
			
		||||
    font-family: sans-serif;
 | 
			
		||||
    font-size: 13px; 
 | 
			
		||||
    color: black; 
 | 
			
		||||
    background: #D4D0C8; 
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
    border-color: #F2F0EE #75736E #75736E #F2F0EE ; 
 | 
			
		||||
    margin-top: 10px; 
 | 
			
		||||
    margin-right: 2px; 
 | 
			
		||||
    margin-bottom: 10px; 
 | 
			
		||||
    margin-left: 2px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 2px; 
 | 
			
		||||
    border-right-width: 2px; 
 | 
			
		||||
    border-bottom-width: 2px; 
 | 
			
		||||
    border-left-width: 2px;
 | 
			
		||||
    padding-top: 2px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    padding-left: 6px; 
 | 
			
		||||
    padding-right: 6px; 
 | 
			
		||||
 }
 | 
			
		||||
a.button-like-small:link, 
 | 
			
		||||
a.button-like-small:visited,
 | 
			
		||||
a.button-like-small:hover,
 | 
			
		||||
a.button-like-small:active { 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    padding-top: 0px; 
 | 
			
		||||
    padding-bottom: 0px; 
 | 
			
		||||
    padding-left: 1px; 
 | 
			
		||||
    padding-right: 1px; 
 | 
			
		||||
}
 | 
			
		||||
a.button-like:active,
 | 
			
		||||
a.button-like-small:active { 
 | 
			
		||||
    border-color: #75736E #F2F0EE #F2F0EE #75736E  ; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* EXPERIMENTAL SECTION */
 | 
			
		||||
/* These are styles used to experiment with. */
 | 
			
		||||
 | 
			
		||||
/* class for links, similar to the class in sme_menu.css, but for a red button */
 | 
			
		||||
a.button-like-red:link, 
 | 
			
		||||
a.button-like-red:visited,
 | 
			
		||||
a.button-like-red:hover,
 | 
			
		||||
a.button-like-red:active { 
 | 
			
		||||
    border-left: #F1726C 2px solid;
 | 
			
		||||
    border-right: #B42025 2px solid;
 | 
			
		||||
    border-top: #F1726C 2px solid;
 | 
			
		||||
    border-bottom: #B42025 2px solid;
 | 
			
		||||
 }
 | 
			
		||||
a.button-like-red:active { 
 | 
			
		||||
    border-color: #75736E #F2F0EE #F2F0EE #75736E  ; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*These are style definitions found in the UI but not defined in any file I 
 | 
			
		||||
  could locate.  They're listed here for historical purposes, but have been
 | 
			
		||||
  removed from the UI
 | 
			
		||||
 | 
			
		||||
pagedescription (used in the first paragraph of text on a page) [HTML.pm]
 | 
			
		||||
label (used in forms) [HTML.pm]
 | 
			
		||||
field (used in forms) [HTML.pm]
 | 
			
		||||
fielddescription (used ???)[HTML.pm]
 | 
			
		||||
buttons (used in forms) [HTML.pm]
 | 
			
		||||
*/  
 | 
			
		||||
/*td.sme-submitbutton {
 | 
			
		||||
	text-align: right;
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*These style definitions were found int he old css file (manager.css)
 | 
			
		||||
  but don't seem to ever be referenced in the code.  They're here
 | 
			
		||||
  for reference.
 | 
			
		||||
 | 
			
		||||
.banner {
 | 
			
		||||
    background: #000000;
 | 
			
		||||
    color: #ffffff;
 | 
			
		||||
}
 | 
			
		||||
.banner-right {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    background: #e17200;
 | 
			
		||||
    color: #ffffff;
 | 
			
		||||
}
 | 
			
		||||
.border {
 | 
			
		||||
    background: #000000;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    border-color: #000000;
 | 
			
		||||
}
 | 
			
		||||
.sidebar {
 | 
			
		||||
    width: 200px;
 | 
			
		||||
    background: #ffffff;
 | 
			
		||||
    font-size: smaller;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
}
 | 
			
		||||
.sidebar-title {
 | 
			
		||||
    background: #1e385b;
 | 
			
		||||
    color: #ffffff;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
.newsitem {
 | 
			
		||||
    background: #ffffff;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    margin-left: 5px;
 | 
			
		||||
    margin-right: 5px;
 | 
			
		||||
    margin-top: 5px;
 | 
			
		||||
    margin-bottom: 5px;
 | 
			
		||||
}
 | 
			
		||||
.newsitem-title {
 | 
			
		||||
    background: #cccccc;
 | 
			
		||||
    color: #ffffff;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
.newsitem-footer {
 | 
			
		||||
    background: #cccccc;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: smaller;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
.newsitem-detail {
 | 
			
		||||
    font-size: smaller;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
} 
 | 
			
		||||
.formlabel {
 | 
			
		||||
    background: #c0c0c0;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: small;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
.welcome-link {
 | 
			
		||||
    background: #ffffff;
 | 
			
		||||
    color: #1e385b;
 | 
			
		||||
}
 | 
			
		||||
.littlelink {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
}
 | 
			
		||||
#textlayer {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    visibility: inherit;
 | 
			
		||||
    top: 160px;
 | 
			
		||||
    left: 50px;
 | 
			
		||||
    z-index: 2;
 | 
			
		||||
}
 | 
			
		||||
#para {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #000000;
 | 
			
		||||
}  
 | 
			
		||||
#title {
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    padding: 7px 7px 7px 7px;
 | 
			
		||||
    color: #ffffff;
 | 
			
		||||
} 
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -1,50 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT =<<'HERE';
 | 
			
		||||
 | 
			
		||||
/*	from e-smith-manager to smanager (smeserver_manager2)  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
/*contribs.org styling */
 | 
			
		||||
 | 
			
		||||
/* This special style is actually used only for the button row along the bottom of each page */
 | 
			
		||||
th.sme-layout {
 | 
			
		||||
border: 1px solid #8ebe43;
 | 
			
		||||
background-color: #bee6a2;
 | 
			
		||||
    }
 | 
			
		||||
table.sme-border {
 | 
			
		||||
border: 2px solid #dddddd;
 | 
			
		||||
    }
 | 
			
		||||
td.sme-border-warning,
 | 
			
		||||
td.sme-border-right,
 | 
			
		||||
td.sme-border-center {
 | 
			
		||||
border: 1px solid #dddddd;
 | 
			
		||||
    }
 | 
			
		||||
td.sme-border-right {text-align: right;}
 | 
			
		||||
td.sme-border-center {text-align: center;}
 | 
			
		||||
th.sme-border {
 | 
			
		||||
border: 1px solid #dddddd;
 | 
			
		||||
background-color: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
HERE
 | 
			
		||||
}
 | 
			
		||||
    
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
 | 
			
		||||
@@ -1,229 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT = <<'EOF';
 | 
			
		||||
 | 
			
		||||
/*	from e-smith-manager to smanager (smeserver_manager2)  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* This is the stylesheet used in the navigation panel only
 | 
			
		||||
 | 
			
		||||
   This file inherits the styles use in sme_core in the "navigation" section,
 | 
			
		||||
   and as noted in the code below. Note that some of the styles here are empty.
 | 
			
		||||
   This is because the style definition has moved safely to sme_core.css and
 | 
			
		||||
   the placeholder is left here for reference or future use.
 | 
			
		||||
 | 
			
		||||
   There are a lot of styles in here, so read carefully.  Each one is
 | 
			
		||||
   documented.
 | 
			
		||||
 | 
			
		||||
   Styles that were in the old stylesheets, but are not used in the UI are at
 | 
			
		||||
   the bottom, commented out.  These can be removed at the end of the 6.0
 | 
			
		||||
   cycle */
 | 
			
		||||
 | 
			
		||||
/* Sets the general page properties */
 | 
			
		||||
body, body.menu { 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 2px; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* This is the section heading style */
 | 
			
		||||
.section {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.menu-cell {
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    padding-left: 0px;
 | 
			
		||||
    padding-right: 0px;
 | 
			
		||||
    padding-top: 0px;
 | 
			
		||||
    padding-bottom: 0px;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
All the a links use pseudoclasses to control the two visual link styles.
 | 
			
		||||
For example:
 | 
			
		||||
  a.item:link             the general link item
 | 
			
		||||
  a.item-current:link:    the active link item
 | 
			
		||||
 | 
			
		||||
The switch from item to item-current is done with a javascript script in the head of the
 | 
			
		||||
navigation page, using the onClick event.
 | 
			
		||||
 | 
			
		||||
We are making heavy use of the cascade with these.
 | 
			
		||||
*/    
 | 
			
		||||
 | 
			
		||||
/* a:link controls the look of a link when the mouse is nowhere near it */
 | 
			
		||||
a.item:link, a.item-current:link, 
 | 
			
		||||
a.warn:link, a.warn-current:link { 
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    color: black; 
 | 
			
		||||
    background: #e8f3e1; 
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
    border-color: #e8f3e1; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px;
 | 
			
		||||
    padding-right: 10px; 
 | 
			
		||||
    padding-left: 10px; 
 | 
			
		||||
    padding-top: 0px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
 }
 | 
			
		||||
 | 
			
		||||
/* a:visited controls the look of a visited link (one that has been clicked) */
 | 
			
		||||
a.item:visited, a.item-current:visited, 
 | 
			
		||||
a.warn:visited, a.warn-current:visited { 
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    color: black; 
 | 
			
		||||
    background: #e8f3e1; 
 | 
			
		||||
    text-decoration: none; 
 | 
			
		||||
    border-color: #e8f3e1; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px;
 | 
			
		||||
    padding-right: 10px; 
 | 
			
		||||
    padding-left: 10px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* a:hover controls the look of a link under the curser*/
 | 
			
		||||
a.item:hover, a.item-current:hover,
 | 
			
		||||
a.warn:hover, a.warn-current:hover { 
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    color: black; 
 | 
			
		||||
    text-decoration: none; 
 | 
			
		||||
    background: #cccccc; 
 | 
			
		||||
    border-color: #888888; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px;
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px; 
 | 
			
		||||
    padding-right: 10px; 
 | 
			
		||||
    padding-left: 10px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* a:active controls the look of a link as it is selected*/
 | 
			
		||||
a.item:active, a.item-current:active, 
 | 
			
		||||
a.warn:active, a.warn-current:active { 
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    color: white; 
 | 
			
		||||
    background: black; 
 | 
			
		||||
    text-decoration: none ; 
 | 
			
		||||
    border-color: #000000; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px; 
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px;
 | 
			
		||||
    padding-right: 10px; 
 | 
			
		||||
    padding-left: 10px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* 
 | 
			
		||||
These styles are to ensure that a selected link appears selected, even if the link
 | 
			
		||||
opens in another frame.  This uses a javascript chunk in the head of the navigation 
 | 
			
		||||
frame to change the style using the onClick event.
 | 
			
		||||
*/
 | 
			
		||||
a.item-current:link,    a.warn-current:link,
 | 
			
		||||
a.item-current:visited, a.warn-current:visited, 
 | 
			
		||||
a.item-current:active,  a.warn-current:active,
 | 
			
		||||
a.item-current:hover,   a.warn-current:hover { 
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
    font-size: 10px; 
 | 
			
		||||
    color: black; 
 | 
			
		||||
    text-decoration: none; 
 | 
			
		||||
    background: #ffffff; 
 | 
			
		||||
    border-color: #888888; 
 | 
			
		||||
    margin-top: 0px; 
 | 
			
		||||
    margin-right: 0px;
 | 
			
		||||
    margin-bottom: 0px; 
 | 
			
		||||
    margin-left: 0px; 
 | 
			
		||||
    border-style: solid; 
 | 
			
		||||
    border-top-width: 1px; 
 | 
			
		||||
    border-right-width: 1px; 
 | 
			
		||||
    border-bottom-width: 1px; 
 | 
			
		||||
    border-left-width: 1px; 
 | 
			
		||||
    padding-right: 10px; 
 | 
			
		||||
    padding-left: 10px; 
 | 
			
		||||
    padding-bottom: 2px; 
 | 
			
		||||
    text-align: left; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* these two add a border on the styles defined directly above when
 | 
			
		||||
the mouse is hovering over them */
 | 
			
		||||
a.item-current:hover,   a.warn-current:hover { 
 | 
			
		||||
    border-color: #888888; 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* These redefine a few elements to make room for the icon to the left of the warn class*/
 | 
			
		||||
a.warn:link,    a.warn-current:link, 
 | 
			
		||||
a.warn:visited, a.warn-current:visited, 
 | 
			
		||||
a.warn:active,  a.warn-current:active,
 | 
			
		||||
a.warn:hover,   a.warn-current:hover { 
 | 
			
		||||
    background-image: url(/server-common/warn.gif);
 | 
			
		||||
    background-repeat: no-repeat;
 | 
			
		||||
    background-position: 10px; 
 | 
			
		||||
    padding-left: 25px; 
 | 
			
		||||
}
 | 
			
		||||
/*end*/
 | 
			
		||||
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
 | 
			
		||||
@@ -1,293 +0,0 @@
 | 
			
		||||
{
 | 
			
		||||
    $OUT = <<'EOF';
 | 
			
		||||
 | 
			
		||||
/*	smeserver_manager2  */
 | 
			
		||||
 | 
			
		||||
/*----------------------------------------------------------------------
 | 
			
		||||
 * copyright (C) 1999-2003 Mitel Networks Corporation
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software; you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation; either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program; if not, write to the Free Software
 | 
			
		||||
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
 | 
			
		||||
 *
 | 
			
		||||
 * Technical support for this program is available from Mitel Networks
 | 
			
		||||
 * Please visit our web site www.mitel.com for details.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* This is the basic stylesheet originally used in the mojo version.
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
body{
 | 
			
		||||
    background-color: #FFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#container{
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
    position: relative;
 | 
			
		||||
    margin: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#navigation{
 | 
			
		||||
    width: 190px;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
    background-color: #E8F3E1;
 | 
			
		||||
/*    height: 600px; */
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#main{
 | 
			
		||||
    margin-left: 195px;
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#central{
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer{
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#header {
 | 
			
		||||
    background: #bee6a2;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#header h1, a:link, a:visited {
 | 
			
		||||
    color: black;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
/* contribs.org styling */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:link { color: #006921; text-decoration: none; }
 | 
			
		||||
a:visited { color: #063; text-decoration: none; }
 | 
			
		||||
a:hover { color: #F00; text-decoration: none; }
 | 
			
		||||
a:active { color: #606060; text-decoration: none; }
 | 
			
		||||
 | 
			
		||||
.sme-error {
 | 
			
		||||
    color: red;
 | 
			
		||||
    display:block;
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: red ; 
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    margin-left: 10px;
 | 
			
		||||
    margin-right: 10px;
 | 
			
		||||
    margin-top:0px;
 | 
			
		||||
    margin-bottom:0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sme-warning {
 | 
			
		||||
    color: orange;
 | 
			
		||||
    display:block;  
 | 
			
		||||
    background-color: #ffffff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: orange ; 
 | 
			
		||||
    padding: 4px;
 | 
			
		||||
    margin-left: 20px;
 | 
			
		||||
    margin-right: 20px;
 | 
			
		||||
    margin-top:2px;
 | 
			
		||||
    margin-bottom:2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer img {
 | 
			
		||||
    float: right;
 | 
			
		||||
    position: fixed;
 | 
			
		||||
    margin-left: 40%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
label.field-with-error {
 | 
			
		||||
	color: #dd7e5e
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.field-with-error { 
 | 
			
		||||
	background-color: #fd9e7e 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.label {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1; /*lightgreen;*/
 | 
			
		||||
    width: 30%;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.label {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1; /*lightgreen;*/
 | 
			
		||||
    width: 30%;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.label2 {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1; /*lightgreen;*/
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.data {
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    margin-left: 0%;
 | 
			
		||||
/*    background-color: lightblue;*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.data2 {
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
/*    background-color: lightblue; */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action {
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    background-color: #bee6a2; /*lightgreen;*/
 | 
			
		||||
    color: darkgreen;
 | 
			
		||||
    border-radius: 8px;
 | 
			
		||||
    border: 2px solid #4CAF50; /* Green */
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action:hover {background-color: #3e8e41; color:white;}
 | 
			
		||||
 | 
			
		||||
input.action:active {
 | 
			
		||||
  background-color: #3e8e41;
 | 
			
		||||
  transform: translate(-2px,2px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.center {
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action2 {
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    color: black;
 | 
			
		||||
    background-color: #d4d0c8;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#modul.desc {
 | 
			
		||||
    padding: 3px;
 | 
			
		||||
    background-color: grey;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
[type = 'text'] {
 | 
			
		||||
    margin-left: 0px;
 | 
			
		||||
    /*background-color: lightblue;*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.a, .return {
 | 
			
		||||
    color: #661866;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.section {
 | 
			
		||||
}
 | 
			
		||||
.a, .item {
 | 
			
		||||
    line-height: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.section-title {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    color: #6CA345;	/*#888;*/
 | 
			
		||||
    padding-left: 5px;
 | 
			
		||||
    padding-right: 5px;
 | 
			
		||||
    line-height: 18px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.menu-title {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    color: #1A6D1A;	/*#666;*/
 | 
			
		||||
    padding-left: 1px;
 | 
			
		||||
    padding-right: 1px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#module {
 | 
			
		||||
/*    height: 600px; */
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#h2l1 {
 | 
			
		||||
    height: 40px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
}
 | 
			
		||||
#h2e11 {
 | 
			
		||||
    width: 50%;
 | 
			
		||||
    float: left;
 | 
			
		||||
}
 | 
			
		||||
#h2e12 {
 | 
			
		||||
    background-color: #C0E7A6;
 | 
			
		||||
    float: left;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2l2 {
 | 
			
		||||
/*    background-color: #A8F9E7;*/
 | 
			
		||||
    border-top: solid white 3px;
 | 
			
		||||
    border-bottom: solid white 2px;
 | 
			
		||||
    height: 14px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    padding: 1px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2e21 {
 | 
			
		||||
    float: left;
 | 
			
		||||
    width: 70%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2e22,#h2e23,#h2e12 {
 | 
			
		||||
    float: left;
 | 
			
		||||
    width: 14em;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.toggle-password {
 | 
			
		||||
    margin-left: -30px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.tg-icon {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    top: 5px;
 | 
			
		||||
    left: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.roundcube div {
 | 
			
		||||
	height:462px;
 | 
			
		||||
	width:85%;
 | 
			
		||||
	margin-bottom:1%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.roundcube object {
 | 
			
		||||
	margin-top:1%;
 | 
			
		||||
	height:95%;
 | 
			
		||||
	width:100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*end*/
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
 | 
			
		||||
@@ -4,6 +4,7 @@ package SrvMngr;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use utf8;
 | 
			
		||||
binmode(STDOUT);
 | 
			
		||||
 | 
			
		||||
use Mojo::Base 'Mojolicious';
 | 
			
		||||
 | 
			
		||||
@@ -29,9 +30,14 @@ use SrvMngr::Model::Main;
 | 
			
		||||
use SrvMngr::Plugin::WithoutCache;
 | 
			
		||||
 | 
			
		||||
use esmith::I18N;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::NavigationDB; # no UTF8 raw is ok for ASCII only flat file
 | 
			
		||||
 | 
			
		||||
# Import the function(s) you need
 | 
			
		||||
use SrvMngr_Auth qw(check_admin_access);
 | 
			
		||||
 | 
			
		||||
#this is overwrittrn with the "release" by the spec file - release can be "99.el8.sme"
 | 
			
		||||
our $VERSION = '51.el8.sme'; 
 | 
			
		||||
our $VERSION = '78.el8.sme'; 
 | 
			
		||||
#Extract the release value
 | 
			
		||||
if ($VERSION =~ /^(\d+)/) {
 | 
			
		||||
    $VERSION = $1;  # $1 contains the matched numeric digits
 | 
			
		||||
@@ -46,7 +52,7 @@ our @EXPORT_OK = qw(
 | 
			
		||||
	getNavigation ip_number validate_password is_normal_password email_simple
 | 
			
		||||
	mac_address_or_blank mac_address ip_number_or_blank
 | 
			
		||||
	lang_space get_routes_list subnet_mask get_reg_mask
 | 
			
		||||
	gen_locale_date_string get_public_ip_address
 | 
			
		||||
	gen_locale_date_string get_public_ip_address simpleNavMerge
 | 
			
		||||
	);
 | 
			
		||||
 | 
			
		||||
has home => sub {
 | 
			
		||||
@@ -301,10 +307,11 @@ sub setup_routing {
 | 
			
		||||
    $if_logged_in->get('/userpassword')->to('userpassword#main')->name('passwd');
 | 
			
		||||
    $if_logged_in->post('/userpassword')->to('userpassword#change_password')->name('passwd2');
 | 
			
		||||
 | 
			
		||||
    my $if_admin = $r->under( sub {
 | 
			
		||||
	my $c =shift;
 | 
			
		||||
	return $c->is_admin || $c->auth_fail($c->l("acs_ADMIN"));
 | 
			
		||||
    });
 | 
			
		||||
	my $if_admin = $r->under( sub {
 | 
			
		||||
	    my $c = shift;
 | 
			
		||||
	    # Call the imported function directly
 | 
			
		||||
	    return check_admin_access($c) || $c->auth_fail($c->l("acs_ADMIN"));
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
    $if_admin->get('/backup')->to('backup#main')->name('backup');
 | 
			
		||||
    $if_admin->post('/backup')->to('backup#do_display')->name('backupd');
 | 
			
		||||
@@ -546,12 +553,10 @@ sub theme_list {
 | 
			
		||||
#------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
sub getNavigation {
 | 
			
		||||
 | 
			
		||||
    use esmith::NavigationDB;
 | 
			
		||||
 | 
			
		||||
    my $c  = shift;
 | 
			
		||||
    my $class  = shift; #not the controller as it is called as an external, not part of the controller.
 | 
			
		||||
    my $lang = shift || 'en-us';
 | 
			
		||||
    my $menu = shift || 'N';
 | 
			
		||||
    my $username = shift || ''; #Username when logged in as a user not admin
 | 
			
		||||
 | 
			
		||||
#    my $lang = $c->session->{lang} || 'en-us';
 | 
			
		||||
 | 
			
		||||
@@ -560,13 +565,33 @@ sub getNavigation {
 | 
			
		||||
 | 
			
		||||
    my @files = ();
 | 
			
		||||
    my %files_hash = ();
 | 
			
		||||
    
 | 
			
		||||
    # Added: Store allowed admin panels for non-admin users
 | 
			
		||||
    my @allowed_admin_panels = ();
 | 
			
		||||
    my $is_admin = 1;  # Default to admin (full access)
 | 
			
		||||
    
 | 
			
		||||
    # Added: Check if user is non-admin and get their allowed panels
 | 
			
		||||
    if ($username ne '') {
 | 
			
		||||
        # Get the AccountsDB to check user permissions
 | 
			
		||||
        my $accountsdb = esmith::AccountsDB::UTF8->open_ro() or
 | 
			
		||||
            die "Couldn't open AccountsDB\n";
 | 
			
		||||
            
 | 
			
		||||
        # Check if user has AdminPanels property
 | 
			
		||||
        my $user_rec = $accountsdb->get($username);
 | 
			
		||||
        if (defined $user_rec && $user_rec->prop('AdminPanels')) {
 | 
			
		||||
            $is_admin = 0;  # User is non-admin with specific panel access
 | 
			
		||||
            # Get comma-separated list of allowed admin panels
 | 
			
		||||
            my $admin_panels = $user_rec->prop('AdminPanels');
 | 
			
		||||
            @allowed_admin_panels = split(/,/, $admin_panels);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #-----------------------------------------------------
 | 
			
		||||
    # Determine the directory where the functions are kept
 | 
			
		||||
    #----------------------------------------------------- 
 | 
			
		||||
	my $navigation_ctlr_ignore = 
 | 
			
		||||
	"(\.\.?|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm|Legacypanel\.pm(-.*)?)";
 | 
			
		||||
#	"(\.\.?|Initial\.pm|Manual\.pm|Swttheme\.pm|Request\.pm|Modules\.pm(-.*)?)";
 | 
			
		||||
	"(\.\.?|.*\-Custom\.pm|Swttheme\.pm|Login\.pm|Request\.pm|Modules\.pm|Legacypanel\.pm(-.*)?)";
 | 
			
		||||
#	"(\.\.?|Initial\.pm|.*Manual\.pm|Swttheme\.pm|Request\.pm|Modules\.pm(-.*)?)";
 | 
			
		||||
	my $navigation_cgi_ignore = 
 | 
			
		||||
	"(\.\.?|navigation|noframes|online-manual|(internal|pleasewait)(-.*)?)";
 | 
			
		||||
 | 
			
		||||
@@ -621,8 +646,7 @@ sub getNavigation {
 | 
			
		||||
 | 
			
		||||
    my $navinfo = NAVIGATIONDIR . "/navigation.$lang";
 | 
			
		||||
 | 
			
		||||
    my $navdb = esmith::NavigationDB->open_ro( $navinfo ) or
 | 
			
		||||
	die "Couldn't open $navinfo\n";
 | 
			
		||||
    my $navdb = esmith::NavigationDB->open_ro( $navinfo ) or die "Couldn't open $navinfo\n"; # no UTF8
 | 
			
		||||
 | 
			
		||||
    # Check the navdb for anything with a UrlPath, which means that it doesn't
 | 
			
		||||
    # have a cgi file to be picked up by the above code. Ideally, only pages
 | 
			
		||||
@@ -638,70 +662,110 @@ sub getNavigation {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    foreach my $file (keys %files_hash)
 | 
			
		||||
    {
 | 
			
		||||
	#my $heading = 'Unknown';
 | 
			
		||||
	my $heading = 'Legacy';
 | 
			
		||||
	
 | 
			
		||||
	my $description = $file;
 | 
			
		||||
	my $headingWeight = 99999;
 | 
			
		||||
	my $descriptionWeight = 99999;
 | 
			
		||||
	my $urlpath = '';
 | 
			
		||||
	my $menucat = 'A';	# admin menu (default)
 | 
			
		||||
		{
 | 
			
		||||
		#my $heading = 'Unknown';
 | 
			
		||||
		my $heading = 'Legacy';
 | 
			
		||||
		
 | 
			
		||||
		my $description = $file;
 | 
			
		||||
		my $headingWeight = 99999;
 | 
			
		||||
		my $descriptionWeight = 99999;
 | 
			
		||||
		my $urlpath = '';
 | 
			
		||||
		my $menucat = 'A';	# admin menu (default)
 | 
			
		||||
 | 
			
		||||
	my $rec = $navdb->get($file);
 | 
			
		||||
		my $rec = $navdb->get($file);
 | 
			
		||||
 | 
			
		||||
	if (defined $rec)
 | 
			
		||||
	{
 | 
			
		||||
	    $heading = $rec->prop('Heading');
 | 
			
		||||
	    $description = $rec->prop('Description');
 | 
			
		||||
	    $headingWeight = $rec->prop('HeadingWeight') || 99999; #Stop noise in logs if file in dir does not have nav header.
 | 
			
		||||
	    $descriptionWeight = $rec->prop('DescriptionWeight');
 | 
			
		||||
	    $urlpath = $rec->prop('UrlPath') || '';
 | 
			
		||||
	    $menucat = $rec->prop('MenuCat') || 'A';	# admin menu (default)
 | 
			
		||||
	}
 | 
			
		||||
	next if $menu ne $menucat;
 | 
			
		||||
		if (defined $rec)
 | 
			
		||||
		{
 | 
			
		||||
			$heading = $rec->prop('Heading');
 | 
			
		||||
			$description = $rec->prop('Description');
 | 
			
		||||
			$headingWeight = $rec->prop('HeadingWeight') || 99999; #Stop noise in logs if file in dir does not have nav header.
 | 
			
		||||
			$descriptionWeight = $rec->prop('DescriptionWeight');
 | 
			
		||||
			$urlpath = $rec->prop('UrlPath') || '';
 | 
			
		||||
			$menucat = $rec->prop('MenuCat') || 'A';	# admin menu (default)
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		# Added: Check if this is an admin menu item and if user has access
 | 
			
		||||
		if ($menucat eq 'A' && !$is_admin) {
 | 
			
		||||
			# Skip this admin panel if user doesn't have access to it
 | 
			
		||||
			my $has_access = 0;
 | 
			
		||||
			my $file_no_ext = $file;
 | 
			
		||||
			$file_no_ext =~ s/\.pm$//;  # Remove .pm extension if present
 | 
			
		||||
			foreach my $allowed_panel (@allowed_admin_panels) {
 | 
			
		||||
				if ($file_no_ext eq lc($allowed_panel)) {
 | 
			
		||||
					#die("Here!!$file $file_no_ext $allowed_panel ");
 | 
			
		||||
					$has_access = 1;
 | 
			
		||||
					last;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			next if !$has_access;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	#-------------------------------------------------- 
 | 
			
		||||
	# add heading, description and weight information to data structure
 | 
			
		||||
	#-------------------------------------------------- 
 | 
			
		||||
		next if $menu ne $menucat;
 | 
			
		||||
 | 
			
		||||
	unless (exists $nav {$heading})
 | 
			
		||||
	{
 | 
			
		||||
	    $nav {$heading} = { COUNT => 0, WEIGHT => 0, DESCRIPTIONS => [] };
 | 
			
		||||
	}
 | 
			
		||||
		#-------------------------------------------------- 
 | 
			
		||||
		# add heading, description and weight information to data structure
 | 
			
		||||
		#-------------------------------------------------- 
 | 
			
		||||
 | 
			
		||||
	$nav {$heading} {'COUNT'} ++;
 | 
			
		||||
	$nav {$heading} {'WEIGHT'} += $headingWeight;
 | 
			
		||||
		unless (exists $nav {$heading})
 | 
			
		||||
		{
 | 
			
		||||
			$nav {$heading} = { COUNT => 0, WEIGHT => 0, DESCRIPTIONS => [] };
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	# Check for manager panel, and assign the appropriate
 | 
			
		||||
	#  cgi-bin prefix for the links.
 | 
			
		||||
	# Grab the last 2 directories by splitting for '/'s and
 | 
			
		||||
	#  then concatenating the last 2
 | 
			
		||||
	# probably a better way, but I don't know it.
 | 
			
		||||
		$nav {$heading} {'COUNT'} ++;
 | 
			
		||||
		$nav {$heading} {'WEIGHT'} += $headingWeight;
 | 
			
		||||
 | 
			
		||||
	my $path;
 | 
			
		||||
	if ( $files_hash{$file} eq 'ctrl') {
 | 
			
		||||
	    $path = "2";
 | 
			
		||||
	} elsif ( $files_hash{$file} eq 'cgim') {
 | 
			
		||||
		$path = "/cgi-bin";
 | 
			
		||||
	} else {
 | 
			
		||||
		my @filename = split /\//, $files_hash{$file};
 | 
			
		||||
		$path = "/$filename[scalar @filename - 2]/$filename[scalar @filename - 1]";
 | 
			
		||||
	};
 | 
			
		||||
		# Check for manager panel, and assign the appropriate
 | 
			
		||||
		#  cgi-bin prefix for the links.
 | 
			
		||||
		# Grab the last 2 directories by splitting for '/'s and
 | 
			
		||||
		#  then concatenating the last 2
 | 
			
		||||
		# probably a better way, but I don't know it.
 | 
			
		||||
 | 
			
		||||
	push @{ $nav {$heading} {'DESCRIPTIONS'} },
 | 
			
		||||
		{ DESCRIPTION => $description,
 | 
			
		||||
		  WEIGHT => $descriptionWeight, 
 | 
			
		||||
		  FILENAME => $urlpath ? $urlpath : "$path/$file",
 | 
			
		||||
		  CGIPATH => $path,
 | 
			
		||||
		  MENUCAT => $menucat
 | 
			
		||||
		my $path;
 | 
			
		||||
		if ( $files_hash{$file} eq 'ctrl') {
 | 
			
		||||
			$path = "2";
 | 
			
		||||
		} elsif ( $files_hash{$file} eq 'cgim') {
 | 
			
		||||
			$path = "/cgi-bin";
 | 
			
		||||
		} else {
 | 
			
		||||
			my @filename = split /\//, $files_hash{$file};
 | 
			
		||||
			$path = "/$filename[scalar @filename - 2]/$filename[scalar @filename - 1]";
 | 
			
		||||
		};
 | 
			
		||||
 | 
			
		||||
		push @{ $nav {$heading} {'DESCRIPTIONS'} },
 | 
			
		||||
			{ DESCRIPTION => $description,
 | 
			
		||||
			  WEIGHT => $descriptionWeight, 
 | 
			
		||||
			  FILENAME => $urlpath ? $urlpath : "$path/$file",
 | 
			
		||||
			  CGIPATH => $path,
 | 
			
		||||
			  MENUCAT => $menucat
 | 
			
		||||
			};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	return \%nav;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub simpleNavMerge {
 | 
			
		||||
	#Used to merge two nav structures - used for the user and selected admin menu.
 | 
			
		||||
    my ($class,$nav1, $nav2) = @_;
 | 
			
		||||
    my %result = %$nav1;  # Start with a copy of first nav
 | 
			
		||||
    
 | 
			
		||||
    # Merge in second nav
 | 
			
		||||
    foreach my $heading (keys %$nav2) {
 | 
			
		||||
        if (exists $result{$heading}) {
 | 
			
		||||
            # Add counts and weights
 | 
			
		||||
            $result{$heading}{COUNT} += $nav2->{$heading}{COUNT};
 | 
			
		||||
            $result{$heading}{WEIGHT} += $nav2->{$heading}{WEIGHT};
 | 
			
		||||
            # Append descriptions
 | 
			
		||||
            push @{$result{$heading}{DESCRIPTIONS}}, @{$nav2->{$heading}{DESCRIPTIONS}};
 | 
			
		||||
        } else {
 | 
			
		||||
            # Just copy the heading
 | 
			
		||||
            $result{$heading} = $nav2->{$heading};
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return \%result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub _lang_space {
 | 
			
		||||
 | 
			
		||||
@@ -749,7 +813,7 @@ sub get_routes_list {
 | 
			
		||||
 | 
			
		||||
    my $c  = shift;
 | 
			
		||||
 | 
			
		||||
    my $rtdb = esmith::ConfigDB->open_ro('routes') || die 'Cannot open Routes db';
 | 
			
		||||
    my $rtdb = esmith::ConfigDB::UTF8->open_ro('routes') || die 'Cannot open Routes db';
 | 
			
		||||
    my @routes = $rtdb->get_all();
 | 
			
		||||
    my @rt;
 | 
			
		||||
 | 
			
		||||
@@ -831,7 +895,7 @@ sub gen_locale_date_string
 | 
			
		||||
sub get_public_ip_address
 | 
			
		||||
{
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
	my $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
	my $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
    my $sysconfig = $cdb->get('sysconfig');
 | 
			
		||||
    if ($sysconfig)
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Backup;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : Backup or restore
 | 
			
		||||
# navigation  : 4000 200
 | 
			
		||||
# navigation  : 4000 100
 | 
			
		||||
# Copyright (C) 2002 Mitel Networks Corporation
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# routes : end
 | 
			
		||||
@@ -20,21 +20,22 @@ use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session ip_number_or_blank);
 | 
			
		||||
use Quota;
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
use File::Find;
 | 
			
		||||
use File::Path qw(make_path remove_tree);
 | 
			
		||||
use esmith::Backup;
 | 
			
		||||
use esmith::BackupHistoryDB;
 | 
			
		||||
use esmith::BackupHistoryDB; #no UTF8 and not in use 
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use esmith::lockfile;
 | 
			
		||||
use esmith::BlockDevices;
 | 
			
		||||
use constant DEBUG => $ENV{MOJO_SMANAGER_DEBUG} || 0;
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open   || die "Couldn't open config db"; #remove as cached gives problems
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
#our $rdb = esmith::ConfigDB->open('/etc/e-smith/restore') || die "Couldn't open restore db";
 | 
			
		||||
 | 
			
		||||
use constant FALSE => 0;
 | 
			
		||||
use constant TRUE  => 1;
 | 
			
		||||
 | 
			
		||||
my ($cdb,$adb,$rdb);
 | 
			
		||||
my $es_backup = new esmith::Backup or die "Couldn't create Backup object\n";
 | 
			
		||||
my @directories = $es_backup->restore_list;
 | 
			
		||||
@@ -52,9 +53,9 @@ sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %bac_datas = ();
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$rdb = esmith::ConfigDB->open('/etc/e-smith/restore');
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open config db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $rdb = esmith::ConfigDB::UTF8->open('/etc/e-smith/restore');
 | 
			
		||||
    my $title     = $c->l('bac_BACKUP_TITLE');
 | 
			
		||||
    my $notif;
 | 
			
		||||
    $bac_datas{'function'} = 'desktop_backup';
 | 
			
		||||
@@ -111,9 +112,9 @@ sub do_display {
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
    my $function = $c->param('Function');
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$rdb = esmith::ConfigDB->open('/etc/e-smith/restore');
 | 
			
		||||
   $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open config db";
 | 
			
		||||
   $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
   $rdb = esmith::ConfigDB::UTF8->open('/etc/e-smith/restore');
 | 
			
		||||
 | 
			
		||||
    if ($function =~ /^(\S+)$/) {
 | 
			
		||||
        $function = $1;
 | 
			
		||||
@@ -138,7 +139,7 @@ sub do_display {
 | 
			
		||||
        $c->render(template=>"backdown");
 | 
			
		||||
        #sleep(30);
 | 
			
		||||
        # Redirect to the front page
 | 
			
		||||
		#$c->redirect_to('/backup');
 | 
			
		||||
        #$c->redirect_to('/backup');
 | 
			
		||||
        return ""
 | 
			
		||||
    } ## end if ($function eq 'desktop_backup')
 | 
			
		||||
 | 
			
		||||
@@ -275,9 +276,9 @@ sub do_update {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $rt       = $c->current_route;
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$rdb = esmith::ConfigDB->open('/etc/e-smith/restore');
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open config db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $rdb = esmith::ConfigDB::UTF8->open('/etc/e-smith/restore');
 | 
			
		||||
    my $function = $c->param('Function');
 | 
			
		||||
    DEBUG && warn("do_update $function");
 | 
			
		||||
    my %bac_datas = ();
 | 
			
		||||
@@ -526,13 +527,13 @@ sub do_update {
 | 
			
		||||
 | 
			
		||||
    # common part for all functions
 | 
			
		||||
    if ($res ne 'OK') {
 | 
			
		||||
 | 
			
		||||
        if ($res eq 'NEXT') {
 | 
			
		||||
            $dest = 'back_' . $bac_datas{"function"};
 | 
			
		||||
        } else {
 | 
			
		||||
            $c->stash(error => $result);
 | 
			
		||||
            $dest = "back_$function";
 | 
			
		||||
        }
 | 
			
		||||
        $bac_datas{vfstype}        = $c->param('VFSType');
 | 
			
		||||
        $c->stash(title => $title, bac_datas => \%bac_datas);
 | 
			
		||||
        return $c->render($dest);
 | 
			
		||||
    } ## end if ($res ne 'OK')
 | 
			
		||||
@@ -932,7 +933,7 @@ sub workstnVerify {
 | 
			
		||||
 | 
			
		||||
sub workstnRestore {
 | 
			
		||||
    my ($c) = @_;
 | 
			
		||||
    my $out;
 | 
			
		||||
    my $out = '';
 | 
			
		||||
    my $restoreref = $c->param('Backupset');
 | 
			
		||||
    my $set        = $restoreref;
 | 
			
		||||
    $set =~ s/\/[^\/]*$//;
 | 
			
		||||
@@ -1015,6 +1016,7 @@ sub workstnRestore {
 | 
			
		||||
        return "$c->l('bac_OPERATION_STATUS_REPORT') $c->l('bac_ERR_PRE_RESTORE')";
 | 
			
		||||
    }
 | 
			
		||||
    $| = 1;
 | 
			
		||||
    my $RD;
 | 
			
		||||
 | 
			
		||||
    if (open(RD, "-|")) {
 | 
			
		||||
 | 
			
		||||
@@ -1047,8 +1049,8 @@ sub workstnRestore {
 | 
			
		||||
                    or warn($c->l('bac_ERR_RESTORING_INITIAL_GRP') . "\n");
 | 
			
		||||
                esmith::util::backgroundCommand(0, "/sbin/e-smith/signal-event", "post-upgrade");
 | 
			
		||||
 | 
			
		||||
                #	system("/sbin/e-smith/signal-event", "post-upgrade") == 0
 | 
			
		||||
                #	    or die ($c->l('bac_ERROR_UPDATING_CONFIGURATION')."\n");
 | 
			
		||||
                	#system("/sbin/e-smith/signal-event", "post-upgrade") == 0 
 | 
			
		||||
                	#    or die ($c->l('bac_ERROR_UPDATING_CONFIGURATION')."\n");
 | 
			
		||||
            } else {
 | 
			
		||||
                $message = $c->l('bac_RESTORE_FAILED');
 | 
			
		||||
            }
 | 
			
		||||
@@ -1076,9 +1078,111 @@ sub workstnRestore {
 | 
			
		||||
        die($error_message) if $error_message;
 | 
			
		||||
        exit(0);
 | 
			
		||||
    } ## end else [ if (open(RD, "-|")) ]
 | 
			
		||||
    $rdb->reload;
 | 
			
		||||
    $error_message .= $c->bunmount($mntdir, $VFSType);
 | 
			
		||||
    return '#OK#' . $out;
 | 
			
		||||
    
 | 
			
		||||
	#my $RD;
 | 
			
		||||
 | 
			
		||||
	## Fork-safe open with explicit error handling
 | 
			
		||||
	#unless (open($RD, "-|")) {
 | 
			
		||||
		## Child process
 | 
			
		||||
		#local $SIG{__DIE__} = sub { exit 255 };
 | 
			
		||||
		#$| = 1;  # Autoflush
 | 
			
		||||
 | 
			
		||||
		#eval {
 | 
			
		||||
			#foreach my $file (@restorefiles) {
 | 
			
		||||
				## Security: strict filename validation
 | 
			
		||||
				#unless ($file =~ m{^[\w\/.-]+$}) {
 | 
			
		||||
					#die "Invalid filename: $file";
 | 
			
		||||
				#}
 | 
			
		||||
				
 | 
			
		||||
				## Check file existence
 | 
			
		||||
				#unless (-e $file) {
 | 
			
		||||
					#die "Backup file $file does not exist";
 | 
			
		||||
				#}
 | 
			
		||||
 | 
			
		||||
				## Execute dar with error checking
 | 
			
		||||
				#system("/usr/bin/dar", "-Q", "-x", $file, "-v", "-N", "-R", "/", "-wa");
 | 
			
		||||
				#if ($? == -1) {
 | 
			
		||||
					#die "Failed to execute dar: $!";
 | 
			
		||||
				#} elsif ($? & 127) {
 | 
			
		||||
					#die sprintf("dar died with signal %d, %s coredump",
 | 
			
		||||
						#($? & 127), ($? & 128) ? 'with' : 'without');
 | 
			
		||||
				#} elsif ($? >> 8 != 0) {
 | 
			
		||||
					#die "dar exited with error code " . ($? >> 8);
 | 
			
		||||
				#}
 | 
			
		||||
			#}
 | 
			
		||||
 | 
			
		||||
			## Unmount with error checking
 | 
			
		||||
			#if (my $unmount_err = $c->bunmount($mntdir, $VFSType)) {
 | 
			
		||||
				#die "Unmount failed: $unmount_err";
 | 
			
		||||
			#}
 | 
			
		||||
		#};
 | 
			
		||||
 | 
			
		||||
		#if (my $child_err = $@) {
 | 
			
		||||
			#print STDERR "CHILD ERROR: $child_err";
 | 
			
		||||
			#exit 254;
 | 
			
		||||
		#}
 | 
			
		||||
		#exit 0;
 | 
			
		||||
	#} 
 | 
			
		||||
	#else {
 | 
			
		||||
		## Parent process
 | 
			
		||||
		#eval {
 | 
			
		||||
			## Verify fork succeeded
 | 
			
		||||
			#unless (defined $RD) {
 | 
			
		||||
				#die "Fork failed: $!";
 | 
			
		||||
			#}
 | 
			
		||||
 | 
			
		||||
			#$out .= $c->l('bac_FILES_HAVE_BEEN_RESTORED') . "\n<UL>";
 | 
			
		||||
			#my $complete = 0;
 | 
			
		||||
 | 
			
		||||
			## Read from child process
 | 
			
		||||
			#while (<$RD>) {
 | 
			
		||||
				#$complete++ if /etc\/samba\/smbpasswd$/;
 | 
			
		||||
				#$out .= "<li>$_</li>\n";
 | 
			
		||||
			#}
 | 
			
		||||
			#$out .= "</UL>";
 | 
			
		||||
 | 
			
		||||
			## Close pipe and check status
 | 
			
		||||
			#unless (close $RD) {
 | 
			
		||||
				#die "Pipe close failed: $!";
 | 
			
		||||
			#}
 | 
			
		||||
 | 
			
		||||
			#my $child_status = $?;
 | 
			
		||||
			#if ($child_status != 0) {
 | 
			
		||||
				#die "Child process failed with status " . ($child_status >> 8);
 | 
			
		||||
			#}
 | 
			
		||||
 | 
			
		||||
			## Post-restore actions
 | 
			
		||||
			#if ($complete) {
 | 
			
		||||
				#system("/usr/sbin/groupmod", "-g", $www_gid, "www");
 | 
			
		||||
				#if ($? != 0) {
 | 
			
		||||
					#die $c->l('bac_ERR_RESTORING_GID') . ": $! (status $?)";
 | 
			
		||||
				#}
 | 
			
		||||
 | 
			
		||||
				#system("/usr/sbin/usermod", "-g", $www_gid, "www");
 | 
			
		||||
				#if ($? != 0) {
 | 
			
		||||
					#die $c->l('bac_ERR_RESTORING_INITIAL_GRP') . ": $! (status $?)";
 | 
			
		||||
				#}
 | 
			
		||||
 | 
			
		||||
				#my $bg_result = esmith::util::backgroundCommand(0, "/sbin/e-smith/signal-event", "post-upgrade");
 | 
			
		||||
				#unless ($bg_result) {
 | 
			
		||||
					#die "Failed to schedule post-upgrade event";
 | 
			
		||||
				#}
 | 
			
		||||
			#} else {
 | 
			
		||||
				#die $c->l('bac_RESTORE_FAILED');
 | 
			
		||||
			#}
 | 
			
		||||
		#};
 | 
			
		||||
 | 
			
		||||
		## Error handling
 | 
			
		||||
		#if (my $err = $@) {
 | 
			
		||||
			#$rec->set_prop('state', 'failed');
 | 
			
		||||
			#$rec->set_prop('error', "$err");
 | 
			
		||||
			#esmith::lockfile::UnlockFile($file_handle);
 | 
			
		||||
			#return $c->l('bac_RESTORE_FAILED_MSG') . ": $err";
 | 
			
		||||
		#}
 | 
			
		||||
	#}       
 | 
			
		||||
	$rdb->reload;
 | 
			
		||||
	$error_message .= $c->bunmount($mntdir, $VFSType);
 | 
			
		||||
	return '#OK#' . $out;
 | 
			
		||||
} ## end sub workstnRestore
 | 
			
		||||
 | 
			
		||||
sub workstnSelRestore() {
 | 
			
		||||
@@ -1455,6 +1559,7 @@ sub performReboot {
 | 
			
		||||
 | 
			
		||||
    #print "$c->l('bac_SERVER_REBOOT')";
 | 
			
		||||
    #print "$c->l('bac_SERVER_WILL_REBOOT')";
 | 
			
		||||
    warn "reboot coming";
 | 
			
		||||
    esmith::util::backgroundCommand(2, "/sbin/e-smith/signal-event", "reboot");
 | 
			
		||||
    return "#OK#" . $c->l('bac_SERVER_WILL_REBOOT');
 | 
			
		||||
} ## end sub performReboot
 | 
			
		||||
@@ -1985,7 +2090,7 @@ sub bunmount {
 | 
			
		||||
        system('/bin/umount', '-f', $mount) == 0
 | 
			
		||||
            or return ($c->l('bac_ERR_WHILE_UNMOUNTING'));
 | 
			
		||||
    }
 | 
			
		||||
    return;
 | 
			
		||||
    return "";
 | 
			
		||||
} ## end sub bunmount
 | 
			
		||||
 | 
			
		||||
sub findmnt {
 | 
			
		||||
@@ -2024,4 +2129,4 @@ sub vmount {
 | 
			
		||||
        return (qx(/bin/mount -t nfs -o nolock,timeo=30,retrans=1,retry=0 "$host:/$share" $mountdir 2>&1));
 | 
			
		||||
    }
 | 
			
		||||
} ## end sub vmount
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Bugreport;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Investigation
 | 
			
		||||
# description : Report a bug
 | 
			
		||||
# navigation  : 7000 500
 | 
			
		||||
# navigation  : 7000 300
 | 
			
		||||
# routes : end
 | 
			
		||||
#------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
@@ -15,7 +15,11 @@ use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use Text::Template;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
use SrvMngr qw( gen_locale_date_string );
 | 
			
		||||
our $cdb = esmith::ConfigDB->open or die "Couldn't open ConfigDB\n";
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
our $cdb = esmith::ConfigDB::UTF8->open or die "Couldn't open ConfigDB\n";
 | 
			
		||||
 | 
			
		||||
use constant FALSE => 0;
 | 
			
		||||
use constant TRUE  => 1;
 | 
			
		||||
 | 
			
		||||
# Get some basic info on the current SME install
 | 
			
		||||
our $sysconfig          = $cdb->get('sysconfig');
 | 
			
		||||
@@ -124,15 +128,30 @@ sub create_configuration_report {
 | 
			
		||||
    print $cfgrep $result;
 | 
			
		||||
    close $cfgrep;
 | 
			
		||||
    
 | 
			
		||||
    #And create boot analysis image - now run externally by systemd, only run once per boot.
 | 
			
		||||
    $result = `/usr/bin/systemctl start bootsequence.service`;
 | 
			
		||||
    if (!$? == 0) {
 | 
			
		||||
		warn "/usr/bin/systemd-analyze plot Command failed \n";
 | 
			
		||||
    #check if boot phase has completed.
 | 
			
		||||
	if (wait_for_boot_completion()) {
 | 
			
		||||
		#And create boot analysis image - now run externally following boot.
 | 
			
		||||
		$result = `/usr/bin/systemctl start bootsequence.service`;
 | 
			
		||||
		if (!$? == 0) {
 | 
			
		||||
			warn "/usr/bin/systemd-analyze plot Command failed \n";
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
  
 | 
			
		||||
} ## end sub create_configuration_report
 | 
			
		||||
 | 
			
		||||
sub wait_for_boot_completion {
 | 
			
		||||
    my $timeout = 60;  # 1-minute timeout
 | 
			
		||||
    my $end_time = time() + $timeout;
 | 
			
		||||
    while (time() < $end_time) {
 | 
			
		||||
        if (`systemctl list-jobs 2>&1` =~ /No jobs running/) {
 | 
			
		||||
            return TRUE;  # Success
 | 
			
		||||
        }
 | 
			
		||||
        sleep 5;
 | 
			
		||||
    }
 | 
			
		||||
    warn "Boot did not complete within $timeout seconds.\n";
 | 
			
		||||
    return FALSE;  # Failure
 | 
			
		||||
} ## end wait_for_boot_completion
 | 
			
		||||
 | 
			
		||||
sub show_config_report {
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    my $out = '';
 | 
			
		||||
 
 | 
			
		||||
@@ -13,9 +13,9 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
 | 
			
		||||
#package esmith::FormMagick::Panel::clamav;
 | 
			
		||||
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
our $db;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
@@ -23,6 +23,7 @@ sub main {
 | 
			
		||||
    my %clm_datas = ();
 | 
			
		||||
    my $title     = $c->l('clm_FORM_TITLE');
 | 
			
		||||
    my $modul     = $c->render_to_string(inline => $c->l('clm_DESC_FILESYSTEM_SCAN_PERIOD'));
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
    $clm_datas{'FilesystemScan'} = ($db->get_prop('clamav', 'FilesystemScan')) || 'disabled';
 | 
			
		||||
    $clm_datas{'Quarantine'}     = ($db->get_prop('clamav', 'Quarantine'))     || 'disabled';
 | 
			
		||||
    $clm_datas{'clam_versions'}  = get_clam_versions();
 | 
			
		||||
@@ -53,6 +54,7 @@ sub do_update {
 | 
			
		||||
 | 
			
		||||
sub change_settings {
 | 
			
		||||
    my $c                  = shift;
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
    my $status             = $c->param('status');
 | 
			
		||||
    my $FilesystemScan     = ($c->param('FilesystemScan') || 'disabled');
 | 
			
		||||
    my $Quarantine         = ($c->param('Quarantine') || 'disabled');
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Datetime;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : Date and time
 | 
			
		||||
# navigation  : 4000 400
 | 
			
		||||
# navigation  : 4000 300
 | 
			
		||||
# routes : end
 | 
			
		||||
#------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
@@ -14,7 +14,8 @@ use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use SrvMngr qw( gen_locale_date_string );
 | 
			
		||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
our $cdb ;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
@@ -23,6 +24,7 @@ sub main {
 | 
			
		||||
    my $title     = $c->l('dat_FORM_TITLE');
 | 
			
		||||
    my $modul     = $c->l('dat_INITIAL_DESC');
 | 
			
		||||
    $dat_datas{ntpstatus} = 'disabled';
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
    my $rec = $cdb->get('ntpd');
 | 
			
		||||
 | 
			
		||||
    if ($rec) {
 | 
			
		||||
@@ -54,6 +56,7 @@ sub do_update {
 | 
			
		||||
    my $result;
 | 
			
		||||
    my $success;
 | 
			
		||||
    my $old_ntpstatus = $c->param('Old_ntpstatus');
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
    $dat_datas{ntpstatus} = $c->param('Ntpstatus');
 | 
			
		||||
 | 
			
		||||
    if ($dat_datas{ntpstatus} ne $old_ntpstatus) {
 | 
			
		||||
@@ -70,7 +73,7 @@ sub do_update {
 | 
			
		||||
        } else {
 | 
			
		||||
            $dat_datas{ntpserver} = ($cdb->get_prop('ntpd', 'NTPServer')) || '';
 | 
			
		||||
        }
 | 
			
		||||
        $dat_datas{now_string} = esmith::FormMagick->gen_locale_date_string();
 | 
			
		||||
        $dat_datas{now_string} = gen_locale_date_string();
 | 
			
		||||
        $c->stash(title => $title, modul => $modul, dat_datas => \%dat_datas);
 | 
			
		||||
        return $c->render('datetime');
 | 
			
		||||
    } ## end if ($dat_datas{ntpstatus...})
 | 
			
		||||
@@ -125,6 +128,7 @@ sub do_update {
 | 
			
		||||
 | 
			
		||||
sub validate_change_datetime {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
    # Untaint parameters and check for validity
 | 
			
		||||
@@ -220,15 +224,14 @@ sub validate_change_datetime {
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
    # Store time zone in configuration database
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
    my $conf = esmith::ConfigDB->open();
 | 
			
		||||
    my $old  = $conf->get('UnsavedChanges')->value;
 | 
			
		||||
    my $rec  = $conf->get('TimeZone');
 | 
			
		||||
    my $old  = $cdb->get('UnsavedChanges')->value;
 | 
			
		||||
    my $rec  = $cdb->get('TimeZone');
 | 
			
		||||
 | 
			
		||||
    unless ($rec) {
 | 
			
		||||
        $rec = $conf->new_record('TimeZone', undef);
 | 
			
		||||
        $rec = $cdb->new_record('TimeZone', undef);
 | 
			
		||||
    }
 | 
			
		||||
    $rec->set_value($timezone);
 | 
			
		||||
    $conf->get('UnsavedChanges')->set_value($old);
 | 
			
		||||
    $cdb->get('UnsavedChanges')->set_value($old);
 | 
			
		||||
 | 
			
		||||
    #--------------------------------------------------
 | 
			
		||||
    # Signal event to change time zone, system time
 | 
			
		||||
@@ -353,4 +356,20 @@ sub getMonth_list {
 | 
			
		||||
        [ $c->l('dat_DECEMBER')  => '12' ]
 | 
			
		||||
    ];
 | 
			
		||||
} ## end sub getMonth_list
 | 
			
		||||
 | 
			
		||||
sub getYear_list {
 | 
			
		||||
    my $c= shift;
 | 
			
		||||
    my @yearArray;
 | 
			
		||||
    # could use also `/bin/date '+%Y'`
 | 
			
		||||
    my $start=2025-40; my $max=2025+40;
 | 
			
		||||
    for ( my $i = $start; $i <= $max; $i++ ) {
 | 
			
		||||
 | 
			
		||||
        push @yearArray,$i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    my @yearList = sort @yearArray;
 | 
			
		||||
    return \@yearList;
 | 
			
		||||
 | 
			
		||||
} ## end sub getYear_list
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Directory;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : User management
 | 
			
		||||
# description : Directory
 | 
			
		||||
# navigation  : 2000 300
 | 
			
		||||
# navigation  : 2000 400
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
@@ -12,13 +12,16 @@ use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
our $db; 
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
    my %dir_datas = ();
 | 
			
		||||
    my $title     = $c->l('dir_FORM_TITLE');
 | 
			
		||||
    my $modul     = $c->render_to_string(inline => $c->l('dir_DESCRIPTION'));
 | 
			
		||||
@@ -52,7 +55,7 @@ sub do_update {
 | 
			
		||||
    $db->get('ldap')->set_prop('defaultPhoneNumber', $phonenumber);
 | 
			
		||||
 | 
			
		||||
    if ($existing eq 'update') {
 | 
			
		||||
        my $ac = esmith::AccountsDB->open() || die "Couldn't open accounts db";
 | 
			
		||||
        my $ac = esmith::AccountsDB::UTF8->open() || die "Couldn't open accounts db";
 | 
			
		||||
        my @users = $ac->users();
 | 
			
		||||
 | 
			
		||||
        foreach my $user (@users) {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,16 +13,10 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use esmith::DomainsDB::UTF8;
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
#use esmith::FormMagick::Panel::domains;
 | 
			
		||||
use esmith::DomainsDB;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
 | 
			
		||||
#use URI::Escape;
 | 
			
		||||
my ($ddb,$cdb,$adb);
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
our ($ddb,$cdb,$adb);
 | 
			
		||||
our $REGEXP_DOMAIN = qq([a-zA-Z0-9\-\.]+);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
@@ -30,9 +24,9 @@ sub main {
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %dom_datas = ();
 | 
			
		||||
    my $title     = $c->l('dom_FORM_TITLE');
 | 
			
		||||
	$ddb = esmith::DomainsDB->open  || die "Couldn't open domains db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $ddb = esmith::DomainsDB::UTF8->open  || die "Couldn't open domains db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $dom_datas{trt} = 'LST';
 | 
			
		||||
    my @domains;
 | 
			
		||||
 | 
			
		||||
@@ -57,9 +51,9 @@ sub do_display {
 | 
			
		||||
    my $rt     = $c->current_route;
 | 
			
		||||
    my $trt    = $c->param('trt');
 | 
			
		||||
    my $domain = $c->param('Domain') || '';
 | 
			
		||||
	$ddb = esmith::DomainsDB->open  || die "Couldn't open domains db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $ddb = esmith::DomainsDB::UTF8->open  || die "Couldn't open domains db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
    #$trt = 'DEL' if ( $rt eq 'domaindel1' );
 | 
			
		||||
    #$trt = 'UPD' if ( $rt eq 'domainupd1' );
 | 
			
		||||
@@ -127,9 +121,9 @@ sub do_update {
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = $c->param('trt');
 | 
			
		||||
	$ddb = esmith::DomainsDB->open  || die "Couldn't open domains db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $ddb = esmith::DomainsDB::UTF8->open  || die "Couldn't open domains db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    my %dom_datas = ();
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
 | 
			
		||||
@@ -246,6 +240,7 @@ sub create_modify_domain {
 | 
			
		||||
                . ' Ctl'
 | 
			
		||||
        );
 | 
			
		||||
    } ## end unless ($domain)
 | 
			
		||||
    $ddb = esmith::DomainsDB::UTF8->open  || die "Couldn't open domains db";
 | 
			
		||||
    my $rec = $ddb->get($domain);
 | 
			
		||||
 | 
			
		||||
    if ($rec and $action eq 'create') {
 | 
			
		||||
@@ -375,6 +370,7 @@ sub nameserver_options_list {
 | 
			
		||||
 | 
			
		||||
sub get_nameserver_value {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $ddb = esmith::DomainsDB::UTF8->open  || die "Couldn't open domains db";
 | 
			
		||||
    my $domain = $c->param('Domain') || undef;
 | 
			
		||||
    return ($ddb->get_prop($domain, 'Nameservers') || 'internet');
 | 
			
		||||
} ## end sub get_nameserver_value
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Emailsettings;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : E-mail
 | 
			
		||||
# navigation  : 4000 500
 | 
			
		||||
# navigation  : 4000 400
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
@@ -16,16 +16,18 @@ use constant TRUE  => 1;
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session ip_number_or_blank);
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
our $pattern_db = esmith::ConfigDB->open("mailpatterns");
 | 
			
		||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
our $pattern_db;
 | 
			
		||||
our $cdb;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    $pattern_db = esmith::ConfigDB::UTF8->open("mailpatterns");
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
    my %mai_datas = ();
 | 
			
		||||
    my $title     = $c->l('mai_FORM_TITLE');
 | 
			
		||||
    $mai_datas{'trt'} = 'LIST';
 | 
			
		||||
@@ -42,7 +44,7 @@ sub do_display {
 | 
			
		||||
    my $title     = $c->l('mai_FORM_TITLE');
 | 
			
		||||
    my ($notif, $dest) = '';
 | 
			
		||||
    $mai_datas{'trt'} = $trt;
 | 
			
		||||
    $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ACC') {
 | 
			
		||||
        $dest = 'emailaccess';
 | 
			
		||||
@@ -94,7 +96,7 @@ sub do_update {
 | 
			
		||||
    my $trt       = $c->param('trt');
 | 
			
		||||
    my %mai_datas = ();
 | 
			
		||||
    $mai_datas{trt} = $trt;
 | 
			
		||||
    $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
    my $title = $c->l('mai_FORM_TITLE');
 | 
			
		||||
    my ($dest, $res, $result) = '';
 | 
			
		||||
 | 
			
		||||
@@ -231,7 +233,7 @@ sub get_patterns_status {
 | 
			
		||||
sub adjust_patterns {
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
    my @selected = @{ $c->every_param('BlockExecutableContent') };
 | 
			
		||||
 | 
			
		||||
    $pattern_db = esmith::ConfigDB::UTF8->open("mailpatterns");
 | 
			
		||||
    foreach my $pattern ($pattern_db->get_all_by_prop(type => "pattern")) {
 | 
			
		||||
        my $status
 | 
			
		||||
            = (grep $pattern->key eq $_, @selected)
 | 
			
		||||
@@ -284,7 +286,7 @@ 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";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
    # Initialize variables with default values
 | 
			
		||||
    my $smtpStatus = 'none';
 | 
			
		||||
@@ -485,7 +487,7 @@ sub get_retrieval_opt {
 | 
			
		||||
 | 
			
		||||
sub get_emailunknownuser_options {
 | 
			
		||||
    my $c                = shift;
 | 
			
		||||
    my $accounts         = esmith::AccountsDB->open_ro();
 | 
			
		||||
    my $accounts         = esmith::AccountsDB::UTF8->open_ro();
 | 
			
		||||
    my %existingAccounts = (
 | 
			
		||||
        'admin'          => $c->l("mai_FORWARD_TO_ADMIN"),
 | 
			
		||||
        'returntosender' => $c->l("mai_RETURN_TO_SENDER")
 | 
			
		||||
@@ -503,7 +505,7 @@ sub get_emailunknownuser_options {
 | 
			
		||||
 | 
			
		||||
sub get_emailunknownuser_opt {
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
    my $accounts = esmith::AccountsDB->open_ro();
 | 
			
		||||
    my $accounts = esmith::AccountsDB::UTF8->open_ro();
 | 
			
		||||
    my @existingAccounts
 | 
			
		||||
        = ([ $c->l("mai_FORWARD_TO_ADMIN") => 'admin' ], [ $c->l("mai_RETURN_TO_SENDER") => 'returntosender' ]);
 | 
			
		||||
 | 
			
		||||
@@ -580,14 +582,13 @@ sub display_multidrop {
 | 
			
		||||
 | 
			
		||||
sub change_settings_reception {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
    $cdb = esmith::ConfigDBi::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
    my $FetchmailMethod      = ($c->param('FetchmailMethod') || 'standard');
 | 
			
		||||
    my $FetchmailFreqOffice  = ($c->param('FreqOffice')      || 'every15min');
 | 
			
		||||
    my $FetchmailFreqOutside = ($c->param('FreqOutside')     || 'everyhour');
 | 
			
		||||
    my $FetchmailFreqWeekend = ($c->param('FreqWeekend')     || 'everyhour');
 | 
			
		||||
    my $SpecifyHeader        = ($c->param('SpecifyHeader')   || 'off');
 | 
			
		||||
    my $fetchmail
 | 
			
		||||
        = $cdb->get('fetchmail') || $cdb->new_record("fetchmail", { type => "service", status => "disabled" });
 | 
			
		||||
    my $fetchmail = $cdb->get('fetchmail') || $cdb->new_record("fetchmail", { type => "service", status => "disabled" });
 | 
			
		||||
 | 
			
		||||
    if ($FetchmailMethod eq 'standard') {
 | 
			
		||||
        $fetchmail->set_prop('status', 'disabled');
 | 
			
		||||
@@ -662,7 +663,7 @@ sub change_settings_reception {
 | 
			
		||||
 | 
			
		||||
sub change_settings_delivery {
 | 
			
		||||
    my ($c) = shift;
 | 
			
		||||
    $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
    my $EmailUnknownUser = ($c->param('EmailUnknownUser') || 'returntosender');
 | 
			
		||||
    $cdb->set_value('SMTPSmartHost',      $c->param('SMTPSmartHost'));
 | 
			
		||||
    $cdb->set_value('DelegateMailServer', $c->param('DelegateMailServer'));
 | 
			
		||||
@@ -683,7 +684,7 @@ sub change_settings_delivery {
 | 
			
		||||
 | 
			
		||||
sub change_settings_access {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
    my $pop3Access = ($c->param('POPAccess') || 'private');
 | 
			
		||||
 | 
			
		||||
    if ($pop3Access eq 'disabled') {
 | 
			
		||||
@@ -757,7 +758,7 @@ sub change_settings_access {
 | 
			
		||||
 | 
			
		||||
sub change_settings_filtering {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
    my $virus_status = ($c->param('VirusStatus') || 'disabled');
 | 
			
		||||
    $cdb->set_prop("qpsmtpd", 'VirusScan', $virus_status);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,21 +14,18 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
#use esmith::FormMagick::Panel::groups;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
my ($cdb,$adb);
 | 
			
		||||
our ($cdb,$adb);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %grp_datas = ();
 | 
			
		||||
    my $title     = $c->l('grp_FORM_TITLE');
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $grp_datas{trt} = 'LST';
 | 
			
		||||
    my @groups;
 | 
			
		||||
 | 
			
		||||
@@ -47,8 +44,8 @@ sub do_display {
 | 
			
		||||
    my $group     = $c->param('group');
 | 
			
		||||
    my %grp_datas = ();
 | 
			
		||||
    my $title     = $c->l('grp_FORM_TITLE');
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $grp_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
@@ -104,8 +101,8 @@ sub do_update {
 | 
			
		||||
    my $title     = $c->l('grp_FORM_TITLE');
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
    my %grp_datas = ();
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $grp_datas{'trt'}   = $trt;
 | 
			
		||||
    $grp_datas{'group'} = $groupName;
 | 
			
		||||
    my @members = ();
 | 
			
		||||
 
 | 
			
		||||
@@ -14,22 +14,14 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
#use esmith::FormMagick::Panel::hostentries;
 | 
			
		||||
use esmith::DomainsDB;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::HostsDB;
 | 
			
		||||
use esmith::NetworksDB;
 | 
			
		||||
use HTML::Entities;
 | 
			
		||||
use Net::IPv4Addr qw(ipv4_in_network);
 | 
			
		||||
use esmith::DomainsDB::UTF8;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::HostsDB::UTF8;
 | 
			
		||||
use esmith::NetworksDB::UTF8;
 | 
			
		||||
 | 
			
		||||
#use URI::Escape;
 | 
			
		||||
#our $ddb = esmith::DomainsDB->open  || die "Couldn't open hostentries db";
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
#our $hdb = esmith::HostsDB->open    || die "Couldn't open hosts db";
 | 
			
		||||
#our $ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
 | 
			
		||||
my ($ddb,$cdb,$hdb,$ndb);
 | 
			
		||||
our ($ddb,$cdb,$hdb,$ndb);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
@@ -37,10 +29,9 @@ sub main {
 | 
			
		||||
    my %hos_datas = ();
 | 
			
		||||
    my $title     = $c->l('hos_FORM_TITLE');
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
	#my $ddb = esmith::DomainsDB->open  || die "Couldn't open hostentries db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$hdb = esmith::HostsDB->open    || die "Couldn't open hosts db";
 | 
			
		||||
	$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db";
 | 
			
		||||
    $hdb = esmith::HostsDB::UTF8->open    || die "Couldn't open hosts db";
 | 
			
		||||
    $ndb = esmith::NetworksDB::UTF8->open || die "Couldn't open networks db";
 | 
			
		||||
    $hos_datas{trt} = 'LIST';
 | 
			
		||||
    my %dom_hosts = ();
 | 
			
		||||
 | 
			
		||||
@@ -73,9 +64,9 @@ sub do_display {
 | 
			
		||||
    $trt = 'LST' if ($trt ne 'DEL' && $trt ne 'UPD' && $trt ne 'ADD');
 | 
			
		||||
    my %hos_datas = ();
 | 
			
		||||
    my $title     = $c->l('hos_FORM_TITLE');
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$hdb = esmith::HostsDB->open    || die "Couldn't open hosts db";
 | 
			
		||||
	$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db";
 | 
			
		||||
    $hdb = esmith::HostsDB::UTF8->open    || die "Couldn't open hosts db";
 | 
			
		||||
    $ndb = esmith::NetworksDB::UTF8->open || die "Couldn't open networks db";
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    $hos_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
@@ -120,9 +111,9 @@ sub do_update {
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my %hos_datas = ();
 | 
			
		||||
    my $title     = $c->l('hos_FORM_TITLE');
 | 
			
		||||
	$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$hdb = esmith::HostsDB->open    || die "Couldn't open hosts db";
 | 
			
		||||
	$ndb = esmith::NetworksDB->open || die "Couldn't open networks db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open   || die "Couldn't open configuration db";
 | 
			
		||||
    $hdb = esmith::HostsDB::UTF8->open    || die "Couldn't open hosts db";
 | 
			
		||||
    $ndb = esmith::NetworksDB::UTF8->open || die "Couldn't open networks db";
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    my $result    = '';
 | 
			
		||||
    $hos_datas{'name'}       = lc $c->param('Name');
 | 
			
		||||
@@ -379,10 +370,10 @@ sub delete_hostentry {
 | 
			
		||||
} ## end sub delete_hostentry
 | 
			
		||||
 | 
			
		||||
sub domains_list {
 | 
			
		||||
    my $d = esmith::DomainsDB->open_ro() or die "Couldn't open DomainsDB";
 | 
			
		||||
    $ddb = esmith::DomainsDB::UTF8->open_ro() or die "Couldn't open DomainsDB";
 | 
			
		||||
    my @domains;
 | 
			
		||||
 | 
			
		||||
    for ($d->domains) {
 | 
			
		||||
    for ($ddb->domains) {
 | 
			
		||||
        my $ns = $_->prop("Nameservers") || 'localhost';
 | 
			
		||||
        push @domains, $_->key if ($ns eq 'localhost');
 | 
			
		||||
    }
 | 
			
		||||
@@ -516,7 +507,7 @@ sub must_be_local {
 | 
			
		||||
    my $localip = shift;
 | 
			
		||||
 | 
			
		||||
    # Make sure that the IP is indeed local.
 | 
			
		||||
    #my $ndb = esmith::NetworksDB->open_ro;
 | 
			
		||||
    #$ndb = esmith::NetworksDB::UTF8->open_ro;
 | 
			
		||||
    my @local_list = $ndb->local_access_spec;
 | 
			
		||||
 | 
			
		||||
    foreach my $spec (@local_list) {
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ package SrvMngr::Controller::Ibays;
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Network
 | 
			
		||||
# description : Shared areas (was ibays)
 | 
			
		||||
# description : Ibays
 | 
			
		||||
# navigation  : 6000 100
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
@@ -14,12 +14,10 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw( theme_list init_session validate_password );
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::DomainsDB;
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::DomainsDB::UTF8;
 | 
			
		||||
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
my ($adb,$cdb);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
@@ -27,9 +25,9 @@ sub main {
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %iba_datas = ();
 | 
			
		||||
    my $title     = $c->l('iba_FORM_TITLE');
 | 
			
		||||
    $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
	$iba_datas{'trt'} = 'LIST';
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
    $iba_datas{'trt'} = 'LIST';
 | 
			
		||||
    my @ibays;
 | 
			
		||||
 | 
			
		||||
    if ($adb) {
 | 
			
		||||
@@ -44,8 +42,8 @@ sub do_display {
 | 
			
		||||
    my $rt   = $c->current_route;
 | 
			
		||||
    my $trt  = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my $ibay = $c->param('ibay') || '';
 | 
			
		||||
    $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
    #$trt = 'DEL' if ( $ibay );
 | 
			
		||||
    #$trt = 'ADD' if ( $rt eq 'ibayadd' );
 | 
			
		||||
@@ -99,7 +97,7 @@ sub do_display {
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'LIST') {
 | 
			
		||||
        my @ibays;
 | 
			
		||||
        $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
        $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
        if ($adb) {
 | 
			
		||||
            @ibays = $adb->ibays();
 | 
			
		||||
@@ -120,8 +118,8 @@ sub do_update {
 | 
			
		||||
    $iba_datas{'trt'} = $trt;
 | 
			
		||||
    my $result = '';
 | 
			
		||||
    my $res;
 | 
			
		||||
    $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
        my $name = ($c->param('ibay') || '');
 | 
			
		||||
@@ -306,7 +304,7 @@ sub print_vhost_message {
 | 
			
		||||
    my $c              = shift;
 | 
			
		||||
    my $name           = $c->param('ibay');
 | 
			
		||||
    my $result         = '';
 | 
			
		||||
    my $domaindb       = esmith::DomainsDB->open();
 | 
			
		||||
    my $domaindb       = esmith::DomainsDB::UTF8->open();
 | 
			
		||||
    my @domains        = $domaindb->get_all_by_prop(Content => $name);
 | 
			
		||||
    my $vhostListItems = join "\n", (map ($_->key . " " . $_->prop('Description'), @domains));
 | 
			
		||||
 | 
			
		||||
@@ -328,7 +326,7 @@ sub remove_ibay {
 | 
			
		||||
    if (my $acct = $adb->get($name)) {
 | 
			
		||||
        if ($acct->prop('type') eq 'ibay') {
 | 
			
		||||
            $acct->set_prop('type', 'ibay-deleted');
 | 
			
		||||
            my $domains_db = esmith::DomainsDB->open();
 | 
			
		||||
            my $domains_db = esmith::DomainsDB::UTF8->open();
 | 
			
		||||
            my @domains = $domains_db->get_all_by_prop(Content => $name);
 | 
			
		||||
 | 
			
		||||
            foreach my $d (@domains) {
 | 
			
		||||
 
 | 
			
		||||
@@ -13,13 +13,12 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session subnet_mask get_reg_mask ip_number);
 | 
			
		||||
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use esmith::HostsDB;
 | 
			
		||||
#my $network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
 | 
			
		||||
use esmith::HostsDB::UTF8;
 | 
			
		||||
use esmith::NetworksDB::UTF8;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
my $ret = "OK";
 | 
			
		||||
my ($network_db);
 | 
			
		||||
our ($network_db,$config_db);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
@@ -27,7 +26,7 @@ sub main {
 | 
			
		||||
    my %ln_datas = ();
 | 
			
		||||
    $ln_datas{return} = "";
 | 
			
		||||
    my $title = $c->l('ln_LOCAL NETWORKS');
 | 
			
		||||
	$network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
 | 
			
		||||
    $network_db = esmith::NetworksDB::UTF8->open() || die("Couldn't open networks db");
 | 
			
		||||
    my $modul = '';
 | 
			
		||||
    $ln_datas{trt} = 'LIST';
 | 
			
		||||
    my @localnetworks;
 | 
			
		||||
@@ -49,7 +48,7 @@ sub do_display {
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LIST');
 | 
			
		||||
	$network_db = esmith::NetworksDB->open() || die("Couldn't open networks db");
 | 
			
		||||
    $network_db = esmith::NetworksDB::UTF8->open() || die("Couldn't open networks db");
 | 
			
		||||
    $trt = 'DEL'  if ($rt eq 'localnetworksdel');
 | 
			
		||||
    $trt = 'ADD'  if ($rt eq 'localnetworksadd');
 | 
			
		||||
    $trt = 'ADD1' if ($rt eq 'localnetworksadd1');
 | 
			
		||||
@@ -77,14 +76,14 @@ sub do_display {
 | 
			
		||||
            #Error - return to Add page
 | 
			
		||||
            $trt = "ADD";
 | 
			
		||||
        }
 | 
			
		||||
        $network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-3");    #Refresh the network DB
 | 
			
		||||
	#$network_db = esmith::NetworksDB::UTF8->open() || die("Failed to open Networkdb-3");    #Refresh the network DB
 | 
			
		||||
        $c->stash(ret => \%ret);    #stash it away for the template
 | 
			
		||||
    } ## end if ($trt eq 'ADD1')
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'DEL1') {
 | 
			
		||||
 | 
			
		||||
        #After Remove clicked on Delete network panel
 | 
			
		||||
        $network_db   = esmith::NetworksDB->open() || die("Failed to open Networkdb-1");
 | 
			
		||||
	#$network_db   = esmith::NetworksDB::UTF8->open() || die("Failed to open Networkdb-1");
 | 
			
		||||
        my $localnetwork = $c->param("localnetwork");
 | 
			
		||||
        my $delete_hosts = $c->param("deletehost") || "1";                                    #default to deleting them.
 | 
			
		||||
        my $rec = $network_db->get($localnetwork) || die("Failed to find network on db:$localnetwork");
 | 
			
		||||
@@ -93,7 +92,7 @@ sub do_display {
 | 
			
		||||
            $ln_datas{localnetwork} = $localnetwork;
 | 
			
		||||
        }
 | 
			
		||||
        my %ret = remove_network($localnetwork, $delete_hosts);
 | 
			
		||||
        $network_db = esmith::NetworksDB->open() || die("Failed to open Networkdb-2");        #Refresh the network DB
 | 
			
		||||
	#$network_db = esmith::NetworksDB::UTF8->open() || die("Failed to open Networkdb-2");        #Refresh the network DB
 | 
			
		||||
        my @localnetworks;
 | 
			
		||||
 | 
			
		||||
        if ($network_db) {
 | 
			
		||||
@@ -138,7 +137,7 @@ sub do_display {
 | 
			
		||||
 | 
			
		||||
sub remove_network {
 | 
			
		||||
    my $network      = shift;
 | 
			
		||||
    $network_db   = esmith::NetworksDB->open();
 | 
			
		||||
    $network_db   = esmith::NetworksDB::UTF8->open();
 | 
			
		||||
    my $record       = $network_db->get($network);
 | 
			
		||||
    my $delete_hosts = shift;
 | 
			
		||||
 | 
			
		||||
@@ -174,7 +173,7 @@ sub hosts_on_network {
 | 
			
		||||
    my $netmask = shift;
 | 
			
		||||
    die if not $network and $netmask;
 | 
			
		||||
    my $cidr             = "$network/$netmask";
 | 
			
		||||
    my $hosts            = esmith::HostsDB->open() || die("Couldn't open hosts db");
 | 
			
		||||
    my $hosts            = esmith::HostsDB::UTF8->open() || die("Couldn't open hosts db");
 | 
			
		||||
    my @localhosts       = grep { $_->prop('HostType') eq 'Local' } $hosts->hosts;
 | 
			
		||||
    my @hosts_on_network = ();
 | 
			
		||||
 | 
			
		||||
@@ -207,9 +206,9 @@ sub add_network {
 | 
			
		||||
 | 
			
		||||
    # we transform bit mask to regular mask
 | 
			
		||||
    $networkMask = get_reg_mask($networkAddress, $networkMask);
 | 
			
		||||
    my $network_db = esmith::NetworksDB->open()
 | 
			
		||||
        || esmith::NetworksDB->create();
 | 
			
		||||
    my $config_db    = esmith::ConfigDB->open();
 | 
			
		||||
    my $network_db = esmith::NetworksDB::UTF8->open()
 | 
			
		||||
        || esmith::NetworksDB::UTF8->create();
 | 
			
		||||
    my $config_db    = esmith::ConfigDB::UTF8->open();
 | 
			
		||||
    my $localIP      = $config_db->get('LocalIP');
 | 
			
		||||
    my $localNetmask = $config_db->get('LocalNetmask');
 | 
			
		||||
    my ($localNetwork, $localBroadcast)
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Login;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Support
 | 
			
		||||
# description : Login
 | 
			
		||||
# navigation  : 0000 001
 | 
			
		||||
# navigation  : 0 200
 | 
			
		||||
# menu        : N
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
@@ -18,7 +18,7 @@ use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr::Model::Main;
 | 
			
		||||
use SrvMngr qw( theme_list init_session );
 | 
			
		||||
@@ -26,7 +26,7 @@ my $MAX_LOGIN_ATTEMPTS   = 3;
 | 
			
		||||
my $DURATION_BLOCKED     = 30 * 60;        # access blocked for 30 min
 | 
			
		||||
my $TIMEOUT_FAILED_LOGIN = 1;
 | 
			
		||||
my $RESET_DURATION       = 2 * 60 * 60;    # 2 hours for resetting
 | 
			
		||||
our $adb = esmith::AccountsDB->open() or die "Couldn't open DB Accounts\n";
 | 
			
		||||
our $adb;
 | 
			
		||||
my $allowed_user_re = qr/^\w{5,10}$/;
 | 
			
		||||
my %Login_Attempts;
 | 
			
		||||
 | 
			
		||||
@@ -39,6 +39,7 @@ sub main {
 | 
			
		||||
sub login {
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    my $trt = $c->param('Trt');
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open() or die "Couldn't open DB Accounts\n";
 | 
			
		||||
 | 
			
		||||
    # password reset request
 | 
			
		||||
    if ($trt eq 'RESET') {
 | 
			
		||||
@@ -85,13 +86,13 @@ sub login {
 | 
			
		||||
        $c->session(logged_in => 1);        # set the logged_in flag
 | 
			
		||||
        $c->session(username  => $name);    # keep a copy of the username
 | 
			
		||||
 | 
			
		||||
        #    if ( $name eq 'admin' || $adb->is_user_in_group($name, 'AdmiN') )  # for futur use
 | 
			
		||||
        #    if ( $name eq 'admin' || $adb->is_user_in_group($name, 'Admin') )  # for futur use
 | 
			
		||||
        if ($name eq 'admin') {
 | 
			
		||||
            $c->session(is_admin => 1);
 | 
			
		||||
        } else {
 | 
			
		||||
            $c->session(is_admin => 0);
 | 
			
		||||
        }
 | 
			
		||||
        $c->session(expiration => 600);     # expire this session in 10 minutes
 | 
			
		||||
        $c->session(expiration => $c->config->{timeout} );     # expire this session in the time set  in config
 | 
			
		||||
        $c->flash(success => $c->l('use_WELCOME'));
 | 
			
		||||
        record_login_attempt($c, 'SUCCESS');
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -114,6 +115,7 @@ sub mail_rescue {
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $name = $c->param('Username');
 | 
			
		||||
    my $from = $c->param('From');
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open() or die "Couldn't open DB Accounts\n";
 | 
			
		||||
    my $res;
 | 
			
		||||
    $res .= $c->l('use_TOO_MANY_LOGIN') if (is_denied($c));
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Logout;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Current User
 | 
			
		||||
# description : Logout
 | 
			
		||||
# navigation  : 1000 900
 | 
			
		||||
# navigation  : 1000 1000
 | 
			
		||||
# menu        : U
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Manual;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Support
 | 
			
		||||
# description : Online manual
 | 
			
		||||
# navigation  : 0000 100
 | 
			
		||||
# navigation  : 0 300
 | 
			
		||||
# menu        : N
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
 
 | 
			
		||||
@@ -13,14 +13,10 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
 | 
			
		||||
#use Regexp::Common qw /net/;
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use esmith::HostsDB;
 | 
			
		||||
#our $db = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
#our $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
#our $udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
use esmith::ConfigDB::UTF8; 
 | 
			
		||||
 | 
			
		||||
my ($cdb,$tcp_db,$udp_db);
 | 
			
		||||
 | 
			
		||||
my %ret = ();
 | 
			
		||||
@@ -34,9 +30,9 @@ sub main {
 | 
			
		||||
    $pf_datas{return} = "";
 | 
			
		||||
    my $title = $c->l('pf_FORM_TITLE');
 | 
			
		||||
    my $modul = '';
 | 
			
		||||
	$cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
	$tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
	$udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
    $tcp_db = esmith::ConfigDB::UTF8->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
    $udp_db = esmith::ConfigDB::UTF8->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
    $pf_datas{trt} = 'LIST';
 | 
			
		||||
    my @tcpforwards = $tcp_db->get_all;
 | 
			
		||||
    my @udpforwards = $udp_db->get_all;
 | 
			
		||||
@@ -57,9 +53,9 @@ sub do_display {
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my $rt = $c->current_route;
 | 
			
		||||
    my $trt = ($c->param('trt') || 'LIST');
 | 
			
		||||
	my $cdb = esmith::ConfigDB->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
	my $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
	my $udp_db = esmith::ConfigDB->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
    my $cdb = esmith::ConfigDB::UTF8->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
    my $tcp_db = esmith::ConfigDB::UTF8->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
    my $udp_db = esmith::ConfigDB::UTF8->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
    $trt = 'DEL'  if ($rt eq 'portforwardingdel');
 | 
			
		||||
    $trt = 'ADD'  if ($rt eq 'portforwardingadd');
 | 
			
		||||
    $trt = 'ADD1' if ($rt eq 'portforwardingadd1');
 | 
			
		||||
@@ -142,6 +138,10 @@ sub do_display {
 | 
			
		||||
    if ($trt eq 'LIST') {
 | 
			
		||||
 | 
			
		||||
        #List all the port forwards
 | 
			
		||||
        # Open them again as maybe written to above 
 | 
			
		||||
        $tcp_db = esmith::ConfigDB::UTF8->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
        $udp_db = esmith::ConfigDB::UTF8->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
 | 
			
		||||
        my @tcpforwards = $tcp_db->get_all;
 | 
			
		||||
        my @udpforwards = $udp_db->get_all;
 | 
			
		||||
        my $empty       = 1 if not @tcpforwards and not @udpforwards;
 | 
			
		||||
@@ -168,10 +168,10 @@ sub add_portforward {
 | 
			
		||||
    my $fdb;
 | 
			
		||||
 | 
			
		||||
    if ($proto eq 'TCP') {
 | 
			
		||||
        $tcp_db = esmith::ConfigDB->open('portforward_tcp') || die "Can't open portforward_tcp database: $!\n";
 | 
			
		||||
        $tcp_db = esmith::ConfigDB::UTF8->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";
 | 
			
		||||
        $udp_db = esmith::ConfigDB::UTF8->open('portforward_udp') || die "Can't open portforward_udp database: $!\n";
 | 
			
		||||
        $fdb = $udp_db;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -211,6 +211,7 @@ sub add_portforward {
 | 
			
		||||
 | 
			
		||||
sub get_destination_host {
 | 
			
		||||
    my $q           = shift;
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
    my $dhost       = $q->param("dhost");
 | 
			
		||||
    my $localip     = $cdb->get_prop('InternalInterface', 'IPAddress');
 | 
			
		||||
    my $external_ip = $cdb->get_prop('ExternalInterface', 'IPAddress') || $localip;
 | 
			
		||||
@@ -357,6 +358,7 @@ sub isValidPort() {
 | 
			
		||||
 | 
			
		||||
sub validate_destination_host {
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Can't open configuration database: $!\n";
 | 
			
		||||
    my $dhost = $c->param('dhost');
 | 
			
		||||
    $dhost =~ s/^\s+|\s+$//g;
 | 
			
		||||
    my $localip = $cdb->get_prop('InternalInterface', 'IPAddress');
 | 
			
		||||
 
 | 
			
		||||
@@ -14,15 +14,15 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
my $adb;
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
our $adb;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %prt_datas = ();
 | 
			
		||||
    my $title     = $c->l('prt_FORM_TITLE');
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $prt_datas{'trt'} = 'LIST';
 | 
			
		||||
    my @printerDrivers;
 | 
			
		||||
 | 
			
		||||
@@ -38,7 +38,7 @@ sub do_display {
 | 
			
		||||
    my $rt      = $c->current_route;
 | 
			
		||||
    my $trt     = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my $printer = $c->param('printer') || '';
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
    #$trt = 'DEL' if ( $printer );
 | 
			
		||||
    #$trt = 'ADD' if ( $rt eq 'printeradd' );
 | 
			
		||||
@@ -79,7 +79,7 @@ sub do_update {
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LIST');
 | 
			
		||||
    my %prt_datas = ();
 | 
			
		||||
    my $title     = $c->l('prt_FORM_TITLE');
 | 
			
		||||
   	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $prt_datas{'trt'} = $trt;
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Proxy;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : Proxy settings
 | 
			
		||||
# navigation  : 4000 710
 | 
			
		||||
# navigation  : 4000 200
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
@@ -14,11 +14,14 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
our $db = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
 | 
			
		||||
our $db;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
    my %prx_datas = ();
 | 
			
		||||
    my $title     = $c->l('prx_TITLE');
 | 
			
		||||
    my $modul     = $c->render_to_string(inline => $c->l('prx_FIRST_PAGE_DESCRIPTION'));
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Pseudonyms;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : User management
 | 
			
		||||
# description : Pseudonyms
 | 
			
		||||
# navigation  : 2000 210
 | 
			
		||||
# navigation  : 2000 300
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
@@ -14,15 +14,10 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
use esmith::DomainsDB::UTF8;
 | 
			
		||||
 | 
			
		||||
#use Data::Dumper;
 | 
			
		||||
#use esmith::FormMagick::Panel::pseudonyms;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
 | 
			
		||||
#use URI::Escape;
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
my ($cdb,$adb);
 | 
			
		||||
our ($cdb,$adb);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
@@ -32,8 +27,7 @@ sub main {
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    $pse_datas{trt} = 'LST';
 | 
			
		||||
    my @pseudonyms;
 | 
			
		||||
	#$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
    if ($adb) {
 | 
			
		||||
        @pseudonyms = $adb->pseudonyms();
 | 
			
		||||
@@ -50,8 +44,7 @@ sub do_display {
 | 
			
		||||
    my $pseudonym = $c->param('pseudonym') || '';
 | 
			
		||||
    my $title     = $c->l('pse_FORM_TITLE');
 | 
			
		||||
    my %pse_datas = ();
 | 
			
		||||
 	#$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
	$pse_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
@@ -97,8 +90,7 @@ sub do_update {
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'LST');
 | 
			
		||||
    my $title     = $c->l('pse_FORM_TITLE');
 | 
			
		||||
   	#$cdb = esmith::ConfigDB->open   || die "Couldn't open configuration db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    my %pse_datas = ();
 | 
			
		||||
    $pse_datas{'trt'} = $trt;
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
@@ -331,8 +323,7 @@ sub validate_new_pseudonym_name {
 | 
			
		||||
    if (defined $acct) {
 | 
			
		||||
        return ($c->l('pse_NAME_IN_USE'));
 | 
			
		||||
    } elsif ($pseudonym =~ /@/) {
 | 
			
		||||
        use esmith::DomainsDB;
 | 
			
		||||
        my $ddb = esmith::DomainsDB->open_ro
 | 
			
		||||
        my $ddb = esmith::DomainsDB::UTF8->open_ro
 | 
			
		||||
            or die "Couldn't open DomainsDB\n";
 | 
			
		||||
        my ($lhs, $rhs) = split /@/, $pseudonym;
 | 
			
		||||
        return ($c->l('pse_PSEUDONYM_INVALID_DOMAIN')) unless ($ddb->get($rhs));
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,9 @@ use SrvMngr qw(gen_locale_date_string);
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use List::Util qw(sum); 
 | 
			
		||||
 | 
			
		||||
#use Mail::Log::Trace::Postfix;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
@@ -48,44 +51,66 @@ sub generateReport {
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my $report_type = shift;
 | 
			
		||||
    my $out         = '';
 | 
			
		||||
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # Looks good; go ahead and generate the report.
 | 
			
		||||
    # Go ahead and generate the report.
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    #	$| = 1;
 | 
			
		||||
    my $now_string = $c->gen_locale_date_string();
 | 
			
		||||
    my $log_path = '/var/log/maillog';
 | 
			
		||||
    $out .= sprintf("<h3>%s %s </h3>", $c->l('REPORT_GENERATED'), $now_string);
 | 
			
		||||
 | 
			
		||||
    if ($report_type =~ /^qmail-q/) {
 | 
			
		||||
        open(QMAILQUEUEREPORT, "/var/qmail/bin/$report_type |");
 | 
			
		||||
        $out .= sprintf "<pre>";
 | 
			
		||||
 | 
			
		||||
        while (<QMAILQUEUEREPORT>) {
 | 
			
		||||
            $out .= sprintf("%s", $_);
 | 
			
		||||
        }
 | 
			
		||||
        close QMAILQUEUEREPORT;
 | 
			
		||||
        $out .= sprintf "</pre>";
 | 
			
		||||
        $out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
 | 
			
		||||
        return '';
 | 
			
		||||
    } ## end if ($report_type =~ /^qmail-q/)
 | 
			
		||||
    chdir "/var/log/qmail";
 | 
			
		||||
    open(QMAILANALOG,
 | 
			
		||||
              "/bin/cat \@* current 2>/dev/null"
 | 
			
		||||
            . "| /usr/local/bin/tai64nunix"
 | 
			
		||||
            . "| /usr/local/qmailanalog/bin/matchup 5>/dev/null"
 | 
			
		||||
            . "| /usr/local/qmailanalog/bin/$report_type |");
 | 
			
		||||
    $out .= sprintf "<pre>";
 | 
			
		||||
    # Get the selected report from the form submission
 | 
			
		||||
    my $selected_report = $report_type;
 | 
			
		||||
 | 
			
		||||
    while (<QMAILANALOG>) {
 | 
			
		||||
    # Call the relevant report sub based on the selection
 | 
			
		||||
    if ($selected_report eq 'daily_summary') {
 | 
			
		||||
        $out .= daily_summary_report($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'daily_summary_today') {
 | 
			
		||||
        $out .= daily_summary_report_today($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'daily_summary_all') {
 | 
			
		||||
        $out .= daily_summary_report_all($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'top_senders') {
 | 
			
		||||
        $out .= top_senders_and_recipients($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'bounce_analysis') {
 | 
			
		||||
        $out .= bounce_rate_analysis($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'spam_and_virus') {
 | 
			
		||||
        $out .= spam_and_virus_filter_report($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'delivery_status') {
 | 
			
		||||
        $out .= delivery_status_report($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'geo_analysis') {
 | 
			
		||||
        $out .= geographical_analysis_of_email($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'traffic_analysis') {
 | 
			
		||||
        $out .= traffic_analysis($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'auth_analysis') {
 | 
			
		||||
        $out .= authentication_analysis($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'user_activity') {
 | 
			
		||||
        $out .= user_activity_report($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'error_reporting') {
 | 
			
		||||
        $out .= error_reporting($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'comparison_reports') {
 | 
			
		||||
        $out .= comparison_reports($log_path, '/var/log/mail.log.1');
 | 
			
		||||
    }
 | 
			
		||||
    elsif ($selected_report eq 'customized_reports') {
 | 
			
		||||
        $out .= customized_reports($log_path);  
 | 
			
		||||
    }
 | 
			
		||||
    else {
 | 
			
		||||
        $out .= 'Invalid report selected';
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        # Cook any special HTML characters
 | 
			
		||||
        s/\&/\&/g;
 | 
			
		||||
        s/\"/\"/g;
 | 
			
		||||
        s/\>/\>/g;
 | 
			
		||||
        s/\</\</g;
 | 
			
		||||
        $out .= sprintf("%s", $_);
 | 
			
		||||
    } ## end while (<QMAILANALOG>)
 | 
			
		||||
    close QMAILANALOG;
 | 
			
		||||
    # The $output variable now contains the generated report output.
 | 
			
		||||
    # Further processing can be done here, or you can render it later.
 | 
			
		||||
  
 | 
			
		||||
    $out .= sprintf "</pre>";
 | 
			
		||||
    $out .= sprintf("<h3>%s</h3>", $c->l('END_OF_REPORT'));
 | 
			
		||||
    return $out;
 | 
			
		||||
@@ -94,22 +119,243 @@ sub generateReport {
 | 
			
		||||
sub reportType_list {
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
    my @array = (
 | 
			
		||||
 | 
			
		||||
        #        [ $c->l('qma_LIST_OUTGOING') => 'qmail-qread' ],
 | 
			
		||||
        #        [ $c->l('qma_SUMMARIZE_QUEUE') => 'qmail-qstat' ],
 | 
			
		||||
        [ $c->l('qma_SUCCESSFUL_DELIVERY_DELAY') => 'zddist' ],
 | 
			
		||||
        [ $c->l('qma_REASONS_DEFERRAL')          => 'zdeferrals' ],
 | 
			
		||||
        [ $c->l('qma_REASONS_FAILURE')           => 'zfailures' ],
 | 
			
		||||
        [ $c->l('qma_BASIC_STATS')               => 'zoverall' ],
 | 
			
		||||
        [ $c->l('qma_RECIP_STATS')               => 'zrecipients' ],
 | 
			
		||||
        [ $c->l('qma_RECIP_HOSTS')               => 'zrhosts' ],
 | 
			
		||||
        [ $c->l('qma_RECIP_ORDERED')             => 'zrxdelay' ],
 | 
			
		||||
        [ $c->l('qma_SENDER_STATS')              => 'zsenders' ],
 | 
			
		||||
        [ $c->l('qma_SENDMAIL_STYLE')            => 'zsendmail' ],
 | 
			
		||||
        [ $c->l('qma_REASONS_SUCCESS')           => 'zsuccesses' ],
 | 
			
		||||
        [ $c->l('qma_SENDER_UIDS')               => 'zsuids' ]
 | 
			
		||||
    );
 | 
			
		||||
		[$c->l('qma_Daily_Summary_Report_yesterday') => 'daily_summary'],
 | 
			
		||||
		[$c->l('qma_Daily_Summary_Report_today') => 'daily_summary_today'],
 | 
			
		||||
		[$c->l('qma_Daily_Summary_Report_all') => 'daily_summary_all'],
 | 
			
		||||
		#[$c->l('qma_Top Senders and Recipients') => 'top_senders'],
 | 
			
		||||
		#[$c->l('qma_Bounce Rate Analysis') => 'bounce_analysis'],
 | 
			
		||||
		#[$c->l('qma_Spam and Virus Filtering Report') => 'spam_and_virus'],
 | 
			
		||||
		#[$c->l('qma_Delivery Status Report') => 'delivery_status'],
 | 
			
		||||
		#[$c->l('qma_Geographic Analysis of Email') => 'geo_analysis'],
 | 
			
		||||
		#[$c->l('qma_Traffic Analysis') => 'traffic_analysis'],
 | 
			
		||||
		#[$c->l('qma_Authentication Analysis') => 'auth_analysis'],
 | 
			
		||||
		#[$c->l('qma_User Activity Report') => 'user_activity'],
 | 
			
		||||
		#[$c->l('qma_Error Reporting') => 'error_reporting'],
 | 
			
		||||
		#[$c->l('qma_Comparison Reports') => 'comparison_reports'],
 | 
			
		||||
		#[$c->l('qma_Customized Reports') => 'customized_reports'],
 | 
			
		||||
	);
 | 
			
		||||
    my @sorted_array = sort { $a->[0] cmp $b->[0] } @array;
 | 
			
		||||
    return \@sorted_array;
 | 
			
		||||
} ## end sub reportType_list
 | 
			
		||||
1;
 | 
			
		||||
 | 
			
		||||
sub daily_summary_report {
 | 
			
		||||
    my $log_file = shift;  # Path to log file
 | 
			
		||||
    my $output = qx(ls -1 /var/log/maillog* | xargs cat |pflogsumm -d yesterday --detail 0 --no-no-msg-size);
 | 
			
		||||
    return format_as_html("Daily Summary Report", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub daily_summary_report_today {
 | 
			
		||||
    my $log_file = shift;  # Path to log file
 | 
			
		||||
    my $output = qx(ls -1 /var/log/maillog* | xargs cat |pflogsumm -d today --detail 0 --no-no-msg-size);
 | 
			
		||||
    return format_as_html("Daily Summary Report", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub daily_summary_report_all {
 | 
			
		||||
    my $log_file = shift;  # Path to log file
 | 
			
		||||
    my $output = qx(ls -1 /var/log/maillog* | xargs cat |pflogsumm --detail 0 --no-no-msg-size);
 | 
			
		||||
    return format_as_html("Summary Report across all logs", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub top_senders_and_recipients {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm --smtpd-stats $log_file);
 | 
			
		||||
    return format_as_html("Top Senders and Recipients", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub bounce_rate_analysis {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm --bounce-detail 10 $log_file);  # Show up to 10 bounce details
 | 
			
		||||
    return format_as_html("Bounce Rate Analysis", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub spam_and_virus_filter_report {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm -u 10 $log_file);  # User report with up to 10 entries
 | 
			
		||||
    return format_as_html("Spam and Virus Filtering Report", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub delivery_status_report {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm --deferral-detail 10 $log_file);  # Show deferral details
 | 
			
		||||
    return format_as_html("Delivery Status Report", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub geographical_analysis_of_email {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    # `pflogsumm` doesn't have a specific option for geographic analysis in the help text;
 | 
			
		||||
    # It's assumed this could be replaced with something relevant, like a SMTP detail.
 | 
			
		||||
    my $output = qx(pflogsumm --smtp-detail 10 $log_file);  # Show up to 10 SMTP details
 | 
			
		||||
    return format_as_html("Geographic Analysis of Email", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub traffic_analysis {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm --verbose-msg-detail $log_file);  # Request verbose detail
 | 
			
		||||
    return format_as_html("Traffic Analysis", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub authentication_analysis {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm -u 10 --verbose-msg-detail $log_file);  # User detailed report
 | 
			
		||||
    return format_as_html("Authentication Analysis", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub user_activity_report {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm -u 20 $log_file);  # Show user activity for up to 20 users
 | 
			
		||||
    return format_as_html("User Activity Report", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub error_reporting {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    my $output = qx(pflogsumm --problems-first $log_file);  # This will show problems first
 | 
			
		||||
    return format_as_html("Error Reporting", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub comparison_reports {
 | 
			
		||||
    my ($log_file1, $log_file2) = @_; # Comparing two log files
 | 
			
		||||
    my $output = qx(pflogsumm $log_file1 $log_file2);  # Standard comparison without special flags
 | 
			
		||||
    return format_as_html("Comparison Reports", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub customized_reports {
 | 
			
		||||
    my $log_file = shift;
 | 
			
		||||
    # Because we don't have a concrete custom flag, we'll consider using -d with specific detail.
 | 
			
		||||
    my $output = qx(pflogsumm --detail 10 $log_file);  # Generally show detailed summary
 | 
			
		||||
    return format_as_html("Customized Reports", $output);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub format_as_html {
 | 
			
		||||
    my ($title, $content) = @_;
 | 
			
		||||
    return <<HTML;
 | 
			
		||||
<h2>$title</h2>
 | 
			
		||||
<pre>$content</pre>
 | 
			
		||||
HTML
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
### 1. Message Tracking
 | 
			
		||||
#sub trace_message {
 | 
			
		||||
    #my ($log_path, $message_id) = @_;
 | 
			
		||||
    ##my $tracer = Mail::Log::Trace::Postfix->new({log_file => $log_path});
 | 
			
		||||
    ##$tracer->set_message_id($message_id);
 | 
			
		||||
    
 | 
			
		||||
    #my $output = "Message Tracking Report for ID: $message_id\n";
 | 
			
		||||
    ##$output .= "=" x 50 . "\n";
 | 
			
		||||
    ##$output .= sprintf "%-12s: %s\n", 'From', $tracer->get_from_address;
 | 
			
		||||
    ##$output .= sprintf "%-12s: %s\n", 'Status', $tracer->get_final_status;
 | 
			
		||||
    
 | 
			
		||||
    ##$output .= "\nRecipients:\n";
 | 
			
		||||
    ##$output .= join("\n", map { "- $_" } $tracer->get_recipient_addresses);
 | 
			
		||||
    
 | 
			
		||||
    ##$output .= "\n\nTimeline:\n";
 | 
			
		||||
    ##my $timeline = $tracer->get_timestamps;
 | 
			
		||||
    ##while (my ($stage, $time) = each %$timeline) {
 | 
			
		||||
        ##$output .= sprintf "%-10s: %s\n", ucfirst($stage), $time;
 | 
			
		||||
    ##}
 | 
			
		||||
    
 | 
			
		||||
    #return $output || "No records found for message ID: $message_id";
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
#### 2. Queue Analysis
 | 
			
		||||
#sub get_queue_stats {
 | 
			
		||||
    #my $spool_dir = '/var/spool/postfix';
 | 
			
		||||
    #my %queues = map { $_ => 0 } qw(active deferred bounce hold corrupt);
 | 
			
		||||
    
 | 
			
		||||
    #foreach my $q (keys %queues) {
 | 
			
		||||
        #opendir(my $dh, "$spool_dir/$q");
 | 
			
		||||
        #$queues{$q} = scalar(grep { -f "$spool_dir/$q/$_" } readdir($dh));
 | 
			
		||||
        #closedir($dh);
 | 
			
		||||
    #}
 | 
			
		||||
    
 | 
			
		||||
    #my $output = "Current Postfix Queue Status\n";
 | 
			
		||||
    #$output .= "=" x 30 . "\n";
 | 
			
		||||
    #$output .= sprintf "%-10s: %3d messages\n", ucfirst($_), $queues{$_} 
 | 
			
		||||
        #for sort keys %queues;
 | 
			
		||||
    #$output .= "\nTotal: " . sum(values %queues) . " messages in queue";
 | 
			
		||||
    
 | 
			
		||||
    #return $output;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
#### 3. Message Statistics
 | 
			
		||||
#sub get_message_stats {
 | 
			
		||||
    #my ($log_path) = @_;
 | 
			
		||||
    #my %stats = (received => 0, rejected => 0, delivered => 0, 
 | 
			
		||||
                #deferred => 0, bounced => 0, held => 0);
 | 
			
		||||
 | 
			
		||||
    #open(my $fh, '<', $log_path);
 | 
			
		||||
    #while(<$fh>) {
 | 
			
		||||
        #$stats{received}++ if /qmgr.*: [A-Z0-9]+: from=/;
 | 
			
		||||
        #$stats{delivered}++ if /status=sent/;
 | 
			
		||||
        #$stats{rejected}++ if /NOQUEUE: reject/;
 | 
			
		||||
        #$stats{deferred}++ if /status=deferred/;
 | 
			
		||||
        #$stats{bounced}++ if /status=bounced/;
 | 
			
		||||
        #$stats{held}++ if /status=hold/;
 | 
			
		||||
    #}
 | 
			
		||||
    #close($fh);
 | 
			
		||||
    
 | 
			
		||||
    #my $output = "Message Statistics for " . localtime . "\n";
 | 
			
		||||
    #$output .= "=" x 40 . "\n";
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d\n", 'Received', $stats{received};
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d (%.1f%%)\n", 'Delivered', $stats{delivered},
 | 
			
		||||
        #($stats{received} ? ($stats{delivered}/$stats{received}*100) : 0);
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d\n", 'Rejected', $stats{rejected};
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d\n", 'Deferred', $stats{deferred};
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d\n", 'Bounced', $stats{bounced};
 | 
			
		||||
    #$output .= sprintf "%-12s: %6d\n", 'Held', $stats{held};
 | 
			
		||||
    
 | 
			
		||||
    #return $output;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
#### 4. User Activity Audit
 | 
			
		||||
#sub get_user_activity {
 | 
			
		||||
    #my ($log_path, $email) = @_;
 | 
			
		||||
    ##my $tracer = Mail::Log::Trace::Postfix->new({log_file => $log_path});
 | 
			
		||||
    
 | 
			
		||||
    ##my $sent = scalar $tracer->find_messages_by_sender($email);
 | 
			
		||||
    ##my $received = scalar $tracer->find_messages_by_recipient($email);
 | 
			
		||||
    
 | 
			
		||||
    #my $output = "Activity Report for: $email\n";
 | 
			
		||||
    ##$output .= "=" x (length($email) + 18) . "\n";
 | 
			
		||||
    ##$output .= "Messages sent:     $sent\n";
 | 
			
		||||
    ##$output .= "Messages received: $received\n\n";
 | 
			
		||||
    
 | 
			
		||||
    ##$output .= "Last week's activity:\n";
 | 
			
		||||
    ##$output .= join("\n", map { sprintf "- %s: %d messages", $_->[0], $_->[1] }
 | 
			
		||||
        ##$tracer->get_weekly_stats($email));
 | 
			
		||||
    
 | 
			
		||||
    #return $output || "No activity found for $email";
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
#### 5. Security Monitoring
 | 
			
		||||
#sub detect_auth_failures {
 | 
			
		||||
    #my ($log_path) = @_;
 | 
			
		||||
    #my %failures;
 | 
			
		||||
    
 | 
			
		||||
    #open(my $fh, '<', $log_path);
 | 
			
		||||
    #while(<$fh>) {
 | 
			
		||||
        #if(/SASL (?:LOGIN|PLAIN) authentication failed.*?\[([0-9.]+)\]/) {
 | 
			
		||||
            #$failures{$1}++;
 | 
			
		||||
        #}
 | 
			
		||||
    #}
 | 
			
		||||
    #close($fh);
 | 
			
		||||
    
 | 
			
		||||
    #return "No authentication failures found" unless keys %failures;
 | 
			
		||||
    
 | 
			
		||||
    #my $output = "Authentication Failure Report\n";
 | 
			
		||||
    #$output .= "=" x 30 . "\n";
 | 
			
		||||
    #$output .= sprintf "%-15s %s\n", 'IP Address', 'Attempts';
 | 
			
		||||
    #$output .= sprintf "%-15s %s\n", '-' x 15, '-' x 7;
 | 
			
		||||
    
 | 
			
		||||
    #foreach my $ip (sort { $failures{$b} <=> $failures{$a} } keys %failures) {
 | 
			
		||||
        #$output .= sprintf "%-15s %5d\n", $ip, $failures{$ip};
 | 
			
		||||
    #}
 | 
			
		||||
    #$output .= "\nTotal failures: " . sum(values %failures);
 | 
			
		||||
    
 | 
			
		||||
    #return $output;
 | 
			
		||||
#}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Quota;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : User management
 | 
			
		||||
# description : Quotas
 | 
			
		||||
# navigation  : 2000 300
 | 
			
		||||
# navigation  : 2000 500
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
@@ -16,8 +16,8 @@ use Scalar::Util qw(looks_like_number);
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
my $adb;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
@@ -25,7 +25,7 @@ sub main {
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    my %quo_datas = ();
 | 
			
		||||
    my $title     = $c->l('quo_FORM_TITLE');
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $quo_datas{'trt'} = 'LIST';
 | 
			
		||||
    my @userAccounts;
 | 
			
		||||
 | 
			
		||||
@@ -44,7 +44,7 @@ sub do_display {
 | 
			
		||||
    $trt = 'UPD' if ($user);
 | 
			
		||||
    my %quo_datas = ();
 | 
			
		||||
    my $title     = $c->l('quo_FORM_TITLE');
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $quo_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
@@ -73,7 +73,7 @@ sub do_update {
 | 
			
		||||
    $quo_datas{trt} = $trt;
 | 
			
		||||
    my $result = '';
 | 
			
		||||
    my $res;
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'UPD') {
 | 
			
		||||
        $quo_datas{user}    = ($c->param('user') || '');
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,7 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session ip_number subnet_mask get_reg_mask);
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
use Exporter;
 | 
			
		||||
@@ -30,7 +30,7 @@ our @EXPORT = qw( networkAccess_list passwordLogin_list get_ssh_permit_root_logi
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
#		get_pptp_sessions
 | 
			
		||||
our $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
our  $db; 
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
@@ -38,7 +38,7 @@ sub main {
 | 
			
		||||
    my $title     = $c->l('rma_FORM_TITLE');
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    my %rma_datas = ();
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
 | 
			
		||||
    #$rma_datas{ipsecrwSess}  = $c->get_ipsecrw_sessions();
 | 
			
		||||
    #$rma_datas{pptpSessions} = $c->get_pptp_sessions();
 | 
			
		||||
@@ -60,7 +60,7 @@ sub do_action {
 | 
			
		||||
    my $title = $c->l('rma_FORM_TITLE');
 | 
			
		||||
    my ($result, $res, $trt) = '';
 | 
			
		||||
    my %rma_datas = ();
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    $rma_datas{ipsecrwSess}  = ($c->param('IpsecrwSess')  || '');
 | 
			
		||||
    $rma_datas{ipsecrwReset} = ($c->param('IpsecrwReset') || '');
 | 
			
		||||
 | 
			
		||||
@@ -134,7 +134,7 @@ sub networkAccess_list {
 | 
			
		||||
    return [
 | 
			
		||||
        [ $c->l('rma_NO_ACCESS')         => 'off' ],
 | 
			
		||||
        [ $c->l('NETWORKS_ALLOW_LOCAL')  => 'private' ],
 | 
			
		||||
        [ $c->l('NETWORKS_ALLOW_PUBLIC') => 'normal' ]
 | 
			
		||||
        [ $c->l('NETWORKS_ALLOW_PUBLIC') => 'public' ]
 | 
			
		||||
    ];
 | 
			
		||||
} ## end sub networkAccess_list
 | 
			
		||||
 | 
			
		||||
@@ -144,6 +144,7 @@ sub passwordLogin_list {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_prop {
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my ($c, $item, $prop) = @_;
 | 
			
		||||
    warn "You must specify a record key"    unless $item;
 | 
			
		||||
    warn "You must specify a property name" unless $prop;
 | 
			
		||||
@@ -154,6 +155,7 @@ sub get_prop {
 | 
			
		||||
sub get_value {
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $item = shift;
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    return ($db->get($item)->value());
 | 
			
		||||
} ## end sub get_value
 | 
			
		||||
 | 
			
		||||
@@ -179,8 +181,8 @@ sub get_ssh_password_auth {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub get_ssh_access {
 | 
			
		||||
    my $status = get_prop('', 'sshd', 'status');
 | 
			
		||||
 | 
			
		||||
	my $c = shift;
 | 
			
		||||
    my $status = $c->get_prop('sshd', 'status');
 | 
			
		||||
    if (defined($status) && ($status eq 'enabled')) {
 | 
			
		||||
        my $access = get_prop('', 'sshd', 'access');
 | 
			
		||||
        $access = ($access eq 'public') ? 'public' : 'private';
 | 
			
		||||
@@ -202,6 +204,7 @@ sub get_ftp_password_login_access {
 | 
			
		||||
} ## end sub get_ftp_password_login_access
 | 
			
		||||
 | 
			
		||||
sub get_telnet_mode {
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $telnet = $db->get('telnet');
 | 
			
		||||
    return ('off') unless $telnet;
 | 
			
		||||
    my $status = $telnet->prop('status') || 'disabled';
 | 
			
		||||
@@ -211,8 +214,8 @@ sub get_telnet_mode {
 | 
			
		||||
} ## end sub get_telnet_mode
 | 
			
		||||
 | 
			
		||||
sub get_ipsecrw_sessions {
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $status = $db->get('ipsec')->prop('RoadWarriorStatus');
 | 
			
		||||
 | 
			
		||||
    if (defined($status) && ($status eq 'enabled')) {
 | 
			
		||||
        return ($db->get('ipsec')->prop('RoadWarriorSessions') || '0');
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -221,6 +224,7 @@ sub get_ipsecrw_sessions {
 | 
			
		||||
} ## end sub get_ipsecrw_sessions
 | 
			
		||||
 | 
			
		||||
sub get_ipsecrw_status {
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    return undef unless ($db->get('ipsec'));
 | 
			
		||||
    return $db->get('ipsec')->prop('RoadWarriorStatus');
 | 
			
		||||
}
 | 
			
		||||
@@ -228,6 +232,7 @@ sub get_ipsecrw_status {
 | 
			
		||||
sub pptp_and_dhcp_range {
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my $val         = shift || 0;
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $dhcp_status = $db->get_prop('dhcpd', 'status') || 'disabled';
 | 
			
		||||
    my $dhcp_end    = $db->get_prop('dhcpd', 'end') || '';
 | 
			
		||||
    my $dhcp_start  = $db->get_prop('dhcpd', 'start') || '';
 | 
			
		||||
@@ -245,6 +250,7 @@ sub pptp_and_dhcp_range {
 | 
			
		||||
 | 
			
		||||
sub _get_valid_from {
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $rec = $db->get('httpd-admin');
 | 
			
		||||
    return undef unless ($rec);
 | 
			
		||||
    my @vals = (split ',', ($rec->prop('ValidFrom') || ''));
 | 
			
		||||
@@ -287,12 +293,12 @@ sub validate_network_and_mask {
 | 
			
		||||
 | 
			
		||||
sub change_settings {
 | 
			
		||||
    my ($c, %rma_datas) = @_;
 | 
			
		||||
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # good; go ahead and change the access.
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $rec = $db->get('telnet');
 | 
			
		||||
 | 
			
		||||
    if ($rec) {
 | 
			
		||||
        if ($rma_datas{telnetAccess} eq "off") {
 | 
			
		||||
            $rec->set_prop('status', 'disabled');
 | 
			
		||||
@@ -363,7 +369,7 @@ sub change_settings {
 | 
			
		||||
sub set_ipsecrw_sessions {
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
    my $sessions = shift;
 | 
			
		||||
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
    if (defined $sessions) {
 | 
			
		||||
        $db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions);
 | 
			
		||||
 | 
			
		||||
@@ -378,6 +384,7 @@ sub add_new_valid_from {
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $net  = shift;
 | 
			
		||||
    my $mask = shift;
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
 | 
			
		||||
    # we transform bit mask to regular mask
 | 
			
		||||
    $mask = get_reg_mask($net, $mask);
 | 
			
		||||
@@ -400,6 +407,7 @@ sub remove_valid_from {
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my $remove_nets = shift;
 | 
			
		||||
    my @remove      = split /,/, $remove_nets;
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || warn "Couldn't open configuration database";
 | 
			
		||||
 | 
			
		||||
    #	my @remove = $c->param('Remove_nets');
 | 
			
		||||
    my @vals = $c->_get_valid_from();
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,8 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use esmith::ConfigDB::UTF8 qw(open_ro);
 | 
			
		||||
use esmith::AccountsDB::UTF8 qw(open_ro);
 | 
			
		||||
 | 
			
		||||
# retrieve a configuration db record
 | 
			
		||||
sub getconfig {
 | 
			
		||||
@@ -16,8 +18,7 @@ sub getconfig {
 | 
			
		||||
    $c->app->log->info($c->log_req . ' ' . $key);
 | 
			
		||||
 | 
			
		||||
    if ($key) {
 | 
			
		||||
        use esmith::ConfigDB qw(open_ro);
 | 
			
		||||
        my $cdb = esmith::ConfigDB->open_ro;
 | 
			
		||||
        my $cdb = esmith::ConfigDB::UTF8->open_ro;
 | 
			
		||||
        return getdb($c, $cdb, $key);
 | 
			
		||||
    } ## end if ($key)
 | 
			
		||||
} ## end sub getconfig
 | 
			
		||||
@@ -29,8 +30,7 @@ sub getaccount {
 | 
			
		||||
    $c->app->log->info($c->log_req . ' ' . $key);
 | 
			
		||||
 | 
			
		||||
    if ($key) {
 | 
			
		||||
        use esmith::AccountsDB qw(open_ro);
 | 
			
		||||
        my $adb = esmith::AccountsDB->open_ro;
 | 
			
		||||
        my $adb = esmith::AccountsDB::UTF8->open_ro;
 | 
			
		||||
        return getdb($c, $adb, $key);
 | 
			
		||||
    } ## end if ($key)
 | 
			
		||||
} ## end sub getaccount
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,11 @@
 | 
			
		||||
package SrvMngr::Controller::Review;
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Support
 | 
			
		||||
# heading     : Investigation
 | 
			
		||||
# description : Review configuration
 | 
			
		||||
# navigation  : 000 500
 | 
			
		||||
# menu        : N
 | 
			
		||||
# navigation  : 7000 400
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading-o     : Configuration
 | 
			
		||||
# description-o : Review configuration
 | 
			
		||||
# navigation-o  : 6000 6800
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
@@ -18,17 +13,20 @@ use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use SrvMngr qw(gen_locale_date_string);
 | 
			
		||||
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::DomainsDB::UTF8;
 | 
			
		||||
use esmith::NetworksDB::UTF8;
 | 
			
		||||
 | 
			
		||||
#use SrvMngr::Review_sub qw(print_page);
 | 
			
		||||
#use smeserver::Panel::review;
 | 
			
		||||
our $db       = esmith::ConfigDB->open_ro   || die "Couldn't open config db";
 | 
			
		||||
our $domains  = esmith::DomainsDB->open_ro  || die "Couldn't open domains";
 | 
			
		||||
our $networks = esmith::NetworksDB->open_ro || die "Couldn't open networks";
 | 
			
		||||
our $db;
 | 
			
		||||
our $domains ;
 | 
			
		||||
our $networks;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    $db       = esmith::ConfigDB::UTF8->open_ro   || die "Couldn't open config db";
 | 
			
		||||
    my $title     = $c->l('rvw_FORM_TITLE');
 | 
			
		||||
    my $modul     = $c->render_to_string(inline => $c->l('rvw_DESCRIPTION'));
 | 
			
		||||
    my %rvw_datas = ();
 | 
			
		||||
@@ -102,6 +100,7 @@ sub gen2_email_addresses {
 | 
			
		||||
 | 
			
		||||
sub gen2_domains {
 | 
			
		||||
    my $c          = shift;
 | 
			
		||||
    $domains  = esmith::DomainsDB::UTF8->open_ro  || die "Couldn't open domains";
 | 
			
		||||
    my @virtual    = $domains->get_all_by_prop(type => 'domain');
 | 
			
		||||
    my $numvirtual = @virtual;
 | 
			
		||||
 | 
			
		||||
@@ -130,6 +129,7 @@ serving.	(mojo ver)
 | 
			
		||||
 | 
			
		||||
sub get2_local_networks {
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    $networks = esmith::NetworksDB::UTF8->open_ro || die "Couldn't open networks";
 | 
			
		||||
    my @nets        = $networks->get_all_by_prop('type' => 'network');
 | 
			
		||||
    my $numNetworks = @nets;
 | 
			
		||||
 | 
			
		||||
@@ -156,7 +156,7 @@ sub get_net_prop {
 | 
			
		||||
  my $fm = shift;
 | 
			
		||||
  my $item = shift;
 | 
			
		||||
  my $prop = shift;
 | 
			
		||||
 | 
			
		||||
  $networks = esmith::NetworksDB::UTF8->open_ro || die "Couldn't open networks";
 | 
			
		||||
  my $record = $networks->get($item);
 | 
			
		||||
  if ($record) {
 | 
			
		||||
    return $record->prop($prop);
 | 
			
		||||
@@ -170,7 +170,7 @@ sub get_net_prop {
 | 
			
		||||
 | 
			
		||||
sub get_local_networks {
 | 
			
		||||
    my $fm = shift;
 | 
			
		||||
 | 
			
		||||
    $networks = esmith::NetworksDB::UTF8->open_ro || die "Couldn't open networks";
 | 
			
		||||
    my @nets = $networks->get_all_by_prop('type' => 'network');
 | 
			
		||||
 | 
			
		||||
    my $numNetworks = @nets;
 | 
			
		||||
@@ -270,6 +270,7 @@ sub print2_dhcp_stanza {
 | 
			
		||||
sub get_value {
 | 
			
		||||
  my $fm = shift;
 | 
			
		||||
  my $item = shift;
 | 
			
		||||
  $db       = esmith::ConfigDB::UTF8->open_ro   || die "Couldn't open config db";
 | 
			
		||||
  my $record = $db->get($item);
 | 
			
		||||
  if ($record) {
 | 
			
		||||
    return $record->value();
 | 
			
		||||
@@ -286,7 +287,7 @@ sub get_prop {
 | 
			
		||||
				 #otherwise, we don't want to grab it
 | 
			
		||||
  my $item = shift;
 | 
			
		||||
  my $prop = shift;
 | 
			
		||||
 | 
			
		||||
  $db       = esmith::ConfigDB::UTF8->open_ro   || die "Couldn't open config db";
 | 
			
		||||
  my $record = $db->get($item);
 | 
			
		||||
  if ($record) {
 | 
			
		||||
    return $record->prop($prop);
 | 
			
		||||
@@ -300,6 +301,7 @@ sub get_prop {
 | 
			
		||||
sub get_public_ip_address
 | 
			
		||||
{
 | 
			
		||||
    my $self = shift;
 | 
			
		||||
    $db       = esmith::ConfigDB::UTF8->open_ro   || die "Couldn't open config db";
 | 
			
		||||
    my $sysconfig = $db->get('sysconfig');
 | 
			
		||||
    if ($sysconfig)
 | 
			
		||||
    {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
package SrvMngr::Controller::Roundcubepanel;
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System
 | 
			
		||||
# heading     : Network
 | 
			
		||||
# description : Webmail
 | 
			
		||||
# navigation  : 99999 9999
 | 
			
		||||
# navigation  : 6000 900
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# name   : roundcubepanel,    method : get,   url : /roundcubepanel,     ctlact : Roundcubepanel#main
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package  SrvMngr::Controller::Support;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Support
 | 
			
		||||
# description : Support and licensing
 | 
			
		||||
# navigation  : 0000 200
 | 
			
		||||
# navigation  : 0 400
 | 
			
		||||
# menu        : N
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
 
 | 
			
		||||
@@ -5,19 +5,18 @@ package SrvMngr::Controller::Swttheme;
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
#use SrvMngr qw(theme_list init_session);
 | 
			
		||||
our $db = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
    my $db = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
    my $from  = $c->param('From') || '/';
 | 
			
		||||
    my $theme = $c->param('Theme');
 | 
			
		||||
    $c->app->log->info(" swt theme '$from'  '$theme' ");
 | 
			
		||||
    my $oldTheme = $c->session->{CurrentTheme};
 | 
			
		||||
 | 
			
		||||
    if ($theme ne $oldTheme) {
 | 
			
		||||
 | 
			
		||||
        #	$c->app->renderer->paths([$c->app->home->rel_file('themes/default/templates')]);
 | 
			
		||||
        #	$c->app->static->paths([$c->app->home->rel_file('themes/default/public')]);
 | 
			
		||||
        #	if ( $theme ne 'default' ) {
 | 
			
		||||
@@ -31,7 +30,7 @@ sub main {
 | 
			
		||||
        system("/sbin/e-smith/signal-event smanager-theme-change") == 0
 | 
			
		||||
            or warn "$c->l('ERROR_UPDATING')";
 | 
			
		||||
    } ## end if ($theme ne $oldTheme)
 | 
			
		||||
## (not sure)     $c->flash( warning => $c->l('swt_LOGIN_AGAIN') );
 | 
			
		||||
    ## (not sure)     $c->flash( warning => $c->l('swt_LOGIN_AGAIN') );
 | 
			
		||||
    $from = '/initial'  if $from eq '/';
 | 
			
		||||
    $from = '/' . $from if ($from !~ m|^\/|);
 | 
			
		||||
    $c->redirect_to($from);
 | 
			
		||||
 
 | 
			
		||||
@@ -15,28 +15,20 @@ use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session
 | 
			
		||||
    validate_password email_simple);
 | 
			
		||||
 | 
			
		||||
#use esmith::FormMagick qw( validate_password );
 | 
			
		||||
#use CGI::FormMagick::Validator qw( call_fm_validation );
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
 | 
			
		||||
#use esmith::FormMagick;
 | 
			
		||||
#use esmith::cgi;
 | 
			
		||||
#use File::Basename;
 | 
			
		||||
#use Exporter;
 | 
			
		||||
#use Carp qw(verbose);
 | 
			
		||||
#use esmith::FormMagick::Panel::useraccounts;
 | 
			
		||||
#our $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
my ($cdb,$adb);
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    my %usr_datas = ();
 | 
			
		||||
    my $title     = $c->l('usr_FORM_TITLE');
 | 
			
		||||
@@ -55,8 +47,8 @@ sub do_display {
 | 
			
		||||
    my %usr_datas = ();
 | 
			
		||||
    my $title     = $c->l('usr_FORM_TITLE');
 | 
			
		||||
    my ($notif, $modul) = '';
 | 
			
		||||
	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    $usr_datas{'trt'} = $trt;
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
@@ -143,8 +135,8 @@ sub do_update {
 | 
			
		||||
    $usr_datas{trt} = $trt;
 | 
			
		||||
    my $title = $c->l('usr_FORM_TITLE');
 | 
			
		||||
    my ($res, $result) = '';
 | 
			
		||||
	$cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	$cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
	$adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
 | 
			
		||||
    if ($trt eq 'ADD') {
 | 
			
		||||
 | 
			
		||||
@@ -363,10 +355,10 @@ sub lock_account {
 | 
			
		||||
        $user = $1;
 | 
			
		||||
 | 
			
		||||
        if (system("/sbin/e-smith/signal-event", "user-lock", $user)) {
 | 
			
		||||
            $adb = esmith::AccountsDB->open();
 | 
			
		||||
            $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
            return $c->l("usr_ERR_OCCURRED_LOCKING");
 | 
			
		||||
        }
 | 
			
		||||
        $adb = esmith::AccountsDB->open();
 | 
			
		||||
        $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
        return 'OK';
 | 
			
		||||
    } else {
 | 
			
		||||
        return $c->l('NO_SUCH_USER', $user);
 | 
			
		||||
@@ -387,10 +379,10 @@ sub remove_account {
 | 
			
		||||
        $user = $1;
 | 
			
		||||
 | 
			
		||||
        if (system("/sbin/e-smith/signal-event", "user-delete", $user)) {
 | 
			
		||||
            $adb = esmith::AccountsDB->open();
 | 
			
		||||
            $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
            return $c->l("ERR_OCCURRED_DELETING");
 | 
			
		||||
        }
 | 
			
		||||
        $adb = esmith::AccountsDB->open();
 | 
			
		||||
        $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
        $adb->get($user)->delete;
 | 
			
		||||
        return 'OK';
 | 
			
		||||
    } else {
 | 
			
		||||
@@ -406,7 +398,7 @@ sub reset_password {
 | 
			
		||||
        return $c->l('usr_TAINTED_USER');
 | 
			
		||||
    }
 | 
			
		||||
    $user = $1;
 | 
			
		||||
	my $adb = esmith::AccountsDB->open || die "Couldn't open accounts db";
 | 
			
		||||
	my $adb = esmith::AccountsDB::UTF8->open || die "Couldn't open accounts db";
 | 
			
		||||
    my $acct = $adb->get($user);
 | 
			
		||||
 | 
			
		||||
    if ($acct->prop('type') eq "user") {
 | 
			
		||||
@@ -415,10 +407,10 @@ sub reset_password {
 | 
			
		||||
        undef $adb;
 | 
			
		||||
 | 
			
		||||
        if (system("/sbin/e-smith/signal-event", "password-modify", $user)) {
 | 
			
		||||
            $adb = esmith::AccountsDB->open();
 | 
			
		||||
            $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
            return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD");
 | 
			
		||||
        }
 | 
			
		||||
        $adb = esmith::AccountsDB->open();
 | 
			
		||||
        $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
        return 'OK';
 | 
			
		||||
    } else {
 | 
			
		||||
        return $c->l('NO_SUCH_USER', $user);
 | 
			
		||||
@@ -671,10 +663,10 @@ sub modify_user {
 | 
			
		||||
        undef $adb;
 | 
			
		||||
 | 
			
		||||
        unless (system("/sbin/e-smith/signal-event", "user-modify", $acctName) == 0) {
 | 
			
		||||
            $adb = esmith::AccountsDB->open();
 | 
			
		||||
            $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
            return $c->l('usr_CANNOT_MODIFY_USER');
 | 
			
		||||
        }
 | 
			
		||||
        $adb = esmith::AccountsDB->open();
 | 
			
		||||
        $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
    } ## end if ($acctType eq "user")
 | 
			
		||||
    return 'OK';
 | 
			
		||||
} ## end sub modify_user
 | 
			
		||||
@@ -707,10 +699,10 @@ sub create_user {
 | 
			
		||||
    $acctName = $1;
 | 
			
		||||
 | 
			
		||||
    if (system("/sbin/e-smith/signal-event", "user-create", $acctName)) {
 | 
			
		||||
        $adb = esmith::AccountsDB->open();
 | 
			
		||||
        $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
        return $c->l("usr_ERR_OCCURRED_CREATING");
 | 
			
		||||
    }
 | 
			
		||||
    $adb = esmith::AccountsDB->open();
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
    $c->set_groups();
 | 
			
		||||
    return 'OK';
 | 
			
		||||
} ## end sub create_user
 | 
			
		||||
@@ -735,7 +727,7 @@ sub modify_admin {
 | 
			
		||||
    $acct->merge_props(%newProperties);
 | 
			
		||||
    undef $adb;
 | 
			
		||||
    my $status = system("/sbin/e-smith/signal-event", "user-modify-admin", 'admin');
 | 
			
		||||
    $adb = esmith::AccountsDB->open();
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
 | 
			
		||||
    if ($status == 0) {
 | 
			
		||||
        return 'OK';
 | 
			
		||||
@@ -759,8 +751,7 @@ sub system_validate_password {
 | 
			
		||||
sub system_check_password {
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
    my $pass1 = shift;
 | 
			
		||||
    use esmith::ConfigDB;
 | 
			
		||||
    my $conf = esmith::ConfigDB->open();
 | 
			
		||||
    my $conf = esmith::ConfigDB::UTF8->open();
 | 
			
		||||
    my ($check_type, $rec);
 | 
			
		||||
 | 
			
		||||
    if ($conf) {
 | 
			
		||||
 
 | 
			
		||||
@@ -12,12 +12,11 @@ use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw( theme_list init_session validate_password );
 | 
			
		||||
#our $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
@@ -161,7 +160,7 @@ sub reset_password {
 | 
			
		||||
    my $ret;
 | 
			
		||||
    return $c->l('usr_TAINTED_USER') unless (($user) = ($user =~ /^(\w[\-\w_\.]*)$/));
 | 
			
		||||
    $user = $1;
 | 
			
		||||
    my $adb  = esmith::AccountsDB->open();
 | 
			
		||||
    my $adb  = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
    my $acct = $adb->get($user);
 | 
			
		||||
    return $c->l('NO_SUCH_USER', $user) unless ($acct->prop('type') eq 'user');
 | 
			
		||||
    $ret = esmith::util::setUserPasswordRequirePrevious($user, $oldpassword, $password) if $trt ne 'RESET';
 | 
			
		||||
@@ -171,10 +170,10 @@ sub reset_password {
 | 
			
		||||
    undef $adb;
 | 
			
		||||
 | 
			
		||||
    if (system("/sbin/e-smith/signal-event", "password-modify", $user)) {
 | 
			
		||||
        $adb = esmith::AccountsDB->open();
 | 
			
		||||
        $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
        return $c->l("usr_ERR_OCCURRED_MODIFYING_PASSWORD");
 | 
			
		||||
    }
 | 
			
		||||
    $adb = esmith::AccountsDB->open();
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open();
 | 
			
		||||
    return 'OK';
 | 
			
		||||
} ## end sub reset_password
 | 
			
		||||
 | 
			
		||||
@@ -194,7 +193,7 @@ sub check_password {
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
    my $password = shift;
 | 
			
		||||
    my $strength;
 | 
			
		||||
   	my $cdb = esmith::ConfigDB->open_ro || die "Couldn't open configuration db";
 | 
			
		||||
    my $cdb = esmith::ConfigDB::UTF8->open_ro || die "Couldn't open configuration db";
 | 
			
		||||
    my $rec = $cdb->get('passwordstrength');
 | 
			
		||||
    $strength = ($rec ? ($rec->prop('Users') || 'none') : 'none');
 | 
			
		||||
    return validate_password($c, $strength, $password);
 | 
			
		||||
 
 | 
			
		||||
@@ -15,14 +15,15 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
use HTML::Entities;
 | 
			
		||||
use SrvMngr qw(gen_locale_date_string);
 | 
			
		||||
use File::Temp qw(tempfile);
 | 
			
		||||
use constant TRUE  => 1;
 | 
			
		||||
use constant FALSE => 0;
 | 
			
		||||
our $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
 | 
			
		||||
our $cdb;
 | 
			
		||||
our @logfiles = ();    # with array
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
@@ -31,7 +32,9 @@ sub main {
 | 
			
		||||
    my %log_datas = ();
 | 
			
		||||
    my $title     = $c->l('log_FORM_TITLE');
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    $log_datas{default_op} = ($cdb->get('viewlogfiles')->prop('DefaultOperation')) || 'view';
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
    my $viewlog = $cdb->get('viewlogfiles');
 | 
			
		||||
    $log_datas{default_op} = ($viewlog ? $viewlog->prop('DefaultOperation') : undef) || 'view';
 | 
			
		||||
    $c->stash(title => $title, notif => $notif, log_datas => \%log_datas);
 | 
			
		||||
    $c->render(template => 'viewlogfiles');
 | 
			
		||||
} ## end sub main
 | 
			
		||||
@@ -230,6 +233,7 @@ sub showlogFile {
 | 
			
		||||
sub download_logFile {
 | 
			
		||||
    my ($c, %log_datas) = @_;
 | 
			
		||||
    my $fullpath = "/var/log/$log_datas{filename}";
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
    # Save this information for later.
 | 
			
		||||
    $cdb->get('viewlogfiles')->merge_props('DefaultOperation', $log_datas{operation});
 | 
			
		||||
 
 | 
			
		||||
@@ -13,11 +13,13 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session);
 | 
			
		||||
our $db = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
our $db ;
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    $db = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
    my %wkg_datas = ();
 | 
			
		||||
    my $title     = $c->l('wkg_FORM_TITLE');
 | 
			
		||||
    my $modul     = '';
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Yum;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : Software installer
 | 
			
		||||
# navigation  : 4000 300
 | 
			
		||||
# navigation  : 4000 500
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
@@ -13,28 +13,30 @@ use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
use Locale::gettext;
 | 
			
		||||
use SrvMngr::I18N;
 | 
			
		||||
use SrvMngr qw(theme_list init_session ip_number_or_blank);
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
# dnf_* should remain ASCII; yum_repositories do not need to be UTF-8
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
use File::Basename;
 | 
			
		||||
our $cdb = esmith::ConfigDB->open || die "Couldn't open config db";
 | 
			
		||||
our $cdb;
 | 
			
		||||
my $dnf_status_file = '/var/cache/dnf/dnf.status';
 | 
			
		||||
 | 
			
		||||
#use File::stat;
 | 
			
		||||
our %dbs;
 | 
			
		||||
 | 
			
		||||
for (qw(available installed updates)) {
 | 
			
		||||
    $dbs{$_} = esmith::ConfigDB->open_ro("dnf_$_")
 | 
			
		||||
    $dbs{$_} = esmith::ConfigDB::UTF8->open_ro("dnf_$_")
 | 
			
		||||
        or die "Couldn't open dnf_$_ DB\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
for (qw(repositories)) {
 | 
			
		||||
    $dbs{$_} = esmith::ConfigDB->open("yum_$_")
 | 
			
		||||
    $dbs{$_} = esmith::ConfigDB::UTF8->open("yum_$_")
 | 
			
		||||
        or die "Couldn't open yum_$_ DB\n";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
    $c->app->log->info($c->log_req);
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
    my %yum_datas = ();
 | 
			
		||||
    my $title     = $c->l('yum_FORM_TITLE');
 | 
			
		||||
    my $dest      = 'yum';
 | 
			
		||||
@@ -60,6 +62,7 @@ sub do_display {
 | 
			
		||||
    my $c         = shift;
 | 
			
		||||
    my $rt        = $c->current_route;
 | 
			
		||||
    my $trt       = ($c->param('trt') || 'STAT');
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open || die "Couldn't open config db";
 | 
			
		||||
    my %yum_datas = ();
 | 
			
		||||
    my $title     = $c->l('yum_FORM_TITLE');
 | 
			
		||||
    my ($notif, $dest) = '';
 | 
			
		||||
 
 | 
			
		||||
@@ -151,4 +151,5 @@ SMALL => 'Small',
 | 
			
		||||
MEDIUM => 'Medium',
 | 
			
		||||
LARGE => 'Large',
 | 
			
		||||
FIELD_INVALID_CHARS => 'A field you entered contains invalid characters.',
 | 
			
		||||
 | 
			
		||||
'REPORT_GENERATED' => "Report generated",
 | 
			
		||||
'END_OF_REPORT' => 'End of Report',
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,15 @@ reports are available.</P>
 | 
			
		||||
these reports</P>',
 | 
			
		||||
'qma_REPORT_TYPE' => 'Choose a report type',
 | 
			
		||||
'qma_GENERATE_REPORT' => 'Generate report',
 | 
			
		||||
'qma_INVALID_REPORT_TYPE' => 'Invalid report type: ',
 | 
			
		||||
'qma_REPORT_GENERATED' => 'Report generated: ',
 | 
			
		||||
'qma_END_OF_REPORT' => 'End of Report',
 | 
			
		||||
'Mail log file analysis' => 'Mail log file analysis',
 | 
			
		||||
 | 
			
		||||
'qma_Daily_Summary_Report_yesterday' => 'Summary report for yesterday',
 | 
			
		||||
'qma_Daily_Summary_Report_today' => 'Summary report for today up to now',
 | 
			
		||||
'qma_Daily_Summary_Report_all' => 'Summary report for all time up to now',
 | 
			
		||||
 | 
			
		||||
'qma_LIST_OUTGOING' => 'List outgoing messages and recipients',
 | 
			
		||||
'qma_SUMMARIZE_QUEUE' => 'Summarize status of mail queue',
 | 
			
		||||
'qma_SUCCESSFUL_DELIVERY_DELAY' => 'Successful delivery delay distribution',
 | 
			
		||||
@@ -20,9 +29,4 @@ these reports</P>',
 | 
			
		||||
'qma_SENDER_STATS' => 'Sender statistics',
 | 
			
		||||
'qma_SENDMAIL_STYLE' => 'Sendmail style log',
 | 
			
		||||
'qma_REASONS_SUCCESS' => 'Reasons for success',
 | 
			
		||||
'qma_SENDER_UIDS' => 'Sender uids',
 | 
			
		||||
'qma_INVALID_REPORT_TYPE' => 'Invalid report type: ',
 | 
			
		||||
'qma_REPORT_GENERATED' => 'Report generated: ',
 | 
			
		||||
'qma_END_OF_REPORT' => 'End of Report',
 | 
			
		||||
'Mail log file analysis' => 'Mail log file analysis',
 | 
			
		||||
 | 
			
		||||
'qma_SENDER_UIDS' => 'Sender uids',
 | 
			
		||||
@@ -4,19 +4,19 @@ use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use utf8;
 | 
			
		||||
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::AccountsDB;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
use esmith::util;
 | 
			
		||||
 | 
			
		||||
use Net::LDAP qw/LDAP_INVALID_CREDENTIALS/;
 | 
			
		||||
 | 
			
		||||
our ($cdb,$adb);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
sub init_data {
 | 
			
		||||
 | 
			
		||||
    my %datas = ();
 | 
			
		||||
 | 
			
		||||
    my $cdb = esmith::ConfigDB->open_ro() or die("can't open Config DB");
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open_ro() or die("can't open Config DB");
 | 
			
		||||
    my $sysconfig = $cdb->get("sysconfig");
 | 
			
		||||
 | 
			
		||||
    $datas{'lang'} = $sysconfig->prop('Language') || 'en_US';
 | 
			
		||||
@@ -42,7 +42,7 @@ sub init_data {
 | 
			
		||||
 | 
			
		||||
sub reconf_needed {
 | 
			
		||||
 | 
			
		||||
    my $cdb = esmith::ConfigDB->open_ro() or die("can't open Config DB");
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open_ro() or die("can't open Config DB");
 | 
			
		||||
    #my $unsafe = ($cdb->get('bootstrap-console') and $cdb->get('bootstrap-console')->prop('Run') eq 'yes') ||
 | 
			
		||||
    #     ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';
 | 
			
		||||
	my $unsafe = ($cdb->get('UnsavedChanges') and $cdb->get('UnsavedChanges')->value eq 'yes') || '0';   
 | 
			
		||||
@@ -55,7 +55,7 @@ sub check_credentials {
 | 
			
		||||
    my ($c, $username, $password) = @_;
 | 
			
		||||
    return unless $username || $password;
 | 
			
		||||
 | 
			
		||||
    my $cdb = esmith::ConfigDB->open_ro() or die("can't open Configuration DB");
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open_ro() or die("can't open Configuration DB");
 | 
			
		||||
    my $l = $cdb->get('ldap');
 | 
			
		||||
    my $status = $l->prop('status') || "disabled";
 | 
			
		||||
    unless ($status eq "enabled" ) {
 | 
			
		||||
@@ -88,13 +88,13 @@ sub check_adminalias {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
 | 
			
		||||
    my $alias;
 | 
			
		||||
    my $cdb = esmith::ConfigDB->open_ro() or die("can't open Configuration DB");
 | 
			
		||||
    $cdb = esmith::ConfigDB::UTF8->open_ro() or die("can't open Configuration DB");
 | 
			
		||||
    if (defined $cdb->get('AdminAlias')) {
 | 
			
		||||
	$alias = $cdb->get('AdminAlias')->value;
 | 
			
		||||
    }
 | 
			
		||||
    return undef unless $alias;
 | 
			
		||||
 | 
			
		||||
    my $adb = esmith::AccountsDB->open_ro() or die("can't open Accounts DB");
 | 
			
		||||
    $adb = esmith::AccountsDB::UTF8->open_ro() or die("can't open Accounts DB");
 | 
			
		||||
    my $arec = $adb->get( $alias );
 | 
			
		||||
    return undef unless $arec;
 | 
			
		||||
 | 
			
		||||
@@ -105,4 +105,4 @@ sub check_adminalias {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										100
									
								
								root/usr/share/smanager/lib/SrvMngr_Auth.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								root/usr/share/smanager/lib/SrvMngr_Auth.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
			
		||||
# Optimized SrvMngr_Auth module using stash caching and Exporter
 | 
			
		||||
 | 
			
		||||
package SrvMngr_Auth;
 | 
			
		||||
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Exporter qw(import); # Import the Exporter module
 | 
			
		||||
use esmith::AccountsDB::UTF8;
 | 
			
		||||
 | 
			
		||||
# Define functions to be exported upon request
 | 
			
		||||
our @EXPORT_OK = qw(check_admin_access load_user_auth_info has_panel_access get_panel_from_path);
 | 
			
		||||
 | 
			
		||||
# Helper function to extract panel name from path
 | 
			
		||||
sub get_panel_from_path {
 | 
			
		||||
    my ($path) = @_;
 | 
			
		||||
    
 | 
			
		||||
    if ($path =~ m{^/([^/]+)}) {
 | 
			
		||||
        return $1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return ''; # Return empty string if no panel found
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Load user authentication info and cache it in the stash
 | 
			
		||||
sub load_user_auth_info {
 | 
			
		||||
    my ($c) = @_;
 | 
			
		||||
    
 | 
			
		||||
    # Check if auth info is already cached in the stash
 | 
			
		||||
    return if exists $c->stash->{auth_info};
 | 
			
		||||
    
 | 
			
		||||
    my %auth_info = (
 | 
			
		||||
        username => '', # Initialize username
 | 
			
		||||
        is_admin => 0,
 | 
			
		||||
        allowed_panels => [],
 | 
			
		||||
    );
 | 
			
		||||
    
 | 
			
		||||
    # Get username from session
 | 
			
		||||
    $auth_info{username} = $c->session->{username} || ''; # Provide default empty string
 | 
			
		||||
    
 | 
			
		||||
    # Check if user is admin
 | 
			
		||||
    $auth_info{is_admin} = $c->is_admin || 0;
 | 
			
		||||
    
 | 
			
		||||
    # If not admin, get allowed panels
 | 
			
		||||
    if (!$auth_info{is_admin} && $auth_info{username}) {
 | 
			
		||||
        my $accountsdb = esmith::AccountsDB::UTF8->open_ro();
 | 
			
		||||
        if ($accountsdb) {
 | 
			
		||||
            my $user_rec = $accountsdb->get($auth_info{username});
 | 
			
		||||
            # Check if the property exists before trying to get its value
 | 
			
		||||
            if (defined $user_rec && $user_rec->prop('AdminPanels')) {
 | 
			
		||||
                # Get comma-separated list of allowed admin panels
 | 
			
		||||
                my $admin_panels = $user_rec->prop('AdminPanels');
 | 
			
		||||
                $auth_info{allowed_panels} = [split(/,/, $admin_panels)];
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    # Store the calculated info in the stash
 | 
			
		||||
    $c->stash(auth_info => \%auth_info);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Check if a user has access to a specific panel (uses cached info)
 | 
			
		||||
sub has_panel_access {
 | 
			
		||||
    my ($c, $panel) = @_;
 | 
			
		||||
    
 | 
			
		||||
    # Ensure auth info is loaded
 | 
			
		||||
    load_user_auth_info($c);
 | 
			
		||||
    
 | 
			
		||||
    my $auth_info = $c->stash->{auth_info};
 | 
			
		||||
    
 | 
			
		||||
    # Check if requested panel is in allowed panels
 | 
			
		||||
    foreach my $allowed_panel (@{$auth_info->{allowed_panels}}) {
 | 
			
		||||
		return 1 if lc($panel) eq lc($allowed_panel) 
 | 
			
		||||
         || lc(substr($panel, 0, length($allowed_panel))) eq lc($allowed_panel);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Main function to check admin access (uses cached info)
 | 
			
		||||
sub check_admin_access {
 | 
			
		||||
    my ($c) = @_;
 | 
			
		||||
    
 | 
			
		||||
    # Ensure auth info is loaded
 | 
			
		||||
    load_user_auth_info($c);
 | 
			
		||||
    
 | 
			
		||||
    my $auth_info = $c->stash->{auth_info};
 | 
			
		||||
    
 | 
			
		||||
    # First check if user is admin
 | 
			
		||||
    return 1 if $auth_info->{is_admin};
 | 
			
		||||
    
 | 
			
		||||
    # If not admin, check if they have access to the specific panel
 | 
			
		||||
    my $current_path = $c->req->url->path;
 | 
			
		||||
    my $requested_panel = $current_path;  
 | 
			
		||||
    return 0 unless $requested_panel;
 | 
			
		||||
    
 | 
			
		||||
    # Check if user has access to this panel using the cached info
 | 
			
		||||
    return has_panel_access($c, $requested_panel);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
1; # Return true value for module loading
 | 
			
		||||
@@ -5,11 +5,11 @@
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
 | 
			
		||||
use constant WEBFUNCTIONS => '/usr/share/smanager/lib/SrvMngr/Controller/';
 | 
			
		||||
 | 
			
		||||
my $rtdb = esmith::ConfigDB->open('routes') or
 | 
			
		||||
my $rtdb = esmith::ConfigDB::UTF8->open('routes') or
 | 
			
		||||
        die "Couldn't access Routes database\n";
 | 
			
		||||
 | 
			
		||||
my @routes = $rtdb->get_all_by_prop( type => 'route' );
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
 | 
			
		||||
use esmith::ConfigDB;
 | 
			
		||||
use esmith::ConfigDB::UTF8;
 | 
			
		||||
 | 
			
		||||
sub gen_pwd {
 | 
			
		||||
    use MIME::Base64 qw(encode_base64);
 | 
			
		||||
@@ -29,7 +29,7 @@ sub gen_pwd {
 | 
			
		||||
    return $p;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
my $cdb = esmith::ConfigDB->open() || die "Couldn't open config db";
 | 
			
		||||
my $cdb = esmith::ConfigDB::UTF8->open() || die "Couldn't open config db";
 | 
			
		||||
 | 
			
		||||
my $pwds = $cdb->get_prop('smanager','Secrets');
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,10 @@ BEGIN
 | 
			
		||||
    $ENV{'HOME'} = '/usr/share/smanager';
 | 
			
		||||
    delete $ENV{'ENV'};
 | 
			
		||||
    esmith::util::setRealToEffective();
 | 
			
		||||
    #to help debug UTF8, see perlrun and perlvar -CSAD or -CLSD
 | 
			
		||||
    #print '$ENV{PERL_UNICODE}='.$ENV{'PERL_UNICODE'}."\n" if $ENV{'PERL_UNICODE'};
 | 
			
		||||
    #print '${^UNICODE}='.${^UNICODE}.' ; ${^UTF8LOCALE}='.${^UTF8LOCALE} ."\n";
 | 
			
		||||
    #print '${^OPEN}'.${^OPEN}."\n" if ${^OPEN} ;
 | 
			
		||||
} 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,8 @@ use Test::Mojo;
 | 
			
		||||
use FindBin;
 | 
			
		||||
use lib "$FindBin::Bin/../lib";
 | 
			
		||||
 | 
			
		||||
eval "use esmith::ConfigDB";
 | 
			
		||||
plan skip_all => 'esmith::ConfigDB (and others) required for testing 002_basic' if $@;
 | 
			
		||||
eval "use esmith::ConfigDB::UTF8";
 | 
			
		||||
plan skip_all => 'esmith::ConfigDB::UTF8 (and others) required for testing 002_basic' if $@;
 | 
			
		||||
 | 
			
		||||
plan tests => 3;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -6,8 +6,8 @@ use Test::Mojo;
 | 
			
		||||
use FindBin;
 | 
			
		||||
use lib "$FindBin::Bin/../lib";
 | 
			
		||||
 | 
			
		||||
eval "use esmith::ConfigDB";
 | 
			
		||||
plan skip_all => 'esmith::ConfigDB (and others) required for testing 004_panels' if $@;
 | 
			
		||||
eval "use esmith::ConfigDB::UTF8";
 | 
			
		||||
plan skip_all => 'esmith::ConfigDB::UTF8 (and others) required for testing 004_panels' if $@;
 | 
			
		||||
 | 
			
		||||
my $tests;
 | 
			
		||||
plan tests => $tests;
 | 
			
		||||
@@ -17,8 +17,8 @@ BEGIN { $tests += 2 * 3 };
 | 
			
		||||
my $t = Test::Mojo->new('SrvMngr');
 | 
			
		||||
$t->ua->max_redirects(1);
 | 
			
		||||
 | 
			
		||||
$t->get_ok('/')->status_is(200)->content_like(qr/SME Server 10/);
 | 
			
		||||
$t->get_ok('/manual')->status_is(200)->content_like(qr/SME Server 10/);
 | 
			
		||||
$t->get_ok('/')->status_is(200)->content_like(qr/SME Server 11/);
 | 
			
		||||
$t->get_ok('/manual')->status_is(200)->content_like(qr/SME Server 11/);
 | 
			
		||||
 | 
			
		||||
BEGIN { $tests += 5 * 2 };
 | 
			
		||||
my @panels = qw/ Initial Login Manual Support Request /;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										43
									
								
								root/usr/share/smanager/themes/default/public/css/module.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								root/usr/share/smanager/themes/default/public/css/module.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,43 @@
 | 
			
		||||
/* General styles for the module panel */
 | 
			
		||||
#module {
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    border: 1px solid #ccc;
 | 
			
		||||
    border-radius: 10px;
 | 
			
		||||
    background-color: #f9f9f9;
 | 
			
		||||
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Debug information styling */
 | 
			
		||||
#module p {
 | 
			
		||||
    font-family: monospace;
 | 
			
		||||
    color: #555;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#module pre {
 | 
			
		||||
    background-color: #eee;
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
    border-radius: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Error message styling */
 | 
			
		||||
.sme-error {
 | 
			
		||||
    color: #d9534f;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Title styling */
 | 
			
		||||
#module h1 {
 | 
			
		||||
    font-family: Arial, sans-serif;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    margin-bottom: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Content styling */
 | 
			
		||||
.module-content {
 | 
			
		||||
    font-family: Georgia, serif;
 | 
			
		||||
    font-size: 13px;
 | 
			
		||||
    line-height: 1.2;
 | 
			
		||||
    color: #555;
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,505 @@
 | 
			
		||||
 {
 | 
			
		||||
    margin-left: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.alert {
 | 
			
		||||
    color: red;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item {
 | 
			
		||||
    color: #00008b;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item-current:hover,   a.warn-current:hover {
 | 
			
		||||
    border-color: #888;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item-current:link,    a.warn-current:link,
 | 
			
		||||
a.item-current:visited, a.warn-current:visited, 
 | 
			
		||||
a.item-current:active,  a.warn-current:active,
 | 
			
		||||
a.item-current:hover,   a.warn-current:hover {
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    color: black;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    background: #fff;
 | 
			
		||||
    border-color: #888;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    padding-right: 10px;
 | 
			
		||||
    padding-left: 10px;
 | 
			
		||||
    padding-bottom: 2px;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item:active, a.item-current:active, 
 | 
			
		||||
a.warn:active, a.warn-current:active {
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    color: white;
 | 
			
		||||
    background: black;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    border-color: #000;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    padding-right: 10px;
 | 
			
		||||
    padding-left: 10px;
 | 
			
		||||
    padding-bottom: 2px;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item:hover, a.item-current:hover,
 | 
			
		||||
a.warn:hover, a.warn-current:hover {
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    color: black;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    background: #ccc;
 | 
			
		||||
    border-color: #888;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    padding-right: 10px;
 | 
			
		||||
    padding-left: 10px;
 | 
			
		||||
    padding-bottom: 2px;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item:link, a.item-current:link, 
 | 
			
		||||
a.warn:link, a.warn-current:link {
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    color: black;
 | 
			
		||||
    background: #e8f3e1;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    border-color: #e8f3e1;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    padding: 0 10px 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.item:visited, a.item-current:visited, 
 | 
			
		||||
a.warn:visited, a.warn-current:visited {
 | 
			
		||||
    display: block;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    color: black;
 | 
			
		||||
    background: #e8f3e1;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    border-color: #e8f3e1;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    padding-right: 10px;
 | 
			
		||||
    padding-left: 10px;
 | 
			
		||||
    padding-bottom: 2px;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.section-title {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    color: #6CA345;
 | 
			
		||||
    padding-left: 5px;
 | 
			
		||||
    padding-right: 5px;
 | 
			
		||||
    line-height: 18px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.sl {
 | 
			
		||||
    color: green;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.update {
 | 
			
		||||
    color: red;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background: #98d36e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a.warn:link,    a.warn-current:link, 
 | 
			
		||||
a.warn:visited, a.warn-current:visited, 
 | 
			
		||||
a.warn:active,  a.warn-current:active,
 | 
			
		||||
a.warn:hover,   a.warn-current:hover {
 | 
			
		||||
    background-image: url("/server-common/warn.gif");
 | 
			
		||||
    background-repeat: no-repeat;
 | 
			
		||||
    background-position: 10px;
 | 
			
		||||
    padding-left: 25px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:active {
 | 
			
		||||
    color: #606060;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:hover {
 | 
			
		||||
    color: #F00;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:link {
 | 
			
		||||
    color: #006921;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
a:visited {
 | 
			
		||||
    color: #063;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body {
 | 
			
		||||
    background-color: #FFF;
 | 
			
		||||
    color: #000;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    border-width: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body, body.main {
 | 
			
		||||
    margin: 5px 20px 5px 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body, body.menu {
 | 
			
		||||
    margin: 0 0 0 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body.header {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background-color: #bee6a2;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body.main {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    color: #000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body.menu {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.error, div.sme-error, span.error, span.sme-error {
 | 
			
		||||
    color: red;
 | 
			
		||||
    background-color: #f9f9f9;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: red;
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
    border-radius: 10px;
 | 
			
		||||
    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
form {
 | 
			
		||||
    margin-top: 2px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h1, .h1 {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    font-size: 18px;
 | 
			
		||||
    margin-bottom: 4px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h2, .h2 {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
    margin-bottom: 3px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h3, .h3 {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
    margin-top: 12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
h4, .h4 {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-style: italic;
 | 
			
		||||
    color: #333;
 | 
			
		||||
    font-size: 12px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
    margin-top: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
hr.sectionbar {
 | 
			
		||||
    color: #8ebe43;
 | 
			
		||||
    background-color: #8ebe43;
 | 
			
		||||
    height: 1px;
 | 
			
		||||
    width: 80%;
 | 
			
		||||
    border: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
hr.sme-copyrightbar {
 | 
			
		||||
    color: #8ebe43;
 | 
			
		||||
    background-color: #8ebe43;
 | 
			
		||||
    height: 1px;
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    border: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action {
 | 
			
		||||
    margin-left: 0;
 | 
			
		||||
    background-color: #bee6a2;
 | 
			
		||||
    color: darkgreen;
 | 
			
		||||
    border-radius: 8px;
 | 
			
		||||
    border: 2px solid #4CAF50;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action2 {
 | 
			
		||||
    margin-left: 0;
 | 
			
		||||
    color: black;
 | 
			
		||||
    background-color: #d4d0c8;
 | 
			
		||||
    display: flex;
 | 
			
		||||
    justify-content: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action:active {
 | 
			
		||||
    background-color: #3e8e41;
 | 
			
		||||
    transform: translate(-2px,2px);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.action:hover {
 | 
			
		||||
    background-color: #3e8e41;
 | 
			
		||||
    color: white;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
input.field-with-error {
 | 
			
		||||
    background-color: #fd9e7e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
label.field-with-error {
 | 
			
		||||
    color: #dd7e5e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ol, ul, li {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    color: black;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
p {
 | 
			
		||||
    margin-top: 8px;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.data {
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    margin-left: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.data2 {
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.label {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    width: 30%;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
span.label2 {
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table, tr, td, div, p, form {
 | 
			
		||||
    color: #000;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table.sme-border {
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
    border: 2px solid #cccccc;
 | 
			
		||||
    empty-cells: show;
 | 
			
		||||
    margin: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table.sme-layout {
 | 
			
		||||
    border-collapse: collapse;
 | 
			
		||||
    margin-bottom: 2px;
 | 
			
		||||
    margin-top: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
table.sme-noborders {
 | 
			
		||||
    padding: 0;
 | 
			
		||||
    margin: 0 0 20px;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.darkgrey {
 | 
			
		||||
    background-color: #888;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.label {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    width: 30%;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.menu-cell {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    padding: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.section {
 | 
			
		||||
    padding-bottom: 2px;
 | 
			
		||||
    padding-top: 8px;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-border a, td.sme-border-right a, td.sme-border-center a {
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-border, td.sme-border-warning, td.sme-border-right, td.sme-border-center {
 | 
			
		||||
    border: 1px solid #cccccc;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
    color: #000;
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    padding: 3px 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-border-center {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-border-right {
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-border-warning {
 | 
			
		||||
    color: red;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* sme-layout* : Used for top-level layout */
 | 
			
		||||
 table.sme-layout {
 | 
			
		||||
     border-collapse: collapse;
 | 
			
		||||
     margin-bottom: 2px;
 | 
			
		||||
     margin-top: 2px;
 | 
			
		||||
}
 | 
			
		||||
 tr.sme-layout {
 | 
			
		||||
     border: 1px solid #dddddd;
 | 
			
		||||
}
 | 
			
		||||
 td.sme-layout {
 | 
			
		||||
     border: 1px solid #dddddd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-noborders-content {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    vertical-align: top;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-noborders-info, div.sme-noborders-info {
 | 
			
		||||
    text-align: left;
 | 
			
		||||
    vertical-align: top;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-noborders-label {
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    width: 33%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
td.sme-radiobutton {
 | 
			
		||||
    width: 30px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
th.sme-border {
 | 
			
		||||
    border: 1px;
 | 
			
		||||
    background-color: #bee6a2;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #000;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    vertical-align: bottom;
 | 
			
		||||
    padding: 3px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
th.sme-layout {
 | 
			
		||||
    border: 1px;
 | 
			
		||||
    background-color: #e8f3e1;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 9pt;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    color: #000;
 | 
			
		||||
    text-align: right;
 | 
			
		||||
    padding: 4px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
tr.sme-layout {
 | 
			
		||||
    border: 1px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ul {
 | 
			
		||||
    list-style-type: circle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.success, span.success {
 | 
			
		||||
     color: #006400;
 | 
			
		||||
     border-width: 1px;
 | 
			
		||||
     border-style: solid;
 | 
			
		||||
     border-color: #006400 ;
 | 
			
		||||
     padding: 10px;
 | 
			
		||||
     border-radius: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
div.roundcube #roundcube{
 | 
			
		||||
	width:100%;
 | 
			
		||||
	height:600px;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										283
									
								
								root/usr/share/smanager/themes/default/public/css/new_sme.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										283
									
								
								root/usr/share/smanager/themes/default/public/css/new_sme.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,283 @@
 | 
			
		||||
/* css/sme-password.css */
 | 
			
		||||
.input-container {
 | 
			
		||||
    position: relative;
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
}
 | 
			
		||||
.sme-password {
 | 
			
		||||
    padding-right: 5px; /* Ensure space for the toggle icon */
 | 
			
		||||
}
 | 
			
		||||
.toggle-password {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    right: 4px; /* Position it towards the right */
 | 
			
		||||
    top: 50%; /* Center vertically */
 | 
			
		||||
    transform: translateY(-50%); /* Adjust for exact centering */
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    width: 20px; /* Set the width of the icon */
 | 
			
		||||
    height: 20px; /* Set the height of the icon */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.module {
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    border: 1px ;
 | 
			
		||||
    border-radius: 10px;
 | 
			
		||||
    background-color: #f9f9f9;
 | 
			
		||||
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
 | 
			
		||||
    margin-left: 10px !important;
 | 
			
		||||
    margin-top: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sme-copyright {
 | 
			
		||||
    color: #777;
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.logo {
 | 
			
		||||
    height: 142%;
 | 
			
		||||
    width: auto;
 | 
			
		||||
    margin-left: -16px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.gradient-panel {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    height: 40px;
 | 
			
		||||
    background: linear-gradient(to right, white ,#c0e7a5 );
 | 
			
		||||
    display: flex;
 | 
			
		||||
    align-items: center;
 | 
			
		||||
    position: relative;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sme-error {
 | 
			
		||||
    color: #d9534f;
 | 
			
		||||
    display: block;
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: red;
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
    font-weight: bold;
 | 
			
		||||
    margin-bottom: 15px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.login-button {
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    left: 7%;
 | 
			
		||||
    transform: translateX(-50%);
 | 
			
		||||
    background-color: #4caf50b8;
 | 
			
		||||
    color: white !important;
 | 
			
		||||
    border: none;
 | 
			
		||||
    padding: 8px;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    display: inline-block;
 | 
			
		||||
    font-size: 14px;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
    margin-left: 77%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.sme-warning {
 | 
			
		||||
    color: orange;
 | 
			
		||||
    display: block;
 | 
			
		||||
    background-color: #fff;
 | 
			
		||||
    border-width: 1px;
 | 
			
		||||
    border-style: solid;
 | 
			
		||||
    border-color: orange;
 | 
			
		||||
    padding: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.infobar {
 | 
			
		||||
    font-family: Verdana, Tahoma, sans-serif;
 | 
			
		||||
    font-size: 11px;
 | 
			
		||||
    background-color: #98d36e;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.module-content {
 | 
			
		||||
    font-family: Georgia, Garamond, serif;
 | 
			
		||||
    font-size: 13px;
 | 
			
		||||
    line-height: 1.2;
 | 
			
		||||
    color: #555;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#help-button {
 | 
			
		||||
    text-decoration: none;
 | 
			
		||||
    font-size: 20px;
 | 
			
		||||
    padding: 8px;
 | 
			
		||||
    background-color: #98d36e;
 | 
			
		||||
    border-radius: 4px;
 | 
			
		||||
    color: #000;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
#module {
 | 
			
		||||
    padding: 20px;
 | 
			
		||||
    border: 1px;
 | 
			
		||||
    border-radius: 10px;
 | 
			
		||||
    background-color: #f9f9f9;
 | 
			
		||||
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
 | 
			
		||||
}
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#container {
 | 
			
		||||
    max-width: 100%;
 | 
			
		||||
    position: relative;
 | 
			
		||||
    margin: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#header2 {
 | 
			
		||||
    width:96%;
 | 
			
		||||
    margin-left: 1px;
 | 
			
		||||
    margin-top: 4px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#main {
 | 
			
		||||
    margin-left: 200px;
 | 
			
		||||
    padding: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#central {
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer {
 | 
			
		||||
    padding-left: 5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#header {
 | 
			
		||||
    width: 100%;
 | 
			
		||||
    margin: auto;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#navigation {
 | 
			
		||||
    width: 190px;
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    padding: 5px;
 | 
			
		||||
    background-color: #E8F3E1;
 | 
			
		||||
    overflow: auto;
 | 
			
		||||
    margin-top:20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#footer img {
 | 
			
		||||
     float: right;
 | 
			
		||||
     position: fixed;
 | 
			
		||||
     /*margin-left: 40%;*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.flag-style {
 | 
			
		||||
     position: absolute;
 | 
			
		||||
     transform: translateY(-50%);
 | 
			
		||||
     left: 95%;
 | 
			
		||||
    /*right: 20px;
 | 
			
		||||
    */
 | 
			
		||||
     width: 24px;
 | 
			
		||||
     height: 14px;
 | 
			
		||||
     display: inline-block;
 | 
			
		||||
     vertical-align: middle;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* flag container*/
 | 
			
		||||
#flag-container span {
 | 
			
		||||
	font-size: 24px;
 | 
			
		||||
    display: flex;                     /* Allows for easy centering */
 | 
			
		||||
    justify-content: center;           /* Center horizontally */
 | 
			
		||||
    align-items: center;               /* Center vertically */
 | 
			
		||||
    width: 100%;                       /* Full width of parent */
 | 
			
		||||
    height: 24px;                      /* Set a fixed height */
 | 
			
		||||
    border: 1px solid #ccc;            /* Light gray border */
 | 
			
		||||
    border-radius: 5px;                /* Rounded corners */
 | 
			
		||||
    cursor: default;                   /* Prevent text cursor */
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.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 */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 table.sme-border {
 | 
			
		||||
     border-collapse: collapse;
 | 
			
		||||
     border: 2px solid #cccccc;
 | 
			
		||||
     empty-cells: show;
 | 
			
		||||
     margin: 5px 5px 5px 2px;
 | 
			
		||||
}
 | 
			
		||||
 td.sme-border, td.sme-border-warning, td.sme-border-right, td.sme-border-center {
 | 
			
		||||
     border: 1px solid #cccccc;
 | 
			
		||||
     font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
     font-size: 10px;
 | 
			
		||||
     font-weight: normal;
 | 
			
		||||
     color: #000000;
 | 
			
		||||
     text-align: left;
 | 
			
		||||
     padding-left: 2px;
 | 
			
		||||
     padding-right: 2px;
 | 
			
		||||
     padding-top: 3px;
 | 
			
		||||
     padding-bottom: 3px;
 | 
			
		||||
}
 | 
			
		||||
 td.sme-border-warning {
 | 
			
		||||
     color: red;
 | 
			
		||||
}
 | 
			
		||||
 td.sme-border-right {
 | 
			
		||||
    text-align: right;
 | 
			
		||||
}
 | 
			
		||||
 td.sme-border-center {
 | 
			
		||||
    text-align: center;
 | 
			
		||||
}
 | 
			
		||||
 th.sme-border {
 | 
			
		||||
     border: 1px solid #cccccc;
 | 
			
		||||
     background-color: #bee6a2;
 | 
			
		||||
     font-family: Verdana, Arial, Helvetica, sans-serif;
 | 
			
		||||
     font-size: 10px;
 | 
			
		||||
     font-weight: bold;
 | 
			
		||||
     color: #000000;
 | 
			
		||||
     text-align: center;
 | 
			
		||||
     vertical-align: bottom;
 | 
			
		||||
     padding-left: 3px;
 | 
			
		||||
     padding-right: 3px;
 | 
			
		||||
     padding-top: 3px;
 | 
			
		||||
     padding-bottom: 3px;
 | 
			
		||||
    /*border-width: 1px;
 | 
			
		||||
     border-style: solid;
 | 
			
		||||
     border-color: #F2F0EE #75736E #75736E #F2F0EE ;
 | 
			
		||||
    */
 | 
			
		||||
}
 | 
			
		||||
 td.sme-border a, td.sme-border-right a, td.sme-border-center a {
 | 
			
		||||
     font-size: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
th.sme-layout {
 | 
			
		||||
border: 1px solid #8ebe43;
 | 
			
		||||
background-color: #bee6a2;
 | 
			
		||||
    }
 | 
			
		||||
table.sme-border {
 | 
			
		||||
border: 2px solid #dddddd;
 | 
			
		||||
    }
 | 
			
		||||
td.sme-border-warning,
 | 
			
		||||
td.sme-border-right,
 | 
			
		||||
td.sme-border-center {
 | 
			
		||||
border: 1px solid #dddddd;
 | 
			
		||||
    }
 | 
			
		||||
td.sme-border-right {text-align: right;}
 | 
			
		||||
td.sme-border-center {text-align: center;}
 | 
			
		||||
th.sme-border {
 | 
			
		||||
border: 1px solid #dddddd;
 | 
			
		||||
background-color: #e8f3e1;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
.no-visited-state {
 | 
			
		||||
     color: inherit;
 | 
			
		||||
    /* Or specify the desired color */
 | 
			
		||||
     text-decoration: none;
 | 
			
		||||
    /* Or any other style you want to reset */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.no-visited-state:visited {
 | 
			
		||||
     color: inherit;
 | 
			
		||||
    /* Or specify the desired color */
 | 
			
		||||
     text-decoration: none;
 | 
			
		||||
    /* Or any other style you want to reset */
 | 
			
		||||
}
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 12 KiB  | 
@@ -0,0 +1,25 @@
 | 
			
		||||
document.addEventListener('DOMContentLoaded', function() {
 | 
			
		||||
    const analysisType = document.getElementById('analysis_type');
 | 
			
		||||
    const messageIdGroup = document.getElementById('message_id_group');
 | 
			
		||||
    const emailAddressGroup = document.getElementById('email_address_group');
 | 
			
		||||
 | 
			
		||||
    // Initially hide both controls
 | 
			
		||||
    messageIdGroup.style.display = 'none';
 | 
			
		||||
    emailAddressGroup.style.display = 'none';
 | 
			
		||||
 | 
			
		||||
    analysisType.addEventListener('change', function() {
 | 
			
		||||
        // Hide both controls first
 | 
			
		||||
        messageIdGroup.style.display = 'none';
 | 
			
		||||
        emailAddressGroup.style.display = 'none';
 | 
			
		||||
 | 
			
		||||
        // Show the relevant control based on the selected option
 | 
			
		||||
        switch(this.value) {
 | 
			
		||||
            case 'trace_message':
 | 
			
		||||
                messageIdGroup.style.display = 'block';
 | 
			
		||||
                break;
 | 
			
		||||
            case 'user_activity':
 | 
			
		||||
                emailAddressGroup.style.display = 'block';
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
    });
 | 
			
		||||
});
 | 
			
		||||
@@ -74,10 +74,8 @@
 | 
			
		||||
	</p><br>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -30,10 +30,8 @@
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_RESTORE_FROM_TAPE'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -44,12 +44,10 @@
 | 
			
		||||
	</span></p>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('NEXT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -148,9 +148,7 @@
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{function}
 | 
			
		||||
	%= hidden_field 'VFSType' => $bac_datas->{vfstype}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_UPDATE_CONF'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -38,9 +38,7 @@
 | 
			
		||||
	</span><br><br>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_RESTORE_FROM_WORKSTN'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -29,9 +29,7 @@
 | 
			
		||||
	%=l 'bac_YOU_MUST_REBOOT'
 | 
			
		||||
	</p>
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_REBOOT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -39,12 +39,10 @@
 | 
			
		||||
	</span><br>
 | 
			
		||||
	<br>
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -41,9 +41,7 @@
 | 
			
		||||
	%= hidden_field 'Backupset' => $bac_datas->{'backupset'}
 | 
			
		||||
	%= hidden_field 'Filterexp' => $bac_datas->{'filterexp'}
 | 
			
		||||
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -24,9 +24,7 @@
 | 
			
		||||
 | 
			
		||||
    %= form_for '/backupd' => (method => 'POST') => begin
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('NEXT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -44,10 +44,8 @@
 | 
			
		||||
 | 
			
		||||
	<br><br>
 | 
			
		||||
	%= hidden_field 'Function' => $bac_datas->{'function'} . '1'
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('bac_VERIFY'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -28,10 +28,8 @@
 | 
			
		||||
 | 
			
		||||
    %= hidden_field 'Function' => $bac_datas->{'function'}
 | 
			
		||||
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
    %= submit_button $c->l('NEXT'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
<%
 | 
			
		||||
 | 
			
		||||
    my $backups = esmith::BackupHistoryDB->open;
 | 
			
		||||
    my $backups = esmith::BackupHistoryDB->open; # no UTF8
 | 
			
		||||
    my $now = time();
 | 
			
		||||
    my $backup_rec = $backups->new_record($now, {
 | 
			
		||||
	type => 'backup_record', BackupType => 'desktop',
 | 
			
		||||
@@ -64,4 +64,4 @@
 | 
			
		||||
    $backup_rec->set_prop('Result', "0");
 | 
			
		||||
 | 
			
		||||
%>
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -70,12 +70,10 @@
 | 
			
		||||
	</span></p>
 | 
			
		||||
 | 
			
		||||
	<br>
 | 
			
		||||
    <div class='center'>
 | 
			
		||||
	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
 	%= submit_button $c->l('PERFORM'), class => 'action'
 | 
			
		||||
 
 | 
			
		||||
    % end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -33,7 +33,7 @@
 | 
			
		||||
	%= select_field 'EmailUnknownUser' => $c->get_emailunknownuser_opt(), class => 'input'
 | 
			
		||||
	</span></p>
 | 
			
		||||
 | 
			
		||||
	<hr class='menubar' />
 | 
			
		||||
	<!--<hr class='menubar' />-->
 | 
			
		||||
	<h2>
 | 
			
		||||
	%=l 'mai_TITLE_DELEGATE'
 | 
			
		||||
	</h2>
 | 
			
		||||
@@ -47,7 +47,7 @@
 | 
			
		||||
	%= text_field 'DelegateMailServer', class => 'input'
 | 
			
		||||
	</span></p>
 | 
			
		||||
 | 
			
		||||
	<hr class='sectionbar' />
 | 
			
		||||
	<!--<hr class='sectionbar' />-->
 | 
			
		||||
	<h2>
 | 
			
		||||
	%=l 'mai_TITLE_SMARTHOST'
 | 
			
		||||
	</h2>
 | 
			
		||||
@@ -89,4 +89,4 @@
 | 
			
		||||
    % end    
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
%end
 | 
			
		||||
%end
 | 
			
		||||
@@ -92,7 +92,7 @@
 | 
			
		||||
	%= select_field 'uSMTPAuth' => $c->get_smtp_ssl_auth_opt(), class => 'input'
 | 
			
		||||
	</span></p>
 | 
			
		||||
 | 
			
		||||
	<hr class="sectionbar" />
 | 
			
		||||
	<!--<hr class="sectionbar" />-->
 | 
			
		||||
	<h2>
 | 
			
		||||
	%=l 'mai_TITLE_SECONDARY'
 | 
			
		||||
	</h2>
 | 
			
		||||
 
 | 
			
		||||
@@ -47,9 +47,10 @@
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'trt' => 'ACC'
 | 
			
		||||
    % end    
 | 
			
		||||
    % end   
 | 
			
		||||
    <br> 
 | 
			
		||||
 | 
			
		||||
        <hr class="sectionbar" />
 | 
			
		||||
    <!--<hr class="sectionbar" />-->
 | 
			
		||||
    
 | 
			
		||||
    %= form_for 'emailsettings' => (method => 'POST') => begin
 | 
			
		||||
	<p><span class=label>
 | 
			
		||||
@@ -76,9 +77,10 @@
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'trt' => 'FIL'
 | 
			
		||||
    % end    
 | 
			
		||||
    % end  
 | 
			
		||||
    <br>  
 | 
			
		||||
 | 
			
		||||
        <hr class="sectionbar" />
 | 
			
		||||
    <!--<hr class="sectionbar" />-->
 | 
			
		||||
 | 
			
		||||
    %= form_for 'emailsettings' => (method => 'POST') => begin
 | 
			
		||||
	<p><span class=label>
 | 
			
		||||
@@ -118,8 +120,9 @@
 | 
			
		||||
 | 
			
		||||
	%= hidden_field 'trt' => 'REC'
 | 
			
		||||
    % end    
 | 
			
		||||
    <br>
 | 
			
		||||
 | 
			
		||||
        <hr class="sectionbar" />
 | 
			
		||||
    <!--<hr class="sectionbar" />-->
 | 
			
		||||
 | 
			
		||||
    %= form_for 'emailsettings' => (method => 'POST') => begin
 | 
			
		||||
	<p><span class=label>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id="central" class="sme-error">
 | 
			
		||||
<div id="central" class="sme-error module">
 | 
			
		||||
    <p><br>dev<br> Oups !!! 
 | 
			
		||||
        The page you were requesting
 | 
			
		||||
        "<%= $self->req->url->path || '/' %>"
 | 
			
		||||
@@ -14,4 +14,4 @@
 | 
			
		||||
    </p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -8,7 +8,7 @@
 | 
			
		||||
	</p>
 | 
			
		||||
    % }
 | 
			
		||||
 | 
			
		||||
<div id='central' class='central initial-panel'>
 | 
			
		||||
<div id='central' class='central initial-panel module'>
 | 
			
		||||
 | 
			
		||||
    % if ( stash 'error' ) {
 | 
			
		||||
    	<br><div class=sme-error>
 | 
			
		||||
 
 | 
			
		||||
@@ -7,11 +7,18 @@
 | 
			
		||||
<title><%= $title %></title>
 | 
			
		||||
    <link rel="made" href="mailto:bugs%40koozali.org">
 | 
			
		||||
    <meta name="copyright" content="(head.tmpl)Copyright 2003-2004 Mitel Corporation">
 | 
			
		||||
    %= stylesheet '/css/sme_core.css'
 | 
			
		||||
    %= stylesheet '/css/sme_main.css'
 | 
			
		||||
    %= stylesheet '/css/sme_menu.css'
 | 
			
		||||
    %= stylesheet '/css/styles.css'
 | 
			
		||||
    %= stylesheet '/css/sme-password.css'
 | 
			
		||||
 | 
			
		||||
    %= stylesheet '/css/new_sme.css'
 | 
			
		||||
    %= stylesheet '/css/new-sme-main.css'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    %# Replaced by consolidated (and rationlised) CSS files as above March 2025
 | 
			
		||||
    %#= stylesheet '/css/sme_core.css'
 | 
			
		||||
    %#= stylesheet '/css/sme_main.css'
 | 
			
		||||
    %#= stylesheet '/css/sme_menu.css'
 | 
			
		||||
    %#= stylesheet '/css/styles.css'
 | 
			
		||||
    %#= stylesheet '/css/sme-password.css'
 | 
			
		||||
 | 
			
		||||
    %= content_for 'head_contrib'
 | 
			
		||||
    % if (config 'hasJquery') {
 | 
			
		||||
	%= include 'partials/_js_imports'
 | 
			
		||||
@@ -70,7 +77,7 @@
 | 
			
		||||
	    %= content 'js_toggleMenu'
 | 
			
		||||
	% }
 | 
			
		||||
 | 
			
		||||
	<div id="navigation" class="col-md-3">
 | 
			
		||||
	<div id="navigation" class="col-md-3 module">
 | 
			
		||||
	    %= include 'partials/_nav_menu'
 | 
			
		||||
%	if ( $c->is_logged_in ) {
 | 
			
		||||
	    %= include 'partials/_user_menu'
 | 
			
		||||
@@ -84,17 +91,17 @@
 | 
			
		||||
	    %= include 'partials/_info'
 | 
			
		||||
 | 
			
		||||
	    % if (flash 'success') {
 | 
			
		||||
		<br><div class=success>
 | 
			
		||||
		<br><div class="success module">
 | 
			
		||||
		%= $c->render_to_string(inline => flash 'success') 
 | 
			
		||||
		</div>
 | 
			
		||||
	    % }
 | 
			
		||||
	    % if ( flash 'warning' ) {
 | 
			
		||||
		<br><div class=sme-warning>
 | 
			
		||||
		<br><div class="sme-warning  module">
 | 
			
		||||
		%= $c->render_to_string(inline => flash 'warning') 
 | 
			
		||||
		</div>
 | 
			
		||||
	    %}
 | 
			
		||||
	    % if ( flash 'error' ) {
 | 
			
		||||
		<br><div class=sme-error>
 | 
			
		||||
		<br><div class="sme-error module">
 | 
			
		||||
		%= $c->render_to_string(inline => flash 'error') 
 | 
			
		||||
		</div>
 | 
			
		||||
	    %}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,20 +1,27 @@
 | 
			
		||||
% layout 'default', title => "Sme server 2 - module";
 | 
			
		||||
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
%= stylesheet '/css/module.css'
 | 
			
		||||
<div id='module' class='module module-panel'>
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	</p>
 | 
			
		||||
        <p>
 | 
			
		||||
            <strong>Debug Info:</strong>
 | 
			
		||||
            <pre><%= dumper $c->current_route %></pre>
 | 
			
		||||
        </p>
 | 
			
		||||
    % }
 | 
			
		||||
    % if ( stash 'error' ) {
 | 
			
		||||
    	<br><div class=sme-error>
 | 
			
		||||
    	%= $c->render_to_string(inline => stash 'error') 
 | 
			
		||||
	</div>
 | 
			
		||||
    %}
 | 
			
		||||
    <h1> <%=$title %></h1><br>
 | 
			
		||||
    %= $c->render_to_string( inline => stash 'modul' )
 | 
			
		||||
    
 | 
			
		||||
    % if (stash 'error') {
 | 
			
		||||
        <div class="sme-error">
 | 
			
		||||
            <strong>Error:</strong><br>
 | 
			
		||||
            <%= $c->render_to_string(inline => stash 'error') %>
 | 
			
		||||
        </div>
 | 
			
		||||
    % }
 | 
			
		||||
    
 | 
			
		||||
    <h1><%= $title %></h1>
 | 
			
		||||
    
 | 
			
		||||
    <div class="module-content">
 | 
			
		||||
        <%= $c->render_to_string(inline => stash 'modul') %>
 | 
			
		||||
    </div>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
%end
 | 
			
		||||
% end
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id="central" class="sme-error">
 | 
			
		||||
<div id="central" class="sme-error module">
 | 
			
		||||
    <p><br>dev<br> Oups !!! 
 | 
			
		||||
        The page you were requesting
 | 
			
		||||
        "<%= $self->req->url->path || '/' %>"
 | 
			
		||||
@@ -12,4 +12,4 @@
 | 
			
		||||
    </p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
% layout 'defaultlight', title => 'Sme server 2 - Error P';
 | 
			
		||||
<div id='central' class='central not_found-panel'>
 | 
			
		||||
<div id='central' class='central not_found-panel module'>
 | 
			
		||||
    <p><br><br>
 | 
			
		||||
        The page you were requesting
 | 
			
		||||
        "<%= $self->req->url->path || '/' %>"
 | 
			
		||||
@@ -7,4 +7,4 @@
 | 
			
		||||
    <br><br>
 | 
			
		||||
    	%= link_to Welcome => '/'
 | 
			
		||||
    </p>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -85,7 +85,8 @@
 | 
			
		||||
 | 
			
		||||
    %= form_for '/domains' => (method => 'POST') => begin
 | 
			
		||||
 | 
			
		||||
		<HR class="sectionbar">
 | 
			
		||||
		<!-- <HR class="sectionbar">-->
 | 
			
		||||
		<br>
 | 
			
		||||
 | 
			
		||||
		% my $btn2 = l('dom_DOMAINS_PAGE_CORPORATE_DNS');
 | 
			
		||||
 | 
			
		||||
@@ -119,4 +120,4 @@
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
<div id="footer">
 | 
			
		||||
<HR class="sme-copyrightbar">
 | 
			
		||||
<div id="footer" class="module">
 | 
			
		||||
<!--<HR class="sme-copyrightbar">-->
 | 
			
		||||
<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 && $c->is_admin) {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,128 +1,12 @@
 | 
			
		||||
<style>
 | 
			
		||||
#h2l1 {
 | 
			
		||||
    display: flex;                  /* Use flexbox layout */
 | 
			
		||||
    justify-content: space-between; /* Space between child elements */
 | 
			
		||||
    align-items: center;           /* Center items vertically */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2e11 {
 | 
			
		||||
    flex: 1;                       /* Allow the first div to take available space on the left */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2e12 { 
 | 
			
		||||
    display: flex;                 /* Make this div a flex container */
 | 
			
		||||
    align-items: center;           /* Vertically center content in this div */
 | 
			
		||||
    margin-left: 20px;            /* Add margin to the left of this div */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#flag-container {
 | 
			
		||||
    display: flex;                 /* Make this div a flex container */
 | 
			
		||||
    align-items: center;           /* Vertically center content in this div */
 | 
			
		||||
    margin-left: 20px;             /* Add margin to the left of the flag container */
 | 
			
		||||
    padding-right: 20px;           /* Add padding to the right side of the flag container */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.flag-icon {
 | 
			
		||||
    width: 43px;
 | 
			
		||||
    font-size: 20px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#legacy-button button {
 | 
			
		||||
    background-color: #98d36e; /* Button background color */
 | 
			
		||||
    font-weight: lighter;      /* Lighter text for the button */
 | 
			
		||||
    color: #063;               /* Button text color */
 | 
			
		||||
    padding: 5px 10px;         /* Padding for the button */
 | 
			
		||||
    border: none;              /* Remove default button border */
 | 
			
		||||
    border-radius: 4px;        /* Rounded corners for button */
 | 
			
		||||
    cursor: pointer;           /* Change cursor on hover */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#legacy-button button:hover {
 | 
			
		||||
    background-color: #82c961; /* Change color on hover */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.infobar {
 | 
			
		||||
    display: flex;                  /* Use flexbox for alignment */
 | 
			
		||||
    justify-content: space-between; /* Space between child elements */
 | 
			
		||||
    align-items: center;            /* Center items vertically */
 | 
			
		||||
    padding: 10px;                  /* Adjust padding as desired */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2e21 {
 | 
			
		||||
    flex: 1;                        /* Allow the first div to take available space on the left */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2e22 {
 | 
			
		||||
    display: flex;                  /* Make this div a flex container */
 | 
			
		||||
    justify-content: center;        /* Center the help button */
 | 
			
		||||
    align-items: center;            /* Center vertically */
 | 
			
		||||
    flex: none;                    /* Prevent this div from growing */
 | 
			
		||||
    position: relative;             /* Relative position for centering */
 | 
			
		||||
    width: 100px;                  /* Set a width for the help button container */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#h2e23 {
 | 
			
		||||
    margin-left: auto;              /* Push the third div to the right */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.login-button {
 | 
			
		||||
    background-color: #98d36e;     /* Button background color */
 | 
			
		||||
    font-weight: bold;              /* Bold text */
 | 
			
		||||
    color: #ffffff;                 /* Button text color */
 | 
			
		||||
    padding: 8px 12px;              /* Adjust padding for button height */
 | 
			
		||||
    border: none;                   /* Remove default border */
 | 
			
		||||
    border-radius: 4px;             /* Rounded corners */
 | 
			
		||||
    cursor: pointer;                /* Change cursor on hover */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.login-button:hover {
 | 
			
		||||
    background-color: #82c961;      /* Change color on hover */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#help-button {
 | 
			
		||||
    text-decoration: none;          /* Remove underline from link */
 | 
			
		||||
    font-size: 20px;                /* Adjust font size as needed */
 | 
			
		||||
    padding: 8px 12px;              /* Add padding to the help link */
 | 
			
		||||
    background-color: #98d36e;      /* Background for visibility */
 | 
			
		||||
    border-radius: 4px;             /* Rounded corners */
 | 
			
		||||
    color: #000;                    /* Button text color */
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#help-button:hover {
 | 
			
		||||
    background-color: #82c961;      /* Change background on hover */
 | 
			
		||||
}
 | 
			
		||||
</style>
 | 
			
		||||
 | 
			
		||||
<div id="header2" class="hd2">
 | 
			
		||||
    <div id="h2l1"> 
 | 
			
		||||
		<div id="h2e11">
 | 
			
		||||
			<a target='_blank' href="http://www.koozali.org"><img src="images/smeserver_logo.jpg" height="40" alt="SME Server"></a>
 | 
			
		||||
		</div> 
 | 
			
		||||
 | 
			
		||||
		<div id="h2e22">
 | 
			
		||||
			<button type='button'class="login-button"><a id="help-button" target="_parent" href="manual">?</a></button>
 | 
			
		||||
		</div>
 | 
			
		||||
    
 | 
			
		||||
        <div id="h2e12">
 | 
			
		||||
			<button type='button' class="login-button"><a id="legacy-button" href="/server-manager" target='_blank'>Legacy SM</a></button>
 | 
			
		||||
        </div>
 | 
			
		||||
		<div id="h2e23">
 | 
			
		||||
			% if ( not defined $c->session->{username} ) {
 | 
			
		||||
				<button type='button' class="login-button"><a target="_parent" href="login">Login</a></button>
 | 
			
		||||
			% } else {
 | 
			
		||||
				<button type='button' class="login-button"><a target="_parent" href="logout"><%= $c->session->{username} %> Logout</a></button>
 | 
			
		||||
			% }
 | 
			
		||||
		</div>
 | 
			
		||||
		<div id="flag-container">
 | 
			
		||||
			<!-- The flag icon will be inserted here -->
 | 
			
		||||
		</div>
 | 
			
		||||
    </div>
 | 
			
		||||
	<div id="h2l2" class="infobar"> 
 | 
			
		||||
		<div id="h2e21">
 | 
			
		||||
			<b>
 | 
			
		||||
				<%= session 'SystemName' %>@<%= session 'DomainName' %></b> 
 | 
			
		||||
		</div>
 | 
			
		||||
		
 | 
			
		||||
		
 | 
			
		||||
<div id="header2" class="hd2 module gradient-panel">
 | 
			
		||||
	<img src="images/KoozaliServerManager.png" alt="Koozali Logo" class="logo" >
 | 
			
		||||
	% if ( not defined $c->session->{username} ) {
 | 
			
		||||
		<button type='button' class="login-button"><a class = "no-visited-state" target="_parent" href="login">Login</a></button>
 | 
			
		||||
	% } else {
 | 
			
		||||
		<button type='button' class="login-button"><a class = "no-visited-state" target="_parent" href="logout">Logout <%= $c->session->{username} %></a></button>
 | 
			
		||||
	% }
 | 
			
		||||
	<div id="flag-container" class = "flag-style">
 | 
			
		||||
		<!--			 The flag icon will be inserted here -->
 | 
			
		||||
	</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -1,16 +1,16 @@
 | 
			
		||||
<%     use POSIX qw(strftime); %>
 | 
			
		||||
<div id="info">
 | 
			
		||||
    <% if (! $c->session->{PwdSet} ) { %>
 | 
			
		||||
	<div class="sme-error"><h5>
 | 
			
		||||
	<div class="sme-error module"><h5>
 | 
			
		||||
        Warning: you have not yet changed the default system password.</h5></div>
 | 
			
		||||
    <% } %>
 | 
			
		||||
    <% if ( $c->is_unsafe ) { %>
 | 
			
		||||
	<div class="sme-error"><h5>
 | 
			
		||||
	<div class="sme-error module"><h5>
 | 
			
		||||
        Warning: a reconfigure and reboot is required before proceeding! Failure to do so now
 | 
			
		||||
        may leave your system in an unknown state!</h5></div>
 | 
			
		||||
    <% } %>
 | 
			
		||||
    <% if ( $c->session->{Access} eq 'public' && ((config->{debug} ne '0') || (config->{mode} ne 'production')) ) { %>
 | 
			
		||||
	<div class="sme-error"><h5>
 | 
			
		||||
	<div class="sme-error module"><h5>
 | 
			
		||||
        Warning: Development or debug mode enabled AND public access is offered !
 | 
			
		||||
        </h5></div>
 | 
			
		||||
    <% } %>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
	% my %ret;
 | 
			
		||||
	% unless (length($retref)) {%ret = (ret=>"");}
 | 
			
		||||
	% else {%ret = %$retref;}
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	% my @vars = split(",",$ret{vars});
 | 
			
		||||
	% my $var1 = @vars[0];
 | 
			
		||||
	% my $var2 = @vars[1];
 | 
			
		||||
@@ -13,30 +13,31 @@
 | 
			
		||||
	% my $var5 = @vars[4];
 | 
			
		||||
	% my $var6 = @vars[5];
 | 
			
		||||
 | 
			
		||||
   <br>
 | 
			
		||||
	%if ($ret{'ret'} eq "") {
 | 
			
		||||
   	
 | 
			
		||||
 | 
			
		||||
	%} elsif (index($ret{ret},"SUCCESS") != -1) {
 | 
			
		||||
	   <div class='success'>
 | 
			
		||||
	       <h2> Operation Status Report</h2>
 | 
			
		||||
			%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
 | 
			
		||||
	       <!--<h2> Operation Status Report</h2>-->
 | 
			
		||||
		%= $c->render_to_string(inline => l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6));
 | 
			
		||||
		</div>
 | 
			
		||||
	   %} else { 
 | 
			
		||||
	   %} else {
 | 
			
		||||
	   <div class='sme-error'>
 | 
			
		||||
	       <h2> Operation Status Report - Error</h2>
 | 
			
		||||
			%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
 | 
			
		||||
	       <!--<h2> Operation Status Report - Error</h2>-->
 | 
			
		||||
		%= $c->render_to_string(inline => l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6));
 | 
			
		||||
    	</div>
 | 
			
		||||
	%}
 | 
			
		||||
	<br />
 | 
			
		||||
    % my $btn = l('ADD');
 | 
			
		||||
    % my $network_db = esmith::NetworksDB->open();
 | 
			
		||||
    
 | 
			
		||||
    % my $network_db = esmith::NetworksDB::UTF8->open() || die "Couldn't open NetworksDB db";
 | 
			
		||||
 | 
			
		||||
   % if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
	%= dumper $c->current_route
 | 
			
		||||
	%= dumper $c->stash("ret")
 | 
			
		||||
	</p>
 | 
			
		||||
    % }
 | 
			
		||||
     
 | 
			
		||||
 | 
			
		||||
    %= form_for '/localnetworksb' => (method => 'POST') => begin
 | 
			
		||||
		<h2>
 | 
			
		||||
		%=l "ln_ADD_TITLE"
 | 
			
		||||
@@ -66,5 +67,4 @@
 | 
			
		||||
			</p>
 | 
			
		||||
	%end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
@@ -26,13 +26,15 @@
 | 
			
		||||
	%if ($ret{ret} eq "") {
 | 
			
		||||
		%=l "ln_FIRSTPAGE_DESC"
 | 
			
		||||
	%} elsif (index($ret{ret},"SUCCESS") != -1) {
 | 
			
		||||
	   <br>
 | 
			
		||||
	   <div class='success'>
 | 
			
		||||
	       <h2> Operation Status Report</h2>
 | 
			
		||||
	       <!--<h2> Operation Status Report</h2>-->
 | 
			
		||||
		%= $c->render_to_string(inline => l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6,$var7));
 | 
			
		||||
		</div>
 | 
			
		||||
	   %} else { 
 | 
			
		||||
	   <br>
 | 
			
		||||
	   <div class='sme-error'>
 | 
			
		||||
	       <h2> Operation Status Report - Error</h2>
 | 
			
		||||
	       <!--<h2> Operation Status Report - Error</h2>-->
 | 
			
		||||
		%= $c->render_to_string(inline => l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6,$var7));
 | 
			
		||||
    	</div>
 | 
			
		||||
	%}
 | 
			
		||||
@@ -103,4 +105,4 @@
 | 
			
		||||
		</table>
 | 
			
		||||
			%= hidden_field 'trt' => $ln_datas->{trt}
 | 
			
		||||
	%}
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -13,16 +13,17 @@
 | 
			
		||||
	% my $var5 = @vars[4];
 | 
			
		||||
	% my $var6 = @vars[5];
 | 
			
		||||
 | 
			
		||||
	<br>
 | 
			
		||||
	%if ($ret{'ret'} eq "") {
 | 
			
		||||
   	
 | 
			
		||||
	%} elsif (index($ret{ret},"SUCCESS") != -1) {
 | 
			
		||||
	   <div class='success'>
 | 
			
		||||
	       <h2> Operation Status Report</h2>
 | 
			
		||||
	       <!--<h2> Operation Status Report</h2>-->
 | 
			
		||||
			%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
 | 
			
		||||
		</div>
 | 
			
		||||
	   %} else { 
 | 
			
		||||
	   <div class='sme-error'>
 | 
			
		||||
	       <h2> Operation Status Report - Error</h2>
 | 
			
		||||
	       <!--<h2> Operation Status Report - Error</h2>-->
 | 
			
		||||
			%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
 | 
			
		||||
    	</div>
 | 
			
		||||
	%}
 | 
			
		||||
@@ -84,4 +85,4 @@
 | 
			
		||||
 | 
			
		||||
	%end
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -21,13 +21,15 @@
 | 
			
		||||
	%if ($ret{ret} eq "") {
 | 
			
		||||
	    %= $c->render_to_string(inline => l('pf_FIRST_PAGE_DESCRIPTION'));
 | 
			
		||||
	%} elsif (index($ret{ret},"SUCCESS") != -1) {
 | 
			
		||||
		<br>
 | 
			
		||||
	   <div class='success'>
 | 
			
		||||
	       <h2> Operation Status Report</h2>
 | 
			
		||||
	       <!--<h2> Operation Status Report</h2>-->
 | 
			
		||||
			%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
 | 
			
		||||
		</div>
 | 
			
		||||
	   %} else { 
 | 
			
		||||
		<br>
 | 
			
		||||
	   <div class='sme-error'>
 | 
			
		||||
	       <h2> Operation Status Report - Error</h2>
 | 
			
		||||
	       <!--<h2> Operation Status Report - Error</h2>-->
 | 
			
		||||
			%= $c->l($ret{ret},$var1,$var2,$var3,$var4,$var5,$var6);
 | 
			
		||||
    	</div>
 | 
			
		||||
	%}
 | 
			
		||||
@@ -113,4 +115,4 @@
 | 
			
		||||
	</table>
 | 
			
		||||
	%= hidden_field 'trt' => $pf_datas->{trt}
 | 
			
		||||
 
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -11,4 +11,4 @@
 | 
			
		||||
	</span>
 | 
			
		||||
	</p>
 | 
			
		||||
 | 
			
		||||
	<hr class='sectionbar' />
 | 
			
		||||
	<!--<hr class='sectionbar' />-->
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
%	use SrvMngr qw( getNavigation );
 | 
			
		||||
%	my %nav = %{SrvMngr->getNavigation( $c->languages(), 'U' )};
 | 
			
		||||
%	use SrvMngr qw( getNavigation simpleNavMerge );
 | 
			
		||||
%	my %nav1 = %{SrvMngr->getNavigation( $c->languages(), 'U' )};
 | 
			
		||||
% 	my %nav2 = %{SrvMngr->getNavigation( $c->languages(), 'A', session('username') )};
 | 
			
		||||
%	my %nav = $c->session->{is_admin} ? %nav1 : %{SrvMngr->simpleNavMerge(\%nav1, \%nav2)};
 | 
			
		||||
 | 
			
		||||
	<div id='usermenu'>
 | 
			
		||||
	<a href='#' id='toguser' class='section section-title'>Current User (<%= session 'username' %>)</a>
 | 
			
		||||
@@ -7,26 +9,24 @@
 | 
			
		||||
%    my $cc = 300;
 | 
			
		||||
%    foreach my $h (sort { ($nav{$a}{'WEIGHT'}/$nav{$a}{'COUNT'}) 
 | 
			
		||||
%		<=> ($nav{$b}{'WEIGHT'}/$nav{$b}{'COUNT'}) } keys %nav) {
 | 
			
		||||
	<!-- div class='section'><%= $h %></div -->
 | 
			
		||||
%	my ($classNew, $target, $href) = '';
 | 
			
		||||
%	foreach (sort { $a->{'WEIGHT'} <=> $b->{'WEIGHT'} }  @{$nav{$h}{'DESCRIPTIONS'}}) {
 | 
			
		||||
 | 
			
		||||
%	next if ($_->{'MENUCAT'} ne 'U' );	# menu User 
 | 
			
		||||
 | 
			
		||||
%	    if ( $_->{'FILENAME'} =~ m/^2\// ) {
 | 
			
		||||
%		$target = '_self';
 | 
			
		||||
%	    	(my $file2 = $_->{'FILENAME'}) =~ s|^2/||;
 | 
			
		||||
%	    	$href = '/smanager/' . $file2;
 | 
			
		||||
%	    } else {
 | 
			
		||||
%		$target = 'main';
 | 
			
		||||
%	    	$href = '/server-manager' . $_->{'FILENAME'};
 | 
			
		||||
%	    }
 | 
			
		||||
	    <div class='menu-cell'><a class='item<%= $classNew %>' target='<%= $target %>'
 | 
			
		||||
	    id='sme<%= $cc %>' href='<%= $href %>'><%= $_->{'DESCRIPTION'} %></a></div>
 | 
			
		||||
		<!-- div class='section'><%= $h %></div -->
 | 
			
		||||
%		my ($classNew, $target, $href) = '';
 | 
			
		||||
%		foreach (sort { $a->{'WEIGHT'} <=> $b->{'WEIGHT'} }  @{$nav{$h}{'DESCRIPTIONS'}}) {
 | 
			
		||||
%			next if ($_->{'MENUCAT'} ne 'A' && $_->{'MENUCAT'} ne 'U' );	# menu User 
 | 
			
		||||
%		    if ( $_->{'FILENAME'} =~ m/^2\// ) {
 | 
			
		||||
%				$target = '_self';
 | 
			
		||||
%				(my $file2 = $_->{'FILENAME'}) =~ s|^2/||;
 | 
			
		||||
%				$href = '/smanager/' . $file2;
 | 
			
		||||
%		    } else {
 | 
			
		||||
%				$target = 'main';
 | 
			
		||||
%				$href = '/server-manager' . $_->{'FILENAME'};
 | 
			
		||||
%		    }
 | 
			
		||||
			<div class='menu-cell'><a class='item<%= $classNew %>' target='<%= $target %>'
 | 
			
		||||
			id='sme<%= $cc %>' href='<%= $href %>'><%= $_->{'DESCRIPTION'} %></a></div>
 | 
			
		||||
%           $cc++;
 | 
			
		||||
%	}
 | 
			
		||||
%		}
 | 
			
		||||
 | 
			
		||||
%    }
 | 
			
		||||
 | 
			
		||||
    </div>
 | 
			
		||||
    </div>
 | 
			
		||||
    </div>
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
% layout 'default', title => "Sme server 2 - qmailanalog";
 | 
			
		||||
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
%= javascript '/js/qmailanalog.js'
 | 
			
		||||
<div id='module' class='module qmailanalog-panel'>
 | 
			
		||||
    %if (config->{debug} == 1) {
 | 
			
		||||
	<p>
 | 
			
		||||
@@ -11,17 +11,34 @@
 | 
			
		||||
    <br>
 | 
			
		||||
    <%= $modul %>
 | 
			
		||||
    <% 	my $btn = l('qma_GENERATE_REPORT'); %>
 | 
			
		||||
 | 
			
		||||
    %= form_for 'qmailanalog' => (method => 'POST') => begin
 | 
			
		||||
	<p>
 | 
			
		||||
	<span class=label>
 | 
			
		||||
	%=l 'qma_REPORT_TYPE'
 | 
			
		||||
	</span><span class=data>
 | 
			
		||||
	<!-- (to be sorted) -->
 | 
			
		||||
	%= select_field 'report_type' => $c->reportType_list()
 | 
			
		||||
	</span>
 | 
			
		||||
	</p>
 | 
			
		||||
	%= submit_button "$btn", class => 'action'
 | 
			
		||||
		<p>
 | 
			
		||||
		<span class=label>
 | 
			
		||||
		%=l 'qma_REPORT_TYPE'
 | 
			
		||||
		</span><span class=data>
 | 
			
		||||
		<!-- (to be sorted) -->
 | 
			
		||||
		%= select_field 'report_type' => $c->reportType_list(), id => 'analysis_type'
 | 
			
		||||
		</span>
 | 
			
		||||
		</p>
 | 
			
		||||
 | 
			
		||||
		<!--And optional parameters, depending on the choice.-->
 | 
			
		||||
		<div id="message_id_group">
 | 
			
		||||
			<span class=label>
 | 
			
		||||
			%= label_for message_id => 'Message ID:'
 | 
			
		||||
			</span><span class=data>
 | 
			
		||||
			%= text_field 'message_id', placeholder => 'Enter Postfix Message ID', id => 'message_id_group'
 | 
			
		||||
			</span>
 | 
			
		||||
		</div>
 | 
			
		||||
 | 
			
		||||
		<div id="email_address_group">
 | 
			
		||||
			<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'
 | 
			
		||||
			</span>
 | 
			
		||||
		</div>
 | 
			
		||||
 | 
			
		||||
		%= submit_button "$btn", class => 'action'
 | 
			
		||||
    % end
 | 
			
		||||
</div>
 | 
			
		||||
%end
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
	</span>
 | 
			
		||||
    %}
 | 
			
		||||
 | 
			
		||||
    <hr class='sectionbar' />
 | 
			
		||||
    <!--<hr class='sectionbar' />-->
 | 
			
		||||
 | 
			
		||||
    <% 	my $btn = l('SAVE'); %>
 | 
			
		||||
 | 
			
		||||
@@ -50,7 +50,7 @@
 | 
			
		||||
	</span>
 | 
			
		||||
	<br><br>
 | 
			
		||||
 | 
			
		||||
	<hr class='sectionbar' />
 | 
			
		||||
	<!--<hr class='sectionbar' />-->
 | 
			
		||||
 | 
			
		||||
    %}
 | 
			
		||||
 | 
			
		||||
@@ -85,7 +85,7 @@
 | 
			
		||||
            %= t td => (class => 'sme-border') => $net
 | 
			
		||||
            %= t td => (class => 'sme-border') => $mask
 | 
			
		||||
            %= t td => (class => 'sme-border') => $numhosts
 | 
			
		||||
            <td class='sme-border'><input type='checkbox' name='Remote_nets' value='<%= $net.'/'.$mask %>'> </td>
 | 
			
		||||
            <td class='sme-border'><input type='checkbox' name='Remove_nets' value='<%= $net.'/'.$mask %>'> </td>
 | 
			
		||||
    	</tr>
 | 
			
		||||
    %    }
 | 
			
		||||
 | 
			
		||||
@@ -115,7 +115,7 @@
 | 
			
		||||
	%= text_field 'ValidFromMask', class => 'input'
 | 
			
		||||
	</span>
 | 
			
		||||
 | 
			
		||||
	<hr class='sectionbar' />
 | 
			
		||||
	<!--<hr class='sectionbar' />-->
 | 
			
		||||
 | 
			
		||||
	<h2>
 | 
			
		||||
	%=l 'rma_TITLE_SSH'
 | 
			
		||||
@@ -154,7 +154,7 @@
 | 
			
		||||
	</span>
 | 
			
		||||
	<br>
 | 
			
		||||
 | 
			
		||||
	<hr class='sectionbar' />
 | 
			
		||||
	<!--<hr class='sectionbar' />-->
 | 
			
		||||
 | 
			
		||||
	<h2>
 | 
			
		||||
	%=l 'rma_TITLE_FTP_ACCESS'
 | 
			
		||||
@@ -183,7 +183,7 @@
 | 
			
		||||
 | 
			
		||||
    % my $mode = $c->get_telnet_mode();
 | 
			
		||||
    % if ( $mode ne 'off') {
 | 
			
		||||
	<hr class='sectionbar' />
 | 
			
		||||
	<!--<hr class='sectionbar' />-->
 | 
			
		||||
 | 
			
		||||
	<h2>
 | 
			
		||||
	%=l 'rma_TITLE_TELNET_ACCESS'
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
% layout 'default', title => 'Sme server 2 - Review';
 | 
			
		||||
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
<div id='central' class='central review-panel'>
 | 
			
		||||
<div id='central' class='central review-panel module'>
 | 
			
		||||
    <h1> <%= $title %> </h1>
 | 
			
		||||
    <%= $modul %><br><br>
 | 
			
		||||
 | 
			
		||||
@@ -134,4 +134,4 @@
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
<div id='roundcube' class='roundcube roundcube-panel'>
 | 
			
		||||
<div id='roundcube' class='roundcube roundcube-panel module'>
 | 
			
		||||
    % if (config->{debug} == 1) {
 | 
			
		||||
		<p>
 | 
			
		||||
			%= dumper $c->current_route
 | 
			
		||||
@@ -37,4 +37,4 @@
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
%end
 | 
			
		||||
%end
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
% layout 'default', title => 'Sme server 2 - IndexT';
 | 
			
		||||
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
<div id='central' class='central welcome-panel'>
 | 
			
		||||
<div id='central' class='central welcome-panel module'>
 | 
			
		||||
    <p>Index on line - Welcome page<br>
 | 
			
		||||
    </p>
 | 
			
		||||
    <p>
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
 | 
			
		||||
% content_for 'module' => begin
 | 
			
		||||
 | 
			
		||||
<div id="central" class="sme-error">
 | 
			
		||||
<div id="central " class="sme-error module">
 | 
			
		||||
    <p><br>dev<br> What else !!! 
 | 
			
		||||
        The page you were requesting
 | 
			
		||||
        "<%= $self->req->url->path || '/' %>"
 | 
			
		||||
@@ -14,4 +14,4 @@
 | 
			
		||||
    </p>
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% end
 | 
			
		||||
@@ -55,7 +55,7 @@
 | 
			
		||||
	% end
 | 
			
		||||
    %}
 | 
			
		||||
 | 
			
		||||
    <br><hr class=sectionbar /><br>
 | 
			
		||||
    <!--<br><hr class=sectionbar /><br>-->
 | 
			
		||||
 | 
			
		||||
    %= form_for 'yum' => (method => 'POST') => begin
 | 
			
		||||
 | 
			
		||||
@@ -97,4 +97,4 @@
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
% end
 | 
			
		||||
% 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 63
 | 
			
		||||
%define release 89
 | 
			
		||||
Version: %{version}
 | 
			
		||||
Release: %{release}%{?dist}
 | 
			
		||||
License: GPL
 | 
			
		||||
@@ -22,8 +22,9 @@ BuildRequires: smeserver-devtools
 | 
			
		||||
#BuildRequires:  perl(Net::Netmask) >= 1.9
 | 
			
		||||
#</Build tests>
 | 
			
		||||
 | 
			
		||||
Requires: smeserver-lib >= 1.18.0-26
 | 
			
		||||
Requires: smeserver-manager >= 2.4.0-22
 | 
			
		||||
Requires: smeserver-lib >= 11.0.0-13
 | 
			
		||||
# old manager is needed to handle access (ValidFrom)
 | 
			
		||||
Requires: e-smith-manager >= 2.4.0-22
 | 
			
		||||
Requires: smeserver-apache >= 2.6.0-19
 | 
			
		||||
Requires: smeserver-php >= 3.0.0-43
 | 
			
		||||
#Requires: smeserver-manager-locale >= 11.0.0
 | 
			
		||||
@@ -37,7 +38,6 @@ Requires: perl(Mojo::JWT) >= 0.08-1
 | 
			
		||||
#Requires: perl(Time::TAI64) >= 2.11
 | 
			
		||||
Requires: mutt >= 1.5.21
 | 
			
		||||
Requires: smeserver-manager-jsquery >= 1.0
 | 
			
		||||
Requires: smeserver-lib >= 11.0
 | 
			
		||||
Requires: smeserver-certificates >= 11.0
 | 
			
		||||
#Requires: js-jquery > 2.2.4-3 (optional)
 | 
			
		||||
 | 
			
		||||
@@ -82,7 +82,8 @@ This RPM contributes the navigation bars for the smeserver-manager. New Mojolici
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
year=`date +%Y`
 | 
			
		||||
sed -i "s/___YEAR___/$year/g" root/usr/share/smanager/lib/SrvMngr/Controller/Datetime.pm
 | 
			
		||||
 | 
			
		||||
perl createlinks
 | 
			
		||||
 | 
			
		||||
@@ -130,7 +131,7 @@ true
 | 
			
		||||
%post
 | 
			
		||||
if [ -f /usr/share/javascript/jquery/latest/jquery.min.js ]
 | 
			
		||||
then
 | 
			
		||||
    [ -d %{dir_mngr}/themes/default/public/js ] || 
 | 
			
		||||
    [ -d %{dir_mngr}/themes/default/public/js ] ||
 | 
			
		||||
	mkdir %{dir_mngr}/themes/default/public/js
 | 
			
		||||
    [ -h %{dir_mngr}/themes/default/public/js/jquery.min.js ] ||
 | 
			
		||||
	ln -s /usr/share/javascript/jquery/latest/jquery.min.js %{dir_mngr}/themes/default/public/js/jquery.min.js
 | 
			
		||||
@@ -143,6 +144,96 @@ true
 | 
			
		||||
%defattr(-,root,root)
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
* Thu Jun 12 2025 Brian Read <brianr@koozali.org> 11.0.0-89.sme
 | 
			
		||||
- rework navigation weights to avoid duplicates [SME: 12996]
 | 
			
		||||
 | 
			
		||||
* Mon Jun 09 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-88.sme
 | 
			
		||||
- add datetime getYear_list [SME: 13031]
 | 
			
		||||
- use esmith::*DB::UTF8 to access db flat files [SME: 13027]
 | 
			
		||||
- fix typo [SME: 13038]
 | 
			
		||||
 | 
			
		||||
* Mon Jun 09 2025 John Crisp <jcrisp@safeandsoundit.co.uk> 11.00.0-86.sme
 | 
			
		||||
- Fix datetime gen_locale_date_string reference [SME: 13017]
 | 
			
		||||
 | 
			
		||||
* Mon Jun 09 2025 John Crisp <jcrisp@safeandsoundit.co.uk> 11.0.0-85.sme
 | 
			
		||||
- fix ln_add templates for UTF8 [SME: 13030]
 | 
			
		||||
- remove extraneous require line in spec file
 | 
			
		||||
 | 
			
		||||
* Mon Jun 09 2025 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-84.sme
 | 
			
		||||
- fix Directory caching issue [SME: 13026]
 | 
			
		||||
- WIP use esmith::*DB::UTF8 to access db flat files [SME: 13027]
 | 
			
		||||
 | 
			
		||||
* Mon May 05 2025 Brian Read <brianr@koozali.org> 11.0.0-83.sme
 | 
			
		||||
- Mod to SrvMngr-Auth to account for partials matching AdminPanels options
 | 
			
		||||
 | 
			
		||||
* Thu May 01 2025 Brian Read <brianr@koozali.org> 11.0.0-82.sme
 | 
			
		||||
- Correct Weights for menus [SME: 12996]
 | 
			
		||||
 | 
			
		||||
* Wed Apr 30 2025 Brian Read <brianr@koozali.org> 11.0.0-80.sme
 | 
			
		||||
- Remove expansion of css files from createlinks [SME: 12989]
 | 
			
		||||
 | 
			
		||||
* Wed Apr 30 2025 Brian Read <brianr@koozali.org> 11.0.0-79.sme
 | 
			
		||||
- Add code in SrvMngr to take note of user panel setting
 | 
			
		||||
 | 
			
		||||
* Thu Apr 17 2025 Brian Read <brianr@koozali.org> 11.0.0-78.sme
 | 
			
		||||
- typo in remoteaccess panel
 | 
			
		||||
- Fix crash in veiwlogfiles if viewlogfiles key not in DB
 | 
			
		||||
 | 
			
		||||
* Sat Apr 12 2025 Brian Read <brianr@koozali.org> 11.0.0-77.sme
 | 
			
		||||
- Sort out local and pulic access setting in remote panel  [SME: 12988]
 | 
			
		||||
- caching problem, plus confusion between normal and public setting in sshd / access in DB
 | 
			
		||||
 | 
			
		||||
* Fri Apr 11 2025 Brian Read <brianr@koozali.org> 11.0.0-76.sme
 | 
			
		||||
- Restore css for roundcube embedded  [SME: 12987]
 | 
			
		||||
 | 
			
		||||
* Wed Apr 09 2025 Brian Read <brianr@koozali.org> 11.0.0-75.sme
 | 
			
		||||
- Move review configuration to behind login [SME: 12984]
 | 
			
		||||
- Fix crash in port forwarding [SME: 12985]
 | 
			
		||||
 | 
			
		||||
* Wed Mar 26 2025 Brian Read <brianr@koozali.org> 11.0.0-74.sme
 | 
			
		||||
- Fix error message and success message format in Local Networking panel [SME: 12969]
 | 
			
		||||
 | 
			
		||||
* Tue Mar 25 2025 Brian Read <brianr@koozali.org> 11.0.0-73.sme
 | 
			
		||||
- Some changes to error message format in css.
 | 
			
		||||
- Fix DB Cache problem with port forwarding panel [SME: 12970]
 | 
			
		||||
- Fix error and success message display for port forwarding panel [SME: 12969]
 | 
			
		||||
 | 
			
		||||
* Mon Mar 24 2025 Brian Read <brianr@koozali.org> 11.0.0-72.sme
 | 
			
		||||
- Remove css files from template structure [SME: 12967]
 | 
			
		||||
- Rationalise and merge css files
 | 
			
		||||
- Adjust some gaps around panels
 | 
			
		||||
- Remove HR lines
 | 
			
		||||
 | 
			
		||||
* Thu Mar 20 2025 Brian Read <brianr@koozali.org> 11.0.0-71.sme
 | 
			
		||||
- Sort out navigation menu error on startup [SME: 12946]
 | 
			
		||||
- More places where floating panel needed
 | 
			
		||||
- Adjust floating panel to make space around it the same
 | 
			
		||||
- clean up some css
 | 
			
		||||
 | 
			
		||||
* Wed Mar 19 2025 Brian Read <brianr@koozali.org> 11.0.0-70.sme
 | 
			
		||||
- Re-cast the default theme - use proper koozali logo image, unwind multiple divs
 | 
			
		||||
- Enhance responsiveness
 | 
			
		||||
- Revert Ibay menu name to Ibays
 | 
			
		||||
- Remove legacy SM1 button on header
 | 
			
		||||
- Remove "?" access to wiki help on header
 | 
			
		||||
 | 
			
		||||
* Mon Mar 17 2025 Brian Read <brianr@koozali.org> 11.0.0-69.sme
 | 
			
		||||
- Add a total summary report across all existing logs [SME: 12951]
 | 
			
		||||
 | 
			
		||||
* Mon Mar 17 2025 Brian Read <brianr@koozali.org> 11.0.0-68.sme
 | 
			
		||||
- re-write qmailanalog for postfix [SME: 12951]
 | 
			
		||||
- Clean up backup.pm
 | 
			
		||||
- Enhance module panel - used by mail log analysis and Licence display
 | 
			
		||||
 | 
			
		||||
* Tue Mar 11 2025 Brian Read <brianr@koozali.org> 11.0.0-66.sme
 | 
			
		||||
- Move the button for each backup panel to the left to conform to all the other panels.
 | 
			
		||||
 | 
			
		||||
* Sun Mar 09 2025 Brian Read <brianr@koozali.org> 11.0.0-65.sme
 | 
			
		||||
- Sort out missing hostname on nfs and cifs workstation backup on error [SME: 12948]
 | 
			
		||||
 | 
			
		||||
* Sat Mar 08 2025 Brian Read <brianr@koozali.org> 11.0.0-64.sme
 | 
			
		||||
- Add code to check for boot phase completion [SME: 12953]
 | 
			
		||||
 | 
			
		||||
* Thu Mar 06 2025 Brian Read <brianr@koozali.org> 11.0.0-63.sme
 | 
			
		||||
- Add boot.svg image to Bug Report panel [SME: 12953]
 | 
			
		||||
- Move report template to inside smanager tree
 | 
			
		||||
@@ -188,7 +279,7 @@ true
 | 
			
		||||
 | 
			
		||||
* Sun Feb 09 2025 Brian Read <brianr@koozali.org> 11.0.0-50.sme
 | 
			
		||||
- Move all routines from FormMagic still called by SM2 panels to SM2 [SME: 12906]
 | 
			
		||||
- delete all references to FormMagic 
 | 
			
		||||
- delete all references to FormMagic
 | 
			
		||||
 | 
			
		||||
* Fri Feb 07 2025 Brian Read <brianr@koozali.org> 11.0.0-49.sme
 | 
			
		||||
- Fix delete of ibay - typo in link
 | 
			
		||||
@@ -200,7 +291,7 @@ true
 | 
			
		||||
 | 
			
		||||
* Tue Jan 28 2025 Brian Read <brianr@koozali.org> 11.0.0-47.sme
 | 
			
		||||
- Temp (we hope) remove CSRF protection plugin  [SME: ]
 | 
			
		||||
- Fix comparison in footer with config->mode 
 | 
			
		||||
- Fix comparison in footer with config->mode
 | 
			
		||||
 | 
			
		||||
* Tue Jan 28 2025 Brian Read <brianr@koozali.org> 11.0.0-46.sme
 | 
			
		||||
- Adjust conditions for showing "Reconfigure required" to only check UnSavedChanges DB entry [SME: 12891]
 | 
			
		||||
@@ -258,7 +349,7 @@ true
 | 
			
		||||
 | 
			
		||||
* Wed Dec 18 2024 Brian Read <brianr@koozali.org> 11.0.0-32.sme
 | 
			
		||||
- Fix for User and localnetwork panel [SME: 6278]
 | 
			
		||||
- Fix menu entry for proxy to stop it moving 
 | 
			
		||||
- Fix menu entry for proxy to stop it moving
 | 
			
		||||
 | 
			
		||||
* Tue Dec 17 2024 Brian Read <brianr@koozali.org> 11.0.0-31.sme
 | 
			
		||||
- Edit html to avoid w3c html validation warnings [SME: 6278]
 | 
			
		||||
@@ -310,7 +401,7 @@ true
 | 
			
		||||
 | 
			
		||||
* 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 
 | 
			
		||||
- Monitor dnf running using dnf status file
 | 
			
		||||
 | 
			
		||||
* Wed Aug 21 2024 Brian Read <brianr@koozali.org> 11.0.0-15.sme
 | 
			
		||||
- Migrate SM2 Software installer panel from use of yum to dnf [SME: 12718]
 | 
			
		||||
@@ -441,7 +532,7 @@ true
 | 
			
		||||
- untainting printer [SME: 12110]
 | 
			
		||||
 | 
			
		||||
* Fri Jan 21 2022 Michel Begue <mab974@misouk.com> 0.1.4-14.sme
 | 
			
		||||
- Fix jquery map link missing 
 | 
			
		||||
- Fix jquery map link missing
 | 
			
		||||
- Fix jquery link deleted during update
 | 
			
		||||
- Remove generated file during remove
 | 
			
		||||
 | 
			
		||||
@@ -478,7 +569,7 @@ true
 | 
			
		||||
* Mon Nov 15 2021 Michel Begue <mab974@misouk.com> 0.1.4-3.sme
 | 
			
		||||
- Fix error message when linking, unlinking jquery in spec
 | 
			
		||||
- Correct the 'review' panel presentation
 | 
			
		||||
- Modify CSRFDefender plugin to take into account GET method 
 | 
			
		||||
- Modify CSRFDefender plugin to take into account GET method
 | 
			
		||||
- Add TOKEN param where the GET method is used in templates
 | 
			
		||||
- Remove smanager from local url address
 | 
			
		||||
 | 
			
		||||
@@ -713,7 +804,7 @@ true
 | 
			
		||||
* Sun Feb 04 2018 Jean-Philipe Pialasse <tests@pialasse.com> 0.1.0-1.sme
 | 
			
		||||
- first smeserver-manager package [SME: 10506]
 | 
			
		||||
  this is a sandbox to dev the next server-manager based on mojolicious
 | 
			
		||||
  this package is based on part of the old e-smith-manager and needs it 
 | 
			
		||||
  this package is based on part of the old e-smith-manager and needs it
 | 
			
		||||
  to work until we moved the httpd-admin part.
 | 
			
		||||
 | 
			
		||||
* Sun Apr 16 2017 Jean-Philipe Pialasse <tests@pialasse.com> 2.8.0-26.sme
 | 
			
		||||
@@ -745,7 +836,7 @@ true
 | 
			
		||||
 | 
			
		||||
* Tue Jul 19 2016 Jean-Philipe Pialasse <tests@pialasse.com> 2.8.0-12.sme
 | 
			
		||||
- Update server-manager to Koozali branding [SME: 9676]
 | 
			
		||||
- We thanks John Crisp for his wonderful work. 
 | 
			
		||||
- We thanks John Crisp for his wonderful work.
 | 
			
		||||
 | 
			
		||||
* Wed Jun 15 2016 Jean-Philipe Pialasse <tests@pialasse.com> 2.8.0-11.sme
 | 
			
		||||
- change link for donation to koozali.org  [SME: 9599]
 | 
			
		||||
@@ -797,7 +888,7 @@ true
 | 
			
		||||
  [SME: 9163]
 | 
			
		||||
 | 
			
		||||
* Sun Mar 23 2014 Ian Wells <esmith@wellsi.com> 2.6.0-1.sme
 | 
			
		||||
- Roll new stream to remove obsolete images [SME: 7962] 
 | 
			
		||||
- Roll new stream to remove obsolete images [SME: 7962]
 | 
			
		||||
 | 
			
		||||
* Sun Mar 23 2014 Ian Wells <esmith@wellsi.com> 2.4.0-9.sme
 | 
			
		||||
- Remove references to obsolete images, by Stephane de Labrusse [SME: 7962]
 | 
			
		||||
@@ -835,10 +926,10 @@ true
 | 
			
		||||
* Wed Dec  9 2009 Charlie Brady <charlieb@budge.apana.org.au> 2.2.0-4.sme
 | 
			
		||||
- Fix css validation errors. [SME: 5656]
 | 
			
		||||
 | 
			
		||||
* Fri Sep 18 2009 Stephen Noble <support@dungog.net> 2.2.0-4.sme 
 | 
			
		||||
* Fri Sep 18 2009 Stephen Noble <support@dungog.net> 2.2.0-4.sme
 | 
			
		||||
- display reconfigure warning once if UnsavedChanges=yes [SME: 5475]
 | 
			
		||||
 | 
			
		||||
* Fri Sep 18 2009 Stephen Noble <support@dungog.net> 2.2.0-3.sme 
 | 
			
		||||
* Fri Sep 18 2009 Stephen Noble <support@dungog.net> 2.2.0-3.sme
 | 
			
		||||
- display reconfigure warning if UnsavedChanges=yes [SME: 5475]
 | 
			
		||||
 | 
			
		||||
* Sun Apr 26 2009 Jonathan Martens <smeserver-contribs@snetram.nl> 2.2.0-2.sme
 | 
			
		||||
@@ -879,13 +970,13 @@ true
 | 
			
		||||
- Fix UTF-8 encoding in header and nav-conf [SME: 4072]
 | 
			
		||||
 | 
			
		||||
* Tue Jan 08 2008 Stephen Noble <support@dungog.net> 1.14.0-11
 | 
			
		||||
- Fix to remove spaces and newlines in panel headers [SME: 3346] 
 | 
			
		||||
- Fix to remove spaces and newlines in panel headers [SME: 3346]
 | 
			
		||||
 | 
			
		||||
* Tue Jan 08 2008 Stephen Noble <support@dungog.net> 1.14.0-10
 | 
			
		||||
- remove the FormMagick session files [SME: 3723]
 | 
			
		||||
 | 
			
		||||
* Tue Jan 08 2008 Stephen Noble <support@dungog.net> 1.14.0-9
 | 
			
		||||
- Remove spaces and newlines in panel headers [SME: 3346] 
 | 
			
		||||
- Remove spaces and newlines in panel headers [SME: 3346]
 | 
			
		||||
 | 
			
		||||
* Sun Jul 01 2007 Shad L. Lords <slords@mail.com> 1.14.0-8
 | 
			
		||||
- Make login/logout no quite so verbose. [SME: 2660]
 | 
			
		||||
@@ -1178,10 +1269,10 @@ true
 | 
			
		||||
 | 
			
		||||
* Wed Jan  1 2003 Gordon Rowell <gordonr@e-smith.com>
 | 
			
		||||
- [1.9.3-08]
 | 
			
		||||
- Generate navigation.info files (config db format) for each supported 
 | 
			
		||||
- Generate navigation.info files (config db format) for each supported
 | 
			
		||||
  language in /etc/e-smith/locale/{language}/etc/e-smith/web/functions
 | 
			
		||||
- Read the navigation.info file for the preferred language when 
 | 
			
		||||
  displaying the navigation bar 
 | 
			
		||||
- Read the navigation.info file for the preferred language when
 | 
			
		||||
  displaying the navigation bar
 | 
			
		||||
- TODO: Actually select the correct navigation.info file [gordonr 5493]
 | 
			
		||||
 | 
			
		||||
* Tue Dec 31 2002 Gordon Rowell <gordonr@e-smith.com>
 | 
			
		||||
@@ -1222,7 +1313,7 @@ true
 | 
			
		||||
* Fri Nov 22 2002 Gordon Rowell <gordonr@e-smith.com>
 | 
			
		||||
- [1.9.1-02]
 | 
			
		||||
- templated header.htm [miked 5826]
 | 
			
		||||
- modified header.htm template to link to online-manual and blades 
 | 
			
		||||
- modified header.htm template to link to online-manual and blades
 | 
			
		||||
  [gordonr 5826]
 | 
			
		||||
 | 
			
		||||
* Thu Nov 21 2002 Mike Dickson <miked@e-smith.com>
 | 
			
		||||
@@ -1269,7 +1360,7 @@ true
 | 
			
		||||
* Thu May 16 2002 Tony Clayton <apc@e-smith.com>
 | 
			
		||||
- [1.5.8-01]
 | 
			
		||||
- Remove unnecessary <p> tags in navigation html [tonyc 3377]
 | 
			
		||||
- Fix navigation panel to not import symbols from fm subclasses 
 | 
			
		||||
- Fix navigation panel to not import symbols from fm subclasses
 | 
			
		||||
  [tonyc 3109]
 | 
			
		||||
 | 
			
		||||
* Mon May 13 2002 Tony Clayton <apc@e-smith.com>
 | 
			
		||||
@@ -1314,7 +1405,7 @@ true
 | 
			
		||||
 | 
			
		||||
* Thu Mar 14 2002 Gordon Rowell <gordonr@e-smith.com>
 | 
			
		||||
- [1.4.3-01]
 | 
			
		||||
- Fixed regexp for ignoring pleasewait(-.*?). Two each in 
 | 
			
		||||
- Fixed regexp for ignoring pleasewait(-.*?). Two each in
 | 
			
		||||
  pleasewait/noframes. Reduced to one in each [gordonr]
 | 
			
		||||
 | 
			
		||||
* Fri Mar 1 2002 Tony Clayton <tonyc@e-smith.com>
 | 
			
		||||
@@ -1347,7 +1438,7 @@ true
 | 
			
		||||
 | 
			
		||||
* Wed Nov 21 2001 Charlie Brady <charlieb@e-smith.com>
 | 
			
		||||
- [1.3.0-06]
 | 
			
		||||
- Remove troublesome "Requires: e-smith-base". 
 | 
			
		||||
- Remove troublesome "Requires: e-smith-base".
 | 
			
		||||
- Remove obsolete "Requires: e-smith".
 | 
			
		||||
 | 
			
		||||
* Thu Nov 1 2001 Gordon Rowell <gordonr@e-smith.com>
 | 
			
		||||
@@ -1386,7 +1477,7 @@ true
 | 
			
		||||
* Tue Jul 31 2001 Adrian Chung <adrianc@e-smith.com>
 | 
			
		||||
- [1.1.0-03]
 | 
			
		||||
- Adding SSL enabling templates for port 981.
 | 
			
		||||
- Adding 01localAccessString fragment for use in SSL 
 | 
			
		||||
- Adding 01localAccessString fragment for use in SSL
 | 
			
		||||
  enabling templates.
 | 
			
		||||
 | 
			
		||||
* Fri Jul 27 2001 Charlie Brady <charlieb@e-smith.com>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user