mirror of
https://codeberg.org/timelimit/timelimit-server.git
synced 2025-10-03 09:49:32 +02:00
Compare commits
27 commits
2023-05-15
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6189601459 | ||
![]() |
569e5ce62d | ||
![]() |
6220cc6bb9 | ||
![]() |
33d9fd732f | ||
![]() |
764f240707 | ||
![]() |
b392ca295a | ||
![]() |
f5fc8e6cd6 | ||
![]() |
9c2048af64 | ||
![]() |
b69271f7df | ||
![]() |
97d2730b20 | ||
![]() |
0346197c23 | ||
![]() |
a7ed01af74 | ||
![]() |
f77d91ff56 | ||
![]() |
2d035da0da | ||
![]() |
2d73cba90e | ||
![]() |
1918c74277 | ||
![]() |
e55d1fd1a9 | ||
![]() |
f10b79a023 | ||
![]() |
2c401288a3 | ||
![]() |
89f3325a18 | ||
![]() |
7aaad00881 | ||
![]() |
c7e4cfc9f9 | ||
![]() |
12ed5d73cd | ||
![]() |
4df809a306 | ||
![]() |
8ec0781859 | ||
![]() |
376a2cc624 | ||
![]() |
e14237be7d |
25 changed files with 3542 additions and 2237 deletions
|
@ -545,6 +545,12 @@
|
||||||
},
|
},
|
||||||
"addedManipulationFlags": {
|
"addedManipulationFlags": {
|
||||||
"type": "number"
|
"type": "number"
|
||||||
|
},
|
||||||
|
"platformType": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"platformLevel": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
|
|
@ -212,6 +212,12 @@
|
||||||
},
|
},
|
||||||
"pk": {
|
"pk": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
},
|
||||||
|
"pType": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"pLevel": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -240,6 +246,7 @@
|
||||||
"model",
|
"model",
|
||||||
"name",
|
"name",
|
||||||
"networkTime",
|
"networkTime",
|
||||||
|
"pLevel",
|
||||||
"qOrLater",
|
"qOrLater",
|
||||||
"reboot",
|
"reboot",
|
||||||
"rebootIsManipulation",
|
"rebootIsManipulation",
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Untitled number in SerializedAppLogicAction Schema
|
||||||
|
|
||||||
|
```txt
|
||||||
|
https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/platformLevel
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
|
||||||
|
| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
|
||||||
|
| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [SerializedAppLogicAction.schema.json\*](SerializedAppLogicAction.schema.json "open original schema") |
|
||||||
|
|
||||||
|
## platformLevel Type
|
||||||
|
|
||||||
|
`number`
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Untitled string in SerializedAppLogicAction Schema
|
||||||
|
|
||||||
|
```txt
|
||||||
|
https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/platformType
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
|
||||||
|
| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
|
||||||
|
| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [SerializedAppLogicAction.schema.json\*](SerializedAppLogicAction.schema.json "open original schema") |
|
||||||
|
|
||||||
|
## platformType Type
|
||||||
|
|
||||||
|
`string`
|
|
@ -28,6 +28,8 @@ https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDevic
|
||||||
| [didReboot](#didreboot) | `boolean` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-didreboot.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/didReboot") |
|
| [didReboot](#didreboot) | `boolean` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-didreboot.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/didReboot") |
|
||||||
| [isQOrLaterNow](#isqorlaternow) | `boolean` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-isqorlaternow.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/isQOrLaterNow") |
|
| [isQOrLaterNow](#isqorlaternow) | `boolean` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-isqorlaternow.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/isQOrLaterNow") |
|
||||||
| [addedManipulationFlags](#addedmanipulationflags) | `number` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/addedManipulationFlags") |
|
| [addedManipulationFlags](#addedmanipulationflags) | `number` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/addedManipulationFlags") |
|
||||||
|
| [platformType](#platformtype) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-platformtype.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/platformType") |
|
||||||
|
| [platformLevel](#platformlevel) | `number` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-platformlevel.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/platformLevel") |
|
||||||
|
|
||||||
## type
|
## type
|
||||||
|
|
||||||
|
@ -257,3 +259,39 @@ https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDevic
|
||||||
### addedManipulationFlags Type
|
### addedManipulationFlags Type
|
||||||
|
|
||||||
`number`
|
`number`
|
||||||
|
|
||||||
|
## platformType
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`platformType`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `string`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-platformtype.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/platformType")
|
||||||
|
|
||||||
|
### platformType Type
|
||||||
|
|
||||||
|
`string`
|
||||||
|
|
||||||
|
## platformLevel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`platformLevel`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-platformlevel.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/platformLevel")
|
||||||
|
|
||||||
|
### platformLevel Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|
|
@ -1240,6 +1240,8 @@ Reference this group by using
|
||||||
| [didReboot](#didreboot) | `boolean` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-didreboot.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/didReboot") |
|
| [didReboot](#didreboot) | `boolean` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-didreboot.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/didReboot") |
|
||||||
| [isQOrLaterNow](#isqorlaternow) | `boolean` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-isqorlaternow.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/isQOrLaterNow") |
|
| [isQOrLaterNow](#isqorlaternow) | `boolean` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-isqorlaternow.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/isQOrLaterNow") |
|
||||||
| [addedManipulationFlags](#addedmanipulationflags) | `number` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/addedManipulationFlags") |
|
| [addedManipulationFlags](#addedmanipulationflags) | `number` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/addedManipulationFlags") |
|
||||||
|
| [platformType](#platformtype) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-platformtype.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/platformType") |
|
||||||
|
| [platformLevel](#platformlevel) | `number` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-platformlevel.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/platformLevel") |
|
||||||
|
|
||||||
### type
|
### type
|
||||||
|
|
||||||
|
@ -1470,6 +1472,42 @@ Reference this group by using
|
||||||
|
|
||||||
`number`
|
`number`
|
||||||
|
|
||||||
|
### platformType
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`platformType`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `string`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-platformtype.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/platformType")
|
||||||
|
|
||||||
|
#### platformType Type
|
||||||
|
|
||||||
|
`string`
|
||||||
|
|
||||||
|
### platformLevel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`platformLevel`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-platformlevel.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/platformLevel")
|
||||||
|
|
||||||
|
#### platformLevel Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|
||||||
## Definitions group SerializedUploadDevicePublicKeyAction
|
## Definitions group SerializedUploadDevicePublicKeyAction
|
||||||
|
|
||||||
Reference this group by using
|
Reference this group by using
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Untitled number in ServerDataStatus Schema
|
||||||
|
|
||||||
|
```txt
|
||||||
|
https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pLevel
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
|
||||||
|
| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :------------------------------------------------------------------------------------ |
|
||||||
|
| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [ServerDataStatus.schema.json\*](ServerDataStatus.schema.json "open original schema") |
|
||||||
|
|
||||||
|
## pLevel Type
|
||||||
|
|
||||||
|
`number`
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Untitled string in ServerDataStatus Schema
|
||||||
|
|
||||||
|
```txt
|
||||||
|
https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pType
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
|
||||||
|
| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :------------------------------------------------------------------------------------ |
|
||||||
|
| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [ServerDataStatus.schema.json\*](ServerDataStatus.schema.json "open original schema") |
|
||||||
|
|
||||||
|
## pType Type
|
||||||
|
|
||||||
|
`string`
|
|
@ -50,6 +50,8 @@ https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData
|
||||||
| [qOrLater](#qorlater) | `boolean` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-qorlater.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/qOrLater") |
|
| [qOrLater](#qorlater) | `boolean` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-qorlater.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/qOrLater") |
|
||||||
| [mFlags](#mflags) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-mflags.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/mFlags") |
|
| [mFlags](#mflags) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-mflags.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/mFlags") |
|
||||||
| [pk](#pk) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-pk.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pk") |
|
| [pk](#pk) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-pk.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pk") |
|
||||||
|
| [pType](#ptype) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-ptype.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pType") |
|
||||||
|
| [pLevel](#plevel) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-plevel.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pLevel") |
|
||||||
|
|
||||||
## deviceId
|
## deviceId
|
||||||
|
|
||||||
|
@ -718,3 +720,39 @@ https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData
|
||||||
### pk Type
|
### pk Type
|
||||||
|
|
||||||
`string`
|
`string`
|
||||||
|
|
||||||
|
## pType
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`pType`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `string`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-ptype.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pType")
|
||||||
|
|
||||||
|
### pType Type
|
||||||
|
|
||||||
|
`string`
|
||||||
|
|
||||||
|
## pLevel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`pLevel`
|
||||||
|
|
||||||
|
* is required
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-plevel.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pLevel")
|
||||||
|
|
||||||
|
### pLevel Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|
|
@ -435,6 +435,8 @@ Reference this group by using
|
||||||
| [qOrLater](#qorlater) | `boolean` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-qorlater.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/qOrLater") |
|
| [qOrLater](#qorlater) | `boolean` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-qorlater.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/qOrLater") |
|
||||||
| [mFlags](#mflags) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-mflags.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/mFlags") |
|
| [mFlags](#mflags) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-mflags.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/mFlags") |
|
||||||
| [pk](#pk) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-pk.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pk") |
|
| [pk](#pk) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-pk.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pk") |
|
||||||
|
| [pType](#ptype) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-ptype.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pType") |
|
||||||
|
| [pLevel](#plevel) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-plevel.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pLevel") |
|
||||||
|
|
||||||
### deviceId
|
### deviceId
|
||||||
|
|
||||||
|
@ -1104,6 +1106,42 @@ Reference this group by using
|
||||||
|
|
||||||
`string`
|
`string`
|
||||||
|
|
||||||
|
### pType
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`pType`
|
||||||
|
|
||||||
|
* is optional
|
||||||
|
|
||||||
|
* Type: `string`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-ptype.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pType")
|
||||||
|
|
||||||
|
#### pType Type
|
||||||
|
|
||||||
|
`string`
|
||||||
|
|
||||||
|
### pLevel
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`pLevel`
|
||||||
|
|
||||||
|
* is required
|
||||||
|
|
||||||
|
* Type: `number`
|
||||||
|
|
||||||
|
* cannot be null
|
||||||
|
|
||||||
|
* defined in: [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-plevel.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pLevel")
|
||||||
|
|
||||||
|
#### pLevel Type
|
||||||
|
|
||||||
|
`number`
|
||||||
|
|
||||||
## Definitions group ProtectionLevel
|
## Definitions group ProtectionLevel
|
||||||
|
|
||||||
Reference this group by using
|
Reference this group by using
|
||||||
|
|
5274
package-lock.json
generated
5274
package-lock.json
generated
File diff suppressed because it is too large
Load diff
12
package.json
12
package.json
|
@ -38,12 +38,11 @@
|
||||||
"@types/lodash": "^4.14.166",
|
"@types/lodash": "^4.14.166",
|
||||||
"@types/node": "^16.11.59",
|
"@types/node": "^16.11.59",
|
||||||
"@types/nodemailer": "^6.4.4",
|
"@types/nodemailer": "^6.4.4",
|
||||||
"@types/umzug": "^2.3.0",
|
"@typescript-eslint/eslint-plugin": "^7.18.0",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
"@typescript-eslint/parser": "^7.18.0",
|
||||||
"@typescript-eslint/parser": "^5.10.0",
|
|
||||||
"eslint": "^8.7.0",
|
"eslint": "^8.7.0",
|
||||||
"rimraf": "^3.0.2",
|
"rimraf": "^3.0.2",
|
||||||
"typescript": "^4.4.4",
|
"typescript": "^5.5.4",
|
||||||
"typescript-json-schema": "^0.52.0"
|
"typescript-json-schema": "^0.52.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -63,10 +62,9 @@
|
||||||
"rate-limiter-flexible": "^2.1.15",
|
"rate-limiter-flexible": "^2.1.15",
|
||||||
"sequelize": "^6.25.5",
|
"sequelize": "^6.25.5",
|
||||||
"socket.io": "^4.0.1",
|
"socket.io": "^4.0.1",
|
||||||
"sqlite3": "^4.0.0",
|
"umzug": "^3.8.1"
|
||||||
"umzug": "^2.3.0"
|
|
||||||
},
|
},
|
||||||
"optionalDependencies": {
|
"optionalDependencies": {
|
||||||
"sqlite3": "^4.0.0"
|
"sqlite3": "^5.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2023 Jonas Lochmann
|
* Copyright (C) 2019 - 2024 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -58,7 +58,9 @@ const allTypes = [
|
||||||
|
|
||||||
const settings = {
|
const settings = {
|
||||||
required: true,
|
required: true,
|
||||||
noExtraProps: true
|
noExtraProps: true,
|
||||||
|
// otherwise it finds errors in dependencies that we don't care about
|
||||||
|
ignoreErrors: true
|
||||||
};
|
};
|
||||||
|
|
||||||
const compilerOptions = {
|
const compilerOptions = {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2022 Jonas Lochmann
|
* Copyright (C) 2019 - 2023 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -15,6 +15,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import { minPlatformLevel, maxPlatformLevel, minPlatformTypeLength, maxPlatformTypeLength } from '../database/device'
|
||||||
import { NewPermissionStatus } from '../model/newpermissionstatus'
|
import { NewPermissionStatus } from '../model/newpermissionstatus'
|
||||||
import { ProtectionLevel } from '../model/protectionlevel'
|
import { ProtectionLevel } from '../model/protectionlevel'
|
||||||
import { RuntimePermissionStatus } from '../model/runtimepermissionstatus'
|
import { RuntimePermissionStatus } from '../model/runtimepermissionstatus'
|
||||||
|
@ -33,6 +34,8 @@ export class UpdateDeviceStatusAction extends AppLogicAction {
|
||||||
readonly didReboot: boolean
|
readonly didReboot: boolean
|
||||||
readonly isQOrLaterNow: boolean
|
readonly isQOrLaterNow: boolean
|
||||||
readonly addedManipulationFlags: number
|
readonly addedManipulationFlags: number
|
||||||
|
readonly platformType?: string
|
||||||
|
readonly platformLevel?: number
|
||||||
|
|
||||||
constructor ({
|
constructor ({
|
||||||
newProtetionLevel,
|
newProtetionLevel,
|
||||||
|
@ -43,7 +46,9 @@ export class UpdateDeviceStatusAction extends AppLogicAction {
|
||||||
newAppVersion,
|
newAppVersion,
|
||||||
didReboot,
|
didReboot,
|
||||||
isQOrLaterNow,
|
isQOrLaterNow,
|
||||||
addedManipulationFlags
|
addedManipulationFlags,
|
||||||
|
platformType,
|
||||||
|
platformLevel
|
||||||
}: {
|
}: {
|
||||||
newProtetionLevel?: ProtectionLevel
|
newProtetionLevel?: ProtectionLevel
|
||||||
newUsageStatsPermissionStatus?: RuntimePermissionStatus
|
newUsageStatsPermissionStatus?: RuntimePermissionStatus
|
||||||
|
@ -54,6 +59,8 @@ export class UpdateDeviceStatusAction extends AppLogicAction {
|
||||||
didReboot: boolean
|
didReboot: boolean
|
||||||
isQOrLaterNow: boolean
|
isQOrLaterNow: boolean
|
||||||
addedManipulationFlags: number
|
addedManipulationFlags: number
|
||||||
|
platformType?: string
|
||||||
|
platformLevel?: number
|
||||||
}) {
|
}) {
|
||||||
super()
|
super()
|
||||||
|
|
||||||
|
@ -67,6 +74,20 @@ export class UpdateDeviceStatusAction extends AppLogicAction {
|
||||||
|
|
||||||
assertSafeInteger({ actionType, field: 'addedManipulationFlags', value: addedManipulationFlags })
|
assertSafeInteger({ actionType, field: 'addedManipulationFlags', value: addedManipulationFlags })
|
||||||
|
|
||||||
|
if (platformType !== undefined) {
|
||||||
|
if (platformType.length < minPlatformTypeLength || platformType.length > maxPlatformTypeLength) {
|
||||||
|
throwOutOfRange({ actionType, field: 'platformType.length', value: platformType.length })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (platformLevel !== undefined) {
|
||||||
|
assertSafeInteger({ actionType, field: 'platformLevel', value: platformLevel })
|
||||||
|
|
||||||
|
if (platformLevel < minPlatformLevel || platformLevel > maxPlatformLevel) {
|
||||||
|
throwOutOfRange({ actionType, field: 'platformLevel', value: platformLevel })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
this.newProtetionLevel = newProtetionLevel
|
this.newProtetionLevel = newProtetionLevel
|
||||||
this.newUsageStatsPermissionStatus = newUsageStatsPermissionStatus
|
this.newUsageStatsPermissionStatus = newUsageStatsPermissionStatus
|
||||||
this.newNotificationAccessPermission = newNotificationAccessPermission
|
this.newNotificationAccessPermission = newNotificationAccessPermission
|
||||||
|
@ -76,6 +97,8 @@ export class UpdateDeviceStatusAction extends AppLogicAction {
|
||||||
this.didReboot = didReboot
|
this.didReboot = didReboot
|
||||||
this.isQOrLaterNow = isQOrLaterNow
|
this.isQOrLaterNow = isQOrLaterNow
|
||||||
this.addedManipulationFlags = addedManipulationFlags
|
this.addedManipulationFlags = addedManipulationFlags
|
||||||
|
this.platformType = platformType
|
||||||
|
this.platformLevel = platformLevel
|
||||||
}
|
}
|
||||||
|
|
||||||
static parse = ({
|
static parse = ({
|
||||||
|
@ -87,7 +110,9 @@ export class UpdateDeviceStatusAction extends AppLogicAction {
|
||||||
appVersion,
|
appVersion,
|
||||||
didReboot,
|
didReboot,
|
||||||
isQOrLaterNow,
|
isQOrLaterNow,
|
||||||
addedManipulationFlags
|
addedManipulationFlags,
|
||||||
|
platformType,
|
||||||
|
platformLevel
|
||||||
}: SerializedUpdateDeviceStatusAction) => (
|
}: SerializedUpdateDeviceStatusAction) => (
|
||||||
new UpdateDeviceStatusAction({
|
new UpdateDeviceStatusAction({
|
||||||
newProtetionLevel: protectionLevel,
|
newProtetionLevel: protectionLevel,
|
||||||
|
@ -98,7 +123,9 @@ export class UpdateDeviceStatusAction extends AppLogicAction {
|
||||||
newAppVersion: appVersion,
|
newAppVersion: appVersion,
|
||||||
didReboot: !!didReboot,
|
didReboot: !!didReboot,
|
||||||
isQOrLaterNow: !!isQOrLaterNow,
|
isQOrLaterNow: !!isQOrLaterNow,
|
||||||
addedManipulationFlags: addedManipulationFlags || 0
|
addedManipulationFlags: addedManipulationFlags || 0,
|
||||||
|
platformType: platformType,
|
||||||
|
platformLevel: platformLevel
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -114,4 +141,6 @@ export interface SerializedUpdateDeviceStatusAction {
|
||||||
didReboot?: boolean
|
didReboot?: boolean
|
||||||
isQOrLaterNow?: boolean
|
isQOrLaterNow?: boolean
|
||||||
addedManipulationFlags?: number
|
addedManipulationFlags?: number
|
||||||
|
platformType?: string
|
||||||
|
platformLevel?: number
|
||||||
}
|
}
|
||||||
|
|
|
@ -1982,6 +1982,12 @@ const definitions = {
|
||||||
},
|
},
|
||||||
"addedManipulationFlags": {
|
"addedManipulationFlags": {
|
||||||
"type": "number"
|
"type": "number"
|
||||||
|
},
|
||||||
|
"platformType": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"platformLevel": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -2164,6 +2170,12 @@ const definitions = {
|
||||||
},
|
},
|
||||||
"pk": {
|
"pk": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
|
},
|
||||||
|
"pType": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"pLevel": {
|
||||||
|
"type": "number"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"additionalProperties": false,
|
"additionalProperties": false,
|
||||||
|
@ -2192,6 +2204,7 @@ const definitions = {
|
||||||
"model",
|
"model",
|
||||||
"name",
|
"name",
|
||||||
"networkTime",
|
"networkTime",
|
||||||
|
"pLevel",
|
||||||
"qOrLater",
|
"qOrLater",
|
||||||
"reboot",
|
"reboot",
|
||||||
"rebootIsManipulation",
|
"rebootIsManipulation",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2022 Jonas Lochmann
|
* Copyright (C) 2019 - 2023 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -37,6 +37,12 @@ export const DeviceManipulationFlags = {
|
||||||
ALL: 1
|
ALL: 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const minPlatformTypeLength = 1
|
||||||
|
export const maxPlatformTypeLength = 8
|
||||||
|
|
||||||
|
export const minPlatformLevel = 0
|
||||||
|
export const maxPlatformLevel = 128
|
||||||
|
|
||||||
export interface DeviceAttributesVersion1 {
|
export interface DeviceAttributesVersion1 {
|
||||||
familyId: string
|
familyId: string
|
||||||
deviceId: string
|
deviceId: string
|
||||||
|
@ -119,11 +125,17 @@ export interface DeviceAttributesVersion14 {
|
||||||
nextKeyReplySequenceNumber: string
|
nextKeyReplySequenceNumber: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface DeviceAttributesVersion15 {
|
||||||
|
platformType: string | null
|
||||||
|
platformLevel: number
|
||||||
|
}
|
||||||
|
|
||||||
export type DeviceAttributes = DeviceAttributesVersion1 & DeviceAttributesVersion2 &
|
export type DeviceAttributes = DeviceAttributesVersion1 & DeviceAttributesVersion2 &
|
||||||
DeviceAttributesVersion3 & DeviceAttributesVersion4 & DeviceAttributesVersion5 &
|
DeviceAttributesVersion3 & DeviceAttributesVersion4 & DeviceAttributesVersion5 &
|
||||||
DeviceAttributesVersion6 & DeviceAttributesVersion7 & DeviceAttributesVersion8 &
|
DeviceAttributesVersion6 & DeviceAttributesVersion7 & DeviceAttributesVersion8 &
|
||||||
DeviceAttributesVersion9 & DeviceAttributesVersion10 & DeviceAttributesVersion11 &
|
DeviceAttributesVersion9 & DeviceAttributesVersion10 & DeviceAttributesVersion11 &
|
||||||
DeviceAttributesVersion12 & DeviceAttributesVersion13 & DeviceAttributesVersion14
|
DeviceAttributesVersion12 & DeviceAttributesVersion13 & DeviceAttributesVersion14 &
|
||||||
|
DeviceAttributesVersion15
|
||||||
|
|
||||||
export type DeviceModel = Sequelize.Model<DeviceAttributes> & DeviceAttributes
|
export type DeviceModel = Sequelize.Model<DeviceAttributes> & DeviceAttributes
|
||||||
export type DeviceModelStatic = typeof Sequelize.Model & {
|
export type DeviceModelStatic = typeof Sequelize.Model & {
|
||||||
|
@ -305,6 +317,26 @@ export const attributesVersion14: SequelizeAttributes<DeviceAttributesVersion14>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const attributesVersion15: SequelizeAttributes<DeviceAttributesVersion15> = {
|
||||||
|
platformType: {
|
||||||
|
type: Sequelize.STRING(maxPlatformTypeLength),
|
||||||
|
allowNull: true,
|
||||||
|
defaultValue: null,
|
||||||
|
validate: {
|
||||||
|
len: [minPlatformTypeLength, maxPlatformTypeLength]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
platformLevel: {
|
||||||
|
type: Sequelize.INTEGER,
|
||||||
|
allowNull: false,
|
||||||
|
defaultValue: minPlatformLevel,
|
||||||
|
validate: {
|
||||||
|
min: minPlatformLevel,
|
||||||
|
max: maxPlatformLevel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export const attributes: SequelizeAttributes<DeviceAttributes> = {
|
export const attributes: SequelizeAttributes<DeviceAttributes> = {
|
||||||
...attributesVersion1,
|
...attributesVersion1,
|
||||||
...attributesVersion2,
|
...attributesVersion2,
|
||||||
|
@ -319,7 +351,8 @@ export const attributes: SequelizeAttributes<DeviceAttributes> = {
|
||||||
...attributesVersion11,
|
...attributesVersion11,
|
||||||
...attributesVersion12,
|
...attributesVersion12,
|
||||||
...attributesVersion13,
|
...attributesVersion13,
|
||||||
...attributesVersion14
|
...attributesVersion14,
|
||||||
|
...attributesVersion15
|
||||||
}
|
}
|
||||||
|
|
||||||
export const createDeviceModel = (sequelize: Sequelize.Sequelize): DeviceModelStatic => sequelize.define('Device', attributes) as DeviceModelStatic
|
export const createDeviceModel = (sequelize: Sequelize.Sequelize): DeviceModelStatic => sequelize.define('Device', attributes) as DeviceModelStatic
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2022 Jonas Lochmann
|
* Copyright (C) 2019 - 2024 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -26,7 +26,7 @@ export const config = {
|
||||||
expireTimeRounding: 1000 * 60 * 15
|
expireTimeRounding: 1000 * 60 * 15
|
||||||
}
|
}
|
||||||
|
|
||||||
export function calculateExpireTime(now: bigint): BigInt {
|
export function calculateExpireTime(now: bigint): bigint {
|
||||||
const expireBaseTime = now + BigInt(config.expireDelay)
|
const expireBaseTime = now + BigInt(config.expireDelay)
|
||||||
const expireTime = expireBaseTime - expireBaseTime % BigInt(config.expireTimeRounding) + BigInt(config.expireTimeRounding)
|
const expireTime = expireBaseTime - expireBaseTime % BigInt(config.expireTimeRounding) + BigInt(config.expireTimeRounding)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* server component for the TimeLimit App
|
||||||
|
* Copyright (C) 2019 - 2023 Jonas Lochmann
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
* published by the Free Software Foundation, version 3 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Affero General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { QueryInterface, Sequelize, Transaction } from 'sequelize'
|
||||||
|
import { attributesVersion15 as deviceAttributes } from '../../device'
|
||||||
|
|
||||||
|
export async function up (queryInterface: QueryInterface, sequelize: Sequelize) {
|
||||||
|
await sequelize.transaction({
|
||||||
|
type: Transaction.TYPES.EXCLUSIVE
|
||||||
|
}, async (transaction) => {
|
||||||
|
await queryInterface.addColumn('Devices', 'platformType', {
|
||||||
|
...deviceAttributes.platformType
|
||||||
|
}, {
|
||||||
|
transaction
|
||||||
|
})
|
||||||
|
|
||||||
|
await queryInterface.addColumn('Devices', 'platformLevel', {
|
||||||
|
...deviceAttributes.platformLevel
|
||||||
|
}, {
|
||||||
|
transaction
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down (queryInterface: QueryInterface, sequelize: Sequelize) {
|
||||||
|
await sequelize.transaction({
|
||||||
|
type: Transaction.TYPES.EXCLUSIVE
|
||||||
|
}, async (transaction) => {
|
||||||
|
await queryInterface.removeColumn('Devices', 'platformLevel', { transaction })
|
||||||
|
await queryInterface.removeColumn('Devices', 'platformType', { transaction })
|
||||||
|
})
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 Jonas Lochmann
|
* Copyright (C) 2019 - 2024 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -17,18 +17,26 @@
|
||||||
|
|
||||||
import { resolve } from 'path'
|
import { resolve } from 'path'
|
||||||
import { Sequelize } from 'sequelize'
|
import { Sequelize } from 'sequelize'
|
||||||
import * as Umzug from 'umzug'
|
import { Umzug, SequelizeStorage } from 'umzug'
|
||||||
|
|
||||||
export const createUmzug = (sequelize: Sequelize) => (
|
export const createUmzug = (sequelize: Sequelize) => (
|
||||||
new Umzug({
|
new Umzug({
|
||||||
storage: 'sequelize',
|
storage: new SequelizeStorage({ sequelize }),
|
||||||
storageOptions: {
|
|
||||||
sequelize
|
|
||||||
},
|
|
||||||
migrations: {
|
migrations: {
|
||||||
params: [sequelize.getQueryInterface(), sequelize],
|
glob: resolve(__dirname, '../../../build/database/migration/migrations/*.js'),
|
||||||
path: resolve(__dirname, '../../../build/database/migration/migrations'),
|
resolve: ({ name, path }) => {
|
||||||
pattern: /^\d+[\w-]+\.js$/
|
if (!path) throw new Error()
|
||||||
}
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||||||
|
const migration = require(path)
|
||||||
|
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
up: async () => migration.up(sequelize.getQueryInterface(), sequelize),
|
||||||
|
down: async () => migration.down(sequelize.getQueryInterface(), sequelize),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
logger: console
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2022 Jonas Lochmann
|
* Copyright (C) 2019 - 2023 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -66,5 +66,7 @@ export const prepareDeviceEntry = ({ familyId, userId, deviceAuthToken, deviceId
|
||||||
isQorLater: false,
|
isQorLater: false,
|
||||||
manipulationFlags: 0,
|
manipulationFlags: 0,
|
||||||
publicKey: null,
|
publicKey: null,
|
||||||
nextKeyReplySequenceNumber: '1'
|
nextKeyReplySequenceNumber: '1',
|
||||||
|
platformType: null,
|
||||||
|
platformLevel: 0
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2022 Jonas Lochmann
|
* Copyright (C) 2019 - 2023 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -15,6 +15,7 @@
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import * as Sequelize from 'sequelize'
|
||||||
import { AddUsedTimeActionVersion2 } from '../../../../action'
|
import { AddUsedTimeActionVersion2 } from '../../../../action'
|
||||||
import { EventHandler } from '../../../../monitoring/eventhandler'
|
import { EventHandler } from '../../../../monitoring/eventhandler'
|
||||||
import { MinuteOfDay } from '../../../../util/minuteofday'
|
import { MinuteOfDay } from '../../../../util/minuteofday'
|
||||||
|
@ -22,6 +23,8 @@ import { Cache } from '../cache'
|
||||||
import { IllegalStateException, SourceDeviceNotFoundException } from '../exception/illegal-state'
|
import { IllegalStateException, SourceDeviceNotFoundException } from '../exception/illegal-state'
|
||||||
import { getRoundedTimestamp as getRoundedTimestampForUsedTime } from './addusedtime'
|
import { getRoundedTimestamp as getRoundedTimestampForUsedTime } from './addusedtime'
|
||||||
|
|
||||||
|
const tolerance = 5 * 1000 // 5 seconds
|
||||||
|
|
||||||
export const getRoundedTimestampForSessionDuration = () => {
|
export const getRoundedTimestampForSessionDuration = () => {
|
||||||
const now = Date.now()
|
const now = Date.now()
|
||||||
|
|
||||||
|
@ -129,11 +132,32 @@ export async function dispatchAddUsedTimeVersion2 ({ deviceId, action, cache, ev
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
const oldTime: number | null = await cache.database.usedTime.aggregate(
|
||||||
|
'usedTime',
|
||||||
|
'MAX',
|
||||||
|
{
|
||||||
|
where: {
|
||||||
|
familyId: cache.familyId,
|
||||||
|
categoryId: item.categoryId,
|
||||||
|
dayOfEpoch: action.dayOfEpoch,
|
||||||
|
startMinuteOfDay: {
|
||||||
|
[Sequelize.Op.gte]: start
|
||||||
|
},
|
||||||
|
endMinuteOfDay: {
|
||||||
|
[Sequelize.Op.lte]: end
|
||||||
|
}
|
||||||
|
},
|
||||||
|
transaction: cache.transaction
|
||||||
|
}
|
||||||
|
) || 0
|
||||||
|
|
||||||
|
if (oldTime !== null && typeof oldTime !== 'number') throw new Error()
|
||||||
|
|
||||||
await cache.database.usedTime.create({
|
await cache.database.usedTime.create({
|
||||||
familyId: cache.familyId,
|
familyId: cache.familyId,
|
||||||
categoryId: item.categoryId,
|
categoryId: item.categoryId,
|
||||||
dayOfEpoch: action.dayOfEpoch,
|
dayOfEpoch: action.dayOfEpoch,
|
||||||
usedTime: Math.max(0, Math.min(item.timeToAdd, lengthInMs)),
|
usedTime: Math.max(0, Math.min(oldTime + item.timeToAdd, lengthInMs)),
|
||||||
lastUpdate: roundedTimestampForUsedTime,
|
lastUpdate: roundedTimestampForUsedTime,
|
||||||
startMinuteOfDay: start,
|
startMinuteOfDay: start,
|
||||||
endMinuteOfDay: end
|
endMinuteOfDay: end
|
||||||
|
@ -168,6 +192,39 @@ export async function dispatchAddUsedTimeVersion2 ({ deviceId, action, cache, ev
|
||||||
transaction: cache.transaction
|
transaction: cache.transaction
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const oldDuration: () => Promise<number> = async () => {
|
||||||
|
const fittingDurationItems = await cache.database.sessionDuration.findAll({
|
||||||
|
where: {
|
||||||
|
familyId: cache.familyId,
|
||||||
|
categoryId: item.categoryId,
|
||||||
|
startMinuteOfDay: {
|
||||||
|
[Sequelize.Op.gte]: limit.start
|
||||||
|
},
|
||||||
|
endMinuteOfDay: {
|
||||||
|
[Sequelize.Op.lte]: limit.end
|
||||||
|
},
|
||||||
|
maxSessionDuration: {
|
||||||
|
[Sequelize.Op.gte]: limit.duration
|
||||||
|
},
|
||||||
|
sessionPauseDuration: {
|
||||||
|
[Sequelize.Op.lte]: limit.pause
|
||||||
|
}
|
||||||
|
},
|
||||||
|
transaction: cache.transaction
|
||||||
|
})
|
||||||
|
|
||||||
|
const fittingDurationItemsLastUsageFiltered =
|
||||||
|
hasTrustedTimestamp ?
|
||||||
|
fittingDurationItems.filter((it) => {
|
||||||
|
action.trustedTimestamp - item.timeToAdd <=
|
||||||
|
parseInt(it.lastUsage, 10) + it.sessionPauseDuration - tolerance
|
||||||
|
}) : fittingDurationItems
|
||||||
|
|
||||||
|
return fittingDurationItemsLastUsageFiltered
|
||||||
|
.map((it) => it.lastSessionDuration)
|
||||||
|
.reduce((a, b) => Math.max(a, b), 0)
|
||||||
|
}
|
||||||
|
|
||||||
if (oldItem) {
|
if (oldItem) {
|
||||||
let extendSession: boolean
|
let extendSession: boolean
|
||||||
|
|
||||||
|
@ -188,14 +245,13 @@ export async function dispatchAddUsedTimeVersion2 ({ deviceId, action, cache, ev
|
||||||
* Due to this, a session is reset if it would be over in a few seconds, too.
|
* Due to this, a session is reset if it would be over in a few seconds, too.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const tolerance = 5 * 1000 // 5 seconds
|
|
||||||
const timeWhenStartingCurrentUsage = action.trustedTimestamp - item.timeToAdd
|
const timeWhenStartingCurrentUsage = action.trustedTimestamp - item.timeToAdd
|
||||||
const nextSessionStart = parseInt(oldItem.lastUsage, 10) + oldItem.sessionPauseDuration - tolerance
|
const nextSessionStart = parseInt(oldItem.lastUsage, 10) + oldItem.sessionPauseDuration - tolerance
|
||||||
|
|
||||||
extendSession = timeWhenStartingCurrentUsage <= nextSessionStart
|
extendSession = timeWhenStartingCurrentUsage <= nextSessionStart
|
||||||
}
|
}
|
||||||
|
|
||||||
oldItem.lastSessionDuration = extendSession ? oldItem.lastSessionDuration + item.timeToAdd : item.timeToAdd
|
oldItem.lastSessionDuration = extendSession ? oldItem.lastSessionDuration + item.timeToAdd : await oldDuration() + item.timeToAdd
|
||||||
oldItem.roundedLastUpdate = roundedTimestampForSessionDuration
|
oldItem.roundedLastUpdate = roundedTimestampForSessionDuration
|
||||||
|
|
||||||
if (hasTrustedTimestamp) {
|
if (hasTrustedTimestamp) {
|
||||||
|
@ -215,7 +271,7 @@ export async function dispatchAddUsedTimeVersion2 ({ deviceId, action, cache, ev
|
||||||
endMinuteOfDay: limit.end,
|
endMinuteOfDay: limit.end,
|
||||||
// end of primary key
|
// end of primary key
|
||||||
lastUsage: action.trustedTimestamp.toString(10),
|
lastUsage: action.trustedTimestamp.toString(10),
|
||||||
lastSessionDuration: item.timeToAdd,
|
lastSessionDuration: await oldDuration() + item.timeToAdd,
|
||||||
roundedLastUpdate: roundedTimestampForSessionDuration
|
roundedLastUpdate: roundedTimestampForSessionDuration
|
||||||
}, { transaction: cache.transaction })
|
}, { transaction: cache.transaction })
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* server component for the TimeLimit App
|
* server component for the TimeLimit App
|
||||||
* Copyright (C) 2019 - 2022 Jonas Lochmann
|
* Copyright (C) 2019 - 2023 Jonas Lochmann
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* This program is free software: you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU Affero General Public License as
|
* it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -155,6 +155,18 @@ export async function dispatchUpdateDeviceStatus ({ deviceId, action, cache }: {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (action.platformType !== undefined) {
|
||||||
|
if (action.platformType !== deviceEntry.platformType) {
|
||||||
|
deviceEntry.platformType = action.platformType
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (action.platformLevel !== undefined) {
|
||||||
|
if (action.platformLevel !== deviceEntry.platformLevel) {
|
||||||
|
deviceEntry.platformLevel = action.platformLevel
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const effectiveManipulationFlags = action.addedManipulationFlags & DeviceManipulationFlags.ALL
|
const effectiveManipulationFlags = action.addedManipulationFlags & DeviceManipulationFlags.ALL
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,9 @@ export async function getDeviceList ({ database, transaction, familyEntry }: {
|
||||||
activityLevelBlocking: item.activityLevelBlocking,
|
activityLevelBlocking: item.activityLevelBlocking,
|
||||||
qOrLater: item.isQorLater,
|
qOrLater: item.isQorLater,
|
||||||
mFlags: item.manipulationFlags,
|
mFlags: item.manipulationFlags,
|
||||||
pk: item.publicKey ? item.publicKey.toString('base64') : undefined
|
pk: item.publicKey ? item.publicKey.toString('base64') : undefined,
|
||||||
|
pType: item.platformType || undefined,
|
||||||
|
pLevel: item.platformLevel
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,6 +103,8 @@ export interface ServerDeviceData {
|
||||||
qOrLater: boolean
|
qOrLater: boolean
|
||||||
mFlags: number // manipulation flags
|
mFlags: number // manipulation flags
|
||||||
pk?: string // public key
|
pk?: string // public key
|
||||||
|
pType?: string
|
||||||
|
pLevel: number
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ServerUpdatedCategoryBaseData {
|
export interface ServerUpdatedCategoryBaseData {
|
||||||
|
|
|
@ -11,7 +11,8 @@
|
||||||
"noUnusedParameters": false,
|
"noUnusedParameters": false,
|
||||||
"noImplicitReturns": true,
|
"noImplicitReturns": true,
|
||||||
"noFallthroughCasesInSwitch": true,
|
"noFallthroughCasesInSwitch": true,
|
||||||
"sourceMap": true
|
"sourceMap": true,
|
||||||
|
"skipLibCheck": true
|
||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
"./src/**/*"
|
"./src/**/*"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue