1574 Commits

Author SHA1 Message Date
74ec397617 Show resend-confirmation link on any login failure in Uno app
The server no longer returns an EmailNotConfirmed flag. Remove the
emailNotConfirmed sentinel from AuthService, the EmailNotConfirmed
observable property and branch from LoginViewModel, and drop the
Visibility binding from the resend button so it is always shown in
the login form regardless of the failure reason.
2026-07-04 14:54:42 +01:00
82980f0b8a Show resend-confirmation link on any login failure in Blazor
The server no longer returns an EmailNotConfirmed flag; it returns a
uniform 401 for all login failures. Remove the flag-gated branch and show
the resend-confirmation link whenever the login form has an error message,
so users with an unconfirmed account still have a clear path forward.
2026-07-04 14:54:00 +01:00
6f16fd8649 Add per-IP sliding-window rate limiting to all auth endpoints
Auth endpoints had no IP-level rate limit; only Identity's per-account
lockout applied. A sliding-window policy (20 requests / 15 min per IP,
no queue) is now registered in Program.cs and applied to AuthController
via [EnableRateLimiting]. Rejected requests receive 429 Too Many Requests.
2026-07-04 14:49:17 +01:00
d561613bb3 Enforce explicit password policy and lockout settings
AddDefaultIdentity was called without configuring PasswordOptions or
LockoutOptions, relying on undocumented Identity defaults. Minimum
password length is now 12 with digit, upper, lower, and non-alphanumeric
requirements. Failed-login lockout is explicitly set to 5 attempts over a
15-minute window.
2026-07-04 14:49:03 +01:00
f2f23f9864 Fix login endpoint leaking account existence via EmailNotConfirmed flag
Returning EmailNotConfirmed=true after a correct password was submitted
disclosed both that the email address is registered and that the password
is valid, without completing authentication. The endpoint now returns a
uniform 401 Bad credentials in all failure cases. Clients should offer a
resend-confirmation link unconditionally via POST /auth/email/resend.
2026-07-04 14:48:30 +01:00
ea009c46c6 Fix JWT sub claim to carry the actual user ID
The sub claim was hardcoded to the literal string "TokenForTheApiWithAuth"
for every token, making it useless for identifying the principal. It now
holds user.Id, matching the JWT spec and enabling standard token inspection
and future revocation workflows.
2026-07-04 14:47:05 +01:00
ab2a617600 Remove hardcoded secrets from appsettings.json
JWT signing key and database connection string were committed in plaintext.
Both are now empty placeholders; real values live in .NET User Secrets (dev)
and must be supplied via environment variables or a secrets manager in production.
2026-07-04 14:46:39 +01:00
325a3f437a Enforce token expiry check before granting admin access in Uno app
CheckAdminRole() and CheckUberadminRole() in all admin ViewModels now
call JwtService.IsTokenValid() before trusting role claims, so an
expired token no longer passes the client-side admin gate.
AuthService.IsAuthenticated() also validates token expiry instead of
only checking for a non-empty token string.
2026-07-03 23:07:20 +01:00
2893da36b3 Require confirmation before all admin delete actions in Uno app
Every admin delete action (companies, machines, software, hardware
entities, publications, reference data, and media assets) now shows a
confirmation dialog naming the item before calling the API, preventing
accidental permanent deletion from a single misclick.
2026-07-01 23:02:09 +01:00
6c18c1e285 Add missing back button to AdminSuggestionReviewPage in Uno app
This detail page was reachable from AdminSuggestionsPage but had no
way to navigate back, unlike every other admin detail page.
2026-07-01 22:29:14 +01:00
6556e1a6c2 Update application name in resources to 'Marechai' 2026-07-01 22:04:17 +01:00
5ea23d4d31 Align admin data grid icons in Uno app with Blazor master
Replace the mix of Segoe MDL2 codepoints, SymbolIcon elements, and raw
emoji used for admin grid action buttons (edit, delete, description,
merge, photos, videos, etc.) with the same Google Material Icons glyphs
used by the Blazor MudBlazor admin pages, sourced from the already
bundled MaterialIcons-Regular.ttf font. Also fixes the Releases action
icon, which was using the codepoint for "album" instead of "new_releases".
2026-07-01 22:03:59 +01:00
5fa12c86c2 Add missing localized string properties for software admin edit panel
Several strings used in AdminSoftwarePage.xaml (external IDs, similar
software, markdown description fields, release management button)
existed in the .resx resources but had no corresponding property on
LocalizedStrings, so the bindings resolved to nothing at runtime.
2026-07-01 21:28:59 +01:00
78dd93cfc2 Fix WinWorldPC suggestion ranking to prioritize exact matches
Platform/genre/company suggestion lists in AdminWwpcImportReviewViewModel
sorted alphabetically after substring filtering, which could push an
exact match (e.g. "Windows") off the visible list when many other
entries shared the same prefix. Now exact matches rank first, followed
by Jaro-Winkler similarity, then alphabetical order.
2026-07-01 19:28:09 +01:00
25084ec88e Fix software duplicates admin page UX in Uno app
Duplicate groups now render as explicit cards instead of relying on
ListView/GroupStyle grouping, which Uno doesn't render reliably across
targets. The merge-target picker no longer loads the entire 170k-row
Software table into memory; it now reuses the existing
SoftwareService.SearchForPickerAsync search endpoint, same as the
sibling similar-software picker. The merge panel also now shows a
"Merging X into Y" summary and locks the target (with a Change link)
when pre-selected from a chosen master, matching the Blazor page's UX.
2026-07-01 19:08:56 +01:00
53f3a7a04e Fix Uno admin photo staging crash and stuck-thumbnail UI
Staging a photo in the Uno admin photo pages (GPU/Machine/Processor/
SoundSynth/Software covers/screenshots) threw ArgumentOutOfRangeException
inside Microsoft.Kiota.Serialization.Json when deserializing the
admin/pending response. Blazor's equivalent dialog never hit this because
it bypasses Kiota entirely for the upload call (raw JS fetch). Replaced
the Kiota-generated PostAsync calls with a manual HttpClient POST +
System.Text.Json deserialization for these endpoints, and hardened
ImageSourceFactory's DispatcherQueue.TryEnqueue calls to surface a real
exception instead of hanging silently if enqueueing fails.

