Compare commits
	
		
			13 Commits
		
	
	
		
			11_0_0-71_
			...
			11_0_0-82_
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| dbfeaa18a3 | |||
| ced08b28d4 | |||
| c74a71dee1 | |||
| 96b002e7a9 | |||
| f30b4ab2b5 | |||
| fa286e966d | |||
| 9bb2128891 | |||
| accf96df0d | |||
| 1c601f0ace | |||
| cffbe53fb4 | |||
| aad1a458f4 | |||
| 252bf20410 | |||
| ebbe7af9a7 | 
							
								
								
									
										2
									
								
								clog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								clog
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
* Thu May 01 2025 Brian Read <brianr@koozali.org> 11.0.0-81.sme
 | 
			
		||||
- Correct Weights for menus [SME: 12996]
 | 
			
		||||
							
								
								
									
										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,277 +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: 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:0;*/
 | 
			
		||||
     /*margin-bottom:0;*/
 | 
			
		||||
     */
 | 
			
		||||
}
 | 
			
		||||
 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:0;*/
 | 
			
		||||
     /*margin-bottom:4px;*/
 | 
			
		||||
     */
 | 
			
		||||
}
 | 
			
		||||
/* 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 ;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
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,358 +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.
 | 
			
		||||
 *----------------------------------------------------------------------
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
 | 
			
		||||
 | 
			
		||||
/*	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;
 | 
			
		||||
}
 | 
			
		||||
 #header2 {
 | 
			
		||||
     width:94.2%;
 | 
			
		||||
     margin-left:1px;
 | 
			
		||||
     /*margin-right:0;*/
 | 
			
		||||
     margin-top:4px;
 | 
			
		||||
}
 | 
			
		||||
 .module {
 | 
			
		||||
     padding: 20px;
 | 
			
		||||
     border: 1px solid #ccc;
 | 
			
		||||
     border-radius: 10px;
 | 
			
		||||
     background-color: #f9f9f9;
 | 
			
		||||
     box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
 | 
			
		||||
     margin-left:10px!important;
 | 
			
		||||
     margin-top:10px!important;
 | 
			
		||||
     /*margin-right:10px !important;*/
 | 
			
		||||
}
 | 
			
		||||
 #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-left : 5px;
 | 
			
		||||
}
 | 
			
		||||
 #header {
 | 
			
		||||
    /*background: #bee6a2;
 | 
			
		||||
    */
 | 
			
		||||
     width:100%;
 | 
			
		||||
     margin:auto;
 | 
			
		||||
}
 | 
			
		||||
 #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:0;*/
 | 
			
		||||
     /*margin-bottom:0;*/
 | 
			
		||||
}
 | 
			
		||||
 .sme-warning {
 | 
			
		||||
     color: orange;
 | 
			
		||||
     display:block;
 | 
			
		||||
     background-color: #ffffff;
 | 
			
		||||
     border-width: 1px;
 | 
			
		||||
     border-style: solid;
 | 
			
		||||
     border-color: orange ;
 | 
			
		||||
     padding: 2px;
 | 
			
		||||
    /* 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;
 | 
			
		||||
}
 | 
			
		||||
 .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%;
 | 
			
		||||
}
 | 
			
		||||
 #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 */
 | 
			
		||||
}
 | 
			
		||||
 .gradient-panel {
 | 
			
		||||
     width: 100%;
 | 
			
		||||
     height: 40px;
 | 
			
		||||
    /* Fixed height for the panel */
 | 
			
		||||
     background: linear-gradient(to right, white , #c0e7a5 );
 | 
			
		||||
    /* Deep green to light green */
 | 
			
		||||
     display: flex;
 | 
			
		||||
     align-items: center;
 | 
			
		||||
     position:relative;
 | 
			
		||||
}
 | 
			
		||||
 .logo {
 | 
			
		||||
     height: 142%;
 | 
			
		||||
    /* Fixed height for the logo */
 | 
			
		||||
     width: auto;
 | 
			
		||||
    /* Width will adjust to maintain aspect ratio */
 | 
			
		||||
     margin-left: -16px;
 | 
			
		||||
}
 | 
			
		||||
 .login-button {
 | 
			
		||||
     position: absolute;
 | 
			
		||||
     left: 7%;
 | 
			
		||||
    /* Positions the button 2/3 across the panel */
 | 
			
		||||
     transform: translateX(-50%);
 | 
			
		||||
    /* Centers the button on its position */
 | 
			
		||||
     background-color: #4caf50b8;
 | 
			
		||||
     color: white !important;
 | 
			
		||||
     border: none;
 | 
			
		||||
     padding: 8px 16px;
 | 
			
		||||
     text-align: center;
 | 
			
		||||
     text-decoration: none;
 | 
			
		||||
     display: inline-block;
 | 
			
		||||
     font-size: 14px;
 | 
			
		||||
     cursor: pointer;
 | 
			
		||||
     border-radius: 4px;
 | 
			
		||||
     margin-left:77% 
 | 
			
		||||
}
 | 
			
		||||
 .login-button:hover {
 | 
			
		||||
     background-color: #45a049;
 | 
			
		||||
}
 | 
			
		||||
 .flag-style {
 | 
			
		||||
     position: absolute;
 | 
			
		||||
     transform: translateY(-50%);
 | 
			
		||||
     left: 95%;
 | 
			
		||||
    /*right: 20px;
 | 
			
		||||
    */
 | 
			
		||||
     width: 24px;
 | 
			
		||||
     height: 14px;
 | 
			
		||||
     display: inline-block;
 | 
			
		||||
     vertical-align: middle;
 | 
			
		||||
}
 | 
			
		||||
 .no-visited-state:visited {
 | 
			
		||||
     color: inherit;
 | 
			
		||||
    /* Or specify the desired color */
 | 
			
		||||
     text-decoration: none;
 | 
			
		||||
    /* Or any other style you want to reset */
 | 
			
		||||
}
 | 
			
		||||
/*end*/
 | 
			
		||||
EOF
 | 
			
		||||
}
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
/* DO NOT MODIFY THIS FILE! It is updated automatically */
 | 
			
		||||
