view .cms/admin.cms/html.php @ 0:78edf6b517a0 draft

24.10
author Coffee CMS <info@coffee-cms.ru>
date Fri, 11 Oct 2024 22:40:23 +0000
parents
children
line wrap: on
line source

<?php

    // Время истечения cookie входа
    $expire_days = 365;
    $expire = time() + $expire_days * 24 * 60 * 60;
    // Продлевать если истекают через
    $expire_less = 180;

    // Продление куки входа
    if ( is_admin() ) {
        $sess = $_COOKIE["sess"];
        $expire = (int) $cms["config"]["logged"][$sess]["expire"];
        $pre_expire = $expire - $expire_less * 24 * 60 * 60;
        $now = time();
        if ( $now > $pre_expire ) {
            $new_expire = time() + $expire_days * 24 * 60 * 60;
            if ( PHP_VERSION_ID < 70300 ) {
                setcookie( "sess", $sess, $new_expire );
            } else {
                setcookie( "sess", $sess, array( "SameSite" => "Lax", "expires" => $new_expire ) );
            }
            // Так же запомнить в конфиге
            $cms["config"]["logged"][$sess]["expire"] = $new_expire;
            cms_save_config();
        }
    }

    // Для работы выпадающего списка
    if ( empty( $cms["config"]["locale"] ) ) {
        $cms["config"]["locale"] = "en_US.UTF-8";
        $cms["config"]["lang"]   = "en";
    }
    if ( ! empty( $_GET["locale"] ) ) {
        $cms["config"]["locale"] = $_GET["locale"];
        $cms["config"]["lang"]   = substr( $_GET["locale"], 0, 2 );
    }
    
    // Login
    if ( isset( $_POST["login"] ) && isset( $_POST["password"] ) ) {

        // Install process
        if ( empty( $cms["config"]["admin.mod.php"]["admin_login"] )
         && empty( $cms["config"]["admin.mod.php"]["admin_password"] )
         && ( ! empty( $_POST["login"] ) || ! empty( $_POST["password"] ) ) ) {
            $cms["config"]["admin.mod.php"]["admin_login"]    = $_POST["login"];
            $cms["config"]["admin.mod.php"]["admin_password"] = $_POST["password"];
            $cms["config"]["admin.mod.php"]["admin_salt"]     = cms_uid();
            $cms["config"]["admin.mod.php"]["admin_url"]      = "-admin";
            $link = "{$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}{$cms['config']['admin.mod.php']['admin_url']}";
            
            // Set Locale and Timezone
            $cms["config"]["locale"] = $_POST["locale"];
            $cms["config"]["lang"]   = substr( $cms["config"]["locale"], 0, 2 );
            cms_save_config();

            if ( is_email( $cms["config"]["admin.mod.php"]["admin_login"] ) ) {
                $subject = __( "install_finished" );
                $body  = __( "congrat" ) . "\n\n";
                $body .= __( "install_finished" ) . "\n\n";
                $body .= __( "login_info" ) . "\n\n";
                $body .= __( "login_url" ) . ": {$link}\n\n";
                $body .= __( "login" ) . ": {$_POST['login']}\n\n";
                $body .= __( "password" ) . ": {$_POST['password']}";
                cms_email( array(
                    "type" => "text/plain",
                    "from_email" => "noreply@" . $cms["url"]["host"],
                    "from_name"  => $cms["url"]["host"],
                    "to_email"   => $_POST["login"],
                    "subject"    => $subject,
                    "email_body" => $body,
                ) );
            }
        }
        // Check login and password
        if ( $_POST["login"]    === $cms["config"]["admin.mod.php"]["admin_login"] && 
             $_POST["password"] === $cms["config"]["admin.mod.php"]["admin_password"] )
        {

            $d        = date( "Y-m-d H:i:s" );
            $sess    = sha1( $cms["config"]["admin.mod.php"]["admin_login"] . $cms["config"]["admin.mod.php"]["admin_salt"] . $d );
            
            // Prepend New Session
            if ( ! isset( $cms["config"]["logged"] ) ) {
                $cms["config"]["logged"] = array();
            }
            $cms["config"]["logged"] = array(
                $sess => array(
                    "ip"         => $_SERVER["REMOTE_ADDR"],
                    "date"       => $d,
                    "user_agent" => $_SERVER["HTTP_USER_AGENT"],
                    "expire"     => $expire,
                )
            ) + $cms["config"]["logged"];

            // Set Locale and Timezone
            $cms["config"]["locale"] = $_POST["locale"];
            $cms["config"]["lang"]   = substr( $cms["config"]["locale"], 0, 2 );

            if ( cms_save_config() ) {
                
                if ( PHP_VERSION_ID < 70300 ) {
                    setcookie( "sess", $sess, $expire );
                } else {
                    setcookie( "sess", $sess, array( "SameSite" => "Lax", "expires" => $expire ) );
                }
                
                $cms["status"] = "302";
                $cms["status_302_location"] = $cms["base_path"] . $cms["config"]["admin.mod.php"]["admin_url"];
                return;

            } else {
                
                $error_message = __( "cant_write_config" ) . " .cms/config.php";

            }

        } else {
            
            $error_message = __( "access_denied" );

        }
    }

    // Тема
    if ( isset( $_COOKIE["theme"] ) && in_array( $_COOKIE["theme"], array( 0, 2 ) ) ) {
        $pref_bg = "#1e1d1d";
    } else {
        $pref_bg = "#e9e0dd";
    }
    $styles = array( "dark", "light", "dark classic" );
    if ( isset( $_COOKIE["theme"] ) ) {
        $html_classes = $styles[ $_COOKIE["theme"] ];
    } else {
        $html_classes = "dark";
    }    

