@7365admin1/core 3.48.1-staging.180 → 3.48.1-staging.181
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.changeset/hid-configuration-write-allowlist.md +22 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
- package/test/hid-hardening.test.mjs +92 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
"@7365admin1/core": patch
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
Constrain what a HID configuration write may contain, and stop storing password salts
|
|
6
|
+
|
|
7
|
+
`PUT /readers/:readerId/configuration` is a passthrough to the reader's
|
|
8
|
+
`set_configuration.fcgi`, and its body schema was `Joi.object().unknown(true)`.
|
|
9
|
+
That reaches `monitor.hostname`, `monitor.port` and `monitor.path` — the block
|
|
10
|
+
that decides which server receives every identification at that door — so one
|
|
11
|
+
request could redirect a reader's entire event stream. Writes are now limited to
|
|
12
|
+
the two modules the product actually writes, `pjsip` and `identifier`, which are
|
|
13
|
+
the only two `setReaderConfiguration` call sites in `layer-common`. Module
|
|
14
|
+
contents stay unvalidated (the vendor owns those keys), reading configuration is
|
|
15
|
+
unchanged, and the monitor block is still managed by the server through
|
|
16
|
+
`setReaderMonitor` and `configureReaderIntegration`, which do not use this
|
|
17
|
+
schema.
|
|
18
|
+
|
|
19
|
+
`sanitizeHidPayload` — the central redaction every `addEvent` already passes
|
|
20
|
+
through — did not include `salt`, so a password salt was still being persisted
|
|
21
|
+
beside the hash it belongs to. `salt`, `salt_value` and `saltvalue` are now
|
|
22
|
+
redacted like the rest. This does not touch records already stored.
|
package/dist/index.d.ts
CHANGED
|
@@ -10659,6 +10659,21 @@ declare const schemaUpdateHidSitePermissions: Joi.ObjectSchema<any>;
|
|
|
10659
10659
|
declare const schemaHidAmicoExecuteActions: Joi.ObjectSchema<any>;
|
|
10660
10660
|
declare const schemaHidAmicoIntercomCall: Joi.ObjectSchema<any>;
|
|
10661
10661
|
declare const schemaHidAmicoConfiguration: Joi.ObjectSchema<any>;
|
|
10662
|
+
/**
|
|
10663
|
+
* A configuration WRITE is a passthrough to `set_configuration.fcgi`, so an
|
|
10664
|
+
* unrestricted body reaches `monitor.hostname`, `monitor.port` and
|
|
10665
|
+
* `monitor.path` - the block that decides which server receives every
|
|
10666
|
+
* identification at that door. A single request could redirect a reader's
|
|
10667
|
+
* entire event stream.
|
|
10668
|
+
*
|
|
10669
|
+
* Writes are limited to the two modules the product actually writes, which are
|
|
10670
|
+
* the only two `setReaderConfiguration` call sites in `layer-common`:
|
|
10671
|
+
* `pjsip` (HidIntercomManagement.vue) and `identifier`
|
|
10672
|
+
* (HidQrCodeConfiguration.vue). Module CONTENTS stay unvalidated - the vendor
|
|
10673
|
+
* owns those keys - and READING configuration is unchanged. The monitor block
|
|
10674
|
+
* is still managed by the server through `setReaderMonitor` and
|
|
10675
|
+
* `configureReaderIntegration`, which do not go through this schema.
|
|
10676
|
+
*/
|
|
10662
10677
|
declare const schemaHidAmicoSetConfiguration: Joi.ObjectSchema<any>;
|
|
10663
10678
|
declare const schemaHidAmicoMonitor: Joi.ObjectSchema<any>;
|
|
10664
10679
|
declare const schemaHidAmicoObjectOperation: Joi.ObjectSchema<any>;
|
package/dist/index.js
CHANGED
|
@@ -43463,7 +43463,10 @@ var schemaHidAmicoIntercomCall = import_joi64.default.object({
|
|
|
43463
43463
|
target: import_joi64.default.string().trim().min(1).max(255).pattern(/^(?:sip:)?[A-Za-z0-9_.+-]+(?:@[A-Za-z0-9.-]+(?::\d{1,5})?)?$/).required()
|
|
43464
43464
|
}).unknown(true);
|
|
43465
43465
|
var schemaHidAmicoConfiguration = import_joi64.default.object().pattern(import_joi64.default.string(), import_joi64.default.array().items(import_joi64.default.string())).min(1).unknown(true);
|
|
43466
|
-
var schemaHidAmicoSetConfiguration = import_joi64.default.object(
|
|
43466
|
+
var schemaHidAmicoSetConfiguration = import_joi64.default.object({
|
|
43467
|
+
pjsip: import_joi64.default.object().unknown(true),
|
|
43468
|
+
identifier: import_joi64.default.object().unknown(true)
|
|
43469
|
+
}).min(1).unknown(false);
|
|
43467
43470
|
var schemaHidAmicoMonitor = import_joi64.default.object({
|
|
43468
43471
|
enabled: import_joi64.default.boolean().required()
|
|
43469
43472
|
});
|
|
@@ -43672,6 +43675,9 @@ var SENSITIVE_KEYS = /* @__PURE__ */ new Set([
|
|
|
43672
43675
|
"pin",
|
|
43673
43676
|
"pin_value",
|
|
43674
43677
|
"pinvalue",
|
|
43678
|
+
"salt",
|
|
43679
|
+
"salt_value",
|
|
43680
|
+
"saltvalue",
|
|
43675
43681
|
"card_value",
|
|
43676
43682
|
"cardvalue",
|
|
43677
43683
|
"cardno",
|