@@ -30,8 +30,11 @@ use SrvMngr::Plugin::WithoutCache;
 | 
			
		||||
 | 
			
		||||
use esmith::I18N;
 | 
			
		||||
 | 
			
		||||
# 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 = '70.el8.sme'; 
 | 
			
		||||
our $VERSION = '78.el8.sme'; 
 | 
			
		||||
#Extract the release value
 | 
			
		||||
if ($VERSION =~ /^(\d+)/) {
 | 
			
		||||
    $VERSION = $1;  # $1 contains the matched numeric digits
 | 
			
		||||
@@ -46,7 +49,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 +304,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');
 | 
			
		||||
@@ -549,9 +553,10 @@ 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,6 +565,26 @@ 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->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
 | 
			
		||||
@@ -638,70 +663,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 {
 | 
			
		||||
 | 
			
		||||
@@ -925,4 +990,4 @@ sub get_reg_mask {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Login;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Support
 | 
			
		||||
# description : Login
 | 
			
		||||
# navigation  : 0000 001
 | 
			
		||||
# navigation  : 0 200
 | 
			
		||||
# menu        : N
 | 
			
		||||
#
 | 
			
		||||
# 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
 | 
			
		||||
 
 | 
			
		||||
@@ -142,6 +142,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->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";
 | 
			
		||||
 | 
			
		||||
        my @tcpforwards = $tcp_db->get_all;
 | 
			
		||||
        my @udpforwards = $udp_db->get_all;
 | 
			
		||||
        my $empty       = 1 if not @tcpforwards and not @udpforwards;
 | 
			
		||||
@@ -211,6 +215,7 @@ sub add_portforward {
 | 
			
		||||
 | 
			
		||||
sub get_destination_host {
 | 
			
		||||
    my $q           = shift;
 | 
			
		||||
	$cdb = esmith::ConfigDB->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 +362,7 @@ sub isValidPort() {
 | 
			
		||||
 | 
			
		||||
sub validate_destination_host {
 | 
			
		||||
    my $c     = shift;
 | 
			
		||||
	$cdb = esmith::ConfigDB->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');
 | 
			
		||||
@@ -395,4 +401,4 @@ sub validate_allowed_hosts {
 | 
			
		||||
    } ## end foreach (split(/[\s,]+/, $ahost...))
 | 
			
		||||
    return %valid_ahost_list;
 | 
			
		||||
} ## end sub validate_allowed_hosts
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Printers;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : Printers
 | 
			
		||||
# navigation  : 4000 800
 | 
			
		||||
# navigation  : 4000 900
 | 
			
		||||
#
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ package SrvMngr::Controller::Proxy;
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : System
 | 
			
		||||
# description : Proxy settings
 | 
			
		||||
# navigation  : 4000 710
 | 
			
		||||
# navigation  : 4000 800
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
#
 | 
			
		||||
# routes : end
 | 
			
		||||
 
 | 
			
		||||
@@ -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";
 | 
			
		||||
my  $db; # = esmith::ConfigDB->open || warn "Couldn't open configuration database"; 
 | 
			
		||||
 | 
			
		||||
sub main {
 | 
			
		||||
    my $c = shift;
 | 
			
		||||
@@ -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->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,8 @@ sub get_prop {
 | 
			
		||||
sub get_value {
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $item = shift;
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    return ($db->get($item)->value());
 | 
			
		||||
} ## end sub get_value
 | 
			
		||||
 | 
			
		||||
@@ -179,8 +182,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 +205,7 @@ sub get_ftp_password_login_access {
 | 
			
		||||
} ## end sub get_ftp_password_login_access
 | 
			
		||||
 | 
			
		||||
sub get_telnet_mode {
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    my $telnet = $db->get('telnet');
 | 
			
		||||
    return ('off') unless $telnet;
 | 
			
		||||
    my $status = $telnet->prop('status') || 'disabled';
 | 
			
		||||
@@ -211,8 +215,8 @@ sub get_telnet_mode {
 | 
			
		||||
} ## end sub get_telnet_mode
 | 
			
		||||
 | 
			
		||||
sub get_ipsecrw_sessions {
 | 
			
		||||
    $db = esmith::ConfigDB->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 +225,7 @@ sub get_ipsecrw_sessions {
 | 
			
		||||
} ## end sub get_ipsecrw_sessions
 | 
			
		||||
 | 
			
		||||
sub get_ipsecrw_status {
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    return undef unless ($db->get('ipsec'));
 | 
			
		||||
    return $db->get('ipsec')->prop('RoadWarriorStatus');
 | 
			
		||||
}
 | 
			
		||||
@@ -228,6 +233,7 @@ sub get_ipsecrw_status {
 | 
			
		||||
sub pptp_and_dhcp_range {
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my $val         = shift || 0;
 | 
			
		||||
    $db = esmith::ConfigDB->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 +251,7 @@ sub pptp_and_dhcp_range {
 | 
			
		||||
 | 
			
		||||
sub _get_valid_from {
 | 
			
		||||
    my $c   = shift;
 | 
			
		||||
    $db = esmith::ConfigDB->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 +294,12 @@ sub validate_network_and_mask {
 | 
			
		||||
 | 
			
		||||
sub change_settings {
 | 
			
		||||
    my ($c, %rma_datas) = @_;
 | 
			
		||||
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    # good; go ahead and change the access.
 | 
			
		||||
    #------------------------------------------------------------
 | 
			
		||||
    $db = esmith::ConfigDB->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 +370,7 @@ sub change_settings {
 | 
			
		||||
sub set_ipsecrw_sessions {
 | 
			
		||||
    my $c        = shift;
 | 
			
		||||
    my $sessions = shift;
 | 
			
		||||
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
    if (defined $sessions) {
 | 
			
		||||
        $db->get('ipsec')->set_prop('RoadWarriorSessions', $sessions);
 | 
			
		||||
 | 
			
		||||
@@ -378,6 +385,7 @@ sub add_new_valid_from {
 | 
			
		||||
    my $c    = shift;
 | 
			
		||||
    my $net  = shift;
 | 
			
		||||
    my $mask = shift;
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
 | 
			
		||||
    # we transform bit mask to regular mask
 | 
			
		||||
    $mask = get_reg_mask($net, $mask);
 | 
			
		||||
@@ -400,6 +408,7 @@ sub remove_valid_from {
 | 
			
		||||
    my $c           = shift;
 | 
			
		||||
    my $remove_nets = shift;
 | 
			
		||||
    my @remove      = split /,/, $remove_nets;
 | 
			
		||||
    $db = esmith::ConfigDB->open || warn "Couldn't open configuration database";
 | 
			
		||||
 | 
			
		||||
    #	my @remove = $c->param('Remove_nets');
 | 
			
		||||
    my @vals = $c->_get_valid_from();
 | 
			
		||||
@@ -430,4 +439,4 @@ sub remove_valid_from {
 | 
			
		||||
    $db->get('httpd-admin')->set_prop('ValidFrom', $prop);
 | 
			
		||||
    return 1;
 | 
			
		||||
} ## end sub remove_valid_from
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
@@ -1,16 +1,11 @@
 | 
			
		||||
package SrvMngr::Controller::Review;
 | 
			
		||||
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading     : Support
 | 
			
		||||
# heading     : Investigation
 | 
			
		||||
# description : Review configuration
 | 
			
		||||
# navigation  : 000 500
 | 
			
		||||
# menu        : N
 | 
			
		||||
# navigation  : 7000 600
 | 
			
		||||
# routes : end
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
# heading-o     : Configuration
 | 
			
		||||
# description-o : Review configuration
 | 
			
		||||
# navigation-o  : 6000 6800
 | 
			
		||||
#----------------------------------------------------------------------
 | 
			
		||||
use strict;
 | 
			
		||||
use warnings;
 | 
			
		||||
use Mojo::Base 'Mojolicious::Controller';
 | 
			
		||||
@@ -313,4 +308,4 @@ sub get_public_ip_address
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
1;
 | 
			
		||||
1;
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,8 @@ sub main {
 | 
			
		||||
    my %log_datas = ();
 | 
			
		||||
    my $title     = $c->l('log_FORM_TITLE');
 | 
			
		||||
    my $notif     = '';
 | 
			
		||||
    $log_datas{default_op} = ($cdb->get('viewlogfiles')->prop('DefaultOperation')) || 'view';
 | 
			
		||||
    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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										99
									
								
								root/usr/share/smanager/lib/SrvMngr_Auth.pm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								root/usr/share/smanager/lib/SrvMngr_Auth.pm
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,99 @@
 | 
			
		||||
# 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;
 | 
			
		||||
 | 
			
		||||
# 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->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 $panel eq lc($allowed_panel); #Controller files are capitalised, but that is lost in panel id.
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    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
 | 
			
		||||
@@ -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 */
 | 
			
		||||
}
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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'
 | 
			
		||||
 
 | 
			
		||||
@@ -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,47 +1,10 @@
 | 
			
		||||
 | 
			
		||||
<!--
 | 
			
		||||
<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>
 | 
			
		||||
</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"><%= $c->session->{username} %> Logout</a></button>
 | 
			
		||||
		<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 -->
 | 
			
		||||
 
 | 
			
		||||
@@ -13,17 +13,18 @@
 | 
			
		||||
	% 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 { 
 | 
			
		||||
	   <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 />
 | 
			
		||||
@@ -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>
 | 
			
		||||
 
 | 
			
		||||
@@ -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'
 | 
			
		||||
 
 | 
			
		||||
@@ -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 71
 | 
			
		||||
%define release 82
 | 
			
		||||
Version: %{version}
 | 
			
		||||
Release: %{release}%{?dist}
 | 
			
		||||
License: GPL
 | 
			
		||||
@@ -143,6 +143,44 @@ true
 | 
			
		||||
%defattr(-,root,root)
 | 
			
		||||
 | 
			
		||||
%changelog
 | 
			
		||||
* 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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user