Commit Graph

2381 Commits

Author SHA1 Message Date
eb1deff2ba case 4693 - form field lists published only when fully built
FormFieldReferenceList and FormFieldKeys built their static lists lazily
and published them before filling them, so requests arriving during the
first build after a restart saw a half-filled list ("is not valid").
Both are now built in a local and published when complete (volatile).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 20:28:11 -07:00
80f81aea0f case 4725 - sessions end on password reset and login disabled, exact login route, default SuperUser limited when licensed
A password set by someone else (reset code, administrator) or a disabled
login replaces the user's session token and download key; changing one's
own password keeps the session. PasswordResetCodeExpire is cleared (was
DlKeyExpire). The token middleware exempts only the exact login and
notify/hello routes and refuses inactive users and users who may not log
in. With a purchased licence, notify/hello no longer offers the default
SuperUser login and a SuperUser with the default password may only change
it (SuperUserDefaultPasswordRoutes). F7, F8 and F9 fixed. Manual and
changelog updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 19:54:03 -07:00
4141217c04 case 4724 - SMTP certificate checked, password never returned
Mailer checks the SMTP server's certificate (trust and name; no revocation
check). New config setting AYANOVA_SMTP_ACCEPT_ANY_CERTIFICATE accepts any
certificate (boot warning, shown in server info, manual page).
The notification settings GET returns ******** instead of the SMTP
password; a PUT with ******** or empty keeps the stored password.
F30 and F31 fixed. Changelog and manual updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 19:09:02 -07:00
d254affc8b case 4720 - restricted roles get filtered work order items in report data, rendering and export
Opening a work order filters it for restricted users (TechRestricted,
SubContractor, SubContractorRestricted): only items they are scheduled on, and
on those only their own labour, travel and scheduling, and for some roles no
parts, units, expenses etc. Report data, rendering and export went through
WorkOrderGetPartialAsync, which filtered nothing for child types (security
review F27). Two causes:
- the partial fetch now applies the same filtering: the item only if the user
  is scheduled on it (checked in the database), then its details filtered; the
  existing per-item filtering moved unchanged into RemoveRestrictedUserItemDetails
  so both fetches share it;
- BizObjectFactory created WorkOrderBiz with UserType.Service for everyone, so
  in these paths a subcontractor was never treated as one; it now passes the
  user's real type (only the subcontractor flags depend on it).

Checked: report data for a restricted subcontractor on work order 1 went from
the whole item with parts to none; scheduled on an item, it gets the item
without parts or other users' labour. Full suite: 111 passed, 5 skipped, the
same 2 known failures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 16:27:59 -07:00
ee59efff48 case 4713 - customer contacts hold and act with customer roles only
Users who may edit contacts but not users (Service, Sales, Accounting) could
give a contact login any role, BizAdmin and OpsAdmin included, and roles are
what every check uses (security review F28). Now:
- saving a Customer or HeadOffice user with any role other than Customer or
  CustomerRestricted is refused (error on Roles);
- UserBiz.EffectiveRoles masks a contact's roles to the customer roles wherever
  they are applied: the token middleware, download-key routes, and the
  notification subscriber check, so contacts that already have staff roles
  stored act without them.

Checked: Service creating a contact with BizAdmin refused, with Customer works;
a contact with OpsAdmin stored in the database gets 403 downloading a log file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 15:59:35 -07:00
87fdc12dce case 4712 - notification subscriptions are the caller's own; object events only to subscribers who may read the record type
Step 6 of 4712 (security review F17). A subscription kept the UserId sent by
the client, and object events (created, modified, deleted, age) were matched by
record type only, so a user could get record names of types it may not read,
delivered to any address. Now a subscription is created for the caller and an
update cannot move it to another user, unless the caller administers users; and
object events skip subscribers without read rights on the record type.

Checked: Service's subscription asked for SuperUser is saved as its own; with
"customer created" subscriptions, Inventory (no read on customers) got 0 events,
Service 1. Full suite: 109 passed, 5 skipped, the same 2 known failures.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 14:39:40 -07:00
bd4494abac case 4712 - customer contacts reach only their own customer's work orders
Step 2 of 4712 (security review F13). The customer work-order rights checked
only tag-based feature switches, never which customer a work order belongs to.
New UserBiz.CustomerContactOwnsCustomerAsync (own customer, or for a head
office contact a customer of its head office), used by:
- workorder/customer/{id}: another customer's work order is not found (404);
- customer work order report (-100): exactly one work order, which must be the
  contact's (the renderer used every id it was given);
