From acdec990ea84a587067f52427cb2a82b5d8824cb Mon Sep 17 00:00:00 2001 From: Jonas Lochmann Date: Mon, 11 Jul 2022 02:00:00 +0200 Subject: [PATCH] Add support for manipulationFlags --- .../SerializedAppLogicAction.schema.json | 3 ++ .../schema/SerializedParentAction.schema.json | 3 ++ docs/schema/ServerDataStatus.schema.json | 4 ++ ...ction-properties-addedmanipulationflags.md | 15 +++++++ ...ions-serializedupdatedevicestatusaction.md | 19 +++++++++ docs/schema/serializedapplogicaction.md | 19 +++++++++ ...tion-properties-ignoremanipulationflags.md | 15 +++++++ ...ions-serializedignoremanipulationaction.md | 19 +++++++++ docs/schema/serializedparentaction.md | 19 +++++++++ ...ions-serverdevicedata-properties-mflags.md | 15 +++++++ ...datastatus-definitions-serverdevicedata.md | 19 +++++++++ docs/schema/serverdatastatus.md | 19 +++++++++ src/action/ignoremanipulation.ts | 20 ++++++++-- src/action/updatedevicestatus.ts | 26 +++++++++++-- src/api/validator.ts | 10 +++++ src/database/device.ts | 32 +++++++++++++-- .../20220711-add-manipulation-flags.ts | 39 +++++++++++++++++++ src/function/device/prepare-device-entry.ts | 5 ++- .../updatedevicestatus.ts | 12 +++++- .../ignoremanipulation.ts | 6 ++- .../get-server-data-status/device-list.ts | 5 ++- src/object/serverdatastatus.ts | 1 + 22 files changed, 306 insertions(+), 19 deletions(-) create mode 100644 docs/schema/serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md create mode 100644 docs/schema/serializedparentaction-definitions-serializedignoremanipulationaction-properties-ignoremanipulationflags.md create mode 100644 docs/schema/serverdatastatus-definitions-serverdevicedata-properties-mflags.md create mode 100644 src/database/migration/migrations/20220711-add-manipulation-flags.ts diff --git a/docs/schema/SerializedAppLogicAction.schema.json b/docs/schema/SerializedAppLogicAction.schema.json index 98ca180..663247a 100644 --- a/docs/schema/SerializedAppLogicAction.schema.json +++ b/docs/schema/SerializedAppLogicAction.schema.json @@ -411,6 +411,9 @@ }, "isQOrLaterNow": { "type": "boolean" + }, + "addedManipulationFlags": { + "type": "number" } }, "additionalProperties": false, diff --git a/docs/schema/SerializedParentAction.schema.json b/docs/schema/SerializedParentAction.schema.json index 4dd2902..30bd16e 100644 --- a/docs/schema/SerializedParentAction.schema.json +++ b/docs/schema/SerializedParentAction.schema.json @@ -487,6 +487,9 @@ }, "ignoreHadManipulationFlags": { "type": "number" + }, + "ignoreManipulationFlags": { + "type": "number" } }, "additionalProperties": false, diff --git a/docs/schema/ServerDataStatus.schema.json b/docs/schema/ServerDataStatus.schema.json index fbb5831..4bd0e89 100644 --- a/docs/schema/ServerDataStatus.schema.json +++ b/docs/schema/ServerDataStatus.schema.json @@ -182,6 +182,9 @@ }, "qOrLater": { "type": "boolean" + }, + "mFlags": { + "type": "number" } }, "additionalProperties": false, @@ -206,6 +209,7 @@ "hadManipulation", "hadManipulationFlags", "isUserKeptSignedIn", + "mFlags", "model", "name", "networkTime", diff --git a/docs/schema/serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md b/docs/schema/serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md new file mode 100644 index 0000000..10d2aa3 --- /dev/null +++ b/docs/schema/serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md @@ -0,0 +1,15 @@ +# Untitled number in SerializedAppLogicAction Schema + +```txt +https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/addedManipulationFlags +``` + + + +| 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") | + +## addedManipulationFlags Type + +`number` diff --git a/docs/schema/serializedapplogicaction-definitions-serializedupdatedevicestatusaction.md b/docs/schema/serializedapplogicaction-definitions-serializedupdatedevicestatusaction.md index 6a01094..604653b 100644 --- a/docs/schema/serializedapplogicaction-definitions-serializedupdatedevicestatusaction.md +++ b/docs/schema/serializedapplogicaction-definitions-serializedupdatedevicestatusaction.md @@ -27,6 +27,7 @@ https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDevic | [appVersion](#appversion) | `number` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-appversion.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/appVersion") | | [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") | +| [addedManipulationFlags](#addedmanipulationflags) | `number` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/addedManipulationFlags") | ## type @@ -238,3 +239,21 @@ https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDevic ### isQOrLaterNow Type `boolean` + +## addedManipulationFlags + + + +`addedManipulationFlags` + +* is optional + +* Type: `number` + +* cannot be null + +* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/addedManipulationFlags") + +### addedManipulationFlags Type + +`number` diff --git a/docs/schema/serializedapplogicaction.md b/docs/schema/serializedapplogicaction.md index 91ee690..815aa66 100644 --- a/docs/schema/serializedapplogicaction.md +++ b/docs/schema/serializedapplogicaction.md @@ -811,6 +811,7 @@ Reference this group by using | [appVersion](#appversion) | `number` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-appversion.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/appVersion") | | [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") | +| [addedManipulationFlags](#addedmanipulationflags) | `number` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/addedManipulationFlags") | ### type @@ -1022,3 +1023,21 @@ Reference this group by using #### isQOrLaterNow Type `boolean` + +### addedManipulationFlags + + + +`addedManipulationFlags` + +* is optional + +* Type: `number` + +* cannot be null + +* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-addedmanipulationflags.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/addedManipulationFlags") + +#### addedManipulationFlags Type + +`number` diff --git a/docs/schema/serializedparentaction-definitions-serializedignoremanipulationaction-properties-ignoremanipulationflags.md b/docs/schema/serializedparentaction-definitions-serializedignoremanipulationaction-properties-ignoremanipulationflags.md new file mode 100644 index 0000000..494a9ea --- /dev/null +++ b/docs/schema/serializedparentaction-definitions-serializedignoremanipulationaction-properties-ignoremanipulationflags.md @@ -0,0 +1,15 @@ +# Untitled number in SerializedParentAction Schema + +```txt +https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/ignoreManipulationFlags +``` + + + +| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In | +| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :------------------------------------------------------------------------------------------------ | +| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [SerializedParentAction.schema.json\*](SerializedParentAction.schema.json "open original schema") | + +## ignoreManipulationFlags Type + +`number` diff --git a/docs/schema/serializedparentaction-definitions-serializedignoremanipulationaction.md b/docs/schema/serializedparentaction-definitions-serializedignoremanipulationaction.md index 3b96e3c..db25d58 100644 --- a/docs/schema/serializedparentaction-definitions-serializedignoremanipulationaction.md +++ b/docs/schema/serializedparentaction-definitions-serializedignoremanipulationaction.md @@ -30,6 +30,7 @@ https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipul | [overlay](#overlay) | `boolean` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedignoremanipulationaction-properties-overlay.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/overlay") | | [accessibilityService](#accessibilityservice) | `boolean` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedignoremanipulationaction-properties-accessibilityservice.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/accessibilityService") | | [ignoreHadManipulationFlags](#ignorehadmanipulationflags) | `number` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedignoremanipulationaction-properties-ignorehadmanipulationflags.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/ignoreHadManipulationFlags") | +| [ignoreManipulationFlags](#ignoremanipulationflags) | `number` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedignoremanipulationaction-properties-ignoremanipulationflags.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/ignoreManipulationFlags") | ## type @@ -254,3 +255,21 @@ https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipul ### ignoreHadManipulationFlags Type `number` + +## ignoreManipulationFlags + + + +`ignoreManipulationFlags` + +* is optional + +* Type: `number` + +* cannot be null + +* defined in: [SerializedParentAction](serializedparentaction-definitions-serializedignoremanipulationaction-properties-ignoremanipulationflags.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/ignoreManipulationFlags") + +### ignoreManipulationFlags Type + +`number` diff --git a/docs/schema/serializedparentaction.md b/docs/schema/serializedparentaction.md index 66bfd57..853e758 100644 --- a/docs/schema/serializedparentaction.md +++ b/docs/schema/serializedparentaction.md @@ -1172,6 +1172,7 @@ Reference this group by using | [overlay](#overlay) | `boolean` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedignoremanipulationaction-properties-overlay.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/overlay") | | [accessibilityService](#accessibilityservice) | `boolean` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedignoremanipulationaction-properties-accessibilityservice.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/accessibilityService") | | [ignoreHadManipulationFlags](#ignorehadmanipulationflags) | `number` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedignoremanipulationaction-properties-ignorehadmanipulationflags.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/ignoreHadManipulationFlags") | +| [ignoreManipulationFlags](#ignoremanipulationflags) | `number` | Optional | cannot be null | [SerializedParentAction](serializedparentaction-definitions-serializedignoremanipulationaction-properties-ignoremanipulationflags.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/ignoreManipulationFlags") | ### type @@ -1397,6 +1398,24 @@ Reference this group by using `number` +### ignoreManipulationFlags + + + +`ignoreManipulationFlags` + +* is optional + +* Type: `number` + +* cannot be null + +* defined in: [SerializedParentAction](serializedparentaction-definitions-serializedignoremanipulationaction-properties-ignoremanipulationflags.md "https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction/properties/ignoreManipulationFlags") + +#### ignoreManipulationFlags Type + +`number` + ## Definitions group SerializedIncrementCategoryExtraTimeAction Reference this group by using diff --git a/docs/schema/serverdatastatus-definitions-serverdevicedata-properties-mflags.md b/docs/schema/serverdatastatus-definitions-serverdevicedata-properties-mflags.md new file mode 100644 index 0000000..d9aa0c8 --- /dev/null +++ b/docs/schema/serverdatastatus-definitions-serverdevicedata-properties-mflags.md @@ -0,0 +1,15 @@ +# Untitled number in ServerDataStatus Schema + +```txt +https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/mFlags +``` + + + +| 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") | + +## mFlags Type + +`number` diff --git a/docs/schema/serverdatastatus-definitions-serverdevicedata.md b/docs/schema/serverdatastatus-definitions-serverdevicedata.md index b262a5c..6c31a1f 100644 --- a/docs/schema/serverdatastatus-definitions-serverdevicedata.md +++ b/docs/schema/serverdatastatus-definitions-serverdevicedata.md @@ -48,6 +48,7 @@ https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData | [wasAsEnabled](#wasasenabled) | `boolean` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-wasasenabled.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/wasAsEnabled") | | [activityLevelBlocking](#activitylevelblocking) | `boolean` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-activitylevelblocking.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/activityLevelBlocking") | | [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") | ## deviceId @@ -680,3 +681,21 @@ https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData ### qOrLater Type `boolean` + +## mFlags + + + +`mFlags` + +* is required + +* Type: `number` + +* cannot be null + +* defined in: [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-mflags.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/mFlags") + +### mFlags Type + +`number` diff --git a/docs/schema/serverdatastatus.md b/docs/schema/serverdatastatus.md index f473884..9392111 100644 --- a/docs/schema/serverdatastatus.md +++ b/docs/schema/serverdatastatus.md @@ -338,6 +338,7 @@ Reference this group by using | [wasAsEnabled](#wasasenabled) | `boolean` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-wasasenabled.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/wasAsEnabled") | | [activityLevelBlocking](#activitylevelblocking) | `boolean` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-activitylevelblocking.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/activityLevelBlocking") | | [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") | ### deviceId @@ -971,6 +972,24 @@ Reference this group by using `boolean` +### mFlags + + + +`mFlags` + +* is required + +* Type: `number` + +* cannot be null + +* defined in: [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-mflags.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/mFlags") + +#### mFlags Type + +`number` + ## Definitions group ProtectionLevel Reference this group by using diff --git a/src/action/ignoremanipulation.ts b/src/action/ignoremanipulation.ts index ce7d79b..638c849 100644 --- a/src/action/ignoremanipulation.ts +++ b/src/action/ignoremanipulation.ts @@ -1,6 +1,6 @@ /* * server component for the TimeLimit App - * Copyright (C) 2019 - 2020 Jonas Lochmann + * Copyright (C) 2019 - 2022 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 @@ -33,11 +33,13 @@ export class IgnoreManipulationAction extends ParentAction { readonly ignoreDidReboot: boolean readonly ignoreHadManipulation: boolean readonly ignoreHadManipulationFlags: number + readonly ignoreManipulationFlags: number constructor ({ deviceId, ignoreDeviceAdminManipulation, ignoreDeviceAdminManipulationAttempt, ignoreAppDowngrade, ignoreNotificationAccessManipulation, ignoreUsageStatsAccessManipulation, - ignoreOverlayPermissionManipulation, ignoreAccessibilityServiceManipulation, ignoreDidReboot, ignoreHadManipulation, ignoreHadManipulationFlags + ignoreOverlayPermissionManipulation, ignoreAccessibilityServiceManipulation, ignoreDidReboot, + ignoreHadManipulation, ignoreHadManipulationFlags, ignoreManipulationFlags }: { deviceId: string ignoreDeviceAdminManipulation: boolean @@ -50,6 +52,7 @@ export class IgnoreManipulationAction extends ParentAction { ignoreDidReboot: boolean ignoreHadManipulation: boolean ignoreHadManipulationFlags: number + ignoreManipulationFlags: number }) { super() @@ -63,6 +66,8 @@ export class IgnoreManipulationAction extends ParentAction { throwOutOfRange({ actionType, field: 'ignoreHadManipulationFlags', value: ignoreHadManipulationFlags }) } + assertSafeInteger({ actionType, field: 'ignoreManipulationFlags', value: ignoreManipulationFlags }) + this.deviceId = deviceId this.ignoreDeviceAdminManipulation = ignoreDeviceAdminManipulation this.ignoreDeviceAdminManipulationAttempt = ignoreDeviceAdminManipulationAttempt @@ -74,9 +79,14 @@ export class IgnoreManipulationAction extends ParentAction { this.ignoreDidReboot = ignoreDidReboot this.ignoreHadManipulation = ignoreHadManipulation this.ignoreHadManipulationFlags = ignoreHadManipulationFlags + this.ignoreManipulationFlags = ignoreManipulationFlags } - static parse = ({ deviceId, admin, adminA, downgrade, notification, usageStats, overlay, accessibilityService, reboot, hadManipulation, ignoreHadManipulationFlags }: SerializedIgnoreManipulationAction) => ( + static parse = ({ + deviceId, admin, adminA, downgrade, notification, usageStats, overlay, + accessibilityService, reboot, hadManipulation, ignoreHadManipulationFlags, + ignoreManipulationFlags + }: SerializedIgnoreManipulationAction) => ( new IgnoreManipulationAction({ deviceId, ignoreDeviceAdminManipulation: admin, @@ -88,7 +98,8 @@ export class IgnoreManipulationAction extends ParentAction { ignoreAccessibilityServiceManipulation: !!accessibilityService, ignoreDidReboot: !!reboot, ignoreHadManipulation: hadManipulation, - ignoreHadManipulationFlags: ignoreHadManipulationFlags || 0 + ignoreHadManipulationFlags: ignoreHadManipulationFlags || 0, + ignoreManipulationFlags: ignoreManipulationFlags || 0 }) ) } @@ -107,4 +118,5 @@ export interface SerializedIgnoreManipulationAction { overlay?: boolean accessibilityService?: boolean ignoreHadManipulationFlags?: number + ignoreManipulationFlags?: number } diff --git a/src/action/updatedevicestatus.ts b/src/action/updatedevicestatus.ts index 33a0115..e550f3c 100644 --- a/src/action/updatedevicestatus.ts +++ b/src/action/updatedevicestatus.ts @@ -1,6 +1,6 @@ /* * server component for the TimeLimit App - * Copyright (C) 2019 - 2020 Jonas Lochmann + * Copyright (C) 2019 - 2022 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 @@ -32,6 +32,7 @@ export class UpdateDeviceStatusAction extends AppLogicAction { readonly newAppVersion?: number readonly didReboot: boolean readonly isQOrLaterNow: boolean + readonly addedManipulationFlags: number constructor ({ newProtetionLevel, @@ -41,7 +42,8 @@ export class UpdateDeviceStatusAction extends AppLogicAction { newAccessibilityServiceEnabled, newAppVersion, didReboot, - isQOrLaterNow + isQOrLaterNow, + addedManipulationFlags }: { newProtetionLevel?: ProtectionLevel newUsageStatsPermissionStatus?: RuntimePermissionStatus @@ -51,6 +53,7 @@ export class UpdateDeviceStatusAction extends AppLogicAction { newAppVersion?: number didReboot: boolean isQOrLaterNow: boolean + addedManipulationFlags: number }) { super() @@ -62,6 +65,8 @@ export class UpdateDeviceStatusAction extends AppLogicAction { } } + assertSafeInteger({ actionType, field: 'addedManipulationFlags', value: addedManipulationFlags }) + this.newProtetionLevel = newProtetionLevel this.newUsageStatsPermissionStatus = newUsageStatsPermissionStatus this.newNotificationAccessPermission = newNotificationAccessPermission @@ -70,9 +75,20 @@ export class UpdateDeviceStatusAction extends AppLogicAction { this.newAppVersion = newAppVersion this.didReboot = didReboot this.isQOrLaterNow = isQOrLaterNow + this.addedManipulationFlags = addedManipulationFlags } - static parse = ({ protectionLevel, usageStats, notificationAccess, overlayPermission, accessibilityServiceEnabled, appVersion, didReboot, isQOrLaterNow }: SerializedUpdateDeviceStatusAction) => ( + static parse = ({ + protectionLevel, + usageStats, + notificationAccess, + overlayPermission, + accessibilityServiceEnabled, + appVersion, + didReboot, + isQOrLaterNow, + addedManipulationFlags + }: SerializedUpdateDeviceStatusAction) => ( new UpdateDeviceStatusAction({ newProtetionLevel: protectionLevel, newUsageStatsPermissionStatus: usageStats, @@ -81,7 +97,8 @@ export class UpdateDeviceStatusAction extends AppLogicAction { newAccessibilityServiceEnabled: accessibilityServiceEnabled, newAppVersion: appVersion, didReboot: !!didReboot, - isQOrLaterNow: !!isQOrLaterNow + isQOrLaterNow: !!isQOrLaterNow, + addedManipulationFlags: addedManipulationFlags || 0 }) ) } @@ -96,4 +113,5 @@ export interface SerializedUpdateDeviceStatusAction { appVersion?: number didReboot?: boolean isQOrLaterNow?: boolean + addedManipulationFlags?: number } diff --git a/src/api/validator.ts b/src/api/validator.ts index d77b657..b59c7df 100644 --- a/src/api/validator.ts +++ b/src/api/validator.ts @@ -442,6 +442,9 @@ const definitions = { }, "ignoreHadManipulationFlags": { "type": "number" + }, + "ignoreManipulationFlags": { + "type": "number" } }, "additionalProperties": false, @@ -1750,6 +1753,9 @@ const definitions = { }, "isQOrLaterNow": { "type": "boolean" + }, + "addedManipulationFlags": { + "type": "number" } }, "additionalProperties": false, @@ -1907,6 +1913,9 @@ const definitions = { }, "qOrLater": { "type": "boolean" + }, + "mFlags": { + "type": "number" } }, "additionalProperties": false, @@ -1931,6 +1940,7 @@ const definitions = { "hadManipulation", "hadManipulationFlags", "isUserKeptSignedIn", + "mFlags", "model", "name", "networkTime", diff --git a/src/database/device.ts b/src/database/device.ts index 9edca16..d74f551 100644 --- a/src/database/device.ts +++ b/src/database/device.ts @@ -1,6 +1,6 @@ /* * server component for the TimeLimit App - * Copyright (C) 2019 - 2020 Jonas Lochmann + * Copyright (C) 2019 - 2022 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 @@ -32,6 +32,11 @@ export const DeviceHadManipulationFlags = { ALL: 1 | 2 | 4 | 8 | 16 | 32 } +export const DeviceManipulationFlags = { + USED_FGS_KILLER: 1, + ALL: 1 +} + export interface DeviceAttributesVersion1 { familyId: string deviceId: string @@ -102,10 +107,15 @@ export interface DeviceAttributesVersion11 { hadManipulationFlags: number } +export interface DeviceAttributesVersion12 { + manipulationFlags: number +} + export type DeviceAttributes = DeviceAttributesVersion1 & DeviceAttributesVersion2 & DeviceAttributesVersion3 & DeviceAttributesVersion4 & DeviceAttributesVersion5 & DeviceAttributesVersion6 & DeviceAttributesVersion7 & DeviceAttributesVersion8 & - DeviceAttributesVersion9 & DeviceAttributesVersion10 & DeviceAttributesVersion11 + DeviceAttributesVersion9 & DeviceAttributesVersion10 & DeviceAttributesVersion11 & + DeviceAttributesVersion12 export type DeviceModel = Sequelize.Model & DeviceAttributes export type DeviceModelStatic = typeof Sequelize.Model & { @@ -259,6 +269,18 @@ export const attributesVersion11: SequelizeAttributes } } +export const attributesVersion12: SequelizeAttributes = { + manipulationFlags: { + type: Sequelize.INTEGER, + allowNull: false, + defaultValue: 0, + validate: { + min: 0, + max: DeviceManipulationFlags.ALL + } + } +} + export const attributes: SequelizeAttributes = { ...attributesVersion1, ...attributesVersion2, @@ -270,7 +292,8 @@ export const attributes: SequelizeAttributes = { ...attributesVersion8, ...attributesVersion9, ...attributesVersion10, - ...attributesVersion11 + ...attributesVersion11, + ...attributesVersion12 } export const createDeviceModel = (sequelize: Sequelize.Sequelize): DeviceModelStatic => sequelize.define('Device', attributes) as DeviceModelStatic @@ -291,7 +314,8 @@ export const hasDeviceManipulation = (device: DeviceAttributes) => { manipulationOfOverlayPermission || manipulationOfAsPermission - const hasAnyManipulation = hasActiveManipulationWarning || device.hadManipulation + const hasAnyManipulation = hasActiveManipulationWarning || device.hadManipulation || + device.manipulationFlags !== 0 return hasAnyManipulation } diff --git a/src/database/migration/migrations/20220711-add-manipulation-flags.ts b/src/database/migration/migrations/20220711-add-manipulation-flags.ts new file mode 100644 index 0000000..0f892bc --- /dev/null +++ b/src/database/migration/migrations/20220711-add-manipulation-flags.ts @@ -0,0 +1,39 @@ +/* + * server component for the TimeLimit App + * Copyright (C) 2019 - 2022 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 . + */ + +import { QueryInterface, Sequelize, Transaction } from 'sequelize' +import { attributesVersion12 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', 'manipulationFlags', { + ...deviceAttributes.manipulationFlags + }, { + transaction + }) + }) +} + +export async function down (queryInterface: QueryInterface, sequelize: Sequelize) { + await sequelize.transaction({ + type: Transaction.TYPES.EXCLUSIVE + }, async (transaction) => { + await queryInterface.removeColumn('Devices', 'manipulationFlags', { transaction }) + }) +} diff --git a/src/function/device/prepare-device-entry.ts b/src/function/device/prepare-device-entry.ts index af82120..fb1dad1 100644 --- a/src/function/device/prepare-device-entry.ts +++ b/src/function/device/prepare-device-entry.ts @@ -1,6 +1,6 @@ /* * server component for the TimeLimit App - * Copyright (C) 2019 Jonas Lochmann + * Copyright (C) 2019 - 2022 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 @@ -63,5 +63,6 @@ export const prepareDeviceEntry = ({ familyId, userId, deviceAuthToken, deviceId asEnabled: false, wasAsEnabled: false, activityLevelBlocking: false, - isQorLater: false + isQorLater: false, + manipulationFlags: 0 }) diff --git a/src/function/sync/apply-actions/dispatch-app-logic-action/updatedevicestatus.ts b/src/function/sync/apply-actions/dispatch-app-logic-action/updatedevicestatus.ts index 39d8290..e2d4a06 100644 --- a/src/function/sync/apply-actions/dispatch-app-logic-action/updatedevicestatus.ts +++ b/src/function/sync/apply-actions/dispatch-app-logic-action/updatedevicestatus.ts @@ -1,6 +1,6 @@ /* * server component for the TimeLimit App - * Copyright (C) 2019 - 2020 Jonas Lochmann + * Copyright (C) 2019 - 2022 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 @@ -16,7 +16,7 @@ */ import { UpdateDeviceStatusAction } from '../../../../action' -import { DeviceHadManipulationFlags, hasDeviceManipulation } from '../../../../database/device' +import { DeviceHadManipulationFlags, DeviceManipulationFlags, hasDeviceManipulation } from '../../../../database/device' import { newPermissionStatusValues } from '../../../../model/newpermissionstatus' import { protetionLevels } from '../../../../model/protectionlevel' import { runtimePermissionStatusValues } from '../../../../model/runtimepermissionstatus' @@ -155,6 +155,14 @@ export async function dispatchUpdateDeviceStatus ({ deviceId, action, cache }: { } } + { + const effectiveManipulationFlags = action.addedManipulationFlags & DeviceManipulationFlags.ALL + + if (effectiveManipulationFlags !== 0) { + deviceEntry.manipulationFlags = deviceEntry.manipulationFlags | effectiveManipulationFlags + } + } + await deviceEntry.save({ transaction: cache.transaction }) if (hasDeviceManipulation(deviceEntry)) { diff --git a/src/function/sync/apply-actions/dispatch-parent-action/ignoremanipulation.ts b/src/function/sync/apply-actions/dispatch-parent-action/ignoremanipulation.ts index 81d6712..b943935 100644 --- a/src/function/sync/apply-actions/dispatch-parent-action/ignoremanipulation.ts +++ b/src/function/sync/apply-actions/dispatch-parent-action/ignoremanipulation.ts @@ -1,6 +1,6 @@ /* * server component for the TimeLimit App - * Copyright (C) 2019 - 2020 Jonas Lochmann + * Copyright (C) 2019 - 2022 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 @@ -81,6 +81,10 @@ export async function dispatchIgnoreManipulation ({ action, cache }: { } } + if (action.ignoreManipulationFlags !== 0) { + deviceEntry.manipulationFlags = deviceEntry.manipulationFlags & (~action.ignoreManipulationFlags) + } + await deviceEntry.save({ transaction: cache.transaction }) cache.invalidiateDeviceList = true } diff --git a/src/function/sync/get-server-data-status/device-list.ts b/src/function/sync/get-server-data-status/device-list.ts index 442d136..2caf511 100644 --- a/src/function/sync/get-server-data-status/device-list.ts +++ b/src/function/sync/get-server-data-status/device-list.ts @@ -1,6 +1,6 @@ /* * server component for the TimeLimit App - * Copyright (C) 2019 - 2020 Jonas Lochmann + * Copyright (C) 2019 - 2022 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 @@ -64,7 +64,8 @@ export async function getDeviceList ({ database, transaction, familyEntry }: { asEnabled: item.asEnabled, wasAsEnabled: item.wasAsEnabled, activityLevelBlocking: item.activityLevelBlocking, - qOrLater: item.isQorLater + qOrLater: item.isQorLater, + mFlags: item.manipulationFlags })) } } diff --git a/src/object/serverdatastatus.ts b/src/object/serverdatastatus.ts index 5ec2203..a65dc22 100644 --- a/src/object/serverdatastatus.ts +++ b/src/object/serverdatastatus.ts @@ -96,6 +96,7 @@ export interface ServerDeviceData { wasAsEnabled: boolean activityLevelBlocking: boolean qOrLater: boolean + mFlags: number // manipulation flags } export interface ServerUpdatedCategoryBaseData {