?>
<!doctype html>
<html lang="<?php echo $cms["config"]["lang"]; ?>" class="<?php echo $html_classes; ?>">
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0, interactive-widget=resizes-content">
        <title><?php echo $cms['url']['host']; ?></title>
        <link rel="icon" href="<?php echo $cms["base_path"]; ?>img/favicon.svg">
        <style>
            html {
                background-color: <?php echo $pref_bg; ?>;
            }
        </style>


        <?php
        echo "<link rel=stylesheet href='{$cms['base_path']}css/admin.css'>";

        echo "<script>\nadmin_styles = " . json_encode( $styles ) . ";\n";
        if ( is_admin() && ! empty( $cms["config"]["locale"] ) ) {
            $lang = json_encode( $cms["lang"] ); // Переводы
            $tr   = json_encode( $cms["tr"] ); // Транслитерация
            $modules = json_encode( $cms["modules"] );
            if ( is_admin() ) {
                echo "cms = {};
                cms.base_path = '{$cms['base_path']}';
                cms.async_api = true;
                cms.api = '{$cms['base_path']}{$cms['config']['admin.mod.php']['api_url']}';
                cms.locale = '{$cms['config']['locale']}';
                cms.modules = {$modules};
                cms.lang = {$lang};
                cms.tr = {$tr};";
            }
        }
        echo "</script>\n";
        ?>

        <?php do_hook( "admin_header" ); ?>

    </head>


<?php if ( is_admin() ) : ?>

<body class=logged>
    <header>
        <div class=burger>
            <div class=menu-icon>
                <span class=line-1></span>
                <span class=line-2></span>
            </div>
        </div>

        <div class=menu>
            <a href="<?php echo $cms["base_path"]; ?>" data-front target=_blank>
                <?php echo __( "home_link" ); ?>
            </a>
            <div class=clear-cache>
                <?php echo __( "cache_btn" ); ?>
            </div>
            <div class=theme-switcher>
                <?php echo __( "theme_btn" ); ?>
            </div>
            <div data-logout>
                <?php echo __( "logout_btn" ); ?>
            </div>
        </div>
    </header>

    <aside>