- work order attachment list and download for contacts; other attachment types
  are refused to contacts (the customer screens show them only on work orders).

Checked: other customer's work order 404 (was 200); report on another's or on
two work orders not found; own customer report still accepted (202).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 13:52:31 -07:00
bf0555fb31 case 4690 - report browser: launch chrome-headless-shell; writable config/cache folders for the browser; Ubuntu 24.04 droplet results
Full Chrome 155 would not start under a Linux service user with no writable
home (chrome_crashpad_handler: --database is required). chrome-headless-shell
starts, and measured on a 1 GB droplet is 3-4x faster and smaller per render.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 08:12:21 -07:00
892ef59608 case 4690 - report browser download/launch failures: logged at Error, specific error returned to the client
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:31:29 -07:00
a34e012eee case 4690 - report browser downloads under the data path, not beside the app; manual updated
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 20:25:00 -07:00
76dab8d865 case 4690 - remove MiniProfiler (never used): packages, wiring, profiler auth workaround, credits entry
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:49:28 -07:00
f3e8026501 case 4690 - PuppeteerSharp 25.15.0; launch arguments as separate elements; --lang keeps the server locale as browser default
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 18:12:49 -07:00
15933c0b1c case 4632 2025-04-03 21:05:18 +00:00
9d7c575dd1 case 4632 2025-02-18 21:08:56 +00:00
1602b9680d 2024-10-23 23:40:31 +00:00
f06a23475b 2024-10-23 23:38:19 +00:00
e394b98882 case 4615 2024-10-23 23:10:16 +00:00
7b341fe8f5 case 4615 2024-10-23 22:05:28 +00:00
d0ab3ea096 case 4586 2024-05-11 01:38:02 +00:00
557241b0e5 case 4586 - got to build point without error all dependencies updated but reporting error handling work to be done and not tested at all yet 2024-05-10 00:09:48 +00:00
59f9d2a2f0 case 4582 2024-04-29 18:49:50 +00:00
a8fb507616 case 4582 2024-04-29 18:41:04 +00:00
176007864a case 4578 (note, prior commit same case forgot to tag it with this message) 2024-04-08 21:05:43 +00:00
59794a6bf1 2024-04-08 19:50:16 +00:00
5f094510d9 case 4578 2024-04-08 19:10:49 +00:00
ddc6258411 case 4568 2024-01-25 23:03:23 +00:00
7b9a505e52 case 4556 2023-11-09 20:02:11 +00:00
e86bb56a06 2023-11-07 18:09:45 +00:00
ce1e3f2b68 2023-10-26 23:42:32 +00:00
a42f1a92f2 case 4377 2023-05-12 23:07:47 +00:00
82fa744de5 case 4173 2023-05-09 22:23:54 +00:00
ca82375bca case 4173 2023-05-08 22:54:18 +00:00
08e9a8a275 2023-04-26 17:57:50 +00:00
de98e3568c case 4496 2023-03-24 17:15:03 +00:00
d615c1d7b0 case 4494 2023-03-22 00:02:46 +00:00
749dbdff66 case 4492 2023-03-21 23:23:54 +00:00
93dd8f5e49 case 4477 2023-03-08 21:23:16 +00:00
cf117a5842 case 4473 2023-03-06 17:53:38 +00:00
7039b367bd 2023-02-22 23:57:24 +00:00
36b949f07e misc cleanup 2023-02-22 23:54:16 +00:00
315caf6448 case 4406 2023-01-27 17:15:14 +00:00
198bc8f249 case 4398 2023-01-26 00:21:17 +00:00
184a58e8df case 4388 2023-01-24 23:01:13 +00:00
f3615b0f5f case 4357 2022-12-20 22:11:12 +00:00
b3bfa718d3 case 4357 2022-12-20 21:40:29 +00:00
5c06f98be0 2022-12-20 21:40:00 +00:00
2ba7b00db0 2022-12-17 01:53:53 +00:00
3abe0c0379 case 4341 2022-12-13 22:49:47 +00:00
722b968aa5 case 4341 2022-12-13 22:24:06 +00:00
b090c1040d case 4341 2022-12-13 22:17:39 +00:00