diff --git a/403.html b/403.html new file mode 100644 index 0000000..1ef3cf5 --- /dev/null +++ b/403.html @@ -0,0 +1,61 @@ + + + + + + Trashbox - 403 Доступ запрещён + + + + +
+
403
+

Доступ запрещён

+

Эй, дружок-пирожок, сюда нельзя

+ Вернуться на главную +
+ + + diff --git a/404.html b/404.html new file mode 100644 index 0000000..dabe65f --- /dev/null +++ b/404.html @@ -0,0 +1,60 @@ + + + + + + Trashbox - 404 Страница не найдена + + + + +
+
404
+

Страница не найдена

+

Эй, дружок-пирожок, тобой выбрана неправильная дверь

+ Вернуться на главную +
+ + diff --git a/README.md b/README.md index 1b0393e..3239f2a 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,8 @@ cgi-bin/ │ └── status.c ├── index.cgi ├── style.cgi -└── status.cgi +└── status.cgi +403 и 404 опционально в папку уровнем выше, чем cgi-bin ``` ### Компиляция CGI ```bash diff --git a/busybox_nginx_reverse.txt b/busybox_nginx_reverse.txt old mode 100755 new mode 100644 index 54d2e5f..bc0cc00 --- a/busybox_nginx_reverse.txt +++ b/busybox_nginx_reverse.txt @@ -1,21 +1,42 @@ server { - listen 443 ssl http2; + listen 443 ssl; + http2 on; server_name home.mashup.su www.home.mashup.su; - - ssl_certificate /etc/letsencrypt/live/www.home.mashup.su/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/www.home.mashup.su/privkey.pem; + ssl_certificate /etc/letsencrypt/live/home.mashup.su/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/home.mashup.su/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384; - # Прокси для MPD потока /gachi - ИСПРАВЛЕННЫЙ ВАРИАНТ + root /home/romkazvo/www; + + # === КАСТОМНЫЕ СТРАНИЦЫ ОШИБОК === + error_page 404 =404 /404.html; + location = /404.html { + root /home/romkazvo/www; + allow all; + } + + error_page 403 =403 /403.html; + location = /403.html { + root /home/romkazvo/www; + allow all; + } + + # === СТАТИКА === + location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg|webp)$ { + expires 1y; + add_header Cache-Control "public, immutable"; + try_files $uri =404; + } + + # === СТРИМ /gachi === location = /gachi { proxy_pass http://127.0.0.1:8001/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - proxy_buffering off; proxy_cache off; proxy_read_timeout 3600; @@ -24,25 +45,40 @@ server { add_header Access-Control-Allow-Origin "*" always; add_header Access-Control-Allow-Methods "GET, OPTIONS, HEAD" always; add_header Access-Control-Allow-Headers "Range, Accept-Encoding" always; - } - + } + + # === CGI (с перехватом ошибок) === location /cgi-bin/ { proxy_pass http://127.0.0.1:8050; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + proxy_intercept_errors on; } + # === ВСЁ ОСТАЛЬНОЕ === location / { proxy_pass http://127.0.0.1:8050; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + proxy_http_version 1.1; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + proxy_intercept_errors on; } } +# HTTP → HTTPS server { listen 80; server_name home.mashup.su www.home.mashup.su; diff --git a/config.ini b/config.ini index b815aaf..0fa3a68 100755 --- a/config.ini +++ b/config.ini @@ -10,7 +10,7 @@ max_entries = 1000 [hidden] dirs = cgi-bin,.git,.svn -files = .htpasswd,.htaccess,.gitignore +files = .htpasswd,.htaccess,.gitignore, robots.txt, 404.html, 403.html [preview] image = jpg,jpeg,png,gif,webp,bmp,svg,ico diff --git a/src/main.c b/src/main.c index d84512b..fa916db 100644 --- a/src/main.c +++ b/src/main.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "config.h" #include "auth.h" #include "fs.h" @@ -76,6 +77,7 @@ int main() { } } + // Обработка пароля (без кук) if (strstr(query_string, "password=")) { char *error = strstr(query_string, "error=1"); if (!error) { diff --git a/src/render.c b/src/render.c index e965b4f..a4eda9a 100644 --- a/src/render.c +++ b/src/render.c @@ -100,37 +100,50 @@ void print_content(buffer_t *buf, const char *base_path, const char *display_pat int entry_count = 0, dir_count = 0, file_count = 0; long long total_size = 0; int is_recursive_search = 0; + + // === ПАРСИМ ПАРОЛЬ ДО ВСЕГО ОСТАЛЬНОГО === char folder_name[256] = ""; + char *password = NULL; + char *query_string = getenv("QUERY_STRING"); + + if (query_string) { + char *pass_start = strstr(query_string, "password="); + if (pass_start) { + pass_start += 9; + char *pass_end = strchr(pass_start, '&'); + int pass_len = pass_end ? (int)(pass_end - pass_start) : (int)strlen(pass_start); + if (pass_len > 0 && pass_len < 256) { + char pass_buf[256]; + strncpy(pass_buf, pass_start, pass_len); + pass_buf[pass_len] = '\0'; + char decoded_pass[256]; + url_decode_enhanced(pass_buf, decoded_pass, sizeof(decoded_pass)); + password = decoded_pass; + } + } + } + if (display_path && display_path[0]) { char *last_slash = strrchr(display_path, '/'); if (last_slash) strcpy(folder_name, last_slash + 1); else strcpy(folder_name, display_path); - char *query_string = getenv("QUERY_STRING"); - char *password = NULL; - if (query_string) { - char *pass_start = strstr(query_string, "password="); - if (pass_start) { - pass_start += 9; - char *pass_end = strchr(pass_start, '&'); - int pass_len = pass_end ? (int)(pass_end - pass_start) : (int)strlen(pass_start); - if (pass_len > 0 && pass_len < 256) { - char pass_buf[256]; - strncpy(pass_buf, pass_start, pass_len); - pass_buf[pass_len] = '\0'; - char decoded_pass[256]; - url_decode_enhanced(pass_buf, decoded_pass, sizeof(decoded_pass)); - password = decoded_pass; - } - } - } - if (is_folder_protected(folder_name)) { - if (!password || !check_folder_password(folder_name, password)) { - print_password_form(buf, folder_name); - free(entries); - return; - } + } + + // === ОТЛАДКА === + fprintf(stderr, "DEBUG: folder_name = '%s'\n", folder_name); + fprintf(stderr, "DEBUG: password = '%s'\n", password ? password : "NULL"); + if (password) { + fprintf(stderr, "DEBUG: check_folder_password = %d\n", check_folder_password(folder_name, password)); + } + + if (is_folder_protected(folder_name)) { + if (!password || !check_folder_password(folder_name, password)) { + print_password_form(buf, folder_name); + free(entries); + return; } } + if (g_params.search[0] != '\0') { int result_count = 0; search_recursive(g_config.base_path, "", g_params.search, entries, &result_count, g_config.max_entries); @@ -171,15 +184,15 @@ void print_content(buffer_t *buf, const char *base_path, const char *display_pat dir = opendir(alt_path); if (!dir) { buffer_append(buf, "
\n"); - buffer_append(buf, "
📁
\n"); - buffer_append(buf, "

Ошибка открытия директории

\n"); - char error_msg[512]; - snprintf(error_msg, sizeof(error_msg), "

Путь: %s

\n", base_path); - buffer_append(buf, error_msg); - snprintf(error_msg, sizeof(error_msg), "

Ошибка: %s

\n", strerror(errno)); - buffer_append(buf, error_msg); - buffer_append(buf, "

← Вернуться на главную

\n"); - buffer_append(buf, "
\n"); + buffer_append(buf, "
📁
\n"); + char *display_base = strstr(base_path, "/www/"); + if (!display_base) display_base = (char*)base_path; + buffer_append(buf, "

Ошибка открытия: "); + buffer_append(buf, display_base); + buffer_append(buf, "

\n"); + buffer_append(buf, "

Папка не найдена

\n"); + buffer_append(buf, "

← Вернуться на главную

\n"); + buffer_append(buf, "\n"); free(entries); return; } @@ -312,7 +325,7 @@ void print_content(buffer_t *buf, const char *base_path, const char *display_pat html_escape(entries[i].name, safe_name, sizeof(safe_name)); buffer_append(buf, safe_name); buffer_append(buf, "')\">\n"); - buffer_append(buf, " 🔒\n"); + buffer_append(buf, " 📁\n"); buffer_append(buf, " "); if (is_recursive_search) { char safe_url[512]; @@ -323,7 +336,7 @@ void print_content(buffer_t *buf, const char *base_path, const char *display_pat html_escape(entries[i].name, safe_name2, sizeof(safe_name2)); buffer_append(buf, safe_name2); } - buffer_append(buf, " (защищена)\n"); + buffer_append(buf, " (🔒)\n"); buffer_append(buf, " \n"); buffer_append(buf, "
\n"); buffer_append(buf, " \n"); + buffer_append(buf, " \n"); + buffer_append(buf, " \n"); buffer_append(buf, "
\n"); buffer_append(buf, " \n"); } else { diff --git a/style.css b/style.css index 73aac06..7fdade0 100755 --- a/style.css +++ b/style.css @@ -11,6 +11,11 @@ --accent-green: #188038; --hover-bg: #f8f9fa; --shadow: 0 2px 4px rgba(0,0,0,0.1); + /* === ПЕРЕМЕННЫЕ ДЛЯ МОДАЛКИ === */ + --modal-bg: #ffffff; + --modal-text: #333333; + --modal-header-bg: #f8f9fa; + --modal-border: #e9ecef; } .dark-theme { @@ -26,6 +31,11 @@ --accent-green: #68d391; --hover-bg: #2d3748; --shadow: 0 2px 4px rgba(0,0,0,0.3); + /* === ПЕРЕМЕННЫЕ ДЛЯ МОДАЛКИ В ТЁМНОЙ ТЕМЕ === */ + --modal-bg: #1e1e1e; + --modal-text: #e0e0e0; + --modal-header-bg: #2d3748; + --modal-border: #2d3748; } body { @@ -387,7 +397,7 @@ li:hover { padding: 0.75rem 0.5rem; margin-bottom: 1rem; background: var(--bg-primary); - border-radius: 8px; + border-radius: 0px; border: 1px solid var(--border-color); } @@ -929,3 +939,29 @@ li:hover { padding: 0.2rem 0.3rem !important; } } + +/* ================================================ + ПЕРЕОПРЕДЕЛЕНИЕ МОДАЛКИ (фикс темы) + ================================================ */ +.preview-content { + background: var(--modal-bg) !important; + color: var(--modal-text) !important; + border: 1px solid var(--modal-border) !important; +} + +.preview-header { + background: var(--modal-header-bg) !important; + border-bottom: 1px solid var(--modal-border) !important; +} + +.preview-title { + color: var(--modal-text) !important; +} + +.preview-iframe { + background: var(--bg-primary) !important; +} + +.preview-image-container { + background: var(--bg-primary) !important; +} diff --git a/template.html b/template.html index 61f607b..5ec6651 100644 --- a/template.html +++ b/template.html @@ -3,8 +3,8 @@ - Trashbox - + Trashbox - личная помоечка + @@ -21,7 +21,7 @@ - +