Also fixed the staged-photo cards appearing permanently stuck on
"uploading..." even after a successful stage: their DataTemplates had no
x:DefaultBindMode, so all x:Bind expressions defaulted to OneTime and
never reflected the item's status/thumbnail/progress changes.
2026-07-01 15:55:32 +01:00
0bfd49b382 Replace photo carousels with responsive grids in Uno app
Machine, GPU, Processor, and Sound Synth detail pages now show photos
as a card grid (ItemsRepeater + UniformGridLayout), matching the
Blazor app's style and the grid pattern already used for software
screenshots/promo art. Company logos carousel is unchanged.
2026-07-01 04:09:26 +01:00
9ecca065a9 Paginate the software list on the machine details page
Loads software in fixed-size pages via the existing skip/take API instead
of fetching the entire list at once, with Previous/Next controls.
2026-07-01 04:01:35 +01:00
bcec1b5f37 Fix ResponsiveView not rendering on photo detail pages until rotation
ResponsiveView's Visibility was bound to IsLoading, keeping it Collapsed
during the first layout pass. It only picks its narrow/wide template based
on the width it measures the first time it participates in layout, so it
never rendered until a real SizeChanged (device rotation) forced it to
re-evaluate. Reorder it under the loading/error overlays instead of hiding
it, so it always measures correctly from the start, and drop the ineffective
QueueLayoutRefresh workaround.
2026-07-01 03:48:32 +01:00
b5192902d8 Fix Android release build not loading ApiClient URL
AndroidManifest.xml was missing the INTERNET permission, which .NET
for Android auto-injects only for Debug builds, causing all network
requests to silently fail in signed Release builds. Also make the
embedded appsettings.json fallback in BuildConfiguration always seed
first on Android instead of gating on an unreliable File.Exists check
against APK-packaged content assets.
2026-07-01 03:31:13 +01:00
c56abea35c Fix missing scrollbars in admin description edit/preview panes
StackPanel gives its children infinite height during measurement, so the
inner ScrollViewer/TextBox never received a finite height to scroll
against and the boxes just grew unbounded instead of scrolling. Replace
the StackPanel wrappers with Grid (Auto/*) rows across all admin
description editors, and add a matching edit+preview pane to
AdminSoftwarePage, which previously had no preview and no scrolling.
2026-07-01 02:16:21 +01:00
055249a298 Make software screenshots admin a child page of Software
Screenshots were managed from a standalone admin page listing every
screenshot across all software, with an in-page picker just to choose
upload scope. Convert it to the same child-of-Software pattern used by
Versions/Releases/PromoArt/Videos: reached via a row icon on the
Software admin grid, scoped to that software via navigation params,
with a back button returning to the Software list. Drops the now
redundant Software picker and the standalone sidebar entry.
2026-07-01 00:30:52 +01:00
024b26b0ed Make software releases a child admin page 2026-07-01 00:10:26 +01:00
b282ceaa8c Use Marechai logo for Uno splash screen 2026-06-30 23:58:08 +01:00
b38641b3fb Use Marechai icon for Uno app 2026-06-30 23:51:42 +01:00
9b4856ee45 Add missing magazine issue localization bindings 2026-06-30 23:47:45 +01:00
df0bf54281 Fix magazines admin issues tooltip binding 2026-06-30 23:43:22 +01:00
221ce68821 Fix Uno photo detail pages staying blank until resize 2026-06-30 23:40:07 +01:00
be2e24edb7 Fix machine video admin localization 2026-06-30 23:17:30 +01:00
00f572dd41 Fix Uno machine photo localizer bindings 2026-06-30 23:13:52 +01:00
c59e31c29c Render entity synopses as markdown in Uno app 2026-06-30 23:08:47 +01:00
96a8d7b7f3 Unify app configuration for Prism and Uno 2026-06-30 23:00:32 +01:00
a1346b939a Fix Uno admin pagination search filters 2026-06-30 22:16:00 +01:00
f801382bfa Fix Android appsettings loading 2026-06-30 22:02:15 +01:00
84bc2be03d Roll out server-side pagination in Uno admin pages 2026-06-30 21:58:40 +01:00
ffcbc9c939 Optimize admin software page query 2026-06-30 21:57:05 +01:00
651d03b526 Fix software compilation admin projection 2026-06-30 21:56:23 +01:00
96b211aa77 Fix markdown rendering in Marechai.App via native XAML renderer
MarkdownTextBlock crashed with a NullReferenceException in ThemeListener
under Uno, and the WebView2-based fallback used by description pages
doesn't composite on Linux desktop. Render markdown directly to XAML
elements (TextBlock/Span/Hyperlink/Image trees) via Markdig's AST instead,
shared by MessageMarkdownView and all entity description pages, with no
embedded browser dependency on any platform.
2026-06-30 14:16:22 +01:00
643bf86bed Add Reports tab to Uno Messages page
The Messages page already had an IsAdmin flag and the server already
supported a "reports" folder of system-authored conversations, but
there was no button/command in the Uno app to ever navigate to it, so
admins had no way to see system messages in the Messages area.
2026-06-30 13:08:29 +01:00
42ed8daaa7 Show WinWorldPC screenshot thumbnails in Uno review 2026-06-30 12:53:34 +01:00
569c178ca0 Add pagination to Uno old-dos imports queue 2026-06-30 12:48:19 +01:00
53521e7ae6 Add pagination to Uno WinWorldPC imports queue 2026-06-30 12:41:14 +01:00
81d1e7c1af Use configured API URL in Uno app client 2026-06-30 12:41:10 +01:00
84bcd3aacb Fix responsive main shell sidebar 2026-06-30 11:58:00 +01:00
86245dae81 Fix machine detail sub-item navigation 2026-06-30 08:10:09 +01:00
e394736648 Bring Uno company detail page to parity with Blazor
Add the junction sections that were missing from the Uno app's
read-only company viewer (smartphones, tablets, PDAs, machine
families, GPUs, processors, sound synthesizers, software, books,
documents, magazines), and restructure the page into tabs
(Overview/Hardware/Software & Media/People/Description) following
the app's established detail-page tab pattern.
2026-06-30 08:05:47 +01:00
a44c74c312 Pin Uno.Sdk back to 6.5.36, fixing blank Carousel rendering
The 6.7.0-dev.99 prerelease pulled in by global.json regressed the
CommunityToolkit Carousel control on the Uno desktop/Skia target: item
containers rendered but their content never did, breaking the Logo
History and Photos carousels. 6.5.36 is the documented stable version
and restores correct rendering.
2026-06-30 07:33:28 +01:00
ee9e88f222 Use icon actions in Uno admin grids 2026-06-30 02:03:33 +01:00
d33c482c24 Move company people editor into separate tab 2026-06-30 01:48:45 +01:00
c50eb00bca Fix Uno admin description panel opening 2026-06-30 01:26:57 +01:00