<?php
foreach( $cms["admin_sections"] as $section_name => $section ) {
    if ( empty( $section["hide"] ) ) {
        // Не выводим пустые секции
        if ( ! empty( $cms["admin_sections"][$section_name]["items"] ) ) {
            
            echo "<section sort={$section["sort"]}>";
            echo "<div>{$cms['admin_sections'][$section_name]['title']}</div>";

            foreach( $cms["admin_sections"][$section_name]["items"] as $page_name => $page ) {
                if ( empty( $page["hide"] ) ) {
                    $title = __( $page["title"], $page["module"] );
                    // for highlite
                    if ( ! empty( $page["class"] ) ) {
                        $class = "class='{$page['class']}'";
                    } else {
                        $class = "";
                    }
                    if ( empty( $page["url"] ) ) {
                        echo "<a href=#{$page_name} {$class} sort={$page['sort']}>{$title}</a>";
                    } else {
                        echo "<a href='{$page['url']}' target=_blank {$class} sort={$page['sort']}>{$title}</a>";
                    }
                }
            }
            echo "</section>";
        }
    }
}
?>

    </aside>


    <main>

<?php
    $hello = __( "hello" );
    if ( cms_base_connect() === false ) {
        $base_ok = "<p>" . __( "hello_set_base" ) . "</p>";
    } else {
        $base_ok = "";
    }
    
    echo "
<section id=start>
    <div>
        <div>{$hello}</div>
        {$base_ok}
    </div>
</section>";

    foreach( $cms["admin_pages"] as $name => $page ) {
        echo "<section id={$name}>{$page}</section>";
    }
    
?>

    </main>

    <div class=milk></div>

    <div class=log-info-box>
        <!-- div for messages -->
    </div>

<?php else : ?>

