Till Brehm
2015-11-10 b79c5bac527dc5f93f1fab6e1d11daf27135403b
New ISPConfig login.
1 files added
16 files modified
375 ■■■■■ changed files
interface/web/content.php 4 ●●●● patch | view | raw | blame | history
interface/web/index.php 8 ●●●● patch | view | raw | blame | history
interface/web/login/index.php 107 ●●●● patch | view | raw | blame | history
interface/web/login/lib/lang/ar.lng 2 ●●● patch | view | raw | blame | history
interface/web/login/lib/lang/bg.lng 2 ●●● patch | view | raw | blame | history
interface/web/login/lib/lang/br.lng 2 ●●● patch | view | raw | blame | history
interface/web/login/lib/lang/de.lng 2 ●●● patch | view | raw | blame | history
interface/web/login/lib/lang/en.lng 2 ●●● patch | view | raw | blame | history
interface/web/login/login_as.php 9 ●●●●● patch | view | raw | blame | history
interface/web/login/logout.php 5 ●●●●● patch | view | raw | blame | history
interface/web/login/password_reset.php 36 ●●●● patch | view | raw | blame | history
interface/web/login/templates/index.htm 49 ●●●●● patch | view | raw | blame | history
interface/web/login/templates/password_reset.htm 41 ●●●●● patch | view | raw | blame | history
interface/web/nav.php 4 ●●●● patch | view | raw | blame | history
interface/web/themes/default/assets/javascripts/ispconfig.js 17 ●●●●● patch | view | raw | blame | history
interface/web/themes/default/assets/javascripts/ispconfig.min.js 29 ●●●●● patch | view | raw | blame | history
interface/web/themes/default/templates/main_login.tpl.htm 56 ●●●●● patch | view | raw | blame | history
interface/web/content.php
@@ -36,8 +36,8 @@
$page = $_REQUEST["s_pg"];
*/
$module = 'login';
$page = 'index';
$module = 'dashboard';
$page = 'dashboard';
if(!preg_match("/^[a-z]{2,20}$/i", $module)) die('module name contains unallowed chars.');
if(!preg_match("/^[a-z]{2,20}$/i", $page)) die('page name contains unallowed chars.');
interface/web/index.php
@@ -31,7 +31,13 @@
require_once '../lib/config.inc.php';
require_once '../lib/app.inc.php';
if(!isset($_SESSION['s']['module']['name'])) $_SESSION['s']['module']['name'] = 'login';
// Check if we have an active users ession and redirect to login if thats not the case.
if($_SESSION['s']['user']['active'] != 1) {
    header('Location: /login/');
    die();
}
if(!isset($_SESSION['s']['module']['name'])) $_SESSION['s']['module']['name'] = 'dashboard';
$app->uses('tpl');
$app->tpl->newTemplate('main.tpl.htm');
interface/web/login/index.php
@@ -1,7 +1,7 @@
<?php
/*
Copyright (c) 2005, Till Brehm, projektfarm Gmbh
Copyright (c) 2005 - 2015, Till Brehm, ISPConfig UG
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
@@ -28,28 +28,18 @@
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
//
require_once '../../lib/config.inc.php';
require_once '../../lib/app.inc.php';
class login_index {
    public $status = '';
    private $target = '';
    private $app;
    private $conf;
    public function render() {
        global $app, $conf;
        /* Redirect to page, if login form was NOT send */
        if(count($_POST) == 0) {
            if(isset($_SESSION['s']['user']) && is_array($_SESSION['s']['user']) && is_array($_SESSION['s']['module'])) {
                die('HEADER_REDIRECT:'.$_SESSION['s']['module']['startpage']);
            }
// Check if we have an active users ession and no login_as.
if($_SESSION['s']['user']['active'] == 1 && @$_POST['login_as'] != 1) {
    header('Location: /index.php');
    die();
        }
        $app->uses('tpl');
        $app->tpl->newTemplate('form.tpl.htm');
$app->tpl->newTemplate('main_login.tpl.htm');
$app->tpl->setInclude('content_tpl', 'templates/index.htm');
        $error = '';
@@ -70,16 +60,16 @@
            //** Check variables
            if(!preg_match("/^[\w\.\-\_\@]{1,128}$/", $_POST['username'])) $error = $app->lng('user_regex_error');
            if(!preg_match("/^.{1,64}$/i", $_POST['passwort'])) $error = $app->lng('pw_error_length');
    if(!preg_match("/^.{1,64}$/i", $_POST['password'])) $error = $app->lng('pw_error_length');
            //** iporting variables
    //** importing variables
            $ip    = ip2long($_SERVER['REMOTE_ADDR']);
            $username = $_POST['username'];
            $passwort = $_POST['passwort'];
    $password = $_POST['password'];
            $loginAs  = false;
            $time = time();
            if($username != '' && $passwort != '' && $error == '') {
    if($username != '' && $password != '' && $error == '') {
                /*
                 *  Check, if there is a "login as" instead of a "normal" login
                 */
@@ -107,7 +97,7 @@
                                
                                /* this is the reseller, that shall be re-logged in */
                                $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?";
                                $tmp = $app->db->queryOneRecord($sql, $username, $passwort);
                        $tmp = $app->db->queryOneRecord($sql, $username, $password);
                                $client_group_id = $app->functions->intval($tmp['default_group']);
                                $tmp_client = $app->db->queryOneRecord("SELECT client.client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $client_group_id);
                                
@@ -129,7 +119,7 @@
                        
                        /* this is the user the reseller wants to 'login as' */
                        $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?";
                        $tmp = $app->db->queryOneRecord($sql, $username, $passwort);
                $tmp = $app->db->queryOneRecord($sql, $username, $password);
                        $tmp_client = $app->db->queryOneRecord("SELECT client.client_id, client.parent_client_id FROM sys_group, client WHERE sys_group.client_id = client.client_id and sys_group.groupid = ?", $tmp["default_group"]);
                        
                        if(!$tmp || $tmp_client["parent_client_id"] != $res_client["client_id"]) {
@@ -140,8 +130,8 @@
                        unset($tmp_client);
                    }
                    $loginAs = true;
                }
                else {
        } else {
                    /* normal login */
                    $loginAs = false;
                }
@@ -149,6 +139,7 @@
                //* Check if there are already wrong logins
                $sql = "SELECT * FROM `attempts_login` WHERE `ip`= ? AND  `login_time` > (NOW() - INTERVAL 1 MINUTE) LIMIT 1";
                $alreadyfailed = $app->db->queryOneRecord($sql, $ip);
                //* too many failedlogins
                if($alreadyfailed['times'] > 5) {
                    $error = $app->lng('error_user_too_many_logins');
@@ -156,8 +147,9 @@
                    if ($loginAs){
                        $sql = "SELECT * FROM sys_user WHERE USERNAME = ? and PASSWORT = ?";
                        $user = $app->db->queryOneRecord($sql, $username, $passwort);
                $user = $app->db->queryOneRecord($sql, $username, $password);
                    } else {
                        if(stristr($username, '@')) {
                            //* mailuser login
                            $sql = "SELECT * FROM mail_user WHERE login = ? or email = ?";
@@ -167,7 +159,7 @@
                                $saved_password = stripslashes($mailuser['password']);
                                $salt = '$1$'.substr($saved_password, 3, 8).'$';
                                //* Check if mailuser password is correct
                                if(crypt(stripslashes($passwort), $salt) == $saved_password) {
                        if(crypt(stripslashes($password), $salt) == $saved_password) {
                                    //* we build a fake user here which has access to the mailuser module only and userid 0
                                    $user = array();
                                    $user['userid'] = 0;
@@ -184,33 +176,27 @@
                                    $user['default_group'] = $mailuser['sys_groupid'];
                                }
                            }
                        } else {
                            //* normal cp user login
                            $sql = "SELECT * FROM sys_user WHERE USERNAME = ?";
                            $user = $app->db->queryOneRecord($sql, $username);
                            if($user) {
                                $saved_password = stripslashes($user['passwort']);
                                if(substr($saved_password, 0, 3) == '$1$') {
                                    //* The password is crypt-md5 encrypted
                                    $salt = '$1$'.substr($saved_password, 3, 8).'$';
                                    if(crypt(stripslashes($passwort), $salt) != $saved_password) {
                                if(crypt(stripslashes($password), $salt) != $saved_password) {
                                        $user = false;
                                    }
                                } elseif(substr($saved_password, 0, 3) == '$5$') {
                                    //* The password is crypt-sha256 encrypted
                                    $salt = '$5$'.substr($saved_password, 3, 16).'$';
                                    if(crypt(stripslashes($passwort), $salt) != $saved_password) {
                                if(crypt(stripslashes($password), $salt) != $saved_password) {
                                        $user = false;
                                    }
                                } else {
                                    //* The password is md5 encrypted
                                    if(md5($passwort) != $saved_password) {
                            if(md5($password) != $saved_password) {
                                        $user = false;
                                    }
                                }
@@ -224,13 +210,14 @@
                        if($user['active'] == 1) {
                            // Maintenance mode - allow logins only when maintenance mode is off or if the user is admin
                            if(!$maintenance_mode || $user['typ'] == 'admin'){
                                // User login right, so attempts can be deleted
                                $sql = "DELETE FROM `attempts_login` WHERE `ip`=?";
                                $app->db->query($sql, $ip);
                                $user = $app->db->toLower($user);
                                if ($loginAs) $oldSession = $_SESSION['s'];
                                session_regenerate_id();
                        if (!$loginAs) session_regenerate_id(true);
                                $_SESSION = array();
                                if ($loginAs) $_SESSION['s_old'] = $oldSession; // keep the way back!
                                $_SESSION['s']['user'] = $user;
@@ -241,7 +228,6 @@
                                if(is_file($_SESSION['s']['user']['startmodule'].'/lib/module.conf.php')) {
                                    include_once $_SESSION['s']['user']['startmodule'].'/lib/module.conf.php';
                                    $menu_dir = ISPC_WEB_PATH.'/' . $_SESSION['s']['user']['startmodule'] . '/lib/menu.d';
                                    if (is_dir($menu_dir)) {
                                        if ($dh = opendir($menu_dir)) {
                                            //** Go through all files in the menu dir
@@ -254,7 +240,6 @@
                                    }
                                    $_SESSION['s']['module'] = $module;
                                }
                                // check if the user theme is valid
                                if($_SESSION['s']['user']['theme'] != 'default') {
                                    $tmp_path = ISPC_THEMES_PATH."/".$_SESSION['s']['user']['theme'];
@@ -278,14 +263,18 @@
                                * We need LOGIN_REDIRECT instead of HEADER_REDIRECT to load the
                                * new theme, if the logged-in user has another
                                */
                                echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage'];
                        if ($loginAs){
                            echo 'LOGIN_REDIRECT:'.$_SESSION['s']['module']['startpage'];
                                exit;
                        } else {
                            header('Location: /index.php?phpsessid='.session_id());
                            die();
                        }
                            }
                        } else {
                            $error = $app->lng('error_user_blocked');
                        }
                    } else {
                        if(!$alreadyfailed['times'] )
                        {
@@ -302,7 +291,6 @@
                        if($app->db->errorMessage != '') $error .= '<br />'.$app->db->errorMessage != '';
                        $app->plugin->raiseEvent('login_failed', $this);
                        //* Save failed login message to var
                        $authlog = 'Failed login for user \''. $username .'\' from '. long2ip($ip) .' at '. date('Y-m-d H:i:s');
                        $authlog_handle = fopen($conf['ispconfig_log_dir'].'/auth.log', 'a');
@@ -310,11 +298,9 @@
                        fclose($authlog_handle);
                    }
                }
            } else {
                //* Username or password empty
                if($error == '') $error = $app->lng('error_user_password_empty');
                $app->plugin->raiseEvent('login_empty', $this);
            }
        }
@@ -344,15 +330,28 @@
        $app->tpl->setVar('login_button_txt', $app->lng('login_button_txt'));
        $app->tpl->setVar('session_timeout', $server_config_array['session_timeout']);
        $app->tpl->setVar('session_allow_endless', $server_config_array['session_allow_endless']);
        $app->tpl->setInclude('content_tpl', 'login/templates/index.htm');
//$app->tpl->setInclude('content_tpl', 'login/templates/index.htm');
$app->tpl->setVar('current_theme', isset($_SESSION['s']['theme']) ? $_SESSION['s']['theme'] : 'default');
//die(isset($_SESSION['s']['theme']) ? $_SESSION['s']['theme'] : 'default');
// Logo
$logo = $app->db->queryOneRecord("SELECT * FROM sys_ini WHERE sysini_id = 1");
if($logo['custom_logo'] != ''){
    $base64_logo_txt = $logo['custom_logo'];
} else {
    $base64_logo_txt = $logo['default_logo'];
}
$tmp_base64 = explode(',', $base64_logo_txt, 2);
$logo_dimensions = $app->functions->getimagesizefromstring(base64_decode($tmp_base64[1]));
$app->tpl->setVar('base64_logo_width', $logo_dimensions[0].'px');
$app->tpl->setVar('base64_logo_height', $logo_dimensions[1].'px');
$app->tpl->setVar('base64_logo_txt', $base64_logo_txt);
// Title
$app->tpl->setVar('company_name', $sys_config['company_name']. ' :: ');
        $app->tpl_defaults();
        $this->status = 'OK';
        return $app->tpl->grab();
    } // << end function
} // << end class
$app->tpl->pparse();
?>
interface/web/login/lib/lang/ar.lng
@@ -10,7 +10,7 @@
$wb['pw_reset_mail_msg'] = 'The password to your ISPConfig 3 control panel account has been reset. The new password is: ';
$wb['pw_reset_mail_title'] = 'ISPConfig 3 Control panel password has been reset.';
$wb['user_regex_error'] = 'Username contains unallowed characters or is longer then 64 characters.';
$wb['pw_error_length'] = 'The password length is > 64 characters.';
$wb['pw_error_length'] = 'The password length is < 1 or > 64 characters.';
$wb['username_txt'] = 'Username';
$wb['password_txt'] = 'Password';
$wb['login_button_txt'] = 'Login';
interface/web/login/lib/lang/bg.lng
@@ -6,7 +6,7 @@
$wb['pw_reset_mail_msg'] = 'Новата парола за вашия ISPConfig 3 контролен панел е:';
$wb['pw_reset_mail_title'] = 'Нова парола за вашия ISPConfig 3 контролен панел';
$wb['user_regex_error'] = 'Потребителско име contains unallowed characters or is longer then 64 characters.';
$wb['pw_error_length'] = 'The password length is > 64 characters.';
$wb['pw_error_length'] = 'The password length is < 1 or > 64 characters.';
$wb['error_user_password_empty'] = 'Потребителско име or Password empty.';
$wb['error_user_password_incorrect'] = 'Потребителско име or Password wrong.';
$wb['error_user_blocked'] = 'User is blocked.';
interface/web/login/lib/lang/br.lng
@@ -9,7 +9,7 @@
$wb['pw_error_noinput'] = 'Favor informar nome de usuário e endereço de correio válidos.';
$wb['pw_reset_mail_msg'] = 'Sua senha do painel de controle foi restabelecida. A sua nova senha é: ';
$wb['pw_reset_mail_title'] = 'Sua senha do painel de controle foi restabelecida.';
$wb['user_regex_error'] = 'O nome de usuário contém mais de 64 caracteres ou contém caracteres inválidos.';
$wb['user_regex_error'] = 'O nome de usuário contém < 1 or mais de 64 caracteres ou contém caracteres inválidos.';
$wb['pw_error_length'] = 'Tamanho da senha não pode ser maior do que 64 caracteres.';
$wb['username_txt'] = 'Usuário';
$wb['password_txt'] = 'Senha';
interface/web/login/lib/lang/de.lng
@@ -10,7 +10,7 @@
$wb['pw_reset_mail_msg'] = 'Das Passwort wurde zurückgesetzt. Das neue Passwort lautet: ';
$wb['pw_reset_mail_title'] = 'Ihr Passwort wurde zurückgesetzt.';
$wb['user_regex_error'] = 'Benutzername beinhaltet nicht erlaubte Zeichen oder ist länger als 64 Zeichen.';
$wb['pw_error_length'] = 'Die Passwortlänge ist > 64 Zeichen.';
$wb['pw_error_length'] = 'Die Passwortlänge ist < 1 oder > 64 Zeichen.';
$wb['login_txt'] = 'Anmelden';
$wb['username_txt'] = 'Benutzername';
$wb['password_txt'] = 'Passwort';
interface/web/login/lib/lang/en.lng
@@ -10,7 +10,7 @@
$wb['pw_reset_mail_msg']    = 'The password to your ISPConfig 3 control panel account has been reset. The new password is: ';
$wb['pw_reset_mail_title']  = 'ISPConfig 3 Control panel password has been reset.';
$wb['user_regex_error'] = 'Username contains unallowed characters or is longer than 64 characters.';
$wb['pw_error_length']  = 'The password length is > 64 characters.';
$wb['pw_error_length']  = 'The password length is < 1 or > 64 characters.';
$wb['email_error'] = 'Email contains unallowed characters or has a invalid format.';
$wb['login_txt']    = "Login";
$wb['username_txt']    = "Username";
interface/web/login/login_as.php
@@ -92,12 +92,13 @@
    '.$wb['login_2_txt'].'<br />
    <div style="visibility:hidden">
        <input type="text" name="username" value="' . $dbData['username'] . '" />
        <input type="password" name="passwort" value="' . $dbData['passwort'] .'" />
        <input type="password" name="password" value="' . $dbData['passwort'] .'" />
    </div>
    <input type="hidden" name="s_mod" value="login" />
    <input type="hidden" name="s_pg" value="index" />
    <input type="hidden" name="s_mod" value="dashboard" />
    <input type="hidden" name="s_pg" value="dashboard" />
    <input type="hidden" name="login_as" value="1" />
    <div class="wf_actions buttons">
      <button class="positive iconstxt icoPositive" type="button" value="'.$wb['btn_yes_txt'].'" onclick="submitLoginForm(' . "'pageForm'" . ');"><span>'.$wb['btn_yes_txt'].'</span></button>
      <button class="positive iconstxt icoPositive" type="button" value="'.$wb['btn_yes_txt'].'" data-submit-form="pageForm" data-form-action="/login/index.php"><span>'.$wb['btn_yes_txt'].'</span></button>
      <button class="negative iconstxt icoNegative" type="button" value="'.$wb['btn_back_txt'].'" data-load-content="'.$backlink.'"><span>'.$wb['btn_back_txt'].'</span></button>
    </div>
';
interface/web/login/logout.php
@@ -50,12 +50,13 @@
        '.str_replace('{UTYPE}', $utype, $wb['login_as_or_logout_txt']).'<br />
        <div style="visibility:hidden">
            <input type="text" name="username" value="' . $_SESSION['s_old']['user']['username'] . '" />
            <input type="password" name="passwort" value="' . $_SESSION['s_old']['user']['passwort'] .'" />
            <input type="password" name="password" value="' . $_SESSION['s_old']['user']['passwort'] .'" />
        </div>
        <input type="hidden" name="s_mod" value="login" />
        <input type="hidden" name="s_pg" value="index" />
        <input type="hidden" name="login_as" value="1" />
        <div class="wf_actions buttons">
          <button class="positive iconstxt icoPositive" type="button" value="Yes, re-login as ' . $utype . '" onclick="submitLoginForm(' . "'pageForm'" . ');"><span>Yes, re-login as ' . $utype . '</span></button>
          <button class="positive iconstxt icoPositive" type="button" value="Yes, re-login as ' . $utype . '" data-submit-form="pageForm" data-form-action="/login/index.php"><span>Yes, re-login as ' . $utype . '</span></button>
          <button class="negative iconstxt icoNegative" type="button" value="No, logout" data-load-content="login/logout.php?l=1"><span>No, logout</span></button>
        </div>
    ';
interface/web/login/password_reset.php
@@ -1,7 +1,7 @@
<?php
/*
Copyright (c) 2008, Till Brehm, projektfarm Gmbh
Copyright (c) 2008 - 2015, Till Brehm, ISPConfig UG
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
@@ -38,18 +38,25 @@
// Loading the template
$app->uses('tpl');
$app->tpl->newTemplate("form.tpl.htm");
$app->tpl->newTemplate('main_login.tpl.htm');
$app->tpl->setInclude('content_tpl', 'templates/password_reset.htm');
$app->tpl_defaults();
include ISPC_ROOT_PATH.'/web/login/lib/lang/'.$_SESSION['s']['language'].'.lng';
$app->tpl->setVar($wb);
$continue = true;
if(isset($_POST['username']) && $_POST['username'] != '' && $_POST['email'] != '' && $_POST['username'] != 'admin') {
    if(!preg_match("/^[\w\.\-\_]{1,64}$/", $_POST['username'])) die($app->lng('user_regex_error'));
    if(!preg_match("/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,10}$/i", $_POST['email'])) die($app->lng('email_error'));
    if(!preg_match("/^[\w\.\-\_]{1,64}$/", $_POST['username'])) {
        $app->tpl->setVar("error", $wb['user_regex_error']);
        $continue = false;
    }
    if(!preg_match("/^\w+[\w.-]*\w+@\w+[\w.-]*\w+\.[a-z]{2,10}$/i", $_POST['email'])) {
        $app->tpl->setVar("error", $wb['email_error']);
        $continue = false;
    }
    $username = $_POST['username'];
    $email = $_POST['email'];
@@ -58,7 +65,7 @@
    if($client['lost_password_function'] == 0) {
        $app->tpl->setVar("error", $wb['lost_password_function_disabled_txt']);
    } else {
    } elseif ($continue) {
        if($client['client_id'] > 0) {
            $server_config_array = $app->getconf->get_global_config();
            $min_password_length = 8;
@@ -91,9 +98,26 @@
        }
    }
} else {
    $app->tpl->setVar("msg", $wb['pw_error_noinput']);
    if(isset($_POST) && count($_POST) > 0) $app->tpl->setVar("msg", $wb['pw_error_noinput']);
}
$app->tpl->setVar('current_theme', isset($_SESSION['s']['theme']) ? $_SESSION['s']['theme'] : 'default');
// Logo
$logo = $app->db->queryOneRecord("SELECT * FROM sys_ini WHERE sysini_id = 1");
if($logo['custom_logo'] != ''){
    $base64_logo_txt = $logo['custom_logo'];
} else {
    $base64_logo_txt = $logo['default_logo'];
}
$tmp_base64 = explode(',', $base64_logo_txt, 2);
$logo_dimensions = $app->functions->getimagesizefromstring(base64_decode($tmp_base64[1]));
$app->tpl->setVar('base64_logo_width', $logo_dimensions[0].'px');
$app->tpl->setVar('base64_logo_height', $logo_dimensions[1].'px');
$app->tpl->setVar('base64_logo_txt', $base64_logo_txt);
// Title
$app->tpl->setVar('company_name', $sys_config['company_name']. ' :: ');
$app->tpl_defaults();
$app->tpl->pparse();
interface/web/login/templates/index.htm
@@ -1,43 +1,28 @@
<div class='page-header'>
    <h1><tmpl_var name="login_txt"></h1>
</div>
<p><tmpl_var name="list_desc_txt"></p>
<div class="panel panel_login">
    <tmpl_if name="msg">
        <div id="OKMsg"><p><tmpl_var name="msg"></p></div>
    </tmpl_if>
    <tmpl_if name="error">
        <div id="errorMsg"><h3>{tmpl_var name='error_txt'}</h3><ol><li><tmpl_var name="error"></li></ol><br /><a href="#" data-load-content="login/password_reset.php">{tmpl_var name='pw_lost_txt'}</a></div>
                    <div class="alert alert-danger" role="alert"><tmpl_var name="error"></div>
    </tmpl_if>
    <div class="pnl_formsarea">
                    <form accept-charset="UTF-8" role="form" method="post" action="index.php">
                    <fieldset>
            <div class="form-group">
                <label for="username" class="col-sm-3 control-label">{tmpl_var name='username_txt'}</label>
                <div class="col-sm-9"><input type="text" name="username" id="username" value="" class="form-control"  onkeypress="if (event.keyCode && event.keyCode == 13) {ISPConfig.submitLoginForm('pageForm'); return false;};" /></div></div>
                            <input class="form-control" placeholder="{tmpl_var name='username_txt'}" name="username" id="username" type="text">
                        </div>
            <div class="form-group">
                <label for="passwort" class="col-sm-3 control-label">{tmpl_var name='password_txt'}</label>
                <div class="col-sm-9"><input type="password" name="passwort" id="passwort" value="" class="form-control"  onkeypress="if (event.keyCode && event.keyCode == 13) {ISPConfig.submitLoginForm('pageForm'); return false;};" /></div></div>
                            <input class="form-control" placeholder="{tmpl_var name='password_txt'}" name="password" id="password" type="password" value="">
                        </div>
            <tmpl_if name="session_timeout" op=">" value="0">
                <tmpl_if name="session_allow_endless" value="y">
            <div class="form-group">
                <label for="passwort" class="col-sm-3 control-label">{tmpl_var name='stay_logged_in_txt'}</label>
                <div class="col-sm-9"><input class="form-control" type="checkbox" name="stay" id="stay" value="1" onkeypress="if (event.keyCode && event.keyCode == 13) {ISPConfig.submitLoginForm('pageForm'); return false;};" /></div></div>
                        <div class="checkbox">
                            <label>
                                <input name="stay" id="stay" type="checkbox" value="1"> {tmpl_var name='stay_logged_in_txt'}
                            </label>
                        </div>
                </tmpl_if>
            </tmpl_if>
        <input type="hidden" name="s_mod" value="login" />
        <input type="hidden" name="s_pg" value="index" />
        <div class="clear"><div class="right">
            <button class="btn btn-default formbutton-default" type="button" value="{tmpl_var name='add_new_record_txt'}" onclick="ISPConfig.submitLoginForm('pageForm');">{tmpl_var name='login_button_txt'}</button>
            <tmpl_if name="pw_lost_show"><button class="btn btn-default formbutton-default" type="button" value="{tmpl_var name='pw_lost_txt'}" data-load-content="login/password_reset.php">{tmpl_var name='pw_lost_txt'}</button></tmpl_if>
        </div></div>
                        <div class="right">
                        <input class="btn btn-default formbutton-default" type="submit" value="{tmpl_var name='login_txt'}">
                        <tmpl_if name="pw_lost_show"><button class="btn btn-default formbutton-default" type="button" value="{tmpl_var name='pw_lost_txt'}" onClick="document.location.href='password_reset.php';">{tmpl_var name='pw_lost_txt'}</button></tmpl_if>
    </div>
</div>
<script language="JavaScript" type="text/javascript">
    $('#username').closest('form').attr('autocomplete','on');
</script>
                    </fieldset>
                      </form>
interface/web/login/templates/password_reset.htm
@@ -1,35 +1,24 @@
<div class='page-header'>
    <h1><tmpl_var name="pw_reset_txt"></h1>
</div>
<p><tmpl_var name="list_desc_txt"></p>
<div class="panel panel_password_reset">
    <tmpl_if name="msg">
        <div id="OKMsg"><p><tmpl_var name="msg"></p></div>
<div class="alert alert-success" role="alert"><tmpl_var name="msg"></div>
    </tmpl_if>
    <tmpl_if name="error">
        <div id="errorMsg"><h3><tmpl_var name="error_txt"></h3><ol><tmpl_var name="error"></ol></div>
<div class="alert alert-danger" role="alert"><tmpl_var name="error"></div>
    </tmpl_if>
    <div class="pnl_formsarea">
        <legend>{tmpl_var name='pw_reset_txt'}</legend>
<h2><tmpl_var name="pw_reset_txt"></h2>
<p><tmpl_var name="list_desc_txt"></p>
<form accept-charset="UTF-8" role="form" method="post" action="password_reset.php">
<fieldset>
            <div class="form-group">
                <label for="email" class="col-sm-3 control-label"><em>*</em> {tmpl_var name='email_txt'}</label>
                <div class="col-sm-9"><input type="text" name="email" id="email" value="" class="form-control" /></div></div>
        <input class="form-control" placeholder="{tmpl_var name='email_txt'}" name="email" id="email" type="text">
    </div>
            <div class="form-group">
                <label for="username" class="col-sm-3 control-label"><em>*</em> {tmpl_var name='username_txt'}</label>
                <div class="col-sm-9"><input type="text" name="username" id="username" value="" class="form-control" /></div></div>
        <input class="form-control" placeholder="{tmpl_var name='username_txt'}" name="username" id="username" type="text">
    </div>
        <input type="hidden" name="s_mod" value="login" />
        <input type="hidden" name="s_pg" value="index" />
        <div class="clear"><div class="right">
            <button class="btn btn-default formbutton-default" type="button" value="{tmpl_var name='pw_button_txt'}" data-submit-form="pageForm" data-form-action="login/password_reset.php">{tmpl_var name='pw_button_txt'}</button>
            <button class="btn btn-default formbutton-default" type="button" value="{tmpl_var name='back_txt'}" onclick="ISPConfig.loadInitContent();">{tmpl_var name='back_txt'}</button>
        </div></div>
    <div class="right">
          <input class="btn btn-default formbutton-default" type="submit" value="{tmpl_var name='pw_button_txt'}">
        <button class="btn btn-default formbutton-default" type="button" value="{tmpl_var name='pw_lost_txt'}" onClick="document.location.href='index.php';">{tmpl_var name='back_txt'}</button>
    </div>
</div>
</fieldset>
</form>
interface/web/nav.php
@@ -83,12 +83,16 @@
        }
    } else {
        //*  Loading Login Module
        /*
        include_once 'login/lib/module.conf.php';
        $_SESSION['s']['module'] = $module;
        $topnav[] = array( 'title'  => 'Login',
            'active'  => 1);
        $module = null;
        unset($module);
        */
        header('Location: /login/');
        die();
    }
    //* Topnavigation
interface/web/themes/default/assets/javascripts/ispconfig.js
@@ -11,7 +11,7 @@
    
    options: {
        useLoadIndicator: false,
        useComboBox: false,
        useComboBox: false
    },
    
    setOption: function(key, value) {
@@ -91,7 +91,7 @@
                placeholder: '',
                width: 'element',
                selectOnBlur: true,
                allowClear: true,
                allowClear: true
            });
        }
    },
@@ -143,7 +143,7 @@
    },
    /* THIS ONE SHOULD BE REMOVED AFTER CREATING THE STATIC LOGIN PAGE!!! */
    submitLoginForm: function(formname) {
    /*submitLoginForm: function(formname) {
        //* Validate form. TODO: username and password with strip();
        var frm = document.getElementById(formname);
        var userNameObj = frm.username;
@@ -189,7 +189,7 @@
                ISPConfig.reportError('Ajax Request was not successful.110');
            }
        });
    },
    },*/
    submitForm: function(formname, target, confirmation) {
        var successMessage = arguments[3];
@@ -209,6 +209,9 @@
                    if(jqXHR.responseText.indexOf('HEADER_REDIRECT:') > -1) {
                        var parts = jqXHR.responseText.split(':');
                        ISPConfig.loadContent(parts[1]);
                    } else if (jqXHR.responseText.indexOf('LOGIN_REDIRECT:') > -1) {
                        // Go to the login page
                        document.location.href = '/index.php';
                    } else {
                        $('#pageContent').html(jqXHR.responseText);
                        ISPConfig.onAfterContentLoad(target, $('#'+formname).serialize());
@@ -354,8 +357,8 @@
    loadInitContent: function() {
        var pageContentObject = $.ajax({
            type: "GET",
            url: "content.php",
            data: "s_mod=login&s_pg=index",
            url: "dashboard/dashboard.php",
            data: "",
            dataType: "html",
            beforeSend: function() {
                ISPConfig.showLoadIndicator();
@@ -366,7 +369,7 @@
                    ISPConfig.loadContent(parts[1]);
                } else {
                    $('#pageContent').html(jqXHR.responseText);
                    ISPConfig.onAfterContentLoad('content.php', "s_mod=login&s_pg=index");
                    ISPConfig.onAfterContentLoad('dashboard/dashboard.php', "");
                    ISPConfig.pageFormChanged = false;
                }
                ISPConfig.hideLoadIndicator();
interface/web/themes/default/assets/javascripts/ispconfig.min.js
@@ -1 +1,28 @@
var ISPConfig={pageFormChanged:false,tabChangeWarningTxt:"",tabChangeDiscardTxt:"",tabChangeWarning:false,tabChangeDiscard:false,requestsRunning:0,indicatorCompleted:false,registeredHooks:new Array(),new_tpl_add_id:0,options:{useLoadIndicator:false,useComboBox:false,},setOption:function(a,b){ISPConfig.options[a]=b},setOptions:function(a){$.extend(ISPConfig.options,a)},reportError:function(a){},registerHook:function(a,c){if(!ISPConfig.registeredHooks[a]){ISPConfig.registeredHooks[a]=new Array()}var b=ISPConfig.registeredHooks[a].length;ISPConfig.registeredHooks[a][b]=c},callHook:function(a,c){if(!ISPConfig.registeredHooks[a]){return}for(var b=0;b<ISPConfig.registeredHooks[a].length;b++){var d=ISPConfig.registeredHooks[a][b];d(a,c)}},resetFormChanged:function(){ISPConfig.pageFormChanged=false},showLoadIndicator:function(){document.body.style.cursor="wait";if(ISPConfig.options.useLoadIndicator==true){ISPConfig.requestsRunning+=1;if(ISPConfig.requestsRunning<2){var a=$("#ajaxloader");if(a.length<1){a=$('<div id="ajaxloader" style="display: none;"></div>');a.appendTo("body")}var b=$("#content");if(b.length<1){return}ISPConfig.indicatorCompleted=false;var d=b.offset().left+150;var c=b.offset().top+150;a.css({left:d,top:c}).fadeIn("fast",function(){ISPConfig.indicatorCompleted=true;if(ISPConfig.requestsRunning<1){$(this).fadeOut("fast",function(){$(this).hide()})}})}}},hideLoadIndicator:function(){document.body.style.cursor="";ISPConfig.requestsRunning-=1;if(ISPConfig.requestsRunning<1){ISPConfig.requestsRunning=0;if(ISPConfig.indicatorCompleted==true){$("#ajaxloader").fadeOut("fast",function(){$("#ajaxloader").hide()})}}},onAfterSideNavLoaded:function(){if(ISPConfig.options.useComboBox==true){$("#sidebar").find("select:not(.chosen-select)").select2({placeholder:"",width:"element",selectOnBlur:true,allowClear:true,})}},onAfterContentLoad:function(a,b){if(!b){b=""}else{b="&"+b}if(ISPConfig.options.useComboBox==true){$("#pageContent").find("select:not(.chosen-select)").select2({placeholder:"",width:"element",selectOnBlur:true,allowClear:true,formatResult:function(c){if(c.id&&$(c.element).parent().hasClass("flags")){return'<span class="flags flag-'+c.id.toLowerCase()+'">'+c.text+"</span>"}else{return c.text}},formatSelection:function(c){if(c.id&&$(c.element).parent().hasClass("flags")){return'<span class="flags flag-'+c.id.toLowerCase()+'">'+c.text+"</span>"}else{return c.text}}}).on("change",function(c){if($("#pageForm .table #Filter").length>0){$("#pageForm .table #Filter").trigger("click")}})}$('input[data-input-element="date"]').datetimepicker({language:"en",todayHighlight:true,todayBtn:"linked",bootcssVer:3,fontAwesome:true,autoclose:true,minView:"month"});$('input[data-input-element="datetime"]').datetimepicker({language:"en",todayHighlight:true,todayBtn:"linked",bootcssVer:3,fontAwesome:true,autoclose:true});ISPConfig.callHook("onAfterContentLoad",{url:a,data:b})},submitLoginForm:function(d){var c=document.getElementById(d);var b=c.username;if(b.value==""){b.focus();return}var e=c.passwort;if(e.value==""){e.focus();return}$("#dummy_username").val(b.value);$("#dummy_passwort").val(e.value);$("#dummy_login_form").submit();var a=$.ajax({type:"POST",url:"content.php",data:$("#"+d).serialize(),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(g,i,f){if(f.responseText.indexOf("HEADER_REDIRECT:")>-1){var h=f.responseText.split(":");ISPConfig.loadContent(h[1])}else{if(f.responseText.indexOf("LOGIN_REDIRECT:")>-1){document.location.href="index.php"}else{$("#pageContent").html(f.responseText);ISPConfig.onAfterContentLoad("content.php",$("#"+d).serialize());ISPConfig.pageFormChanged=false}}ISPConfig.loadMenus();ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful.110")}})},submitForm:function(d,e,c){var b=arguments[3];if(!c){c=false}if(!c||window.confirm(c)){var a=$.ajax({type:"POST",url:e,data:$("#"+d).serialize(),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(g,i,f){if(b){alert(b)}if(f.responseText.indexOf("HEADER_REDIRECT:")>-1){var h=f.responseText.split(":");ISPConfig.loadContent(h[1])}else{$("#pageContent").html(f.responseText);ISPConfig.onAfterContentLoad(e,$("#"+d).serialize());ISPConfig.pageFormChanged=false}ISPConfig.hideLoadIndicator()},error:function(f,i,h){ISPConfig.hideLoadIndicator();var g=f.responseText.split(":");ISPConfig.reportError("Ajax Request was not successful. 111")}})}},submitUploadForm:function(c,d){var b=function(l){var g,h=l.contentWindow.document.body.innerHTML;try{g=JSON.parse(h)}catch(i){g=h}var j="";var f=$("#OKMsg",g).html();if(f){j='<div id="OKMsg">'+f+"</div>"}var k=$("#errorMsg",g).html();if(k){j=j+'<div id="errorMsg">'+k+"</div>"}return j};var a="ajaxUploader-iframe-"+Math.round(new Date().getTime()/1000);$("body").after('<iframe width="0" height="0" style="display:none;" name="'+a+'" id="'+a+'"/>');$('input[type="file"]').closest("form").attr({target:a,action:d}).submit();$("#"+a).load(function(){var e=b(this);$("#errorMsg").remove();$("#OKMsg").remove();$('input[name="id"]').before(e);$(this).remove()})},capp:function(b,c){var a=$.ajax({type:"GET",url:"capp.php",data:"mod="+b+((c!=undefined)?"&redirect="+c:""),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(e,h,d){if(d.responseText!=""){if(d.responseText.indexOf("HEADER_REDIRECT:")>-1){var g=d.responseText.split(":");ISPConfig.loadContent(g[1])}else{if(d.responseText.indexOf("URL_REDIRECT:")>-1){var f=d.responseText.substr(d.responseText.indexOf("URL_REDIRECT:")+"URL_REDIRECT:".length);document.location.href=f}else{}}}ISPConfig.loadMenus();ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful."+b)}})},loadContent:function(b){var c=arguments[1];var a=$.ajax({type:"GET",url:b,data:(c?c:null),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(e,h,d){if(d.responseText.indexOf("HEADER_REDIRECT:")>-1){var g=d.responseText.split(":");ISPConfig.loadContent(g[1])}else{if(d.responseText.indexOf("URL_REDIRECT:")>-1){var f=d.responseText.substr(d.responseText.indexOf("URL_REDIRECT:")+"URL_REDIRECT:".length);document.location.href=f}else{$("#pageContent").html(d.responseText);ISPConfig.onAfterContentLoad(b,(c?c:null));ISPConfig.pageFormChanged=false}}ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 113")}})},loadContentRefresh:function(b){if($("#refreshinterval").val()>0){var a=$.ajax({type:"GET",url:b,data:"refresh="+document.getElementById("refreshinterval").value,dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(d,e,c){ISPConfig.hideLoadIndicator();$("#pageContent").html(c.responseText);ISPConfig.onAfterContentLoad(b,"refresh="+document.getElementById("refreshinterval").value);ISPConfig.pageFormChanged=false},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful."+b)}});setTimeout("ISPConfig.loadContentRefresh('"+b+"&refresh="+document.getElementById("refreshinterval").value+"')",document.getElementById("refreshinterval").value*1000*60)}},loadInitContent:function(){var a=$.ajax({type:"GET",url:"content.php",data:"s_mod=login&s_pg=index",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(c,e,b){if(b.responseText.indexOf("HEADER_REDIRECT:")>-1){var d=b.responseText.split(":");ISPConfig.loadContent(d[1])}else{$("#pageContent").html(b.responseText);ISPConfig.onAfterContentLoad("content.php","s_mod=login&s_pg=index");ISPConfig.pageFormChanged=false}ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 114")}});ISPConfig.loadMenus();ISPConfig.keepalive();setTimeout(function(){try{$("form#pageForm").find('input[name="username"]').focus()}catch(b){}},1000)},loadMenus:function(){var b=$.ajax({type:"GET",url:"nav.php",data:"nav=side",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(d,e,c){ISPConfig.hideLoadIndicator();$("#sidebar").html(c.responseText);ISPConfig.onAfterSideNavLoaded();ISPConfig.loadPushyMenu()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 115")}});var a=$.ajax({type:"GET",url:"nav.php",data:"nav=top",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(d,e,c){ISPConfig.hideLoadIndicator();$("#topnav-container").html(c.responseText);ISPConfig.loadPushyMenu()},error:function(c){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 116")}})},changeTab:function(c,e,d){if(ISPConfig.requestsRunning>0){return false}document.pageForm.next_tab.value=c;var b=$("form#pageForm").find('[name="id"]');var f=null;if(b.length>0){f=b.val()}if(ISPConfig.tabChangeDiscard=="y"&&!d){if((b.length<1||f)&&(ISPConfig.pageFormChanged==false||window.confirm(ISPConfig.tabChangeDiscardTxt))){var a=c;if(f){ISPConfig.loadContent(e,{next_tab:a,id:f})}else{ISPConfig.loadContent(e,{next_tab:a})}}else{return false}}else{if(f&&ISPConfig.tabChangeWarning=="y"&&ISPConfig.pageFormChanged==true){if(window.confirm(ISPConfig.tabChangeWarningTxt)){ISPConfig.submitForm("pageForm",e)}else{var a=c;if(f){ISPConfig.loadContent(e,{next_tab:a,id:f})}else{ISPConfig.loadContent(e,{next_tab:a})}}}else{ISPConfig.submitForm("pageForm",e)}}},confirm_action:function(b,a){if(window.confirm(a)){ISPConfig.loadContent(b)}},loadContentInto:function(b,c){var a=$.ajax({type:"GET",url:c,dataType:"html",beforeSend:function(){},success:function(e,f,d){$("#"+b).html(d.responseText)},error:function(){ISPConfig.reportError("Ajax Request was not successful. 118")}})},loadOptionInto:function(b,c,d){var a=$.ajax({type:"GET",url:c,dataType:"html",beforeSend:function(){},success:function(h,l,g){var j=g.responseText;var k=j.split("#");el=document.getElementById(b);el.innerHTML="";for(var f=0;f<k.length;++f){var e=document.createElement("option");e.appendChild(document.createTextNode(k[f]));e.value=k[f];el.appendChild(e)}if(typeof(d)!="undefined"){d(b,c)}},error:function(){ISPConfig.reportError("Ajax Request was not successful. 119")}})},keepalive:function(){var a=$.ajax({type:"GET",url:"keepalive.php",dataType:"html",success:function(c,d,b){setTimeout(function(){ISPConfig.keepalive()},1000000)},error:function(){ISPConfig.reportError("Session expired. Please login again.")}})},addAdditionalTemplate:function(){var e=$("#template_additional").val();var a=$("#tpl_add_select").val().split("|",2);var d=a[0];var f=a[1];if(d>0){var c=e.split("/");ISPConfig.new_tpl_add_id+=1;var b=$('<a href="#"></a>').attr("class","button icons16 icoDelete").click(function(g){g.preventDefault();ISPConfig.delAdditionalTemplate($(this).parent().attr("rel"))});c[c.length]="n"+ISPConfig.new_tpl_add_id+":"+d;$("<li>"+f+"</li>").attr("rel","n"+new_tpl_add_id).append(b).appendTo("#template_additional_list ul");$("#template_additional").val(c.join("/"));alert("additional template "+f+" added to customer")}else{alert("no additional template selcted")}},delAdditionalTemplate:function(d){var a=$("#template_additional").val();if(d){var l=$("#template_additional_list ul").find('li[rel="'+d+'"]').eq(0);var k=l.text();l.remove();var j=a.split("/");var b=new Array();for(var e=0;e<j.length;e++){var f=j[e].split(":",2);if(f.length==2&&f[0]==d){continue}b[b.length]=j[e]}$("#template_additional").val(b.join("/"));alert("additional template "+k+" deleted from customer")}else{if(a!=""){var c=document.getElementById("tpl_add_select").value.split("|",2);var h=c[0];var k=c[1];$("#template_additional_list ul").find("li:not([rel])").each(function(){var i=$(this).text();if(i==k){$(this).remove();return false}return this});var b=a;var g=new RegExp("(^|/)"+h+"(/|$)");b=b.replace(g,"");b=b.replace("//","/");$("#template_additional").val(b);alert("additional template "+k+" deleted from customer")}else{alert("no additional template selcted")}}}};$(document).on("change",function(a){var b=a.target.localName;if($("#pageForm .table #Filter").length>0&&b=="select"){a.preventDefault();$("#pageForm .table #Filter").trigger("click")}if(b=="select"||b=="input"||b=="textarea"){if($(a.target).hasClass("no-page-form-change")==false){ISPConfig.pageFormChanged=true}}});$(document).on("click","a[data-load-content],button[data-load-content]",function(b){var a=$(this).attr("data-load-content");if(!a){return this}ISPConfig.loadContent(a)});$(document).on("click","a[data-capp],button[data-capp]",function(b){var a=$(this).attr("data-capp");if(!a){return this}ISPConfig.capp(a)});$(document).on("click","a[data-submit-form],button[data-submit-form]",function(d){var b=$(this);var a=b.attr("data-form-action");var c=b.attr("data-submit-form");if(b.attr("data-form-upload")=="true"){ISPConfig.submitUploadForm(c,a)}else{ISPConfig.submitForm(c,a)}});$(document).bind("keypress",function(a){if(a.which=="13"&&$("#pageForm .table #Filter").length>0&&$(a.target).hasClass("ui-autocomplete-input")==false){a.preventDefault();$("#pageForm .table #Filter").trigger("click")}if(a.which=="13"&&$(".pnl_formsarea button.positive").length>0&&a.target.localName!="textarea"&&$(a.target).is(":input")){a.preventDefault();$(".pnl_formsarea button.positive:first").not("[disabled='disabled']").trigger("click")}});$(document).on("click","th[data-column]",function(h){var i=$(this);var d=i.attr("data-column");if(!d){return this}if($("#pageForm .table #Filter").length>0&&i.attr("data-sortable")!="false"){var c=$("#Filter");var a=c.attr("data-form-action");var f=c.attr("data-submit-form");var b=i.attr("data-ordered");var g="?";if(a.indexOf("?")>=0){g="&"}a=a+g+"orderby="+d;ISPConfig.submitForm(f,a);$(document).ajaxComplete(function(){var e=$('#pageForm .table th[data-column="'+d+'"]');e.parent().children("th[data-column]").removeAttr("data-ordered");if(b&&b=="asc"){e.attr("data-ordered","desc")}else{e.attr("data-ordered","asc")}})}});$(document).on("click",".addPlaceholder",function(){var a=$(this).text();var b=$(this).siblings(":input");b.insertAtCaret(a)});$(document).on("click",".addPlaceholderContent",function(){var b=$(this).find(".addPlaceholderContent").text();var a=$(this).siblings(":input");a.insertAtCaret(b)});$(document).on("ready",function(){$.fn.extend({insertAtCaret:function(a){return this.each(function(d){if(document.selection){this.focus();sel=document.selection.createRange();sel.text=a;this.focus()}else{if(this.selectionStart||this.selectionStart=="0"){var c=this.selectionStart;var b=this.selectionEnd;var e=this.scrollTop;this.value=this.value.substring(0,c)+a+this.value.substring(b,this.value.length);this.focus();this.selectionStart=c+a.length;this.selectionEnd=c+a.length;this.scrollTop=e}else{this.value+=a;this.focus()}}})}});$(".progress .progress-bar").css("width",function(){return $(this).attr("aria-valuenow")+"%"});ISPConfig.loadInitContent();$("#searchform").submit(function(a){a.preventDefault()});$("#pageForm").submit(function(a){if($("#pageForm .table #Filter").length>0){a.preventDefault()}})});
var ISPConfig={pageFormChanged:!1,tabChangeWarningTxt:"",tabChangeDiscardTxt:"",tabChangeWarning:!1,tabChangeDiscard:!1,requestsRunning:0,indicatorCompleted:!1,registeredHooks:[],new_tpl_add_id:0,options:{useLoadIndicator:!1,useComboBox:!1},setOption:function(a,b){ISPConfig.options[a]=b},setOptions:function(a){$.extend(ISPConfig.options,a)},reportError:function(a){},registerHook:function(a,b){ISPConfig.registeredHooks[a]||(ISPConfig.registeredHooks[a]=[]);ISPConfig.registeredHooks[a][ISPConfig.registeredHooks[a].length]=
b},callHook:function(a,b){if(ISPConfig.registeredHooks[a])for(var c=0;c<ISPConfig.registeredHooks[a].length;c++)(0,ISPConfig.registeredHooks[a][c])(a,b)},resetFormChanged:function(){ISPConfig.pageFormChanged=!1},showLoadIndicator:function(){document.body.style.cursor="wait";if(1==ISPConfig.options.useLoadIndicator&&(ISPConfig.requestsRunning+=1,2>ISPConfig.requestsRunning)){var a=$("#ajaxloader");1>a.length&&(a=$('<div id="ajaxloader" style="display: none;"></div>'),a.appendTo("body"));var b=$("#content");
if(!(1>b.length)){ISPConfig.indicatorCompleted=!1;var c=b.offset().left+150,b=b.offset().top+150;a.css({left:c,top:b}).fadeIn("fast",function(){ISPConfig.indicatorCompleted=!0;1>ISPConfig.requestsRunning&&$(this).fadeOut("fast",function(){$(this).hide()})})}}},hideLoadIndicator:function(){document.body.style.cursor="";--ISPConfig.requestsRunning;1>ISPConfig.requestsRunning&&(ISPConfig.requestsRunning=0,1==ISPConfig.indicatorCompleted&&$("#ajaxloader").fadeOut("fast",function(){$("#ajaxloader").hide()}))},
onAfterSideNavLoaded:function(){1==ISPConfig.options.useComboBox&&$("#sidebar").find("select:not(.chosen-select)").select2({placeholder:"",width:"element",selectOnBlur:!0,allowClear:!0})},onAfterContentLoad:function(a,b){b=b?"&"+b:"";if(1==ISPConfig.options.useComboBox)$("#pageContent").find("select:not(.chosen-select)").select2({placeholder:"",width:"element",selectOnBlur:!0,allowClear:!0,formatResult:function(a){return a.id&&$(a.element).parent().hasClass("flags")?'<span class="flags flag-'+a.id.toLowerCase()+
'">'+a.text+"</span>":a.text},formatSelection:function(a){return a.id&&$(a.element).parent().hasClass("flags")?'<span class="flags flag-'+a.id.toLowerCase()+'">'+a.text+"</span>":a.text}}).on("change",function(a){0<$("#pageForm .table #Filter").length&&$("#pageForm .table #Filter").trigger("click")});$('input[data-input-element="date"]').datetimepicker({language:"en",todayHighlight:!0,todayBtn:"linked",bootcssVer:3,fontAwesome:!0,autoclose:!0,minView:"month"});$('input[data-input-element="datetime"]').datetimepicker({language:"en",
todayHighlight:!0,todayBtn:"linked",bootcssVer:3,fontAwesome:!0,autoclose:!0});ISPConfig.callHook("onAfterContentLoad",{url:a,data:b})},submitForm:function(a,b,c,e){c||(c=!1);c&&!window.confirm(c)||$.ajax({type:"POST",url:b,data:$("#"+a).serialize(),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(c,f,g){e&&alert(e);-1<g.responseText.indexOf("HEADER_REDIRECT:")?(c=g.responseText.split(":"),ISPConfig.loadContent(c[1])):-1<g.responseText.indexOf("LOGIN_REDIRECT:")?
document.location.href="/index.php":($("#pageContent").html(g.responseText),ISPConfig.onAfterContentLoad(b,$("#"+a).serialize()),ISPConfig.pageFormChanged=!1);ISPConfig.hideLoadIndicator()},error:function(a,b,c){ISPConfig.hideLoadIndicator();a.responseText.split(":");ISPConfig.reportError("Ajax Request was not successful. 111")}})},submitUploadForm:function(a,b){var c="ajaxUploader-iframe-"+Math.round((new Date).getTime()/1E3);$("body").after('<iframe width="0" height="0" style="display:none;" name="'+
c+'" id="'+c+'"/>');$('input[type="file"]').closest("form").attr({target:c,action:b}).submit();$("#"+c).load(function(){var a,b=this.contentWindow.document.body.innerHTML;try{a=JSON.parse(b)}catch(c){a=b}var b="",f=$("#OKMsg",a).html();f&&(b='<div id="OKMsg">'+f+"</div>");(a=$("#errorMsg",a).html())&&(b=b+'<div id="errorMsg">'+a+"</div>");a=b;$("#errorMsg").remove();$("#OKMsg").remove();$('input[name="id"]').before(a);$(this).remove()})},capp:function(a,b){$.ajax({type:"GET",url:"capp.php",data:"mod="+
a+(void 0!=b?"&redirect="+b:""),dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(a,b,d){""!=d.responseText&&(-1<d.responseText.indexOf("HEADER_REDIRECT:")?(a=d.responseText.split(":"),ISPConfig.loadContent(a[1])):-1<d.responseText.indexOf("URL_REDIRECT:")&&(a=d.responseText.substr(d.responseText.indexOf("URL_REDIRECT:")+13),document.location.href=a));ISPConfig.loadMenus();ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful."+
a)}})},loadContent:function(a,b){$.ajax({type:"GET",url:a,data:b?b:null,dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(c,e,d){-1<d.responseText.indexOf("HEADER_REDIRECT:")?(c=d.responseText.split(":"),ISPConfig.loadContent(c[1])):-1<d.responseText.indexOf("URL_REDIRECT:")?(c=d.responseText.substr(d.responseText.indexOf("URL_REDIRECT:")+13),document.location.href=c):($("#pageContent").html(d.responseText),ISPConfig.onAfterContentLoad(a,b?b:null),ISPConfig.pageFormChanged=
!1);ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 113")}})},loadContentRefresh:function(a){0<$("#refreshinterval").val()&&($.ajax({type:"GET",url:a,data:"refresh="+document.getElementById("refreshinterval").value,dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(b,c,e){ISPConfig.hideLoadIndicator();$("#pageContent").html(e.responseText);ISPConfig.onAfterContentLoad(a,"refresh="+
document.getElementById("refreshinterval").value);ISPConfig.pageFormChanged=!1},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful."+a)}}),setTimeout("ISPConfig.loadContentRefresh('"+a+"&refresh="+document.getElementById("refreshinterval").value+"')",6E4*document.getElementById("refreshinterval").value))},loadInitContent:function(){$.ajax({type:"GET",url:"dashboard/dashboard.php",data:"",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},
success:function(a,b,c){-1<c.responseText.indexOf("HEADER_REDIRECT:")?(a=c.responseText.split(":"),ISPConfig.loadContent(a[1])):($("#pageContent").html(c.responseText),ISPConfig.onAfterContentLoad("dashboard/dashboard.php",""),ISPConfig.pageFormChanged=!1);ISPConfig.hideLoadIndicator()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 114")}});ISPConfig.loadMenus();ISPConfig.keepalive();setTimeout(function(){try{$("form#pageForm").find('input[name="username"]').focus()}catch(a){}},
1E3)},loadMenus:function(){$.ajax({type:"GET",url:"nav.php",data:"nav=side",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},success:function(a,b,c){ISPConfig.hideLoadIndicator();$("#sidebar").html(c.responseText);ISPConfig.onAfterSideNavLoaded();ISPConfig.loadPushyMenu()},error:function(){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 115")}});$.ajax({type:"GET",url:"nav.php",data:"nav=top",dataType:"html",beforeSend:function(){ISPConfig.showLoadIndicator()},
success:function(a,b,c){ISPConfig.hideLoadIndicator();$("#topnav-container").html(c.responseText);ISPConfig.loadPushyMenu()},error:function(a){ISPConfig.hideLoadIndicator();ISPConfig.reportError("Ajax Request was not successful. 116")}})},changeTab:function(a,b,c){if(0<ISPConfig.requestsRunning)return!1;document.pageForm.next_tab.value=a;var e=$("form#pageForm").find('[name="id"]'),d=null;0<e.length&&(d=e.val());if("y"!=ISPConfig.tabChangeDiscard||c)d&&"y"==ISPConfig.tabChangeWarning&&1==ISPConfig.pageFormChanged?
window.confirm(ISPConfig.tabChangeWarningTxt)?ISPConfig.submitForm("pageForm",b):d?ISPConfig.loadContent(b,{next_tab:a,id:d}):ISPConfig.loadContent(b,{next_tab:a}):ISPConfig.submitForm("pageForm",b);else if((1>e.length||d)&&(0==ISPConfig.pageFormChanged||window.confirm(ISPConfig.tabChangeDiscardTxt)))d?ISPConfig.loadContent(b,{next_tab:a,id:d}):ISPConfig.loadContent(b,{next_tab:a});else return!1},confirm_action:function(a,b){window.confirm(b)&&ISPConfig.loadContent(a)},loadContentInto:function(a,
b){$.ajax({type:"GET",url:b,dataType:"html",beforeSend:function(){},success:function(b,e,d){$("#"+a).html(d.responseText)},error:function(){ISPConfig.reportError("Ajax Request was not successful. 118")}})},loadOptionInto:function(a,b,c){$.ajax({type:"GET",url:b,dataType:"html",beforeSend:function(){},success:function(e,d,f){e=f.responseText.split("#");el=document.getElementById(a);el.innerHTML="";for(d=0;d<e.length;++d)f=document.createElement("option"),f.appendChild(document.createTextNode(e[d])),
f.value=e[d],el.appendChild(f);"undefined"!=typeof c&&c(a,b)},error:function(){ISPConfig.reportError("Ajax Request was not successful. 119")}})},keepalive:function(){$.ajax({type:"GET",url:"keepalive.php",dataType:"html",success:function(a,b,c){setTimeout(function(){ISPConfig.keepalive()},1E6)},error:function(){ISPConfig.reportError("Session expired. Please login again.")}})},addAdditionalTemplate:function(){var a=$("#template_additional").val(),b=$("#tpl_add_select").val().split("|",2),c=b[0],b=
b[1];if(0<c){a=a.split("/");ISPConfig.new_tpl_add_id+=1;var e=$('<a href="#"></a>').attr("class","button icons16 icoDelete").click(function(a){a.preventDefault();ISPConfig.delAdditionalTemplate($(this).parent().attr("rel"))});a[a.length]="n"+ISPConfig.new_tpl_add_id+":"+c;$("<li>"+b+"</li>").attr("rel","n"+new_tpl_add_id).append(e).appendTo("#template_additional_list ul");$("#template_additional").val(a.join("/"));alert("additional template "+b+" added to customer")}else alert("no additional template selcted")},
delAdditionalTemplate:function(a){var b=$("#template_additional").val();if(a){var c=$("#template_additional_list ul").find('li[rel="'+a+'"]').eq(0),e=c.text();c.remove();for(var b=b.split("/"),c=[],d=0;d<b.length;d++){var f=b[d].split(":",2);if(2!=f.length||f[0]!=a)c[c.length]=b[d]}$("#template_additional").val(c.join("/"));alert("additional template "+e+" deleted from customer")}else""!=b?(a=document.getElementById("tpl_add_select").value.split("|",2),c=a[0],e=a[1],$("#template_additional_list ul").find("li:not([rel])").each(function(){return $(this).text()==
e?($(this).remove(),!1):this}),c=b.replace(new RegExp("(^|/)"+c+"(/|$)"),""),c=c.replace("//","/"),$("#template_additional").val(c),alert("additional template "+e+" deleted from customer")):alert("no additional template selcted")}};
$(document).on("change",function(a){var b=a.target.localName;0<$("#pageForm .table #Filter").length&&"select"==b&&(a.preventDefault(),$("#pageForm .table #Filter").trigger("click"));"select"!=b&&"input"!=b&&"textarea"!=b||0!=$(a.target).hasClass("no-page-form-change")||(ISPConfig.pageFormChanged=!0)});$(document).on("click","a[data-load-content],button[data-load-content]",function(a){a=$(this).attr("data-load-content");if(!a)return this;ISPConfig.loadContent(a)});
$(document).on("click","a[data-capp],button[data-capp]",function(a){a=$(this).attr("data-capp");if(!a)return this;ISPConfig.capp(a)});$(document).on("click","a[data-submit-form],button[data-submit-form]",function(a){a=$(this);var b=a.attr("data-form-action"),c=a.attr("data-submit-form");"true"==a.attr("data-form-upload")?ISPConfig.submitUploadForm(c,b):ISPConfig.submitForm(c,b)});
$(document).bind("keypress",function(a){"13"==a.which&&0<$("#pageForm .table #Filter").length&&0==$(a.target).hasClass("ui-autocomplete-input")&&(a.preventDefault(),$("#pageForm .table #Filter").trigger("click"));"13"==a.which&&0<$(".pnl_formsarea button.positive").length&&"textarea"!=a.target.localName&&$(a.target).is(":input")&&(a.preventDefault(),$(".pnl_formsarea button.positive:first").not("[disabled='disabled']").trigger("click"))});
$(document).on("click","th[data-column]",function(a){var b=$(this),c=b.attr("data-column");if(!c)return this;if(0<$("#pageForm .table #Filter").length&&"false"!=b.attr("data-sortable")){var e=$("#Filter");a=e.attr("data-form-action");var e=e.attr("data-submit-form"),d=b.attr("data-ordered"),b="?";0<=a.indexOf("?")&&(b="&");ISPConfig.submitForm(e,a+b+"orderby="+c);$(document).ajaxComplete(function(){var a=$('#pageForm .table th[data-column="'+c+'"]');a.parent().children("th[data-column]").removeAttr("data-ordered");
d&&"asc"==d?a.attr("data-ordered","desc"):a.attr("data-ordered","asc")})}});$(document).on("click",".addPlaceholder",function(){var a=$(this).text();$(this).siblings(":input").insertAtCaret(a)});$(document).on("click",".addPlaceholderContent",function(){var a=$(this).find(".addPlaceholderContent").text();$(this).siblings(":input").insertAtCaret(a)});
$(document).on("ready",function(){$.fn.extend({insertAtCaret:function(a){return this.each(function(b){if(document.selection)this.focus(),sel=document.selection.createRange(),sel.text=a,this.focus();else if(this.selectionStart||"0"==this.selectionStart){b=this.selectionStart;var c=this.selectionEnd,e=this.scrollTop;this.value=this.value.substring(0,b)+a+this.value.substring(c,this.value.length);this.focus();this.selectionStart=b+a.length;this.selectionEnd=b+a.length;this.scrollTop=e}else this.value+=
a,this.focus()})}});$(".progress .progress-bar").css("width",function(){return $(this).attr("aria-valuenow")+"%"});ISPConfig.loadInitContent();$("#searchform").submit(function(a){a.preventDefault()});$("#pageForm").submit(function(a){0<$("#pageForm .table #Filter").length&&a.preventDefault()})});
interface/web/themes/default/templates/main_login.tpl.htm
New file
@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang='en'>
<head>
  <meta charset='utf-8' />
  <title><tmpl_var name="company_name"><tmpl_var name="app_title"></title>
  <meta name='viewport' content='width=device-width, user-scalable=yes'>
  <meta name='description' lang='en' content='' />
  <meta name='keywords' lang='en' content='' />
  <meta name='robots' content='index, follow' />
  <link rel='stylesheet' href='../themes/<tmpl_var name='current_theme'>/assets/stylesheets/bootstrap.min.css' />
  <link rel='stylesheet' href='../themes/<tmpl_var name='current_theme'>/assets/stylesheets/fonts.min.css' />
  <link rel='stylesheet' href='../themes/<tmpl_var name='current_theme'>/assets/stylesheets/ispconfig.min.css' />
  <link rel='stylesheet' href='../themes/<tmpl_var name='current_theme'>/assets/stylesheets/pushy.min.css' />
  <link rel='stylesheet' href='../themes/<tmpl_var name='current_theme'>/assets/stylesheets/bootstrap-datetimepicker.min.css' />
  <link rel='stylesheet' href='../themes/<tmpl_var name='current_theme'>/assets/stylesheets/responsive.min.css' />
  <link rel='stylesheet' href='../themes/<tmpl_var name='current_theme'>/assets/stylesheets/themes/default/theme.min.css' />
  <link rel='stylesheet' href='../themes/<tmpl_var name='current_theme'>/assets/stylesheets/select2.css' />
  <link rel='stylesheet' href='../themes/<tmpl_var name='current_theme'>/assets/stylesheets/select2-bootstrap.css' />
  <link rel='stylesheet' href='../themes/<tmpl_var name='current_theme'>/assets/stylesheets/login.css' />
</head>
<body>
<div class="container" style="min-height: 100%; min-height: 100vh; display: flex;">
  <div class="row" style="margin: auto; width:100%;">
        <div class="col-md-4 col-md-offset-4">
            <div class="panel panel-default">
                  <div class="panel-heading" style="background: linear-gradient(to bottom, white, #eef0f2);">
                    <img src="{tmpl_var name='base64_logo_txt'}">
                 </div>
                  <div class="panel-body">
                    <tmpl_dyninclude name="content_tpl">
                </div>
            </div>
        </div>
    </div>
</div>
  <script type="text/javascript" src="js/jquery.min.js"></script>
  <script src='../themes/<tmpl_var name='current_theme'>/assets/javascripts/bootstrap.min.js'></script>
  <script src='../themes/<tmpl_var name='current_theme'>/assets/javascripts/bootstrap-datetimepicker.min.js'></script>
  <script src='../themes/<tmpl_var name='current_theme'>/assets/javascripts/ispconfig.min.js'></script>
  <script src='../themes/<tmpl_var name='current_theme'>/assets/javascripts/modernizr.custom.min.js'></script>
  <script src='../themes/<tmpl_var name='current_theme'>/assets/javascripts/pushy.min.js'></script>
  <script src='../themes/<tmpl_var name='current_theme'>/assets/javascripts/responsive.min.js'></script>
  <script src='../js/select2/select2.min.js'></script>
  <script src='../js/scrigo.js.php'></script>
  <script type="text/javascript" src="../js/jquery.ispconfigsearch.js"></script>
  <script type="text/javascript" src="../js/jquery.tipsy.js"></script>
  <tmpl_loop name="js_d_includes">
    <script type="text/javascript" src="../js/js.d/<tmpl_var name='file'>"></script>
  </tmpl_loop>
</body>
</html>