204 Commits

Author SHA1 Message Date
ruslan f5c53f01bf Reduce login logo size 72px -> 54px 2026-08-03 14:01:24 +00:00
ruslan de6753b077 Increase login page logo size 36px -> 72px 2026-08-03 13:54:50 +00:00
ruslan cbfafe4471 Replace logo with new MONT|4MONT design, white version fitted to existing size 2026-08-03 13:39:04 +00:00
ruslan 3251ce3380 Fix favicon HEAD 405 and unify favicon design across ico/png/svg 2026-08-03 13:00:29 +00:00
ruslan b7ec4b81a5 fix: regenerate favicon sizes from original favicon.png (not logo) 2026-07-26 15:30:38 +00:00
ruslan 06643e2d50 seo: proper favicon sizes (32/192/512px) + web app manifest for Yandex 2026-07-26 13:21:59 +00:00
ruslan 0fe2f7d9a9 ui: replace logo with logo2.png, bump cache buster to v=3 2026-07-26 13:10:32 +00:00
ruslan 6f7f28408d fix: iframe probe accepts only 2xx (reject portal 404 with X-Frame-Options) 2026-07-23 12:24:20 +00:00
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