From a10056228f2b3007e38b29e52d98945ccefc1c06 Mon Sep 17 00:00:00 2001
From: themohooks <81331307+themohooks@users.noreply.github.com>
Date: Mon, 26 May 2025 12:17:26 +0300
Subject: [PATCH] finally
---
.../Api/Admin/Models/RequestHandler.php | 34 ++
.../Admin/{CreateNews.php => News/Create.php} | 4 +-
app/Controllers/Api/Admin/News/Delete.php | 24 +
.../Api/Admin/{LoadNews.php => News/Load.php} | 7 +-
app/Controllers/Api/Login.php | 10 +-
app/Controllers/ApiController.php | 12 +-
app/Core/Routes.php | 8 +-
app/Models/Admin/News.php | 27 +
app/Models/Comment.php | 2 +-
app/Services/Captcha.php | 98 ++++
index.php | 7 +-
ngallery-example.yaml | 5 +-
static/css/style.css | 13 +
static/js/act.js | 400 ++++++++------
static/js/comments.js | 514 ++++++------------
static/js/index.js | 18 -
static/themepacks/nativegallery-dark/root.css | 6 +-
views/components/AdminSidebar.php | 90 +--
views/pages/Admin/Index.php | 1 +
views/pages/Admin/Models.php | 136 ++++-
views/pages/Admin/News.php | 34 +-
views/pages/Admin/Photo.php | 4 +-
views/pages/Admin/Settings.php | 5 +-
views/pages/Admin/UserEdit.php | 101 ++--
views/pages/Main.php | 2 +-
views/pages/MapMedia.php | 2 +-
views/pages/Photo.php | 132 ++---
views/pages/Profile/Index.php | 448 +++++++--------
views/pages/Profile/LK/Profile.php | 2 +-
.../Profile/LK/Profile/Personalization.php | 5 +-
views/pages/Rules.php | 302 +---------
views/pages/Search/Index.php | 506 +----------------
views/pages/Vehicle/DBEdit.php | 238 +++-----
33 files changed, 1280 insertions(+), 1917 deletions(-)
create mode 100644 app/Controllers/Api/Admin/Models/RequestHandler.php
rename app/Controllers/Api/Admin/{CreateNews.php => News/Create.php} (88%)
create mode 100644 app/Controllers/Api/Admin/News/Delete.php
rename app/Controllers/Api/Admin/{LoadNews.php => News/Load.php} (59%)
create mode 100644 app/Models/Admin/News.php
create mode 100644 app/Services/Captcha.php
diff --git a/app/Controllers/Api/Admin/Models/RequestHandler.php b/app/Controllers/Api/Admin/Models/RequestHandler.php
new file mode 100644
index 0000000..d4fc54b
--- /dev/null
+++ b/app/Controllers/Api/Admin/Models/RequestHandler.php
@@ -0,0 +1,34 @@
+ $id))[0];
+ if ($modelrequest) {
+ if ($type === 'accept') {
+ DB::query('INSERT INTO entities_data VALUES (\'0\', :title, :createdate, :entityid, NULL, :content)', array(':title' => $modelrequest['title'], ':createdate' => time(), ':entityid' => $modelrequest['entityid'], ':content' => $modelrequest['data']));
+ DB::query('UPDATE entities_requests SET status=1 WHERE id=:id', array(':id' => $id));
+ } else if ($type === 'decline') {
+ DB::query('UPDATE entities_requests SET status=2 WHERE id=:id', array(':id' => $id));
+ }
+ }
+ echo json_encode(
+ array(
+ 'errorcode' => '0',
+ 'error' => 0,
+ )
+ );
+ }
+}
diff --git a/app/Controllers/Api/Admin/CreateNews.php b/app/Controllers/Api/Admin/News/Create.php
similarity index 88%
rename from app/Controllers/Api/Admin/CreateNews.php
rename to app/Controllers/Api/Admin/News/Create.php
index b44e5d1..d81b9d9 100644
--- a/app/Controllers/Api/Admin/CreateNews.php
+++ b/app/Controllers/Api/Admin/News/Create.php
@@ -1,6 +1,6 @@
$postId));
+ echo json_encode(
+ array(
+ 'errorcode' => 0,
+ 'error' => 0
+ )
+ );
+ }
+}
diff --git a/app/Controllers/Api/Admin/LoadNews.php b/app/Controllers/Api/Admin/News/Load.php
similarity index 59%
rename from app/Controllers/Api/Admin/LoadNews.php
rename to app/Controllers/Api/Admin/News/Load.php
index 5f00b95..01d20ef 100644
--- a/app/Controllers/Api/Admin/LoadNews.php
+++ b/app/Controllers/Api/Admin/News/Load.php
@@ -1,6 +1,6 @@
' . Date::zmdate($n['time']) . ' ' . $n['body'] . '
';
+ $nn = new \App\Models\Admin\News($n['id']);
+ $nn->view();
}
}
}
diff --git a/app/Controllers/Api/Login.php b/app/Controllers/Api/Login.php
index a734807..3d3f889 100644
--- a/app/Controllers/Api/Login.php
+++ b/app/Controllers/Api/Login.php
@@ -15,10 +15,9 @@ class Login
{
$username = $_POST['username'];
$password = $_POST['password'];
- if (DB::query('SELECT email FROM users WHERE email=:username OR username=:username', array(':username' => $username))) {
- $email = DB::query('SELECT email FROM users WHERE email=:username OR username=:username', array(':username' => $username))[0]['email'];
+ if (DB::query('SELECT email FROM users WHERE (LOWER(username) LIKE :username1) OR (LOWER(email) LIKE :username2)', array(':username1' => '%'.$username.'%', ':username2' => '%'.$username.'%'))) {
+ $email = DB::query('SELECT email FROM users WHERE (LOWER(username) LIKE :username1) OR (LOWER(email) LIKE :username2)', array(':username1' => '%'.$username.'%', ':username2' => '%'.$username.'%'))[0]['email'];
if (password_verify($password, DB::query('SELECT password FROM users WHERE email=:username', array(':username' => $email))[0]['password'])) {
- $cstrong = True;
$token = GenerateRandomStr::gen_uuid();
$user_id = DB::query('SELECT id FROM users WHERE email=:username', array(':username' => $email))[0]['id'];
@@ -50,7 +49,7 @@ class Login
$iv = openssl_random_pseudo_bytes(16);
$encryptedIp = openssl_encrypt($ip, 'AES-256-CBC', $encryptionKey, 0, $iv);
$encryptedLoc = openssl_encrypt($loc, 'AES-256-CBC', $encryptionKey, 0, $iv);
- DB::query('INSERT INTO login_tokens VALUES (\'0\', :token, :user_id, :device, :os, :ip, :loc, :la, :crd)', array(
+ DB::query('INSERT INTO login_tokens VALUES (\'0\', :token, :user_id, :device, :os, :ip, :loc, :la, :crd, :iv)', array(
':token' => $token,
':user_id' => $user_id,
':device' => $device,
@@ -58,7 +57,8 @@ class Login
':ip' => $encryptedIp,
':loc' => $encryptedLoc,
':la' => time(),
- ':crd' => time()
+ ':crd' => time(),
+ ':iv' => $iv
));
setcookie("NGALLERYSESS", $token, time() + 50 * 50 * 54 * 72, '/', NULL, NULL, TRUE);
diff --git a/app/Controllers/ApiController.php b/app/Controllers/ApiController.php
index fe64043..ae7c0ca 100644
--- a/app/Controllers/ApiController.php
+++ b/app/Controllers/ApiController.php
@@ -30,9 +30,11 @@ use \App\Controllers\Api\Users\LoadUser as UserLoad;
use \App\Controllers\Api\Users\EmailVerify as EmailVerify;
use \App\Controllers\Api\Users\Search as UsersSearch;
use \App\Controllers\Api\Admin\Images\SetVisibility as AdminPhotoSetVisibility;
-use \App\Controllers\Api\Admin\CreateNews as AdminCreateNews;
-use \App\Controllers\Api\Admin\LoadNews as AdminLoadNews;
+use \App\Controllers\Api\Admin\News\Create as AdminCreateNews;
+use \App\Controllers\Api\Admin\News\Load as AdminLoadNews;
+use \App\Controllers\Api\Admin\News\Delete as AdminDeleteNews;
use \App\Controllers\Api\Admin\GetVehicleInputs as AdminGetVehicleInputs;
+use \App\Controllers\Api\Admin\Models\RequestHandler as AdminModelsRequestHandler;
use \App\Controllers\Api\Admin\GeoDB\Create as AdminGeoDBCreate;
use \App\Controllers\Api\Admin\GeoDB\Load as AdminGeoDBLoad;
use \App\Controllers\Api\Admin\GeoDB\Delete as AdminGeoDBDelete;
@@ -121,6 +123,9 @@ class ApiController
public static function admincreatenews() {
return new AdminCreateNews();
}
+ public static function admindeletenews() {
+ return new AdminDeleteNews();
+ }
public static function adminloadnews() {
return new AdminLoadNews();
}
@@ -172,6 +177,9 @@ class ApiController
public static function photoloadmap() {
return new PhotoLoadMap();
}
+ public static function adminmodelsrequesthandler() {
+ return new AdminModelsRequestHandler();
+ }
}
\ No newline at end of file
diff --git a/app/Core/Routes.php b/app/Core/Routes.php
index e97cea8..467f276 100644
--- a/app/Core/Routes.php
+++ b/app/Core/Routes.php
@@ -63,7 +63,8 @@ class Routes
Router::get('/voting/sendpretend', 'ContestsController@sendpretend');
Router::get('/vehicle/edit', 'VehicleController@iedit');
- Router::get('/vehicle/dbedit', 'VehicleController@dbedit');
+ Router::any('/vehicle/dbedit', 'VehicleController@dbedit');
+ Router::any('/vehicle/$id', 'VehicleController@i');
Router::post('/api/upload', 'ApiController@upload');
Router::post('/api/profile/update', 'ApiController@updateprofile');
Router::post('/api/photo/comment', 'ApiController@photocomment');
@@ -89,9 +90,11 @@ class Routes
if ($user->i('admin') > 0) {
Router::any('/admin', 'AdminController@index');
Router::any('/api/admin/images/setvisibility', 'ApiController@adminsetvis');
- Router::any('/api/admin/createnews', 'ApiController@admincreatenews');
+ Router::any('/api/admin/news/create', 'ApiController@admincreatenews');
+ Router::any('/api/admin/news/$id/delete', 'ApiController@admindeletenews');
Router::any('/api/admin/loadnews', 'ApiController@adminloadnews');
Router::any('/api/admin/getvehicleinputs/$id', 'ApiController@admingetvehicleinputs');
+ Router::any('/api/admin/models/requests/$id/$type', 'ApiController@adminmodelsrequesthandler');
Router::any('/api/admin/geodb/create', 'ApiController@admingeodbcreate');
Router::any('/api/admin/geodb/load', 'ApiController@admingeodbload');
Router::any('/api/admin/contests/createtheme', 'ApiController@admincontestscreatetheme');
@@ -103,6 +106,5 @@ class Routes
} else {
Router::redirect('/login?return='.$_SERVER['HTTP_REFERER']);
}
- Router::get('/vehicle/$id', 'VehicleController@i');
}
}
\ No newline at end of file
diff --git a/app/Models/Admin/News.php b/app/Models/Admin/News.php
new file mode 100644
index 0000000..eb8b9bd
--- /dev/null
+++ b/app/Models/Admin/News.php
@@ -0,0 +1,27 @@
+id = $id;
+ $result = DB::query("SELECT * FROM news WHERE id=:id", [':id' => $this->id]);
+ if (!empty($result)) {
+ $this->table = (object) $result[0];
+ } else {
+ $this->table = (object) [];
+ }
+ }
+ public function i($key) {
+ return $this->table->$key ?? null;
+ }
+ public function view() {
+ echo ''
+ . Date::zmdate($this->table->time) . ' '
+ . $this->table->body
+ . '
Удалить ';
+ }
+}
\ No newline at end of file
diff --git a/app/Models/Comment.php b/app/Models/Comment.php
index 40e9c96..6c4b4b2 100644
--- a/app/Models/Comment.php
+++ b/app/Models/Comment.php
@@ -150,7 +150,7 @@ class Comment
$pinc = 'Закрепить';
echo '
-
-
\ No newline at end of file
+
\ No newline at end of file
diff --git a/views/pages/Admin/Photo.php b/views/pages/Admin/Photo.php
index 0923e24..f594123 100644
--- a/views/pages/Admin/Photo.php
+++ b/views/pages/Admin/Photo.php
@@ -39,10 +39,10 @@ use \App\Models\User;
@@ -161,95 +111,49 @@ use \App\Models\{Vehicle, User};
$data = json_decode($vehicle['sampledata'], true);
$count = 1;
foreach ($data as $d) {
-
+
if ($d['important'] === "1") {
$imp = 'required';
}
echo '
' . $d['name'] . '
-
+
';
- $count++;
+ $count++;
}
?>
-
-
+
+
+
+
+
+
+
+
+
-
+
+ Заявки можно отправлять раз в 24 часа';
+ }
+ ?>
-
'; $pinc = 'Открепить'; } echo ' diff --git a/app/Services/Captcha.php b/app/Services/Captcha.php new file mode 100644 index 0000000..9c2cbae --- /dev/null +++ b/app/Services/Captcha.php @@ -0,0 +1,98 @@ +secretKey = $secretKey; + } + + public function setToken(string $token): void + { + $this->token = $token; + } + + public function setRemoteIp(string $ip): void + { + $this->remoteIp = $ip; + } + + public function setExpectedAction(string $action): void + { + $this->expectedAction = $action; + } + + public function setExpectedCdata(string $cdata): void + { + $this->expectedCdata = $cdata; + } + + public function verify(): array + { + if (empty($this->token)) { + throw new Exception('Turnstile token is missing'); + } + + if (empty($this->secretKey)) { + throw new Exception('Secret key is not configured'); + } + + $data = [ + 'secret' => $this->secretKey, + 'response' => $this->token + ]; + + if ($this->remoteIp) { + $data['remoteip'] = $this->remoteIp; + } + + $url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify'; + $options = [ + 'http' => [ + 'header' => "Content-type: application/x-www-form-urlencoded\r\n", + 'method' => 'POST', + 'content' => http_build_query($data) + ] + ]; + + $context = stream_context_create($options); + $response = file_get_contents($url, false, $context); + + if ($response === false) { + throw new Exception('Failed to verify Turnstile token'); + } + + $result = json_decode($response, true); + + if (!is_array($result)) { + throw new Exception('Invalid response from Turnstile server'); + } + + if (!$result['success']) { + $errorCodes = $result['error-codes'] ?? ['unknown-error']; + throw new Exception('Turnstile verification failed: ' . implode(', ', $errorCodes)); + } + + $this->validateAdditionalParameters($result); + + return $result; + } + + private function validateAdditionalParameters(array $response): void + { + if ($this->expectedAction && ($response['action'] ?? '') !== $this->expectedAction) { + throw new Exception("Action mismatch. Expected: {$this->expectedAction}, Received: {$response['action']}"); + } + + if ($this->expectedCdata && ($response['cdata'] ?? '') !== $this->expectedCdata) { + throw new Exception("Cdata mismatch. Expected: {$this->expectedCdata}, Received: {$response['cdata']}"); + } + } +} \ No newline at end of file diff --git a/index.php b/index.php index 3c9b3a7..7a04f6f 100644 --- a/index.php +++ b/index.php @@ -11,7 +11,9 @@ class App { public static function start() { - error_reporting(E_ALL & ~E_WARNING); + ini_set('display_errors', 0); + ini_set('display_startup_errors', 0); + error_reporting(E_ALL); if (file_exists($_SERVER['DOCUMENT_ROOT'] . '/ngallery.yaml')) { define("NGALLERY", Yaml::parse(file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/ngallery.yaml'))['ngallery']); @@ -35,9 +37,8 @@ class App } } catch (PDOException $ex) { echo '
Произошла ошибка MySQL
'.nl2br($ex).'Произошла скриптовая ошибка PHP
'.nl2br($ex).'Отредактировать комментарий
+ height: 200px;" name="wtext" id="bodypost__commedit` + + id + + `">` + + value + + `
Удалить комментарий
Вы действительно хотите удалить комментарий? Действие необратимо.Модели
- Создать -+
+
'; + $num++; + } + echo '
+
' . $n['body'] . '