auto-format all files; add table-definitions to test-bootstrap file
Signed-off-by: Michael Kaufmann <d00p@froxlor.org>
This commit is contained in:
@@ -3,6 +3,7 @@ namespace Froxlor\Api\Commands;
|
||||
|
||||
use Froxlor\Database as Database;
|
||||
use Froxlor\Settings as Settings;
|
||||
|
||||
/**
|
||||
* This file is part of the Froxlor project.
|
||||
* Copyright (c) 2010 the Froxlor Team (see authors).
|
||||
@@ -11,12 +12,12 @@ use Froxlor\Settings as Settings;
|
||||
* file that was distributed with this source code. You can also view the
|
||||
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package API
|
||||
* @since 0.10.0
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package API
|
||||
* @since 0.10.0
|
||||
*
|
||||
*/
|
||||
class EmailForwarders extends \Froxlor\Api\ApiCommand implements \Froxlor\Api\ResourceEntity
|
||||
{
|
||||
|
||||
@@ -3,7 +3,6 @@ namespace Froxlor\Api\Commands;
|
||||
|
||||
use Froxlor\Database as Database;
|
||||
|
||||
|
||||
/**
|
||||
* This file is part of the Froxlor project.
|
||||
* Copyright (c) 2010 the Froxlor Team (see authors).
|
||||
|
||||
@@ -3,6 +3,7 @@ namespace Froxlor\Api\Commands;
|
||||
|
||||
use Froxlor\Database as Database;
|
||||
use Froxlor\Settings as Settings;
|
||||
|
||||
/**
|
||||
* This file is part of the Froxlor project.
|
||||
* Copyright (c) 2010 the Froxlor Team (see authors).
|
||||
@@ -11,12 +12,12 @@ use Froxlor\Settings as Settings;
|
||||
* file that was distributed with this source code. You can also view the
|
||||
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package API
|
||||
* @since 0.10.0
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package API
|
||||
* @since 0.10.0
|
||||
*
|
||||
*/
|
||||
class SubDomains extends \Froxlor\Api\ApiCommand implements \Froxlor\Api\ResourceEntity
|
||||
{
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<?php
|
||||
|
||||
namespace Froxlor\Cli;
|
||||
|
||||
/**
|
||||
@@ -16,7 +15,6 @@ namespace Froxlor\Cli;
|
||||
* @package Cron
|
||||
*
|
||||
*/
|
||||
|
||||
class ConfigServicesCmd extends CmdLineHandler
|
||||
{
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
namespace Froxlor\Cron\Http;
|
||||
|
||||
use Froxlor\Database\Database;
|
||||
use \Froxlor\Settings;
|
||||
use Froxlor\Settings;
|
||||
use Froxlor\Cron\Http\Php\Fpm;
|
||||
use Froxlor\Cron\Http\Php\PhpInterface;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
namespace Froxlor\Cron\Http;
|
||||
|
||||
use Froxlor\Database\Database;
|
||||
use \Froxlor\Settings;
|
||||
use Froxlor\Settings;
|
||||
use Froxlor\Cron\Http\Php\PhpInterface;
|
||||
|
||||
/**
|
||||
@@ -14,27 +14,25 @@ use Froxlor\Cron\Http\Php\PhpInterface;
|
||||
* file that was distributed with this source code. You can also view the
|
||||
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Florian Lippert <flo@syscp.org> (2003-2009)
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Cron
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Florian Lippert <flo@syscp.org> (2003-2009)
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Cron
|
||||
*
|
||||
*/
|
||||
|
||||
class ApacheFcgi extends Apache
|
||||
{
|
||||
|
||||
protected function composePhpOptions($domain, $ssl_vhost = false)
|
||||
{
|
||||
$php_options_text = '';
|
||||
|
||||
if($domain['phpenabled_customer'] == 1 && $domain['phpenabled_vhost'] == '1')
|
||||
{
|
||||
if ($domain['phpenabled_customer'] == 1 && $domain['phpenabled_vhost'] == '1') {
|
||||
$php = new PhpInterface($domain);
|
||||
$phpconfig = $php->getPhpConfig((int)$domain['phpsettingid']);
|
||||
$phpconfig = $php->getPhpConfig((int) $domain['phpsettingid']);
|
||||
|
||||
if((int)Settings::Get('phpfpm.enabled') == 1)
|
||||
{
|
||||
if ((int) Settings::Get('phpfpm.enabled') == 1) {
|
||||
$srvName = 'fpm.external';
|
||||
if ($domain['ssl'] == 1 && $ssl_vhost) {
|
||||
$srvName = 'ssl-fpm.external';
|
||||
@@ -42,116 +40,107 @@ class ApacheFcgi extends Apache
|
||||
// #1317 - perl is executed via apache and therefore, when using fpm, does not know the user
|
||||
// which perl is supposed to run as, hence the need for Suexec need
|
||||
if (customerHasPerlEnabled($domain['customerid'])) {
|
||||
$php_options_text.= ' SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n";
|
||||
$php_options_text .= ' SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n";
|
||||
}
|
||||
|
||||
|
||||
// mod_proxy stuff for apache-2.4
|
||||
if (Settings::Get('system.apache24') == '1'
|
||||
&& Settings::Get('phpfpm.use_mod_proxy') == '1'
|
||||
) {
|
||||
if (Settings::Get('system.apache24') == '1' && Settings::Get('phpfpm.use_mod_proxy') == '1') {
|
||||
$filesmatch = $phpconfig['fpm_settings']['limit_extensions'];
|
||||
$extensions = explode(" ", $filesmatch);
|
||||
$filesmatch = "";
|
||||
foreach ($extensions as $ext) {
|
||||
$filesmatch .= substr($ext, 1).'|';
|
||||
$filesmatch .= substr($ext, 1) . '|';
|
||||
}
|
||||
// start block, cut off last pipe and close block
|
||||
$filesmatch = '('.str_replace(".", "\.", substr($filesmatch, 0, -1)).')';
|
||||
$php_options_text.= ' <FilesMatch \.'.$filesmatch.'$>'. "\n";
|
||||
$php_options_text.= ' SetHandler proxy:unix:' . $php->getInterface()->getSocketFile() . '|fcgi://localhost'. "\n";
|
||||
$php_options_text.= ' </FilesMatch>' . "\n";
|
||||
$filesmatch = '(' . str_replace(".", "\.", substr($filesmatch, 0, - 1)) . ')';
|
||||
$php_options_text .= ' <FilesMatch \.' . $filesmatch . '$>' . "\n";
|
||||
$php_options_text .= ' SetHandler proxy:unix:' . $php->getInterface()->getSocketFile() . '|fcgi://localhost' . "\n";
|
||||
$php_options_text .= ' </FilesMatch>' . "\n";
|
||||
|
||||
$mypath_dir = new \Froxlor\Http\Directory($domain['documentroot']);
|
||||
|
||||
// only create the require all granted if there is not active directory-protection
|
||||
// for this path, as this would be the first require and therefore grant all access
|
||||
if ($mypath_dir->isUserProtected() == false) {
|
||||
$php_options_text.= ' <Directory "' . \Froxlor\FileDir::makeCorrectDir($domain['documentroot']) . '">' . "\n";
|
||||
// only create the require all granted if there is not active directory-protection
|
||||
// for this path, as this would be the first require and therefore grant all access
|
||||
if ($mypath_dir->isUserProtected() == false) {
|
||||
$php_options_text .= ' <Directory "' . \Froxlor\FileDir::makeCorrectDir($domain['documentroot']) . '">' . "\n";
|
||||
if ($phpconfig['pass_authorizationheader'] == '1') {
|
||||
$php_options_text.= ' CGIPassAuth On' . "\n";
|
||||
$php_options_text .= ' CGIPassAuth On' . "\n";
|
||||
}
|
||||
$php_options_text.= ' Require all granted' . "\n";
|
||||
$php_options_text.= ' AllowOverride All' . "\n";
|
||||
$php_options_text.= ' </Directory>' . "\n";
|
||||
} elseif ($phpconfig['pass_authorizationheader'] == '1') {
|
||||
$php_options_text .= ' Require all granted' . "\n";
|
||||
$php_options_text .= ' AllowOverride All' . "\n";
|
||||
$php_options_text .= ' </Directory>' . "\n";
|
||||
} elseif ($phpconfig['pass_authorizationheader'] == '1') {
|
||||
// allow Pass of Authorization header
|
||||
$php_options_text.= ' <Directory "' . \Froxlor\FileDir::makeCorrectDir($domain['documentroot']) . '">' . "\n";
|
||||
$php_options_text.= ' CGIPassAuth On' . "\n";
|
||||
$php_options_text.= ' </Directory>' . "\n";
|
||||
}
|
||||
|
||||
$php_options_text .= ' <Directory "' . \Froxlor\FileDir::makeCorrectDir($domain['documentroot']) . '">' . "\n";
|
||||
$php_options_text .= ' CGIPassAuth On' . "\n";
|
||||
$php_options_text .= ' </Directory>' . "\n";
|
||||
}
|
||||
} else {
|
||||
$addheader = "";
|
||||
if ($phpconfig['pass_authorizationheader'] == '1') {
|
||||
$addheader = " -pass-header Authorization";
|
||||
}
|
||||
$php_options_text.= ' FastCgiExternalServer ' . $php->getInterface()->getAliasConfigDir() . $srvName . ' -socket ' . $php->getInterface()->getSocketFile() . ' -idle-timeout ' . $phpconfig['fpm_settings']['idle_timeout'] . $addheader . "\n";
|
||||
$php_options_text.= ' <Directory "' . \Froxlor\FileDir::makeCorrectDir($domain['documentroot']) . '">' . "\n";
|
||||
$php_options_text .= ' FastCgiExternalServer ' . $php->getInterface()->getAliasConfigDir() . $srvName . ' -socket ' . $php->getInterface()->getSocketFile() . ' -idle-timeout ' . $phpconfig['fpm_settings']['idle_timeout'] . $addheader . "\n";
|
||||
$php_options_text .= ' <Directory "' . \Froxlor\FileDir::makeCorrectDir($domain['documentroot']) . '">' . "\n";
|
||||
$filesmatch = $phpconfig['fpm_settings']['limit_extensions'];
|
||||
$extensions = explode(" ", $filesmatch);
|
||||
$filesmatch = "";
|
||||
foreach ($extensions as $ext) {
|
||||
$filesmatch .= substr($ext, 1).'|';
|
||||
$filesmatch .= substr($ext, 1) . '|';
|
||||
}
|
||||
// start block, cut off last pipe and close block
|
||||
$filesmatch = '('.str_replace(".", "\.", substr($filesmatch, 0, -1)).')';
|
||||
$php_options_text.= ' <FilesMatch \.'.$filesmatch.'$>'. "\n";
|
||||
$php_options_text.= ' SetHandler php-fastcgi'. "\n";
|
||||
$php_options_text.= ' Action php-fastcgi /fastcgiphp' . "\n";
|
||||
$php_options_text.= ' Options +ExecCGI' . "\n";
|
||||
$php_options_text.= ' </FilesMatch>' . "\n";
|
||||
$filesmatch = '(' . str_replace(".", "\.", substr($filesmatch, 0, - 1)) . ')';
|
||||
$php_options_text .= ' <FilesMatch \.' . $filesmatch . '$>' . "\n";
|
||||
$php_options_text .= ' SetHandler php-fastcgi' . "\n";
|
||||
$php_options_text .= ' Action php-fastcgi /fastcgiphp' . "\n";
|
||||
$php_options_text .= ' Options +ExecCGI' . "\n";
|
||||
$php_options_text .= ' </FilesMatch>' . "\n";
|
||||
// >=apache-2.4 enabled?
|
||||
if (Settings::Get('system.apache24') == '1') {
|
||||
$mypath_dir = new \Froxlor\Http\Directory($domain['documentroot']);
|
||||
// only create the require all granted if there is not active directory-protection
|
||||
// for this path, as this would be the first require and therefore grant all access
|
||||
if ($mypath_dir->isUserProtected() == false) {
|
||||
$php_options_text.= ' Require all granted' . "\n";
|
||||
$php_options_text.= ' AllowOverride All' . "\n";
|
||||
}
|
||||
$mypath_dir = new \Froxlor\Http\Directory($domain['documentroot']);
|
||||
// only create the require all granted if there is not active directory-protection
|
||||
// for this path, as this would be the first require and therefore grant all access
|
||||
if ($mypath_dir->isUserProtected() == false) {
|
||||
$php_options_text .= ' Require all granted' . "\n";
|
||||
$php_options_text .= ' AllowOverride All' . "\n";
|
||||
}
|
||||
} else {
|
||||
$php_options_text.= ' Order allow,deny' . "\n";
|
||||
$php_options_text.= ' allow from all' . "\n";
|
||||
$php_options_text .= ' Order allow,deny' . "\n";
|
||||
$php_options_text .= ' allow from all' . "\n";
|
||||
}
|
||||
$php_options_text.= ' </Directory>' . "\n";
|
||||
$php_options_text.= ' Alias /fastcgiphp ' . $php->getInterface()->getAliasConfigDir() . $srvName . "\n";
|
||||
$php_options_text .= ' </Directory>' . "\n";
|
||||
$php_options_text .= ' Alias /fastcgiphp ' . $php->getInterface()->getAliasConfigDir() . $srvName . "\n";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$php_options_text.= ' FcgidIdleTimeout ' . Settings::Get('system.mod_fcgid_idle_timeout') . "\n";
|
||||
if((int)Settings::Get('system.mod_fcgid_wrapper') == 0)
|
||||
{
|
||||
$php_options_text.= ' SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n";
|
||||
$php_options_text.= ' ScriptAlias /php/ ' . $php->getInterface()->getConfigDir() . "\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
$php_options_text.= ' SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n";
|
||||
$php_options_text.= ' <Directory "' . \Froxlor\FileDir::makeCorrectDir($domain['documentroot']) . '">' . "\n";
|
||||
} else {
|
||||
$php_options_text .= ' FcgidIdleTimeout ' . Settings::Get('system.mod_fcgid_idle_timeout') . "\n";
|
||||
if ((int) Settings::Get('system.mod_fcgid_wrapper') == 0) {
|
||||
$php_options_text .= ' SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n";
|
||||
$php_options_text .= ' ScriptAlias /php/ ' . $php->getInterface()->getConfigDir() . "\n";
|
||||
} else {
|
||||
$php_options_text .= ' SuexecUserGroup "' . $domain['loginname'] . '" "' . $domain['loginname'] . '"' . "\n";
|
||||
$php_options_text .= ' <Directory "' . \Froxlor\FileDir::makeCorrectDir($domain['documentroot']) . '">' . "\n";
|
||||
$file_extensions = explode(' ', $phpconfig['file_extensions']);
|
||||
$php_options_text.= ' <FilesMatch "\.(' . implode('|', $file_extensions) . ')$">' . "\n";
|
||||
$php_options_text.= ' SetHandler fcgid-script' . "\n";
|
||||
foreach($file_extensions as $file_extension)
|
||||
{
|
||||
$php_options_text.= ' FcgidWrapper ' . $php->getInterface()->getStarterFile() . ' .' . $file_extension . "\n";
|
||||
$php_options_text .= ' <FilesMatch "\.(' . implode('|', $file_extensions) . ')$">' . "\n";
|
||||
$php_options_text .= ' SetHandler fcgid-script' . "\n";
|
||||
foreach ($file_extensions as $file_extension) {
|
||||
$php_options_text .= ' FcgidWrapper ' . $php->getInterface()->getStarterFile() . ' .' . $file_extension . "\n";
|
||||
}
|
||||
$php_options_text.= ' Options +ExecCGI' . "\n";
|
||||
$php_options_text.= ' </FilesMatch>' . "\n";
|
||||
$php_options_text .= ' Options +ExecCGI' . "\n";
|
||||
$php_options_text .= ' </FilesMatch>' . "\n";
|
||||
// >=apache-2.4 enabled?
|
||||
if (Settings::Get('system.apache24') == '1') {
|
||||
$mypath_dir = new \Froxlor\Http\Directory($domain['documentroot']);
|
||||
// only create the require all granted if there is not active directory-protection
|
||||
// for this path, as this would be the first require and therefore grant all access
|
||||
if ($mypath_dir->isUserProtected() == false) {
|
||||
$php_options_text.= ' Require all granted' . "\n";
|
||||
$php_options_text.= ' AllowOverride All' . "\n";
|
||||
}
|
||||
$mypath_dir = new \Froxlor\Http\Directory($domain['documentroot']);
|
||||
// only create the require all granted if there is not active directory-protection
|
||||
// for this path, as this would be the first require and therefore grant all access
|
||||
if ($mypath_dir->isUserProtected() == false) {
|
||||
$php_options_text .= ' Require all granted' . "\n";
|
||||
$php_options_text .= ' AllowOverride All' . "\n";
|
||||
}
|
||||
} else {
|
||||
$php_options_text.= ' Order allow,deny' . "\n";
|
||||
$php_options_text.= ' allow from all' . "\n";
|
||||
$php_options_text .= ' Order allow,deny' . "\n";
|
||||
$php_options_text .= ' allow from all' . "\n";
|
||||
}
|
||||
$php_options_text.= ' </Directory>' . "\n";
|
||||
$php_options_text .= ' </Directory>' . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -161,10 +150,8 @@ class ApacheFcgi extends Apache
|
||||
// create php.ini (fpm does nothing here, as it
|
||||
// defines ini-settings in its pool config)
|
||||
$php->getInterface()->createIniFile($phpconfig);
|
||||
}
|
||||
else
|
||||
{
|
||||
$php_options_text.= ' # PHP is disabled for this vHost' . "\n";
|
||||
} else {
|
||||
$php_options_text .= ' # PHP is disabled for this vHost' . "\n";
|
||||
}
|
||||
|
||||
return $php_options_text;
|
||||
@@ -172,23 +159,16 @@ class ApacheFcgi extends Apache
|
||||
|
||||
public function createOwnVhostStarter()
|
||||
{
|
||||
if (Settings::Get('system.mod_fcgid_ownvhost') == '1'
|
||||
|| (Settings::Get('phpfpm.enabled') == '1'
|
||||
&& Settings::Get('phpfpm.enabled_ownvhost') == '1')
|
||||
) {
|
||||
if (Settings::Get('system.mod_fcgid_ownvhost') == '1' || (Settings::Get('phpfpm.enabled') == '1' && Settings::Get('phpfpm.enabled_ownvhost') == '1')) {
|
||||
$mypath = \Froxlor\Froxlor::getInstallDir();
|
||||
|
||||
if (Settings::Get('system.mod_fcgid_ownvhost') == '1')
|
||||
{
|
||||
if (Settings::Get('system.mod_fcgid_ownvhost') == '1') {
|
||||
$user = Settings::Get('system.mod_fcgid_httpuser');
|
||||
$group = Settings::Get('system.mod_fcgid_httpgroup');
|
||||
}
|
||||
elseif(Settings::Get('phpfpm.enabled') == '1'
|
||||
&& Settings::Get('phpfpm.enabled_ownvhost') == '1'
|
||||
) {
|
||||
} elseif (Settings::Get('phpfpm.enabled') == '1' && Settings::Get('phpfpm.enabled_ownvhost') == '1') {
|
||||
$user = Settings::Get('phpfpm.vhost_httpuser');
|
||||
$group = Settings::Get('phpfpm.vhost_httpgroup');
|
||||
|
||||
|
||||
// get fpm config
|
||||
$fpm_sel_stmt = Database::prepare("
|
||||
SELECT f.id FROM `" . TABLE_PANEL_FPMDAEMONS . "` f
|
||||
@@ -204,8 +184,8 @@ class ApacheFcgi extends Apache
|
||||
'id' => 'none',
|
||||
'domain' => Settings::Get('system.hostname'),
|
||||
'adminid' => 1, /* first admin-user (superadmin) */
|
||||
'mod_fcgid_starter' => -1,
|
||||
'mod_fcgid_maxrequests' => -1,
|
||||
'mod_fcgid_starter' => - 1,
|
||||
'mod_fcgid_maxrequests' => - 1,
|
||||
'guid' => $user,
|
||||
'openbasedir' => 0,
|
||||
'email' => Settings::Get('panel.adminmail'),
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
<?php if (!defined('MASTER_CRONJOB')) die('You cannot access this file directly!');
|
||||
<?php
|
||||
|
||||
if (! defined('MASTER_CRONJOB'))
|
||||
die('You cannot access this file directly!');
|
||||
|
||||
/**
|
||||
* This file is part of the Froxlor project.
|
||||
@@ -8,17 +11,16 @@
|
||||
* file that was distributed with this source code. You can also view the
|
||||
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Cron
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Cron
|
||||
*
|
||||
*/
|
||||
use \Froxlor\Database;
|
||||
use \Froxlor\Settings;
|
||||
use Froxlor\Database;
|
||||
use Froxlor\Settings;
|
||||
|
||||
if ((int)Settings::Get('system.report_webmax') > 0)
|
||||
{
|
||||
if ((int) Settings::Get('system.report_webmax') > 0) {
|
||||
/**
|
||||
* report about diskusage for customers
|
||||
*/
|
||||
@@ -34,11 +36,7 @@ if ((int)Settings::Get('system.report_webmax') > 0)
|
||||
|
||||
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||
|
||||
if (isset($row['diskspace'])
|
||||
&& $row['diskspace_used'] != null
|
||||
&& $row['diskspace_used'] > 0
|
||||
&& (($row['diskspace_used'] * 100) / $row['diskspace']) >= (int)Settings::Get('system.report_webmax')
|
||||
) {
|
||||
if (isset($row['diskspace']) && $row['diskspace_used'] != null && $row['diskspace_used'] > 0 && (($row['diskspace_used'] * 100) / $row['diskspace']) >= (int) Settings::Get('system.report_webmax')) {
|
||||
|
||||
$rep_userinfo = array(
|
||||
'name' => $row['name'],
|
||||
@@ -58,12 +56,16 @@ if ((int)Settings::Get('system.report_webmax') > 0)
|
||||
SELECT `file` FROM `" . TABLE_PANEL_LANGUAGE . "`
|
||||
WHERE `language` = :deflang
|
||||
");
|
||||
$lngfile = Database::pexecute_first($lngfile_stmt, array('deflang' => $row['def_language']));
|
||||
$lngfile = Database::pexecute_first($lngfile_stmt, array(
|
||||
'deflang' => $row['def_language']
|
||||
));
|
||||
|
||||
if ($lngfile !== null) {
|
||||
$langfile = $lngfile['file'];
|
||||
} else {
|
||||
$lngfile = Database::pexecute_first($lngfile_stmt, array('deflang' => Settings::Get('panel.standardlanguage')));
|
||||
$lngfile = Database::pexecute_first($lngfile_stmt, array(
|
||||
'deflang' => Settings::Get('panel.standardlanguage')
|
||||
));
|
||||
$langfile = $lngfile['file'];
|
||||
}
|
||||
|
||||
@@ -99,7 +101,7 @@ if ((int)Settings::Get('system.report_webmax') > 0)
|
||||
$mail->MsgHTML(nl2br($mail_body));
|
||||
$mail->AddAddress($row['email'], $row['name']);
|
||||
$mail->Send();
|
||||
} catch(\PHPMailer\PHPMailer\Exception $e) {
|
||||
} catch (\PHPMailer\PHPMailer\Exception $e) {
|
||||
$mailerr_msg = $e->errorMessage();
|
||||
$_mailerror = true;
|
||||
} catch (Exception $e) {
|
||||
@@ -117,7 +119,9 @@ if ((int)Settings::Get('system.report_webmax') > 0)
|
||||
UPDATE `" . TABLE_PANEL_CUSTOMERS . "` SET `reportsent` = '2'
|
||||
WHERE `customerid` = :customerid
|
||||
");
|
||||
Database::pexecute($upd_stmt, array('customerid' => $row['customerid']));
|
||||
Database::pexecute($upd_stmt, array(
|
||||
'customerid' => $row['customerid']
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -130,11 +134,7 @@ if ((int)Settings::Get('system.report_webmax') > 0)
|
||||
|
||||
while ($row = $result_stmt->fetch(PDO::FETCH_ASSOC)) {
|
||||
|
||||
if (isset($row['diskspace'])
|
||||
&& $row['diskspace_used'] != null
|
||||
&& $row['diskspace_used'] > 0
|
||||
&& (($row['diskspace_used'] * 100) / $row['diskspace']) >= (int)Settings::Get('system.report_webmax')
|
||||
) {
|
||||
if (isset($row['diskspace']) && $row['diskspace_used'] != null && $row['diskspace_used'] > 0 && (($row['diskspace_used'] * 100) / $row['diskspace']) >= (int) Settings::Get('system.report_webmax')) {
|
||||
|
||||
$replace_arr = array(
|
||||
'NAME' => $row['name'],
|
||||
@@ -148,12 +148,16 @@ if ((int)Settings::Get('system.report_webmax') > 0)
|
||||
SELECT `file` FROM `" . TABLE_PANEL_LANGUAGE . "`
|
||||
WHERE `language` = :deflang
|
||||
");
|
||||
$lngfile = Database::pexecute_first($lngfile_stmt, array('deflang' => $row['def_language']));
|
||||
$lngfile = Database::pexecute_first($lngfile_stmt, array(
|
||||
'deflang' => $row['def_language']
|
||||
));
|
||||
|
||||
if ($lngfile !== null) {
|
||||
$langfile = $lngfile['file'];
|
||||
} else {
|
||||
$lngfile = Database::pexecute_first($lngfile_stmt, array('deflang' => Settings::Get('panel.standardlanguage')));
|
||||
$lngfile = Database::pexecute_first($lngfile_stmt, array(
|
||||
'deflang' => Settings::Get('panel.standardlanguage')
|
||||
));
|
||||
$langfile = $lngfile['file'];
|
||||
}
|
||||
|
||||
@@ -189,7 +193,7 @@ if ((int)Settings::Get('system.report_webmax') > 0)
|
||||
$mail->MsgHTML(nl2br($mail_body));
|
||||
$mail->AddAddress($row['email'], $row['name']);
|
||||
$mail->Send();
|
||||
} catch(\PHPMailer\PHPMailer\Exception $e) {
|
||||
} catch (\PHPMailer\PHPMailer\Exception $e) {
|
||||
$mailerr_msg = $e->errorMessage();
|
||||
$_mailerror = true;
|
||||
} catch (Exception $e) {
|
||||
@@ -207,7 +211,9 @@ if ((int)Settings::Get('system.report_webmax') > 0)
|
||||
UPDATE `" . TABLE_PANEL_ADMINS . "` SET `reportsent` = '2'
|
||||
WHERE `adminid` = :adminid
|
||||
");
|
||||
Database::pexecute($upd_stmt, array('adminid' => $row['adminid']));
|
||||
Database::pexecute($upd_stmt, array(
|
||||
'adminid' => $row['adminid']
|
||||
));
|
||||
}
|
||||
}
|
||||
} // webmax > 0
|
||||
|
||||
@@ -70,8 +70,9 @@ class FroxlorLogger
|
||||
/**
|
||||
* return FroxlorLogger instance
|
||||
*
|
||||
* @param array $userinfo unused
|
||||
*
|
||||
* @param array $userinfo
|
||||
* unused
|
||||
*
|
||||
* @return FroxlorLogger
|
||||
*/
|
||||
public static function getInstanceOf($userinfo = null)
|
||||
|
||||
@@ -5,33 +5,38 @@ use Froxlor\Settings;
|
||||
|
||||
class Statistics
|
||||
{
|
||||
|
||||
/**
|
||||
* Create or modify the AWStats configuration file for the given domain.
|
||||
* Modified by Berend Dekens to allow custom configurations.
|
||||
*
|
||||
* @param logFile
|
||||
* @param siteDomain
|
||||
* @param hostAliases
|
||||
* @param
|
||||
* logFile
|
||||
* @param
|
||||
* siteDomain
|
||||
* @param
|
||||
* hostAliases
|
||||
* @return null
|
||||
*/
|
||||
public static function createAWStatsConf($logFile, $siteDomain, $hostAliases, $customerDocroot, $awstats_params = array()) {
|
||||
|
||||
public static function createAWStatsConf($logFile, $siteDomain, $hostAliases, $customerDocroot, $awstats_params = array())
|
||||
{
|
||||
|
||||
// Generation header
|
||||
$header = "## GENERATED BY FROXLOR\n";
|
||||
$header2 = "## Do not remove the line above! This tells Froxlor to update this configuration\n## If you wish to manually change this configuration file, remove the first line to make sure Froxlor won't rebuild this file\n## Generated for domain {SITE_DOMAIN} on " . date('l dS \of F Y h:i:s A') . "\n";
|
||||
|
||||
$awstats_dir = \Froxlor\FileDir::makeCorrectDir($customerDocroot.'/awstats/'.$siteDomain.'/');
|
||||
if (!is_dir($awstats_dir)) {
|
||||
\Froxlor\FileDir::safe_exec('mkdir -p '.escapeshellarg($awstats_dir));
|
||||
|
||||
$awstats_dir = \Froxlor\FileDir::makeCorrectDir($customerDocroot . '/awstats/' . $siteDomain . '/');
|
||||
if (! is_dir($awstats_dir)) {
|
||||
\Froxlor\FileDir::safe_exec('mkdir -p ' . escapeshellarg($awstats_dir));
|
||||
}
|
||||
// chown created folder, #258
|
||||
self::makeChownWithNewStats($awstats_params);
|
||||
|
||||
|
||||
// weird but could happen...
|
||||
if (!is_dir(Settings::Get('system.awstats_conf'))) {
|
||||
\Froxlor\FileDir::safe_exec('mkdir -p '.escapeshellarg(Settings::Get('system.awstats_conf')));
|
||||
if (! is_dir(Settings::Get('system.awstats_conf'))) {
|
||||
\Froxlor\FileDir::safe_exec('mkdir -p ' . escapeshellarg(Settings::Get('system.awstats_conf')));
|
||||
}
|
||||
|
||||
|
||||
// These are the variables we will replace
|
||||
$regex = array(
|
||||
'/\{LOG_FILE\}/',
|
||||
@@ -47,82 +52,78 @@ class Statistics
|
||||
$awstats_dir,
|
||||
\Froxlor\FileDir::makeCorrectDir(Settings::Get('system.awstats_conf'))
|
||||
);
|
||||
|
||||
|
||||
// File names
|
||||
$domain_file = \Froxlor\FileDir::makeCorrectFile(Settings::Get('system.awstats_conf').'/awstats.' . $siteDomain . '.conf');
|
||||
$model_file = \Froxlor\Froxlor::getInstallDir().'/templates/misc/awstats/awstats.froxlor.model.conf';
|
||||
$domain_file = \Froxlor\FileDir::makeCorrectFile(Settings::Get('system.awstats_conf') . '/awstats.' . $siteDomain . '.conf');
|
||||
$model_file = \Froxlor\Froxlor::getInstallDir() . '/templates/misc/awstats/awstats.froxlor.model.conf';
|
||||
$model_file = \Froxlor\FileDir::makeCorrectFile($model_file);
|
||||
|
||||
|
||||
// Test if the file exists
|
||||
if (file_exists($domain_file)) {
|
||||
// Check for the generated header - if this is a manual modification we won't update
|
||||
$awstats_domain_conf = fopen($domain_file, 'r');
|
||||
|
||||
|
||||
if (fgets($awstats_domain_conf, strlen($header)) != $header) {
|
||||
fclose($awstats_domain_conf);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Close the file
|
||||
fclose($awstats_domain_conf);
|
||||
}
|
||||
|
||||
|
||||
$awstats_domain_conf = fopen($domain_file, 'w');
|
||||
$awstats_model_conf = fopen($model_file, 'r');
|
||||
|
||||
|
||||
// Write the header
|
||||
fwrite($awstats_domain_conf, $header);
|
||||
fwrite($awstats_domain_conf, preg_replace($regex, $replace, $header2));
|
||||
|
||||
|
||||
// Write the configuration file
|
||||
while (($line = fgets($awstats_model_conf, 4096)) !== false) {
|
||||
if (!preg_match('/^#/', $line)
|
||||
&& trim($line) != ''
|
||||
) {
|
||||
fwrite($awstats_domain_conf, preg_replace($regex, $replace, $line));
|
||||
}
|
||||
if (! preg_match('/^#/', $line) && trim($line) != '') {
|
||||
fwrite($awstats_domain_conf, preg_replace($regex, $replace, $line));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fclose($awstats_domain_conf);
|
||||
fclose($awstats_model_conf);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* chowns either awstats or webalizer folder,
|
||||
* either with webserver-user or - if fcgid
|
||||
* is used - the customers name, #258
|
||||
*
|
||||
* @param array $row array if panel_customers
|
||||
*
|
||||
* @param array $row
|
||||
* array if panel_customers
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function makeChownWithNewStats($row) {
|
||||
|
||||
public static function makeChownWithNewStats($row)
|
||||
{
|
||||
|
||||
// get correct user
|
||||
if ((Settings::Get('system.mod_fcgid') == '1' || Settings::Get('phpfpm.enabled') == '1')
|
||||
&& isset($row['deactivated'])
|
||||
&& $row['deactivated'] == '0'
|
||||
) {
|
||||
$user = $row['loginname'];
|
||||
$group = $row['loginname'];
|
||||
} else {
|
||||
$user = $row['guid'];
|
||||
$group = $row['guid'];
|
||||
}
|
||||
|
||||
// get correct directory
|
||||
$dir = $row['documentroot'];
|
||||
if (Settings::Get('system.awstats_enabled') == '1') {
|
||||
$dir .= '/awstats/';
|
||||
} else {
|
||||
$dir .= '/webalizer/';
|
||||
}
|
||||
|
||||
// only run chown if directory exists
|
||||
if (file_exists($dir)) {
|
||||
// run chown
|
||||
\Froxlor\FileDir::safe_exec('chown -R '.escapeshellarg($user).':'.escapeshellarg($group).' '.escapeshellarg(\Froxlor\FileDir::makeCorrectDir($dir)));
|
||||
}
|
||||
if ((Settings::Get('system.mod_fcgid') == '1' || Settings::Get('phpfpm.enabled') == '1') && isset($row['deactivated']) && $row['deactivated'] == '0') {
|
||||
$user = $row['loginname'];
|
||||
$group = $row['loginname'];
|
||||
} else {
|
||||
$user = $row['guid'];
|
||||
$group = $row['guid'];
|
||||
}
|
||||
|
||||
// get correct directory
|
||||
$dir = $row['documentroot'];
|
||||
if (Settings::Get('system.awstats_enabled') == '1') {
|
||||
$dir .= '/awstats/';
|
||||
} else {
|
||||
$dir .= '/webalizer/';
|
||||
}
|
||||
|
||||
// only run chown if directory exists
|
||||
if (file_exists($dir)) {
|
||||
// run chown
|
||||
\Froxlor\FileDir::safe_exec('chown -R ' . escapeshellarg($user) . ':' . escapeshellarg($group) . ' ' . escapeshellarg(\Froxlor\FileDir::makeCorrectDir($dir)));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,10 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace Froxlor;
|
||||
|
||||
use Froxlor\Database\Database;
|
||||
|
||||
|
||||
/**
|
||||
* This file is part of the Froxlor project.
|
||||
* Copyright (c) 2010 the Froxlor Team (see authors).
|
||||
@@ -13,14 +11,14 @@ use Froxlor\Database\Database;
|
||||
* file that was distributed with this source code. You can also view the
|
||||
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Michael Kaufmann <mkaufmann@nutime.de>
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Classes
|
||||
*
|
||||
* @since 0.9.31
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Michael Kaufmann <mkaufmann@nutime.de>
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Classes
|
||||
*
|
||||
* @since 0.9.31
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
@@ -28,12 +26,12 @@ use Froxlor\Database\Database;
|
||||
*
|
||||
* Interaction with settings from the db
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Michael Kaufmann <mkaufmann@nutime.de>
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Classes
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Michael Kaufmann <mkaufmann@nutime.de>
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Classes
|
||||
*
|
||||
* @method static mixed Get ($setting = null) return a setting-value by its group and varname separated by a dot (group.varname)
|
||||
* @method static boolean Set ($setting = null, $value = null, $instant_save = true) update a setting / set a new value
|
||||
* @method static boolean IsInList ($setting = null, $entry = null) tests if a setting-value that i s a comma separated list contains an entry
|
||||
@@ -41,7 +39,8 @@ use Froxlor\Database\Database;
|
||||
* @method static boolean Flush () Store all un-saved changes to the database and re-read in all settings
|
||||
* @method static void Stash () forget all un-saved changes to settings
|
||||
*/
|
||||
class Settings {
|
||||
class Settings
|
||||
{
|
||||
|
||||
/**
|
||||
* current settings object
|
||||
@@ -75,12 +74,13 @@ class Settings {
|
||||
/**
|
||||
* private constructor, reads in all settings
|
||||
*/
|
||||
private function __construct() {
|
||||
private function __construct()
|
||||
{
|
||||
$this->_readSettings();
|
||||
self::$_updatedata = array();
|
||||
// prepare statement
|
||||
self::$_updstmt = Database::prepare("
|
||||
UPDATE `".TABLE_PANEL_SETTINGS."` SET `value` = :value
|
||||
UPDATE `" . TABLE_PANEL_SETTINGS . "` SET `value` = :value
|
||||
WHERE `settinggroup` = :group AND `varname` = :varname
|
||||
");
|
||||
}
|
||||
@@ -89,7 +89,8 @@ class Settings {
|
||||
* Read in all settings from the database
|
||||
* and set the internal $_data array
|
||||
*/
|
||||
private function _readSettings() {
|
||||
private function _readSettings()
|
||||
{
|
||||
$result_stmt = Database::query("
|
||||
SELECT `settingid`, `settinggroup`, `varname`, `value`
|
||||
FROM `" . TABLE_PANEL_SETTINGS . "`
|
||||
@@ -108,11 +109,12 @@ class Settings {
|
||||
* @param string $varname
|
||||
* @param string $value
|
||||
*/
|
||||
private function _storeSetting($group = null, $varname = null, $value = null) {
|
||||
private function _storeSetting($group = null, $varname = null, $value = null)
|
||||
{
|
||||
$upd_data = array(
|
||||
'group' => $group,
|
||||
'varname' => $varname,
|
||||
'value' => $value
|
||||
'group' => $group,
|
||||
'varname' => $varname,
|
||||
'value' => $value
|
||||
);
|
||||
Database::pexecute(self::$_updstmt, $upd_data);
|
||||
}
|
||||
@@ -120,14 +122,16 @@ class Settings {
|
||||
/**
|
||||
* return a setting-value by its group and varname
|
||||
*
|
||||
* @param string $setting a group and a varname separated by a dot (group.varname)
|
||||
*
|
||||
* @param string $setting
|
||||
* a group and a varname separated by a dot (group.varname)
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function pGet($setting = null) {
|
||||
public function pGet($setting = null)
|
||||
{
|
||||
$sstr = explode(".", $setting);
|
||||
// no separator - do'h
|
||||
if (!isset($sstr[1])) {
|
||||
if (! isset($sstr[1])) {
|
||||
return null;
|
||||
}
|
||||
$result = null;
|
||||
@@ -140,35 +144,40 @@ class Settings {
|
||||
/**
|
||||
* tests if a setting-value that i s a comma separated list contains an entry
|
||||
*
|
||||
* @param string $setting a group and a varname separated by a dot (group.varname)
|
||||
* @param string $entry the entry that is expected to be in the list
|
||||
*
|
||||
* @param string $setting
|
||||
* a group and a varname separated by a dot (group.varname)
|
||||
* @param string $entry
|
||||
* the entry that is expected to be in the list
|
||||
*
|
||||
* @return boolean true, if the list contains $entry
|
||||
*/
|
||||
public function pIsInList($setting = null, $entry = null) {
|
||||
$s=Settings::Get($setting);
|
||||
if ($s==null) {
|
||||
public function pIsInList($setting = null, $entry = null)
|
||||
{
|
||||
$s = Settings::Get($setting);
|
||||
if ($s == null) {
|
||||
return false;
|
||||
}
|
||||
$slist = explode(",",$s);
|
||||
$slist = explode(",", $s);
|
||||
return in_array($entry, $slist);
|
||||
}
|
||||
|
||||
/**
|
||||
* update a setting / set a new value
|
||||
*
|
||||
* @param string $setting a group and a varname separated by a dot (group.varname)
|
||||
* @param string $setting
|
||||
* a group and a varname separated by a dot (group.varname)
|
||||
* @param string $value
|
||||
* @param boolean $instant_save
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function pSet($setting = null, $value = null, $instant_save = true) {
|
||||
public function pSet($setting = null, $value = null, $instant_save = true)
|
||||
{
|
||||
// check whether the setting exists
|
||||
if (Settings::Get($setting) !== null) {
|
||||
// set new value in array
|
||||
$sstr = explode(".", $setting);
|
||||
if (!isset($sstr[1])) {
|
||||
if (! isset($sstr[1])) {
|
||||
return false;
|
||||
}
|
||||
self::$_data[$sstr[0]][$sstr[1]] = $value;
|
||||
@@ -177,12 +186,12 @@ class Settings {
|
||||
$this->_storeSetting($sstr[0], $sstr[1], $value);
|
||||
} else {
|
||||
// set temporary data for usage
|
||||
if (!isset(self::$_data[$sstr[0]]) || !is_array(self::$_data[$sstr[0]])) {
|
||||
if (! isset(self::$_data[$sstr[0]]) || ! is_array(self::$_data[$sstr[0]])) {
|
||||
self::$_data[$sstr[0]] = array();
|
||||
}
|
||||
self::$_data[$sstr[0]][$sstr[1]] = $value;
|
||||
// set update-data when invoking Flush()
|
||||
if (!isset(self::$_updatedata[$sstr[0]]) || !is_array(self::$_updatedata[$sstr[0]])) {
|
||||
if (! isset(self::$_updatedata[$sstr[0]]) || ! is_array(self::$_updatedata[$sstr[0]])) {
|
||||
self::$_updatedata[$sstr[0]] = array();
|
||||
}
|
||||
self::$_updatedata[$sstr[0]][$sstr[1]] = $value;
|
||||
@@ -195,31 +204,33 @@ class Settings {
|
||||
/**
|
||||
* add a new setting to the database (mainly used in updater)
|
||||
*
|
||||
* @param string $setting a group and a varname separated by a dot (group.varname)
|
||||
* @param string $setting
|
||||
* a group and a varname separated by a dot (group.varname)
|
||||
* @param string $value
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function pAddNew($setting = null, $value = null) {
|
||||
public function pAddNew($setting = null, $value = null)
|
||||
{
|
||||
|
||||
// first check if it doesn't exist
|
||||
if (Settings::Get($setting) === null) {
|
||||
// validate parameter
|
||||
$sstr = explode(".", $setting);
|
||||
if (!isset($sstr[1])) {
|
||||
if (! isset($sstr[1])) {
|
||||
return false;
|
||||
}
|
||||
// prepare statement
|
||||
$ins_stmt = Database::prepare("
|
||||
INSERT INTO `".TABLE_PANEL_SETTINGS."` SET
|
||||
INSERT INTO `" . TABLE_PANEL_SETTINGS . "` SET
|
||||
`settinggroup` = :group,
|
||||
`varname` = :varname,
|
||||
`value` = :value
|
||||
");
|
||||
$ins_data = array(
|
||||
'group' => $sstr[0],
|
||||
'varname' => $sstr[1],
|
||||
'value' => $value
|
||||
'group' => $sstr[0],
|
||||
'varname' => $sstr[1],
|
||||
'value' => $value
|
||||
);
|
||||
Database::pexecute($ins_stmt, $ins_data);
|
||||
// also set new value to internal array and make it available
|
||||
@@ -233,7 +244,8 @@ class Settings {
|
||||
* Store all un-saved changes to the database and
|
||||
* re-read in all settings
|
||||
*/
|
||||
public function pFlush() {
|
||||
public function pFlush()
|
||||
{
|
||||
if (is_array(self::$_updatedata) && count(self::$_updatedata) > 0) {
|
||||
// save all un-saved changes to the settings
|
||||
foreach (self::$_updatedata as $group => $vargroup) {
|
||||
@@ -252,7 +264,8 @@ class Settings {
|
||||
/**
|
||||
* forget all un-saved changes to settings
|
||||
*/
|
||||
public function pStash() {
|
||||
public function pStash()
|
||||
{
|
||||
// empty update array
|
||||
self::$_updatedata = array();
|
||||
}
|
||||
@@ -262,7 +275,8 @@ class Settings {
|
||||
*
|
||||
* @return object
|
||||
*/
|
||||
private static function getInstance() {
|
||||
private static function getInstance()
|
||||
{
|
||||
// do we got an object already?
|
||||
if (self::$_obj == null) {
|
||||
self::$_obj = new self();
|
||||
@@ -280,12 +294,16 @@ class Settings {
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public static function __callStatic($name, $args) {
|
||||
public static function __callStatic($name, $args)
|
||||
{
|
||||
// as our functions are not static and therefore cannot
|
||||
// be called statically, we prefix a 'p' to all of
|
||||
// our public functions so we can use Settings::functionname()
|
||||
// which looks cooler and is easier to use
|
||||
$callback = array(self::getInstance(), "p".$name);
|
||||
$callback = array(
|
||||
self::getInstance(),
|
||||
"p" . $name
|
||||
);
|
||||
$result = call_user_func_array($callback, $args);
|
||||
return $result;
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ class Cronjob
|
||||
* Checks if the system's last guid is not higher than the one saved
|
||||
* in froxlor's database. If it's higher, froxlor needs to
|
||||
* set its last guid to this one to avoid conflicts with libnss-users
|
||||
*
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public static function checkLastGuid()
|
||||
|
||||
@@ -137,7 +137,7 @@ class Crypt
|
||||
|
||||
return $available_pwdhashes;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function validatePassword
|
||||
*
|
||||
@@ -145,78 +145,37 @@ class Crypt
|
||||
* we check against the length, if not matched
|
||||
* an error message will be output and 'exit' is called
|
||||
*
|
||||
* @param string $password the password to validate
|
||||
*
|
||||
* @param string $password
|
||||
* the password to validate
|
||||
*
|
||||
* @return string either the password or an errormessage+exit
|
||||
*/
|
||||
public static function validatePassword($password = null, $json_response = false) {
|
||||
|
||||
public static function validatePassword($password = null, $json_response = false)
|
||||
{
|
||||
if (Settings::Get('panel.password_min_length') > 0) {
|
||||
$password = validate(
|
||||
$password,
|
||||
Settings::Get('panel.password_min_length'),
|
||||
'/^.{'.(int)Settings::Get('panel.password_min_length').',}$/D',
|
||||
'notrequiredpasswordlength',
|
||||
array(),
|
||||
$json_response
|
||||
);
|
||||
$password = validate($password, Settings::Get('panel.password_min_length'), '/^.{' . (int) Settings::Get('panel.password_min_length') . ',}$/D', 'notrequiredpasswordlength', array(), $json_response);
|
||||
}
|
||||
|
||||
|
||||
if (Settings::Get('panel.password_regex') != '') {
|
||||
$password = validate(
|
||||
$password,
|
||||
Settings::Get('panel.password_regex'),
|
||||
Settings::Get('panel.password_regex'),
|
||||
'notrequiredpasswordcomplexity',
|
||||
array(),
|
||||
$json_response
|
||||
);
|
||||
$password = validate($password, Settings::Get('panel.password_regex'), Settings::Get('panel.password_regex'), 'notrequiredpasswordcomplexity', array(), $json_response);
|
||||
} else {
|
||||
if (Settings::Get('panel.password_alpha_lower')) {
|
||||
$password = validate(
|
||||
$password,
|
||||
'/.*[a-z]+.*/',
|
||||
'/.*[a-z]+.*/',
|
||||
'notrequiredpasswordcomplexity',
|
||||
array(),
|
||||
$json_response
|
||||
);
|
||||
$password = validate($password, '/.*[a-z]+.*/', '/.*[a-z]+.*/', 'notrequiredpasswordcomplexity', array(), $json_response);
|
||||
}
|
||||
if (Settings::Get('panel.password_alpha_upper')) {
|
||||
$password = validate(
|
||||
$password,
|
||||
'/.*[A-Z]+.*/',
|
||||
'/.*[A-Z]+.*/',
|
||||
'notrequiredpasswordcomplexity',
|
||||
array(),
|
||||
$json_response
|
||||
);
|
||||
$password = validate($password, '/.*[A-Z]+.*/', '/.*[A-Z]+.*/', 'notrequiredpasswordcomplexity', array(), $json_response);
|
||||
}
|
||||
if (Settings::Get('panel.password_numeric')) {
|
||||
$password = validate(
|
||||
$password,
|
||||
'/.*[0-9]+.*/',
|
||||
'/.*[0-9]+.*/',
|
||||
'notrequiredpasswordcomplexity',
|
||||
array(),
|
||||
$json_response
|
||||
);
|
||||
$password = validate($password, '/.*[0-9]+.*/', '/.*[0-9]+.*/', 'notrequiredpasswordcomplexity', array(), $json_response);
|
||||
}
|
||||
if (Settings::Get('panel.password_special_char_required')) {
|
||||
$password = validate(
|
||||
$password,
|
||||
'/.*[' . preg_quote(Settings::Get('panel.password_special_char')) . ']+.*/',
|
||||
'/.*[' . preg_quote(Settings::Get('panel.password_special_char')) . ']+.*/',
|
||||
'notrequiredpasswordcomplexity',
|
||||
array(),
|
||||
$json_response
|
||||
);
|
||||
$password = validate($password, '/.*[' . preg_quote(Settings::Get('panel.password_special_char')) . ']+.*/', '/.*[' . preg_quote(Settings::Get('panel.password_special_char')) . ']+.*/', 'notrequiredpasswordcomplexity', array(), $json_response);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $password;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Function validatePasswordLogin
|
||||
*
|
||||
@@ -225,22 +184,26 @@ class Crypt
|
||||
* additionally it updates the hash if the system settings changed
|
||||
* or if the very old md5() sum is used
|
||||
*
|
||||
* @param array $userinfo user-data from table
|
||||
* @param string $password the password to validate
|
||||
* @param string $table either panel_customers or panel_admins
|
||||
* @param string $uid user-id-field in $table
|
||||
*
|
||||
* @param array $userinfo
|
||||
* user-data from table
|
||||
* @param string $password
|
||||
* the password to validate
|
||||
* @param string $table
|
||||
* either panel_customers or panel_admins
|
||||
* @param string $uid
|
||||
* user-id-field in $table
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public static function validatePasswordLogin($userinfo = null, $password = null, $table = 'panel_customers', $uid = 'customerid') {
|
||||
|
||||
public static function validatePasswordLogin($userinfo = null, $password = null, $table = 'panel_customers', $uid = 'customerid')
|
||||
{
|
||||
$systype = 3; // SHA256
|
||||
if (Settings::Get('system.passwordcryptfunc') !== null) {
|
||||
$systype = (int)Settings::Get('system.passwordcryptfunc');
|
||||
$systype = (int) Settings::Get('system.passwordcryptfunc');
|
||||
}
|
||||
|
||||
|
||||
$pwd_hash = $userinfo['password'];
|
||||
|
||||
|
||||
$update_hash = false;
|
||||
// check for good'ole md5
|
||||
if (strlen($pwd_hash) == 32 && ctype_xdigit($pwd_hash)) {
|
||||
@@ -254,34 +217,31 @@ class Crypt
|
||||
// check whether the hash needs to be updated
|
||||
$hash_type_chk = substr($pwd_hash, 0, 3);
|
||||
if (($systype == 1 && $hash_type_chk != '$1$') || // MD5
|
||||
($systype == 2 && $hash_type_chk != '$2$') || // BLOWFISH
|
||||
($systype == 3 && $hash_type_chk != '$5$') || // SHA256
|
||||
($systype == 4 && $hash_type_chk != '$6$') // SHA512
|
||||
) {
|
||||
$update_hash = true;
|
||||
}
|
||||
($systype == 2 && $hash_type_chk != '$2$') || // BLOWFISH
|
||||
($systype == 3 && $hash_type_chk != '$5$') || // SHA256
|
||||
($systype == 4 && $hash_type_chk != '$6$')) // SHA512
|
||||
{
|
||||
$update_hash = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ($pwd_hash == $pwd_check) {
|
||||
|
||||
|
||||
// check for update of hash (only if our database is ready to handle the bigger string)
|
||||
$is_ready = (version_compare2("0.9.33", \Froxlor\Froxlor::getVersion()) <= 0 ? true : false);
|
||||
if ($update_hash && $is_ready) {
|
||||
$upd_stmt = \Froxlor\Database\Database::prepare("
|
||||
UPDATE " . $table . " SET `password` = :newpasswd WHERE `" . $uid . "` = :uid
|
||||
");
|
||||
$params = array (
|
||||
$params = array(
|
||||
'newpasswd' => self::makeCryptPassword($password),
|
||||
'uid' => $userinfo[$uid]
|
||||
);
|
||||
\Froxlor\Database\Database::pexecute($upd_stmt, $params);
|
||||
}
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -9,20 +9,22 @@ namespace Froxlor\UI;
|
||||
* file that was distributed with this source code. You can also view the
|
||||
* COPYING file online at http://files.froxlor.org/misc/COPYING.txt
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Classes
|
||||
*
|
||||
* @copyright (c) the authors
|
||||
* @author Froxlor team <team@froxlor.org> (2010-)
|
||||
* @license GPLv2 http://files.froxlor.org/misc/COPYING.txt
|
||||
* @package Classes
|
||||
*
|
||||
*/
|
||||
|
||||
class HtmlForm
|
||||
{
|
||||
|
||||
/**
|
||||
* internal tmp-variable to store form
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private static $_form = '';
|
||||
|
||||
private static $_filename = '';
|
||||
|
||||
public static function genHTMLForm($data = array())
|
||||
@@ -32,46 +34,43 @@ class HtmlForm
|
||||
|
||||
self::$_form = '';
|
||||
|
||||
foreach($data as $fdata)
|
||||
{
|
||||
foreach ($data as $fdata) {
|
||||
$sections = $fdata['sections'];
|
||||
|
||||
foreach($sections as $section)
|
||||
{
|
||||
foreach ($sections as $section) {
|
||||
/*
|
||||
* here be section title & image
|
||||
*/
|
||||
*/
|
||||
$title = $section['title'];
|
||||
$image = $section['image'];
|
||||
|
||||
if(isset($section['visible']) && $section['visible'] === false)
|
||||
{
|
||||
if (isset($section['visible']) && $section['visible'] === false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!isset($section['nobuttons']) || $section['nobuttons'] == false) {
|
||||
if (! isset($section['nobuttons']) || $section['nobuttons'] == false) {
|
||||
eval("self::\$_form .= \"" . Template::getTemplate("misc/form/table_section", "1") . "\";");
|
||||
} else {
|
||||
$nob = true;
|
||||
}
|
||||
|
||||
$nexto = false;
|
||||
foreach($section['fields'] as $fieldname => $fielddata)
|
||||
{
|
||||
if(isset($fielddata['visible']) && $fielddata['visible'] === false)
|
||||
{
|
||||
foreach ($section['fields'] as $fieldname => $fielddata) {
|
||||
if (isset($fielddata['visible']) && $fielddata['visible'] === false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($nexto === false || (isset($fielddata['next_to']) && $nexto['field'] != $fielddata['next_to'])) {
|
||||
$label = $fielddata['label'];
|
||||
$desc = (isset($fielddata['desc']) ? $fielddata['desc'] : '');
|
||||
$style = (isset($fielddata['style']) ? ' class="'.$fielddata['style'].'"' : '');
|
||||
$style = (isset($fielddata['style']) ? ' class="' . $fielddata['style'] . '"' : '');
|
||||
$mandatory = self::_getMandatoryFlag($fielddata);
|
||||
$data_field = self::_parseDataField($fieldname, $fielddata);
|
||||
if (isset($fielddata['has_nextto'])) {
|
||||
$nexto = array('field' => $fieldname);
|
||||
$data_field.='{NEXTTOFIELD_'.$fieldname.'}';
|
||||
$nexto = array(
|
||||
'field' => $fieldname
|
||||
);
|
||||
$data_field .= '{NEXTTOFIELD_' . $fieldname . '}';
|
||||
} else {
|
||||
$nexto = false;
|
||||
}
|
||||
@@ -79,12 +78,8 @@ class HtmlForm
|
||||
} else {
|
||||
$data_field = self::_parseDataField($fieldname, $fielddata);
|
||||
$data_field = str_replace("\t", "", $data_field);
|
||||
$data_field = $fielddata['next_to_prefix'].$data_field;
|
||||
self::$_form = str_replace(
|
||||
'{NEXTTOFIELD_'.$fielddata['next_to'].'}',
|
||||
$data_field,
|
||||
self::$_form
|
||||
);
|
||||
$data_field = $fielddata['next_to_prefix'] . $data_field;
|
||||
self::$_form = str_replace('{NEXTTOFIELD_' . $fielddata['next_to'] . '}', $data_field, self::$_form);
|
||||
$nexto = false;
|
||||
}
|
||||
}
|
||||
@@ -92,7 +87,7 @@ class HtmlForm
|
||||
}
|
||||
|
||||
// add save/reset buttons at the end of the form
|
||||
if (!$nob) {
|
||||
if (! $nob) {
|
||||
eval("self::\$_form .= \"" . Template::getTemplate("misc/form/table_end", "1") . "\";");
|
||||
}
|
||||
|
||||
@@ -101,41 +96,48 @@ class HtmlForm
|
||||
|
||||
private static function _parseDataField($fieldname, $data = array())
|
||||
{
|
||||
switch($data['type'])
|
||||
{
|
||||
switch ($data['type']) {
|
||||
case 'text':
|
||||
return self::_textBox($fieldname, $data); break;
|
||||
return self::_textBox($fieldname, $data);
|
||||
break;
|
||||
case 'textul':
|
||||
return self::_textBox($fieldname, $data, 'text', true); break;
|
||||
return self::_textBox($fieldname, $data, 'text', true);
|
||||
break;
|
||||
case 'password':
|
||||
return self::_textBox($fieldname, $data, 'password'); break;
|
||||
return self::_textBox($fieldname, $data, 'password');
|
||||
break;
|
||||
case 'hidden':
|
||||
return self::_textBox($fieldname, $data, 'hidden'); break;
|
||||
return self::_textBox($fieldname, $data, 'hidden');
|
||||
break;
|
||||
case 'yesno':
|
||||
return self::_yesnoBox($data); break;
|
||||
return self::_yesnoBox($data);
|
||||
break;
|
||||
case 'select':
|
||||
return self::_selectBox($fieldname, $data); break;
|
||||
return self::_selectBox($fieldname, $data);
|
||||
break;
|
||||
case 'label':
|
||||
return self::_labelField($data); break;
|
||||
return self::_labelField($data);
|
||||
break;
|
||||
case 'textarea':
|
||||
return self::_textArea($fieldname, $data); break;
|
||||
return self::_textArea($fieldname, $data);
|
||||
break;
|
||||
case 'checkbox':
|
||||
return self::_checkbox($fieldname, $data); break;
|
||||
return self::_checkbox($fieldname, $data);
|
||||
break;
|
||||
case 'file':
|
||||
return self::_file($fieldname, $data); break;
|
||||
return self::_file($fieldname, $data);
|
||||
break;
|
||||
case 'int':
|
||||
return self::_int($fieldname, $data); break;
|
||||
return self::_int($fieldname, $data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private static function _getMandatoryFlag($data = array())
|
||||
{
|
||||
if(isset($data['mandatory']))
|
||||
{
|
||||
if (isset($data['mandatory'])) {
|
||||
return ' <span class="red">*</span>';
|
||||
}
|
||||
elseif(isset($data['mandatory_ex']))
|
||||
{
|
||||
} elseif (isset($data['mandatory_ex'])) {
|
||||
return ' <span class="red">**</span>';
|
||||
}
|
||||
return '';
|
||||
@@ -145,14 +147,14 @@ class HtmlForm
|
||||
{
|
||||
$return = '';
|
||||
$extras = '';
|
||||
if(isset($data['maxlength'])) {
|
||||
$extras .= ' maxlength="'.$data['maxlength'].'"';
|
||||
if (isset($data['maxlength'])) {
|
||||
$extras .= ' maxlength="' . $data['maxlength'] . '"';
|
||||
}
|
||||
if(isset($data['size'])) {
|
||||
$extras .= ' size="'.$data['size'].'"';
|
||||
if (isset($data['size'])) {
|
||||
$extras .= ' size="' . $data['size'] . '"';
|
||||
}
|
||||
if(isset($data['autocomplete'])) {
|
||||
$extras .= ' autocomplete="'.$data['autocomplete'].'"';
|
||||
if (isset($data['autocomplete'])) {
|
||||
$extras .= ' autocomplete="' . $data['autocomplete'] . '"';
|
||||
}
|
||||
|
||||
// add support to save reloaded forms
|
||||
@@ -164,10 +166,9 @@ class HtmlForm
|
||||
$value = '';
|
||||
}
|
||||
|
||||
$ulfield = ($unlimited == true ? ' '.$data['ul_field'] : '');
|
||||
if(isset($data['display']) && $data['display'] != '')
|
||||
{
|
||||
$ulfield = '<strong>'.$data['display'].'</strong>';
|
||||
$ulfield = ($unlimited == true ? ' ' . $data['ul_field'] : '');
|
||||
if (isset($data['display']) && $data['display'] != '') {
|
||||
$ulfield = '<strong>' . $data['display'] . '</strong>';
|
||||
}
|
||||
|
||||
eval("\$return = \"" . Template::getTemplate("misc/form/input_text", "1") . "\";");
|
||||
@@ -178,11 +179,11 @@ class HtmlForm
|
||||
{
|
||||
$return = '';
|
||||
$extras = '';
|
||||
if(isset($data['cols'])) {
|
||||
$extras .= ' cols="'.$data['cols'].'"';
|
||||
if (isset($data['cols'])) {
|
||||
$extras .= ' cols="' . $data['cols'] . '"';
|
||||
}
|
||||
if(isset($data['rows'])) {
|
||||
$extras .= ' rows="'.$data['rows'].'"';
|
||||
if (isset($data['rows'])) {
|
||||
$extras .= ' rows="' . $data['rows'] . '"';
|
||||
}
|
||||
|
||||
// add support to save reloaded forms
|
||||
@@ -221,12 +222,10 @@ class HtmlForm
|
||||
}
|
||||
|
||||
return '<select
|
||||
id="'.$fieldname.'"
|
||||
name="'.$fieldname.'"
|
||||
'.(isset($data['class']) ? ' class="'.$data['class'] .'" ' : '').'
|
||||
>'
|
||||
.$select_var.
|
||||
'</select>';
|
||||
id="' . $fieldname . '"
|
||||
name="' . $fieldname . '"
|
||||
' . (isset($data['class']) ? ' class="' . $data['class'] . '" ' : '') . '
|
||||
>' . $select_var . '</select>';
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -234,32 +233,36 @@ class HtmlForm
|
||||
*
|
||||
* <code>
|
||||
* $data = array(
|
||||
* 'label' => $lng['customer']['email_imap'],
|
||||
* 'type' => 'checkbox',
|
||||
* 'values' => array(
|
||||
* array( 'label' => 'active',
|
||||
* 'value' => '1'
|
||||
* )
|
||||
* ),
|
||||
* 'value' => array('1'),
|
||||
* 'mandatory' => true
|
||||
* )
|
||||
* 'label' => $lng['customer']['email_imap'],
|
||||
* 'type' => 'checkbox',
|
||||
* 'values' => array(
|
||||
* array( 'label' => 'active',
|
||||
* 'value' => '1'
|
||||
* )
|
||||
* ),
|
||||
* 'value' => array('1'),
|
||||
* 'mandatory' => true
|
||||
* )
|
||||
* </code>
|
||||
*
|
||||
* @param string $fieldname contains the fieldname
|
||||
* @param array $data contains the data array
|
||||
* @param string $fieldname
|
||||
* contains the fieldname
|
||||
* @param array $data
|
||||
* contains the data array
|
||||
*/
|
||||
public static function _checkbox($fieldname = '', $data = array()) {
|
||||
public static function _checkbox($fieldname = '', $data = array())
|
||||
{
|
||||
// $data['value'] contains checked items
|
||||
|
||||
$checked = array();
|
||||
if (isset($data['value'])) {
|
||||
$checked = $data['value'];
|
||||
}
|
||||
|
||||
if (isset($_SESSION['requestData'])) {
|
||||
if(isset($_SESSION['requestData'][$fieldname])) {
|
||||
$checked = array($_SESSION['requestData'][$fieldname]);
|
||||
if (isset($_SESSION['requestData'][$fieldname])) {
|
||||
$checked = array(
|
||||
$_SESSION['requestData'][$fieldname]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -272,12 +275,12 @@ class HtmlForm
|
||||
|
||||
// will contain the output
|
||||
$output = "";
|
||||
foreach($data['values'] as $val) {
|
||||
foreach ($data['values'] as $val) {
|
||||
$key = $val['label'];
|
||||
// is this box checked?
|
||||
$isChecked = '';
|
||||
if (is_array($checked) && count($checked) > 0) {
|
||||
foreach($checked as $tmp) {
|
||||
foreach ($checked as $tmp) {
|
||||
if ($tmp == $val['value']) {
|
||||
$isChecked = ' checked="checked" ';
|
||||
break;
|
||||
@@ -286,10 +289,10 @@ class HtmlForm
|
||||
}
|
||||
$output .= '<label>';
|
||||
if (empty($isArray)) {
|
||||
$output .= '<input type="hidden" name="'.$fieldname.'" value="0" />';
|
||||
$output .= '<input type="hidden" name="' . $fieldname . '" value="0" />';
|
||||
}
|
||||
$output .= '<input type="checkbox" name="'.$fieldname.$isArray.'" value="'.$val['value'].'" '.$isChecked.'/>';
|
||||
$output .= $key.'</label>';
|
||||
$output .= '<input type="checkbox" name="' . $fieldname . $isArray . '" value="' . $val['value'] . '" ' . $isChecked . '/>';
|
||||
$output .= $key . '</label>';
|
||||
}
|
||||
|
||||
return $output;
|
||||
@@ -299,8 +302,8 @@ class HtmlForm
|
||||
{
|
||||
$return = '';
|
||||
$extras = '';
|
||||
if(isset($data['maxlength'])) {
|
||||
$extras .= ' maxlength="'.$data['maxlength'].'"';
|
||||
if (isset($data['maxlength'])) {
|
||||
$extras .= ' maxlength="' . $data['maxlength'] . '"';
|
||||
}
|
||||
|
||||
// add support to save reloaded forms
|
||||
@@ -312,9 +315,8 @@ class HtmlForm
|
||||
$value = '';
|
||||
}
|
||||
|
||||
if(isset($data['display']) && $data['display'] != '')
|
||||
{
|
||||
$ulfield = '<strong>'.$data['display'].'</strong>';
|
||||
if (isset($data['display']) && $data['display'] != '') {
|
||||
$ulfield = '<strong>' . $data['display'] . '</strong>';
|
||||
}
|
||||
|
||||
eval("\$return = \"" . Template::getTemplate("misc/form/input_file", "1") . "\";");
|
||||
@@ -325,11 +327,11 @@ class HtmlForm
|
||||
{
|
||||
$return = '';
|
||||
$extras = '';
|
||||
if(isset($data['int_min'])) {
|
||||
$extras .= ' min="'.$data['int_min'].'"';
|
||||
if (isset($data['int_min'])) {
|
||||
$extras .= ' min="' . $data['int_min'] . '"';
|
||||
}
|
||||
if(isset($data['int_max'])) {
|
||||
$extras .= ' max="'.$data['int_max'].'"';
|
||||
if (isset($data['int_max'])) {
|
||||
$extras .= ' max="' . $data['int_max'] . '"';
|
||||
}
|
||||
|
||||
// add support to save reloaded forms
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<?php
|
||||
namespace Froxlor\Validate\Form;
|
||||
|
||||
class String
|
||||
class Strings
|
||||
{
|
||||
|
||||
public static function validateFormFieldString($fieldname, $fielddata, $newfieldvalue)
|
||||
Reference in New Issue
Block a user