Mercurial
comparison .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 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:78edf6b517a0 |
---|---|
1 <?php | |
2 | |
3 // Время истечения cookie входа | |
4 $expire_days = 365; | |
5 $expire = time() + $expire_days * 24 * 60 * 60; | |
6 // Продлевать если истекают через | |
7 $expire_less = 180; | |
8 | |
9 // Продление куки входа | |
10 if ( is_admin() ) { | |
11 $sess = $_COOKIE["sess"]; | |
12 $expire = (int) $cms["config"]["logged"][$sess]["expire"]; | |
13 $pre_expire = $expire - $expire_less * 24 * 60 * 60; | |
14 $now = time(); | |
15 if ( $now > $pre_expire ) { | |
16 $new_expire = time() + $expire_days * 24 * 60 * 60; | |
17 if ( PHP_VERSION_ID < 70300 ) { | |
18 setcookie( "sess", $sess, $new_expire ); | |
19 } else { | |
20 setcookie( "sess", $sess, array( "SameSite" => "Lax", "expires" => $new_expire ) ); | |
21 } | |
22 // Так же запомнить в конфиге | |
23 $cms["config"]["logged"][$sess]["expire"] = $new_expire; | |
24 cms_save_config(); | |
25 } | |
26 } | |
27 | |
28 // Для работы выпадающего списка | |
29 if ( empty( $cms["config"]["locale"] ) ) { | |
30 $cms["config"]["locale"] = "en_US.UTF-8"; | |
31 $cms["config"]["lang"] = "en"; | |
32 } | |
33 if ( ! empty( $_GET["locale"] ) ) { | |
34 $cms["config"]["locale"] = $_GET["locale"]; | |
35 $cms["config"]["lang"] = substr( $_GET["locale"], 0, 2 ); | |
36 } | |
37 | |
38 // Login | |
39 if ( isset( $_POST["login"] ) && isset( $_POST["password"] ) ) { | |
40 | |
41 // Install process | |
42 if ( empty( $cms["config"]["admin.mod.php"]["admin_login"] ) | |
43 && empty( $cms["config"]["admin.mod.php"]["admin_password"] ) | |
44 && ( ! empty( $_POST["login"] ) || ! empty( $_POST["password"] ) ) ) { | |
45 $cms["config"]["admin.mod.php"]["admin_login"] = $_POST["login"]; | |
46 $cms["config"]["admin.mod.php"]["admin_password"] = $_POST["password"]; | |
47 $cms["config"]["admin.mod.php"]["admin_salt"] = cms_uid(); | |
48 $cms["config"]["admin.mod.php"]["admin_url"] = "-admin"; | |
49 $link = "{$cms['url']['scheme']}://{$cms['url']['host']}{$cms['base_path']}{$cms['config']['admin.mod.php']['admin_url']}"; | |
50 | |
51 // Set Locale and Timezone | |
52 $cms["config"]["locale"] = $_POST["locale"]; | |
53 $cms["config"]["lang"] = substr( $cms["config"]["locale"], 0, 2 ); | |
54 cms_save_config(); | |
55 | |
56 if ( is_email( $cms["config"]["admin.mod.php"]["admin_login"] ) ) { | |
57 $subject = __( "install_finished" ); | |
58 $body = __( "congrat" ) . "\n\n"; | |
59 $body .= __( "install_finished" ) . "\n\n"; | |
60 $body .= __( "login_info" ) . "\n\n"; | |
61 $body .= __( "login_url" ) . ": {$link}\n\n"; | |
62 $body .= __( "login" ) . ": {$_POST['login']}\n\n"; | |
63 $body .= __( "password" ) . ": {$_POST['password']}"; | |
64 cms_email( array( | |
65 "type" => "text/plain", | |
66 "from_email" => "noreply@" . $cms["url"]["host"], | |
67 "from_name" => $cms["url"]["host"], | |
68 "to_email" => $_POST["login"], | |
69 "subject" => $subject, | |
70 "email_body" => $body, | |
71 ) ); | |
72 } | |
73 } | |
74 // Check login and password | |
75 if ( $_POST["login"] === $cms["config"]["admin.mod.php"]["admin_login"] && | |
76 $_POST["password"] === $cms["config"]["admin.mod.php"]["admin_password"] ) | |
77 { | |
78 | |
79 $d = date( "Y-m-d H:i:s" ); | |
80 $sess = sha1( $cms["config"]["admin.mod.php"]["admin_login"] . $cms["config"]["admin.mod.php"]["admin_salt"] . $d ); | |
81 | |
82 // Prepend New Session | |
83 if ( ! isset( $cms["config"]["logged"] ) ) { | |
84 $cms["config"]["logged"] = array(); | |
85 } | |
86 $cms["config"]["logged"] = array( | |
87 $sess => array( | |
88 "ip" => $_SERVER["REMOTE_ADDR"], | |
89 "date" => $d, | |
90 "user_agent" => $_SERVER["HTTP_USER_AGENT"], | |
91 "expire" => $expire, | |
92 ) | |
93 ) + $cms["config"]["logged"]; | |
94 | |
95 // Set Locale and Timezone | |
96 $cms["config"]["locale"] = $_POST["locale"]; | |
97 $cms["config"]["lang"] = substr( $cms["config"]["locale"], 0, 2 ); | |
98 | |
99 if ( cms_save_config() ) { | |
100 | |
101 if ( PHP_VERSION_ID < 70300 ) { | |
102 setcookie( "sess", $sess, $expire ); | |
103 } else { | |
104 setcookie( "sess", $sess, array( "SameSite" => "Lax", "expires" => $expire ) ); | |
105 } | |
106 | |
107 $cms["status"] = "302"; | |
108 $cms["status_302_location"] = $cms["base_path"] . $cms["config"]["admin.mod.php"]["admin_url"]; | |
109 return; | |
110 | |
111 } else { | |
112 | |
113 $error_message = __( "cant_write_config" ) . " .cms/config.php"; | |
114 | |
115 } | |
116 | |
117 } else { | |
118 | |
119 $error_message = __( "access_denied" ); | |
120 | |
121 } | |
122 } | |
123 | |
124 // Тема | |
125 if ( isset( $_COOKIE["theme"] ) && in_array( $_COOKIE["theme"], array( 0, 2 ) ) ) { | |
126 $pref_bg = "#1e1d1d"; | |
127 } else { | |
128 $pref_bg = "#e9e0dd"; | |
129 } | |
130 $styles = array( "dark", "light", "dark classic" ); | |
131 if ( isset( $_COOKIE["theme"] ) ) { | |
132 $html_classes = $styles[ $_COOKIE["theme"] ]; | |
133 } else { | |
134 $html_classes = "dark"; | |
135 } | |
136 | |
137 ?> | |
138 <!doctype html> | |
139 <html lang="<?php echo $cms["config"]["lang"]; ?>" class="<?php echo $html_classes; ?>"> | |
140 <head> | |
141 <meta charset="utf-8"> | |
142 <meta name="viewport" content="width=device-width, initial-scale=1.0, interactive-widget=resizes-content"> | |
143 <title><?php echo $cms['url']['host']; ?></title> | |
144 <link rel="icon" href="<?php echo $cms["base_path"]; ?>img/favicon.svg"> | |
145 <style> | |
146 html { | |
147 background-color: <?php echo $pref_bg; ?>; | |
148 } | |
149 </style> | |
150 | |
151 | |
152 <?php | |
153 echo "<link rel=stylesheet href='{$cms['base_path']}css/admin.css'>"; | |
154 | |
155 echo "<script>\nadmin_styles = " . json_encode( $styles ) . ";\n"; | |
156 if ( is_admin() && ! empty( $cms["config"]["locale"] ) ) { | |
157 $lang = json_encode( $cms["lang"] ); // Переводы | |
158 $tr = json_encode( $cms["tr"] ); // Транслитерация | |
159 $modules = json_encode( $cms["modules"] ); | |
160 if ( is_admin() ) { | |
161 echo "cms = {}; | |
162 cms.base_path = '{$cms['base_path']}'; | |
163 cms.async_api = true; | |
164 cms.api = '{$cms['base_path']}{$cms['config']['admin.mod.php']['api_url']}'; | |
165 cms.locale = '{$cms['config']['locale']}'; | |
166 cms.modules = {$modules}; | |
167 cms.lang = {$lang}; | |
168 cms.tr = {$tr};"; | |
169 } | |
170 } | |
171 echo "</script>\n"; | |
172 ?> | |
173 | |
174 <?php do_hook( "admin_header" ); ?> | |
175 | |
176 </head> | |
177 | |
178 | |
179 <?php if ( is_admin() ) : ?> | |
180 | |
181 <body class=logged> | |
182 <header> | |
183 <div class=burger> | |
184 <div class=menu-icon> | |
185 <span class=line-1></span> | |
186 <span class=line-2></span> | |
187 </div> | |
188 </div> | |
189 | |
190 <div class=menu> | |
191 <a href="<?php echo $cms["base_path"]; ?>" data-front target=_blank> | |
192 <?php echo __( "home_link" ); ?> | |
193 </a> | |
194 <div class=clear-cache> | |
195 <?php echo __( "cache_btn" ); ?> | |
196 </div> | |
197 <div class=theme-switcher> | |
198 <?php echo __( "theme_btn" ); ?> | |
199 </div> | |
200 <div data-logout> | |
201 <?php echo __( "logout_btn" ); ?> | |
202 </div> | |
203 </div> | |
204 </header> | |
205 | |
206 <aside> | |
207 | |
208 <?php | |
209 foreach( $cms["admin_sections"] as $section_name => $section ) { | |
210 if ( empty( $section["hide"] ) ) { | |
211 // Не выводим пустые секции | |
212 if ( ! empty( $cms["admin_sections"][$section_name]["items"] ) ) { | |
213 | |
214 echo "<section sort={$section["sort"]}>"; | |
215 echo "<div>{$cms['admin_sections'][$section_name]['title']}</div>"; | |
216 | |
217 foreach( $cms["admin_sections"][$section_name]["items"] as $page_name => $page ) { | |
218 if ( empty( $page["hide"] ) ) { | |
219 $title = __( $page["title"], $page["module"] ); | |
220 // for highlite | |
221 if ( ! empty( $page["class"] ) ) { | |
222 $class = "class='{$page['class']}'"; | |
223 } else { | |
224 $class = ""; | |
225 } | |
226 if ( empty( $page["url"] ) ) { | |
227 echo "<a href=#{$page_name} {$class} sort={$page['sort']}>{$title}</a>"; | |
228 } else { | |
229 echo "<a href='{$page['url']}' target=_blank {$class} sort={$page['sort']}>{$title}</a>"; | |
230 } | |
231 } | |
232 } | |
233 echo "</section>"; | |
234 } | |
235 } | |
236 } | |
237 ?> | |
238 | |
239 </aside> | |
240 | |
241 | |
242 <main> | |
243 | |
244 <?php | |
245 $hello = __( "hello" ); | |
246 if ( cms_base_connect() === false ) { | |
247 $base_ok = "<p>" . __( "hello_set_base" ) . "</p>"; | |
248 } else { | |
249 $base_ok = ""; | |
250 } | |
251 | |
252 echo " | |
253 <section id=start> | |
254 <div> | |
255 <div>{$hello}</div> | |
256 {$base_ok} | |
257 </div> | |
258 </section>"; | |
259 | |
260 foreach( $cms["admin_pages"] as $name => $page ) { | |
261 echo "<section id={$name}>{$page}</section>"; | |
262 } | |
263 | |
264 ?> | |
265 | |
266 </main> | |
267 | |
268 <div class=milk></div> | |
269 | |
270 <div class=log-info-box> | |
271 <!-- div for messages --> | |
272 </div> | |
273 | |
274 <?php else : ?> | |
275 | |
276 <body class=login> | |
277 | |
278 <header> | |
279 <div class=menu> | |
280 <div class=theme-switcher> | |
281 <?php echo __( "theme_btn" ); ?> | |
282 </div> | |
283 </div> | |
284 </header> | |
285 | |
286 | |
287 | |
288 <div class=aside-main> | |
289 <div class=center-box> | |
290 <div class=setup-error> | |
291 <?php | |
292 // Если файл существует, то не перезаписывать его, | |
293 // иначе можно менять языки не заходя в админку | |
294 // Но проверку оставить, могут быть сменены права позже | |
295 if ( is_file( $cms["config_file"] ) ) { | |
296 if ( ! is_writable( $cms["config_file"] ) ) { | |
297 echo __( "cant_write_config" ) . " {$cms["config_file"]}"; | |
298 } | |
299 } | |
300 // config.php not writeable | |
301 elseif ( cms_save_config() === false ) { | |
302 echo __( "cant_write_config" ) . " {$cms["config_file"]}"; | |
303 } | |
304 | |
305 // Error login and password | |
306 if ( isset( $error_message ) ) { | |
307 echo __( $error_message ); | |
308 } | |
309 ?> | |
310 </div> | |
311 | |
312 <?php | |
313 // Scan all locales | |
314 $options = ""; | |
315 foreach( glob( "lang/*.UTF-8", GLOB_ONLYDIR ) as $locale ) { | |
316 include( $locale . "/admin.mod.php" ); | |
317 $locale = preg_replace( "/.*\//u", "", $locale ); | |
318 | |
319 // translate | |
320 $lang = $cms["lang"]["admin.mod.php"][$locale][$locale]; | |
321 | |
322 $options .= "<div class=option value='{$locale}'>{$lang}</div>"; | |
323 } | |
324 ?> | |
325 <div class=lang-selector> | |
326 <div class=lang-select-grid> | |
327 <div class=field-select data-lang='<?php echo $cms["config"]["locale"]; ?>'> | |
328 <div class=value> | |
329 <?php echo $cms["lang"]["admin.mod.php"][$cms["config"]["locale"]][$cms["config"]["locale"]]; ?> | |
330 </div> | |
331 <div class=icon></div> | |
332 </div> | |
333 <div class=field-options> | |
334 <?php echo $options; ?> | |
335 </div> | |
336 </div> | |
337 </div> | |
338 <div class=setup-auth> | |
339 <?php | |
340 if ( empty( $cms["config"]["admin.mod.php"]["admin_login"] ) && empty( $cms["config"]["admin.mod.php"]["admin_password"] ) ) { | |
341 echo __( "set_login_and_password" ); | |
342 } | |
343 ?> | |
344 </div> | |
345 | |
346 <script> | |
347 <?php | |
348 $form = " | |
349 <form class=login-and-password method=post> | |
350 <div class=login> | |
351 <input placeholder=\"" . __( "login_or_password" ) . "\" name=login type=text> | |
352 </div> | |
353 <div class=password> | |
354 <input placeholder=\"" . __( "password" ) . "\" name=password type=password> | |
355 <div class=password-eye></div> | |
356 <button title=\"" . __( "login_btn" ) . "\"></button> | |
357 </div> | |
358 <input type=hidden name=locale value=\"{$cms["config"]["locale"]}\"> | |
359 </form>"; | |
360 $form = base64_encode( $form ); | |
361 ?> | |
362 let f = decodeURIComponent( escape( window.atob( "<?php echo $form; ?>" ) ) ); | |
363 document.write( f ); | |
364 | |
365 document.querySelectorAll( ".login-and-password .login input" ).forEach( function( login ) { | |
366 login.focus(); | |
367 } ); | |
368 | |
369 function get_cookie( name ) { | |
370 let cookies = document.cookie.split( ";" ); | |
371 for ( let line of cookies ) { | |
372 let cookie = line.split( "=" ); | |
373 if ( name == cookie[ 0 ].trim() ) { | |
374 return decodeURIComponent( cookie[ 1 ] ); | |
375 } | |
376 } | |
377 return ""; | |
378 } | |
379 | |
380 function set_cookie( name, value ) { | |
381 document.cookie = encodeURIComponent( name ) + "=" + encodeURIComponent( value ) + ";SameSite=Lax"; | |
382 } | |
383 | |
384 // Theme switcher | |
385 document.querySelectorAll( ".theme-switcher" ).forEach( function( el ) { | |
386 el.addEventListener( "click", function( event ) { | |
387 event.preventDefault(); | |
388 let n = get_cookie( "theme" ) || 0; | |
389 let styles2 = admin_styles[n]; | |
390 let styles = styles2.split( " " ); | |
391 styles.forEach( function( style ) { | |
392 document.documentElement.classList.remove( style ); | |
393 } ); | |
394 n = (+n+1) % admin_styles.length; | |
395 styles2 = admin_styles[n]; | |
396 styles = styles2.split( " " ); | |
397 styles.forEach( function( style ) { | |
398 document.documentElement.classList.add( style ); | |
399 } ); | |
400 set_cookie( "theme" , n ); | |
401 } ); | |
402 } ); | |
403 | |
404 // Select language. Select | |
405 document.querySelectorAll( ".login .field-select" ).forEach( function( select ) { | |
406 select.addEventListener( "click", function( e ) { | |
407 e.stopPropagation(); | |
408 select.nextElementSibling.classList.toggle( "open" ); | |
409 select.closest( ".lang-select-grid" ).classList.toggle( "open" ); | |
410 } ); | |
411 } ); | |
412 | |
413 // Select language. Option | |
414 document.querySelectorAll( ".login .field-options .option" ).forEach( function( select ) { | |
415 select.addEventListener( "click", function( e ) { | |
416 let input = this.closest( ".lang-select-grid" ).querySelector( ".field-select" ); | |
417 input.setAttribute( "data-lang", this.getAttribute( "value" ) ); | |
418 input.querySelector( ".value" ).innerText = this.innerText; | |
419 //e.stopPropagation(); убираем чтобы закрылось автоматически | |
420 let locale = this.getAttribute( "value" ); | |
421 let search = window.location.search.replace( /&*locale=[^&]+/, "" ); | |
422 if ( search == "" ) { | |
423 search += "?locale=" + locale; | |
424 } else if ( search == "?" ) { | |
425 search += "locale=" + locale; | |
426 } else { | |
427 search += "&locale=" + locale; | |
428 } | |
429 window.location.search = search; | |
430 } ); | |
431 } ); | |
432 | |
433 // Клик по молоку | |
434 document.body.addEventListener( "click", function( e ) { | |
435 let select = document.querySelector( ".login .lang-select-grid" ); | |
436 select.classList.remove( "open" ); | |
437 select.querySelector( ".field-options" ).classList.remove( "open" ); | |
438 } ); | |
439 | |
440 // Show/Hide password | |
441 document.querySelectorAll( ".password-eye" ).forEach( function( eye ) { | |
442 eye.addEventListener( "click", function( e ) { | |
443 this.classList.toggle( "showed" ); | |
444 let inp = this.previousElementSibling; | |
445 let t = inp.getAttribute( "type" ); | |
446 if ( t == "password" ) { | |
447 inp.setAttribute( "type", "text" ); | |
448 } else { | |
449 inp.setAttribute( "type", "password" ); | |
450 } | |
451 inp.focus(); | |
452 } ); | |
453 } ); | |
454 </script> | |
455 | |
456 <div class=flatfree></div> | |
457 <div class=support-box> | |
458 <a target=_blank href='<?php echo __( "support_url" ); ?>'><?php echo __( "support" ); ?></a> | |
459 </div> | |
460 </div> | |
461 </div> | |
462 | |
463 | |
464 <?php endif; ?> | |
465 | |
466 </body> | |
467 </html> |