<body class=login>
  
    <header>
        <div class=menu>
            <div class=theme-switcher>
                <?php echo __( "theme_btn" ); ?>
            </div>
        </div>
    </header>

    

    <div class=aside-main>
        <div class=center-box>
            <div class=setup-error>
                <?php
                // Если файл существует, то не перезаписывать его,
                // иначе можно менять языки не заходя в админку
                // Но проверку оставить, могут быть сменены права позже
                if ( is_file( $cms["config_file"] ) ) {
                    if ( ! is_writable( $cms["config_file"] ) ) {
                        echo __( "cant_write_config" ) . " {$cms["config_file"]}";
                    }
                }
                // config.php not writeable
                elseif ( cms_save_config() === false ) {
                    echo __( "cant_write_config" ) . " {$cms["config_file"]}";
                }

                // Error login and password
                if ( isset( $error_message ) ) {
                    echo __( $error_message );
                }
                ?>
            </div>
            
            <?php
                // Scan all locales
                $options = "";
                foreach( glob( "lang/*.UTF-8",  GLOB_ONLYDIR ) as $locale ) {
                    include( $locale . "/admin.mod.php" );
                    $locale = preg_replace( "/.*\//u", "", $locale );

                    // translate
                    $lang = $cms["lang"]["admin.mod.php"][$locale][$locale];

                    $options .= "<div class=option value='{$locale}'>{$lang}</div>";
                }
            ?>
            <div class=lang-selector>
                <div class=lang-select-grid>
                    <div class=field-select data-lang='<?php echo $cms["config"]["locale"]; ?>'>
                        <div class=value>
                            <?php echo $cms["lang"]["admin.mod.php"][$cms["config"]["locale"]][$cms["config"]["locale"]]; ?>
                        </div>
                        <div class=icon></div>
                    </div>
                    <div class=field-options>
                        <?php echo $options; ?>
                    </div>
                </div>
            </div>
            <div class=setup-auth>
                <?php
                if ( empty( $cms["config"]["admin.mod.php"]["admin_login"] ) && empty( $cms["config"]["admin.mod.php"]["admin_password"] ) ) {
                    echo __( "set_login_and_password" );
                }
                ?>
            </div>

            <script>
            <?php
            $form = "
            <form class=login-and-password method=post>
                <div class=login>
                    <input placeholder=\"" . __( "login_or_password" ) . "\" name=login type=text>
                </div>
                <div class=password>
                    <input placeholder=\"" . __( "password" ) . "\" name=password type=password>
                    <div class=password-eye></div>
                    <button title=\"" . __( "login_btn" ) . "\"></button>
                </div>
                <input type=hidden name=locale value=\"{$cms["config"]["locale"]}\">
            </form>";
            $form = base64_encode( $form );
            ?>
            let f = decodeURIComponent( escape( window.atob( "<?php echo $form; ?>" ) ) );
            document.write( f );

            document.querySelectorAll( ".login-and-password .login input" ).forEach( function( login ) {
                login.focus();
            } );

            function get_cookie( name ) {
                let cookies = document.cookie.split( ";" );
                for ( let line of cookies ) {
                    let cookie = line.split( "=" );
                    if ( name == cookie[ 0 ].trim() ) {
                        return decodeURIComponent( cookie[ 1 ] );
                    }
                }
                return "";
            }

            function set_cookie( name, value ) {
                document.cookie = encodeURIComponent( name ) + "=" + encodeURIComponent( value ) + ";SameSite=Lax";
            }

            // Theme switcher
            document.querySelectorAll( ".theme-switcher" ).forEach( function( el ) {
                el.addEventListener( "click", function( event ) {
                    event.preventDefault();
                    let n = get_cookie( "theme" ) || 0;
                    let styles2 = admin_styles[n];
                    let styles = styles2.split( " " );
                    styles.forEach( function( style ) {
                        document.documentElement.classList.remove( style );
                    } );
                    n = (+n+1) % admin_styles.length;
                    styles2 = admin_styles[n];
                    styles = styles2.split( " " );
                    styles.forEach( function( style ) {
                        document.documentElement.classList.add( style );
                    } );
                    set_cookie( "theme" , n );
                } );
            } );

            // Select language. Select
            document.querySelectorAll( ".login .field-select" ).forEach( function( select ) {
                select.addEventListener( "click", function( e ) {
                    e.stopPropagation();
                    select.nextElementSibling.classList.toggle( "open" );
                    select.closest( ".lang-select-grid" ).classList.toggle( "open" );
                } );
            } );

            // Select language. Option
            document.querySelectorAll( ".login .field-options .option" ).forEach( function( select ) {
                select.addEventListener( "click", function( e ) {
                    let input = this.closest( ".lang-select-grid" ).querySelector( ".field-select" );
                    input.setAttribute( "data-lang", this.getAttribute( "value" ) );
                    input.querySelector( ".value" ).innerText = this.innerText;
                    //e.stopPropagation(); убираем чтобы закрылось автоматически
                    let locale = this.getAttribute( "value" );
                    let search = window.location.search.replace( /&*locale=[^&]+/, "" );
                    if ( search == "" ) { 
                        search += "?locale=" + locale;
                    } else if ( search == "?" ) {
                        search += "locale=" + locale;
                    } else {
                        search += "&locale=" + locale;
                    }
                    window.location.search = search;
                } );
            } );

            // Клик по молоку
            document.body.addEventListener( "click", function( e ) {
                let select = document.querySelector( ".login .lang-select-grid" );
                select.classList.remove( "open" );
                select.querySelector( ".field-options" ).classList.remove( "open" );
            } );

            // Show/Hide password
            document.querySelectorAll( ".password-eye" ).forEach( function( eye ) {
                eye.addEventListener( "click", function( e ) {
                    this.classList.toggle( "showed" );
                    let inp = this.previousElementSibling;
                    let t   = inp.getAttribute( "type" );
                    if ( t == "password" ) {
                        inp.setAttribute( "type", "text" );
                    } else {
                        inp.setAttribute( "type", "password" );
                    }
                    inp.focus();
                } );
            } );
            </script>

            <div class=flatfree></div>
            <div class=support-box>
                <a target=_blank href='<?php echo __( "support_url" ); ?>'><?php echo __( "support" ); ?></a>
            </div>
        </div>
    </div>

    
<?php endif; ?>
    
</body>
</html>