ruslan
c3efdc5a8f
security: add brute-force rate limiting to /login
...
5 failed attempts per IP within 5 minutes triggers 15-minute block.
Counter resets on successful login. State is per-worker (in-memory).
2026-07-23 11:41:08 +00:00
ruslan
3092645408
security: disable FastAPI docs/redoc/openapi endpoints in production
2026-07-23 11:38:13 +00:00
ruslan
fc4b73c536
chore: remove unused files
...
- app/runtime.py.bak, app/static/style.css.bak — temp backups
- app/static/service-icons/svc_*_2026042*.png, svc_*_20260306*.png — old icon versions superseded by newer uploads
- app/static/parallax/ — images not referenced in any template
2026-07-23 11:20:34 +00:00
ruslan
85bcb304f6
refactor: extract _init_schema and _startup_pools to remove duplication in maintenance.py
2026-07-23 11:16:06 +00:00
ruslan
53e18d92ac
refactor: extract _dispatch_post to remove duplicate retry logic
2026-07-23 11:14:25 +00:00
ruslan
2e0d4c78ca
refactor: merge duplicate pool status functions into _get_pool_status
2026-07-23 11:13:17 +00:00
ruslan
1e6eadeed2
refactor: remove dead code (safe cleanup)
...
- main.py: remove duplicate sqlalchemy select import
- main.py: remove unused json import in _telegram_poll_loop
- runtime.py: remove unreachable return after raise LockTimeoutError
- runtime.py: remove _restart_rdp_slot_bg (defined but never called)
2026-07-23 11:07:48 +00:00
ruslan
9839539206
fix: double-check iframe src with HEAD probe before loading
...
After status/ready=true, do HEAD request to the iframe URL itself.
If it returns 5xx, keep polling. This prevents Bad Gateway appearing
in the iframe when container is technically registered but not yet serving.
2026-07-23 10:55:42 +00:00
ruslan
a1479aa47a
fix: view page polls readiness before loading iframe
...
Session view page was loading the iframe immediately on load, causing
Bad Gateway if the container was still starting. Now polls /status
until ready, then sets iframe src.
2026-07-23 10:50:41 +00:00
ruslan
b2297c7773
fix: route_ready rejects 5xx responses; remove spinner from wait page
...
route_ready returned True on 502 Bad Gateway, causing premature redirect
before the container was actually serving. Now only accepts < 500 responses.
Spinner removed from wait page per user request.
2026-07-23 10:48:16 +00:00
ruslan
b89f239d02
feat: add spinner and loading message to session wait page
...
Wait page was a blank dark screen - users saw nothing and hit refresh.
Now shows spinner + service name + status message from /status endpoint.
2026-07-23 10:43:57 +00:00
ruslan
5e884a39ad
fix: rdp-proxy heartbeat now uses sid from URL instead of static SESSION_ID
...
Static SESSION_ID=rdpslot-N did not match the actual session UUID in DB,
so touch requests returned 404, last_access_at was never updated, and sessions
expired immediately after 5 minutes without user activity tracking.
2026-07-22 08:16:52 +00:00
ruslan
c58ed04821
fix: recycle webpool container on TERMINATED sessions too
...
terminate_session_record was explicitly skipping WEBPOOLIDX containers.
Now stops portal-webpool-N in a background thread on any session close,
so ensure_web_pool recreates it fresh for the next user.
2026-07-22 08:10:20 +00:00
ruslan
ca5d1af2b5
fix: webpool containers now stay alive 24h; recycle on session expiry
...
- Pool containers got IDLE_TIMEOUT=86400 instead of SESSION_IDLE_SECONDS (300s)
to prevent them from cycling every 5 minutes while idle
- On session expiry, WEBPOOLIDX containers are now stopped so ensure_web_pool()
recreates them fresh for the next user (prevents dirty Chromium state)
2026-07-21 13:53:18 +00:00
ruslan
3eff94fbb2
ui: remove credentials badge from WEB sessions, remove Back button from RDP
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 11:07:21 +00:00
ruslan
de56959ba2
fix autofill: handle two-step login forms (CommuniGate)
...
- Fill username by specific attrs even without visible password field
(handles two-step forms: username first, password appears after)
- Broad input[type=text] fallback only fires when password field is present
(prevents filling R7-Office font selector and other app inputs)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 11:02:55 +00:00
ruslan
d258f3e0fd
fix autofill: stop filling when no visible password field on page
...
Prevents autofill from filling app text inputs (e.g. R7 font selector)
after login. Now tryFill() bails out immediately if no input[type=password]
is visible — meaning we are no longer on a login form.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 09:02:22 +00:00
ruslan
51590cea80
seo: add explicit shortcut icon link to all templates for Yandex favicon indexing
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 08:38:24 +00:00
ruslan
65b098b702
fix: serve favicon.ico from /favicon.ico route with correct mime type
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 08:32:04 +00:00
ruslan
a9213eb507
update favicon.ico: multi-size (16/32/48/64/128/256px) from favicon.svg
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 08:27:16 +00:00
ruslan
cc5d7b8476
revert: white cards, remove credentials from service tiles
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 08:13:38 +00:00
ruslan
cdc30f126c
fix: add cache-busting v=2 to style.css to force browser reload
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 08:10:29 +00:00
ruslan
ccc3a2fb51
fix: force original icon box size with explicit !important overrides
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 08:08:15 +00:00
ruslan
4c2fc455ff
revert: restore original icon box size
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 08:05:12 +00:00
ruslan
1fe62af26b
revert: remove search bar and credentials collapsible
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 08:04:04 +00:00
ruslan
4d5e01855f
dashboard: collapsible credentials block; autofill: fix Pult username field
...
- Credentials wrapped in svc-credentials-wrap with toggle button and chevron
- Credentials hidden by default, expand on click (CSS class toggle)
- Autofill: add autofocus selector to catch fields like Zabbix name=name
- Autofill: re-fill username after password fill if Pult/Zabbix cleared it
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 08:00:02 +00:00
ruslan
cfadc72e6c
dashboard: glassmorphism cards, compact accent icon box, live search bar
...
- Tile cards: backdrop-filter blur(22px), rgba white bg, inset highlight
- Hover: translateY(-5px) + brighter glass effect
- Icon box: 68px compact rounded square with blue gradient accent
- Added live search input with glass style (filters by service name)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-07-21 07:48:11 +00:00
ruslan
174efa7f57
form: add Select All checkbox to products list in access request form
2026-07-20 20:19:07 +00:00
ruslan
b7a5d42644
fix: serve /favicon.ico so search engines find the site icon
2026-07-20 19:37:09 +00:00
ruslan
0ffab2e98f
web overlay: add 2s progress bar before showing Enter button
2026-07-20 19:29:44 +00:00
ruslan
f1449460d0
nav: hide title text when green Enter button appears on overlay
2026-07-20 19:27:09 +00:00
ruslan
706c647ba6
nav: replace hint text with green Enter button on overlay
2026-07-20 19:24:12 +00:00
ruslan
b185049a60
nav: show click-to-continue hint on overlay, fullscreen on that click
2026-07-20 19:21:02 +00:00
ruslan
f00d51cd76
nav: fullscreen on first user interaction with screen (browser policy fix)
2026-07-20 19:16:02 +00:00
ruslan
e079723922
nav: add labels to buttons, auto-fullscreen on session open
2026-07-20 19:12:47 +00:00
ruslan
709de88c95
fix: encode From header with RFC 2047 to fix email delivery with Cyrillic sender name
2026-07-20 17:06:52 +00:00
ruslan
09833cd298
Replace spinner with mont-emoji(3).gif animation in RDP and WEB overlays
2026-07-20 16:41:58 +00:00
ruslan
81608f8741
webpool: disable password save dialog and add chromium-l10n for Russian UI
...
- Add --disable-features=PasswordManagerEnabled to Chromium flags
- Add credentials_enable_service=False and profile.password_manager_enabled=False to Chrome Preferences
- Install chromium-l10n package in Dockerfile for Russian browser UI
2026-07-20 16:15:44 +00:00
ruslan
806c5d8e1f
session wait page: replace visible card with silent dark redirect
2026-07-20 16:04:21 +00:00
ruslan
f028f91ce4
universal-runtime: fix JS SyntaxError — remove bash escapes from single-quoted heredoc
2026-07-20 15:57:43 +00:00
ruslan
36570631cf
universal-runtime: fix overlay hiding error messages on reconnect
2026-07-20 15:50:54 +00:00
ruslan
19a9764d8e
universal-runtime: replace status badge with centered overlay Подготовка приложения...
2026-07-20 15:45:50 +00:00
ruslan
f61953f32a
rdp-proxy: rename overlay text to Подготовка рабочего стола...
2026-07-20 15:31:42 +00:00
ruslan
8707c72d23
rdp-proxy: pre-connect xfreerdp at container startup for instant sessions
2026-07-20 15:19:51 +00:00
ruslan
283f4f93c9
rdp-proxy: show overlay only after connect, remove waiting phase
2026-07-20 15:16:43 +00:00
ruslan
6f40e9dc72
rdp-proxy: replace corner status with centered fullscreen overlay
...
- Remove Ожидайте corner badge
- Phase 1 (connecting): centered spinner + Подключение к рабочему столу... + elapsed timer
- Phase 2 (desktop ready): progress bar fills over 5.8s then fades out
- Errors (reconnect) shown in small top-left box only
2026-07-20 15:05:27 +00:00
ruslan
3433e32df3
Handle renewal: extend expiry, add new products, send renewal email
2026-07-08 08:56:53 +00:00
ruslan
4b4b07dd20
Fix Telegram sendMessage: switch to HTML parse mode, escape user data
2026-07-03 11:37:30 +00:00
ruslan
18bb4bfaf4
Update description text: Партнеры MONT и их заказчики
2026-06-15 13:27:03 +00:00
ruslan
2a494dfa5e
Reduce left panel title font size to fit narrow column
2026-06-08 09:39:06 +00:00