diff .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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.cms/admin.cms/html.php	Fri Oct 11 22:40:23 2024 +0000
@@ -0,0 +1,467 @@
+<?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>