diff --git a/docs/schema/ClientPullChangesRequest.schema.json b/docs/schema/ClientPullChangesRequest.schema.json
index e112fa6..c01277c 100644
--- a/docs/schema/ClientPullChangesRequest.schema.json
+++ b/docs/schema/ClientPullChangesRequest.schema.json
@@ -37,6 +37,18 @@
},
"clientLevel": {
"type": "number"
+ },
+ "devicesDetail": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/definitions/DeviceDataStatus"
+ }
+ },
+ "kri": {
+ "type": "number"
+ },
+ "kr": {
+ "type": "number"
}
},
"additionalProperties": false,
@@ -75,6 +87,19 @@
"usedTime"
],
"title": "CategoryDataStatus"
+ },
+ "DeviceDataStatus": {
+ "type": "object",
+ "properties": {
+ "appsB": {
+ "type": "string"
+ },
+ "appsD": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "title": "DeviceDataStatus"
}
},
"$schema": "http://json-schema.org/draft-07/schema#",
diff --git a/docs/schema/README.md b/docs/schema/README.md
index 993ad77..9708c1c 100644
--- a/docs/schema/README.md
+++ b/docs/schema/README.md
@@ -54,6 +54,8 @@
* [ClientPushChangesRequestAction](./clientpushchangesrequest-definitions-clientpushchangesrequestaction.md) – `https://timelimit.io/ClientPushChangesRequest#/definitions/ClientPushChangesRequestAction`
+* [DeviceDataStatus](./clientpullchangesrequest-definitions-devicedatastatus.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus`
+
* [NewDeviceInfo](./createfamilybymailtokenrequest-definitions-newdeviceinfo.md) – `https://timelimit.io/CreateFamilyByMailTokenRequest#/definitions/NewDeviceInfo`
* [NewDeviceInfo](./registerchilddevicerequest-definitions-newdeviceinfo.md) – `https://timelimit.io/RegisterChildDeviceRequest#/definitions/NewDeviceInfo`
@@ -106,6 +108,8 @@
* [SerializedDeleteTimeLimitRuleAction](./serializedparentaction-definitions-serializeddeletetimelimitruleaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedDeleteTimeLimitRuleAction`
+* [SerializedFinishKeyRequestAction](./serializedapplogicaction-definitions-serializedfinishkeyrequestaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction`
+
* [SerializedForceSyncAction](./serializedapplogicaction-definitions-serializedforcesyncaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedForceSyncAction`
* [SerializedIgnoreManipulationAction](./serializedparentaction-definitions-serializedignoremanipulationaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedIgnoreManipulationAction`
@@ -126,8 +130,12 @@
* [SerializedRenameChildAction](./serializedparentaction-definitions-serializedrenamechildaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedRenameChildAction`
+* [SerializedReplyToKeyRequestAction](./serializedapplogicaction-definitions-serializedreplytokeyrequestaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction`
+
* [SerializedReviewChildTaskAction](./serializedparentaction-definitions-serializedreviewchildtaskaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedReviewChildTaskAction`
+* [SerializedSendKeyRequestAction](./serializedapplogicaction-definitions-serializedsendkeyrequestaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction`
+
* [SerializedSetCategoryExtraTimeAction](./serializedparentaction-definitions-serializedsetcategoryextratimeaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryExtraTimeAction`
* [SerializedSetCategoryForUnassignedAppsAction](./serializedparentaction-definitions-serializedsetcategoryforunassignedappsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedSetCategoryForUnassignedAppsAction`
@@ -186,6 +194,8 @@
* [SerializedUpdateEnableActivityLevelBlockingAction](./serializedparentaction-definitions-serializedupdateenableactivitylevelblockingaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateEnableActivityLevelBlockingAction`
+* [SerializedUpdateInstalledAppsAction](./serializedapplogicaction-definitions-serializedupdateinstalledappsaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction`
+
* [SerializedUpdateParentNotificationFlagsAction](./serializedparentaction-definitions-serializedupdateparentnotificationflagsaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateParentNotificationFlagsAction`
* [SerializedUpdateTimelimitRuleAction](./serializedparentaction-definitions-serializedupdatetimelimitruleaction.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateTimelimitRuleAction`
@@ -196,14 +206,24 @@
* [SerializedUpdateUserLimitLoginPreBlockDuration](./serializedparentaction-definitions-serializedupdateuserlimitloginpreblockduration.md) – `https://timelimit.io/SerializedParentAction#/definitions/SerializedUpdateUserLimitLoginPreBlockDuration`
+* [SerializedUploadDevicePublicKeyAction](./serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction`
+
* [ServerCategoryNetworkId](./serverdatastatus-definitions-servercategorynetworkid.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerCategoryNetworkId`
+* [ServerCryptContainer](./serverdatastatus-definitions-servercryptcontainer.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer`
+
* [ServerDeviceData](./serverdatastatus-definitions-serverdevicedata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData`
* [ServerDeviceList](./serverdatastatus-definitions-serverdevicelist.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceList`
+* [ServerExtendedDeviceData](./serverdatastatus-definitions-serverextendeddevicedata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData`
+
* [ServerInstalledAppsData](./serverdatastatus-definitions-serverinstalledappsdata.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData`
+* [ServerKeyRequest](./serverdatastatus-definitions-serverkeyrequest.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest`
+
+* [ServerKeyResponse](./serverdatastatus-definitions-serverkeyresponse.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse`
+
* [ServerSessionDurationItem](./serverdatastatus-definitions-serversessiondurationitem.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerSessionDurationItem`
* [ServerTimeLimitRule](./serverdatastatus-definitions-servertimelimitrule.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerTimeLimitRule`
@@ -230,10 +250,14 @@
* [Untitled object in ClientPullChangesRequest](./clientpullchangesrequest-definitions-clientdatastatus-properties-categories.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/categories`
+* [Untitled object in ClientPullChangesRequest](./clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devicesDetail`
+
* [Untitled object in ClientPullChangesRequest](./clientpullchangesrequest-definitions-clientdatastatus-properties-apps.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/apps`
* [Untitled object in ClientPullChangesRequest](./clientpullchangesrequest-definitions-clientdatastatus-properties-categories.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/categories`
+* [Untitled object in ClientPullChangesRequest](./clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md) – `https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devicesDetail`
+
* [Untitled object in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items`
* [Untitled object in SerializedAppLogicAction](./serializedapplogicaction-definitions-serializedaddusedtimeactionversion2-properties-i-items.md) – `https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedAddUsedTimeActionVersion2/properties/i/items`
@@ -296,6 +320,8 @@
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serverdevicelist-properties-data.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceList/properties/data`
+* [Untitled array in ServerDataStatus](./serverdatastatus-properties-devices2.md) – `https://timelimit.io/ServerDataStatus#/properties/devices2`
+
* [Untitled array in ServerDataStatus](./serverdatastatus-properties-apps.md) – `https://timelimit.io/ServerDataStatus#/properties/apps`
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serverinstalledappsdata-properties-apps.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/apps`
@@ -330,6 +356,10 @@
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serveruserlist-properties-data.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerUserList/properties/data`
+* [Untitled array in ServerDataStatus](./serverdatastatus-properties-krq.md) – `https://timelimit.io/ServerDataStatus#/properties/krq`
+
+* [Untitled array in ServerDataStatus](./serverdatastatus-properties-kr.md) – `https://timelimit.io/ServerDataStatus#/properties/kr`
+
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serverdevicelist-properties-data.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceList/properties/data`
* [Untitled array in ServerDataStatus](./serverdatastatus-definitions-serverinstalledappsdata-properties-apps.md) – `https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/apps`
diff --git a/docs/schema/SerializedAppLogicAction.schema.json b/docs/schema/SerializedAppLogicAction.schema.json
index 663247a..34db597 100644
--- a/docs/schema/SerializedAppLogicAction.schema.json
+++ b/docs/schema/SerializedAppLogicAction.schema.json
@@ -9,15 +9,27 @@
{
"$ref": "#/definitions/SerializedAddUsedTimeActionVersion2"
},
+ {
+ "$ref": "#/definitions/SerializedFinishKeyRequestAction"
+ },
{
"$ref": "#/definitions/SerializedForceSyncAction"
},
+ {
+ "$ref": "#/definitions/SerializedReplyToKeyRequestAction"
+ },
{
"$ref": "#/definitions/SerializedMarkTaskPendingAction"
},
+ {
+ "$ref": "#/definitions/SerializedUpdateInstalledAppsAction"
+ },
{
"$ref": "#/definitions/SerializedRemoveInstalledAppsAction"
},
+ {
+ "$ref": "#/definitions/SerializedSendKeyRequestAction"
+ },
{
"$ref": "#/definitions/SerializedSignOutAtDeviceAction"
},
@@ -29,6 +41,9 @@
},
{
"$ref": "#/definitions/SerializedUpdateDeviceStatusAction"
+ },
+ {
+ "$ref": "#/definitions/SerializedUploadDevicePublicKeyAction"
}
],
"definitions": {
@@ -206,6 +221,26 @@
],
"title": "SerializedAddUsedTimeActionVersion2"
},
+ "SerializedFinishKeyRequestAction": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "FINISH_KEY_REQUEST"
+ ]
+ },
+ "dsn": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "dsn",
+ "type"
+ ],
+ "title": "SerializedFinishKeyRequestAction"
+ },
"SerializedForceSyncAction": {
"type": "object",
"properties": {
@@ -222,6 +257,38 @@
],
"title": "SerializedForceSyncAction"
},
+ "SerializedReplyToKeyRequestAction": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "REPLY_TO_KEY_REQUEST"
+ ]
+ },
+ "rsn": {
+ "type": "number"
+ },
+ "tempKey": {
+ "type": "string"
+ },
+ "encryptedKey": {
+ "type": "string"
+ },
+ "signature": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "encryptedKey",
+ "rsn",
+ "signature",
+ "tempKey",
+ "type"
+ ],
+ "title": "SerializedReplyToKeyRequestAction"
+ },
"SerializedMarkTaskPendingAction": {
"type": "object",
"properties": {
@@ -242,6 +309,32 @@
],
"title": "SerializedMarkTaskPendingAction"
},
+ "SerializedUpdateInstalledAppsAction": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "UPDATE_INSTALLED_APPS"
+ ]
+ },
+ "b": {
+ "type": "string"
+ },
+ "d": {
+ "type": "string"
+ },
+ "w": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "type",
+ "w"
+ ],
+ "title": "SerializedUpdateInstalledAppsAction"
+ },
"SerializedRemoveInstalledAppsAction": {
"type": "object",
"properties": {
@@ -265,6 +358,44 @@
],
"title": "SerializedRemoveInstalledAppsAction"
},
+ "SerializedSendKeyRequestAction": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "SEND_KEY_REQUEST"
+ ]
+ },
+ "dsn": {
+ "type": "number"
+ },
+ "deviceId": {
+ "type": "string"
+ },
+ "categoryId": {
+ "type": "string"
+ },
+ "dataType": {
+ "type": "number"
+ },
+ "tempKey": {
+ "type": "string"
+ },
+ "signature": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "dataType",
+ "dsn",
+ "signature",
+ "tempKey",
+ "type"
+ ],
+ "title": "SerializedSendKeyRequestAction"
+ },
"SerializedSignOutAtDeviceAction": {
"type": "object",
"properties": {
@@ -421,6 +552,26 @@
"type"
],
"title": "SerializedUpdateDeviceStatusAction"
+ },
+ "SerializedUploadDevicePublicKeyAction": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "UPLOAD_DEVICE_PUBLIC_KEY"
+ ]
+ },
+ "key": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "key",
+ "type"
+ ],
+ "title": "SerializedUploadDevicePublicKeyAction"
}
},
"$schema": "http://json-schema.org/draft-07/schema#",
diff --git a/docs/schema/ServerDataStatus.schema.json b/docs/schema/ServerDataStatus.schema.json
index 4bd0e89..ffafea1 100644
--- a/docs/schema/ServerDataStatus.schema.json
+++ b/docs/schema/ServerDataStatus.schema.json
@@ -4,6 +4,12 @@
"devices": {
"$ref": "#/definitions/ServerDeviceList"
},
+ "devices2": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServerExtendedDeviceData"
+ }
+ },
"apps": {
"type": "array",
"items": {
@@ -49,6 +55,18 @@
"users": {
"$ref": "#/definitions/ServerUserList"
},
+ "krq": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServerKeyRequest"
+ }
+ },
+ "kr": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/ServerKeyResponse"
+ }
+ },
"fullVersion": {
"type": "number"
},
@@ -185,6 +203,9 @@
},
"mFlags": {
"type": "number"
+ },
+ "pk": {
+ "type": "string"
}
},
"additionalProperties": false,
@@ -251,6 +272,42 @@
"type": "string",
"title": "NewPermissionStatus"
},
+ "ServerExtendedDeviceData": {
+ "type": "object",
+ "properties": {
+ "deviceId": {
+ "type": "string"
+ },
+ "appsBase": {
+ "$ref": "#/definitions/ServerCryptContainer"
+ },
+ "appsDiff": {
+ "$ref": "#/definitions/ServerCryptContainer"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "deviceId"
+ ],
+ "title": "ServerExtendedDeviceData"
+ },
+ "ServerCryptContainer": {
+ "type": "object",
+ "properties": {
+ "version": {
+ "type": "string"
+ },
+ "data": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "data",
+ "version"
+ ],
+ "title": "ServerCryptContainer"
+ },
"ServerInstalledAppsData": {
"type": "object",
"properties": {
@@ -784,6 +841,78 @@
"type"
],
"title": "ServerUserEntry"
+ },
+ "ServerKeyRequest": {
+ "type": "object",
+ "properties": {
+ "srvSeq": {
+ "type": "number"
+ },
+ "senId": {
+ "type": "string"
+ },
+ "senSeq": {
+ "type": "number"
+ },
+ "deviceId": {
+ "type": "string"
+ },
+ "categoryId": {
+ "type": "string"
+ },
+ "type": {
+ "type": "number"
+ },
+ "tempKey": {
+ "type": "string"
+ },
+ "signature": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "senId",
+ "senSeq",
+ "signature",
+ "srvSeq",
+ "tempKey",
+ "type"
+ ],
+ "title": "ServerKeyRequest"
+ },
+ "ServerKeyResponse": {
+ "type": "object",
+ "properties": {
+ "srvSeq": {
+ "type": "number"
+ },
+ "sender": {
+ "type": "string"
+ },
+ "rqSeq": {
+ "type": "number"
+ },
+ "tempKey": {
+ "type": "string"
+ },
+ "cryptKey": {
+ "type": "string"
+ },
+ "signature": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "cryptKey",
+ "rqSeq",
+ "sender",
+ "signature",
+ "srvSeq",
+ "tempKey"
+ ],
+ "title": "ServerKeyResponse"
}
},
"$schema": "http://json-schema.org/draft-07/schema#",
diff --git a/docs/schema/clientpullchangesrequest-definitions-categorydatastatus-properties-appsb.md b/docs/schema/clientpullchangesrequest-definitions-categorydatastatus-properties-appsb.md
new file mode 100644
index 0000000..a73d3e9
--- /dev/null
+++ b/docs/schema/clientpullchangesrequest-definitions-categorydatastatus-properties-appsb.md
@@ -0,0 +1,15 @@
+# Untitled string in ClientPullChangesRequest Schema
+
+```txt
+https://timelimit.io/ClientPullChangesRequest#/definitions/CategoryDataStatus/properties/appsB
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [ClientPullChangesRequest.schema.json\*](ClientPullChangesRequest.schema.json "open original schema") |
+
+## appsB Type
+
+`string`
diff --git a/docs/schema/clientpullchangesrequest-definitions-categorydatastatus-properties-appsd.md b/docs/schema/clientpullchangesrequest-definitions-categorydatastatus-properties-appsd.md
new file mode 100644
index 0000000..b8b08ee
--- /dev/null
+++ b/docs/schema/clientpullchangesrequest-definitions-categorydatastatus-properties-appsd.md
@@ -0,0 +1,15 @@
+# Untitled string in ClientPullChangesRequest Schema
+
+```txt
+https://timelimit.io/ClientPullChangesRequest#/definitions/CategoryDataStatus/properties/appsD
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [ClientPullChangesRequest.schema.json\*](ClientPullChangesRequest.schema.json "open original schema") |
+
+## appsD Type
+
+`string`
diff --git a/docs/schema/clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md b/docs/schema/clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md
new file mode 100644
index 0000000..a576f79
--- /dev/null
+++ b/docs/schema/clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md
@@ -0,0 +1,39 @@
+# Untitled object in ClientPullChangesRequest Schema
+
+```txt
+https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devicesDetail
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [ClientPullChangesRequest.schema.json\*](ClientPullChangesRequest.schema.json "open original schema") |
+
+## devicesDetail Type
+
+`object` ([Details](clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md))
+
+# devicesDetail Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :-------------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Additional Properties | `object` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-devicedatastatus.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devicesDetail/additionalProperties") |
+
+## Additional Properties
+
+Additional properties are allowed, as long as they follow this schema:
+
+
+
+* is optional
+
+* Type: `object` ([DeviceDataStatus](clientpullchangesrequest-definitions-devicedatastatus.md))
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-devicedatastatus.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devicesDetail/additionalProperties")
+
+### additionalProperties Type
+
+`object` ([DeviceDataStatus](clientpullchangesrequest-definitions-devicedatastatus.md))
diff --git a/docs/schema/clientpullchangesrequest-definitions-clientdatastatus-properties-kr.md b/docs/schema/clientpullchangesrequest-definitions-clientdatastatus-properties-kr.md
new file mode 100644
index 0000000..d5f23ec
--- /dev/null
+++ b/docs/schema/clientpullchangesrequest-definitions-clientdatastatus-properties-kr.md
@@ -0,0 +1,15 @@
+# Untitled number in ClientPullChangesRequest Schema
+
+```txt
+https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/kr
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [ClientPullChangesRequest.schema.json\*](ClientPullChangesRequest.schema.json "open original schema") |
+
+## kr Type
+
+`number`
diff --git a/docs/schema/clientpullchangesrequest-definitions-clientdatastatus-properties-kri.md b/docs/schema/clientpullchangesrequest-definitions-clientdatastatus-properties-kri.md
new file mode 100644
index 0000000..fccdfe0
--- /dev/null
+++ b/docs/schema/clientpullchangesrequest-definitions-clientdatastatus-properties-kri.md
@@ -0,0 +1,15 @@
+# Untitled number in ClientPullChangesRequest Schema
+
+```txt
+https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/kri
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [ClientPullChangesRequest.schema.json\*](ClientPullChangesRequest.schema.json "open original schema") |
+
+## kri Type
+
+`number`
diff --git a/docs/schema/clientpullchangesrequest-definitions-clientdatastatus.md b/docs/schema/clientpullchangesrequest-definitions-clientdatastatus.md
index ef53120..fb9f4d1 100644
--- a/docs/schema/clientpullchangesrequest-definitions-clientdatastatus.md
+++ b/docs/schema/clientpullchangesrequest-definitions-clientdatastatus.md
@@ -16,13 +16,16 @@ https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus
# ClientDataStatus Properties
-| Property | Type | Required | Nullable | Defined by |
-| :-------------------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [devices](#devices) | `string` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-devices.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devices") |
-| [apps](#apps) | `object` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-apps.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/apps") |
-| [categories](#categories) | `object` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-categories.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/categories") |
-| [users](#users) | `string` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-users.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/users") |
-| [clientLevel](#clientlevel) | `number` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-clientlevel.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/clientLevel") |
+| Property | Type | Required | Nullable | Defined by |
+| :------------------------------ | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [devices](#devices) | `string` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-devices.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devices") |
+| [apps](#apps) | `object` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-apps.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/apps") |
+| [categories](#categories) | `object` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-categories.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/categories") |
+| [users](#users) | `string` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-users.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/users") |
+| [clientLevel](#clientlevel) | `number` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-clientlevel.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/clientLevel") |
+| [devicesDetail](#devicesdetail) | `object` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devicesDetail") |
+| [kri](#kri) | `number` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-kri.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/kri") |
+| [kr](#kr) | `number` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-kr.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/kr") |
## devices
@@ -113,3 +116,57 @@ https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus
### clientLevel Type
`number`
+
+## devicesDetail
+
+
+
+`devicesDetail`
+
+* is optional
+
+* Type: `object` ([Details](clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md))
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devicesDetail")
+
+### devicesDetail Type
+
+`object` ([Details](clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md))
+
+## kri
+
+
+
+`kri`
+
+* is optional
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-kri.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/kri")
+
+### kri Type
+
+`number`
+
+## kr
+
+
+
+`kr`
+
+* is optional
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-kr.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/kr")
+
+### kr Type
+
+`number`
diff --git a/docs/schema/clientpullchangesrequest-definitions-devicedatastatus-properties-appsb.md b/docs/schema/clientpullchangesrequest-definitions-devicedatastatus-properties-appsb.md
new file mode 100644
index 0000000..9cc4195
--- /dev/null
+++ b/docs/schema/clientpullchangesrequest-definitions-devicedatastatus-properties-appsb.md
@@ -0,0 +1,15 @@
+# Untitled string in ClientPullChangesRequest Schema
+
+```txt
+https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus/properties/appsB
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [ClientPullChangesRequest.schema.json\*](ClientPullChangesRequest.schema.json "open original schema") |
+
+## appsB Type
+
+`string`
diff --git a/docs/schema/clientpullchangesrequest-definitions-devicedatastatus-properties-appsd.md b/docs/schema/clientpullchangesrequest-definitions-devicedatastatus-properties-appsd.md
new file mode 100644
index 0000000..1ebd930
--- /dev/null
+++ b/docs/schema/clientpullchangesrequest-definitions-devicedatastatus-properties-appsd.md
@@ -0,0 +1,15 @@
+# Untitled string in ClientPullChangesRequest Schema
+
+```txt
+https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus/properties/appsD
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :---------------------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | Unknown identifiability | Forbidden | Allowed | none | [ClientPullChangesRequest.schema.json\*](ClientPullChangesRequest.schema.json "open original schema") |
+
+## appsD Type
+
+`string`
diff --git a/docs/schema/clientpullchangesrequest-definitions-devicedatastatus.md b/docs/schema/clientpullchangesrequest-definitions-devicedatastatus.md
new file mode 100644
index 0000000..627ebf9
--- /dev/null
+++ b/docs/schema/clientpullchangesrequest-definitions-devicedatastatus.md
@@ -0,0 +1,58 @@
+# DeviceDataStatus Schema
+
+```txt
+https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [ClientPullChangesRequest.schema.json\*](ClientPullChangesRequest.schema.json "open original schema") |
+
+## DeviceDataStatus Type
+
+`object` ([DeviceDataStatus](clientpullchangesrequest-definitions-devicedatastatus.md))
+
+# DeviceDataStatus Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :-------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [appsB](#appsb) | `string` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-devicedatastatus-properties-appsb.md "https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus/properties/appsB") |
+| [appsD](#appsd) | `string` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-devicedatastatus-properties-appsd.md "https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus/properties/appsD") |
+
+## appsB
+
+
+
+`appsB`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-devicedatastatus-properties-appsb.md "https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus/properties/appsB")
+
+### appsB Type
+
+`string`
+
+## appsD
+
+
+
+`appsD`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-devicedatastatus-properties-appsd.md "https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus/properties/appsD")
+
+### appsD Type
+
+`string`
diff --git a/docs/schema/clientpullchangesrequest.md b/docs/schema/clientpullchangesrequest.md
index 564e4a8..33020ac 100644
--- a/docs/schema/clientpullchangesrequest.md
+++ b/docs/schema/clientpullchangesrequest.md
@@ -67,13 +67,16 @@ Reference this group by using
{"$ref":"https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus"}
```
-| Property | Type | Required | Nullable | Defined by |
-| :-------------------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [devices](#devices) | `string` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-devices.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devices") |
-| [apps](#apps) | `object` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-apps.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/apps") |
-| [categories](#categories) | `object` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-categories.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/categories") |
-| [users](#users) | `string` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-users.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/users") |
-| [clientLevel](#clientlevel) | `number` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-clientlevel.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/clientLevel") |
+| Property | Type | Required | Nullable | Defined by |
+| :------------------------------ | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [devices](#devices) | `string` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-devices.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devices") |
+| [apps](#apps) | `object` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-apps.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/apps") |
+| [categories](#categories) | `object` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-categories.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/categories") |
+| [users](#users) | `string` | Required | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-users.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/users") |
+| [clientLevel](#clientlevel) | `number` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-clientlevel.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/clientLevel") |
+| [devicesDetail](#devicesdetail) | `object` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devicesDetail") |
+| [kri](#kri) | `number` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-kri.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/kri") |
+| [kr](#kr) | `number` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-kr.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/kr") |
### devices
@@ -165,6 +168,60 @@ Reference this group by using
`number`
+### devicesDetail
+
+
+
+`devicesDetail`
+
+* is optional
+
+* Type: `object` ([Details](clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md))
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/devicesDetail")
+
+#### devicesDetail Type
+
+`object` ([Details](clientpullchangesrequest-definitions-clientdatastatus-properties-devicesdetail.md))
+
+### kri
+
+
+
+`kri`
+
+* is optional
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-kri.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/kri")
+
+#### kri Type
+
+`number`
+
+### kr
+
+
+
+`kr`
+
+* is optional
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-clientdatastatus-properties-kr.md "https://timelimit.io/ClientPullChangesRequest#/definitions/ClientDataStatus/properties/kr")
+
+#### kr Type
+
+`number`
+
## Definitions group CategoryDataStatus
Reference this group by using
@@ -270,3 +327,52 @@ Reference this group by using
#### tasks Type
`string`
+
+## Definitions group DeviceDataStatus
+
+Reference this group by using
+
+```json
+{"$ref":"https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus"}
+```
+
+| Property | Type | Required | Nullable | Defined by |
+| :-------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [appsB](#appsb) | `string` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-devicedatastatus-properties-appsb.md "https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus/properties/appsB") |
+| [appsD](#appsd) | `string` | Optional | cannot be null | [ClientPullChangesRequest](clientpullchangesrequest-definitions-devicedatastatus-properties-appsd.md "https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus/properties/appsD") |
+
+### appsB
+
+
+
+`appsB`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-devicedatastatus-properties-appsb.md "https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus/properties/appsB")
+
+#### appsB Type
+
+`string`
+
+### appsD
+
+
+
+`appsD`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ClientPullChangesRequest](clientpullchangesrequest-definitions-devicedatastatus-properties-appsd.md "https://timelimit.io/ClientPullChangesRequest#/definitions/DeviceDataStatus/properties/appsD")
+
+#### appsD Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-dsn.md b/docs/schema/serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-dsn.md
new file mode 100644
index 0000000..bf776c1
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-dsn.md
@@ -0,0 +1,15 @@
+# Untitled number in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction/properties/dsn
+```
+
+
+
+| 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") |
+
+## dsn Type
+
+`number`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-type.md b/docs/schema/serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-type.md
new file mode 100644
index 0000000..d9efbce
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-type.md
@@ -0,0 +1,23 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction/properties/type
+```
+
+
+
+| 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") |
+
+## type Type
+
+`string`
+
+## type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :--------------------- | :---------- |
+| `"FINISH_KEY_REQUEST"` | |
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedfinishkeyrequestaction.md b/docs/schema/serializedapplogicaction-definitions-serializedfinishkeyrequestaction.md
new file mode 100644
index 0000000..99b9978
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedfinishkeyrequestaction.md
@@ -0,0 +1,66 @@
+# SerializedFinishKeyRequestAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [SerializedAppLogicAction.schema.json\*](SerializedAppLogicAction.schema.json "open original schema") |
+
+## SerializedFinishKeyRequestAction Type
+
+`object` ([SerializedFinishKeyRequestAction](serializedapplogicaction-definitions-serializedfinishkeyrequestaction.md))
+
+# SerializedFinishKeyRequestAction Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :------------ | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction/properties/type") |
+| [dsn](#dsn) | `number` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-dsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction/properties/dsn") |
+
+## type
+
+
+
+`type`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction/properties/type")
+
+### type Type
+
+`string`
+
+### type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :--------------------- | :---------- |
+| `"FINISH_KEY_REQUEST"` | |
+
+## dsn
+
+
+
+`dsn`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-dsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction/properties/dsn")
+
+### dsn Type
+
+`number`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-encryptedkey.md b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-encryptedkey.md
new file mode 100644
index 0000000..e53b16d
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-encryptedkey.md
@@ -0,0 +1,15 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/encryptedKey
+```
+
+
+
+| 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") |
+
+## encryptedKey Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-rsn.md b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-rsn.md
new file mode 100644
index 0000000..eb0016a
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-rsn.md
@@ -0,0 +1,15 @@
+# Untitled number in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/rsn
+```
+
+
+
+| 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") |
+
+## rsn Type
+
+`number`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-signature.md b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-signature.md
new file mode 100644
index 0000000..5527052
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-signature.md
@@ -0,0 +1,15 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/signature
+```
+
+
+
+| 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") |
+
+## signature Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-tempkey.md b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-tempkey.md
new file mode 100644
index 0000000..d1e89bd
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-tempkey.md
@@ -0,0 +1,15 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/tempKey
+```
+
+
+
+| 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") |
+
+## tempKey Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-type.md b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-type.md
new file mode 100644
index 0000000..288adf3
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-type.md
@@ -0,0 +1,23 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/type
+```
+
+
+
+| 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") |
+
+## type Type
+
+`string`
+
+## type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :----------------------- | :---------- |
+| `"REPLY_TO_KEY_REQUEST"` | |
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction.md b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction.md
new file mode 100644
index 0000000..a7af893
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedreplytokeyrequestaction.md
@@ -0,0 +1,123 @@
+# SerializedReplyToKeyRequestAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [SerializedAppLogicAction.schema.json\*](SerializedAppLogicAction.schema.json "open original schema") |
+
+## SerializedReplyToKeyRequestAction Type
+
+`object` ([SerializedReplyToKeyRequestAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction.md))
+
+# SerializedReplyToKeyRequestAction Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :---------------------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/type") |
+| [rsn](#rsn) | `number` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-rsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/rsn") |
+| [tempKey](#tempkey) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-tempkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/tempKey") |
+| [encryptedKey](#encryptedkey) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-encryptedkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/encryptedKey") |
+| [signature](#signature) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-signature.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/signature") |
+
+## type
+
+
+
+`type`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/type")
+
+### type Type
+
+`string`
+
+### type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :----------------------- | :---------- |
+| `"REPLY_TO_KEY_REQUEST"` | |
+
+## rsn
+
+
+
+`rsn`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-rsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/rsn")
+
+### rsn Type
+
+`number`
+
+## tempKey
+
+
+
+`tempKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-tempkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/tempKey")
+
+### tempKey Type
+
+`string`
+
+## encryptedKey
+
+
+
+`encryptedKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-encryptedkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/encryptedKey")
+
+### encryptedKey Type
+
+`string`
+
+## signature
+
+
+
+`signature`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-signature.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/signature")
+
+### signature Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-categoryid.md b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-categoryid.md
new file mode 100644
index 0000000..615c8b8
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-categoryid.md
@@ -0,0 +1,15 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/categoryId
+```
+
+
+
+| 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") |
+
+## categoryId Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-datatype.md b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-datatype.md
new file mode 100644
index 0000000..99e8674
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-datatype.md
@@ -0,0 +1,15 @@
+# Untitled number in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/dataType
+```
+
+
+
+| 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") |
+
+## dataType Type
+
+`number`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-deviceid.md b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-deviceid.md
new file mode 100644
index 0000000..299b162
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-deviceid.md
@@ -0,0 +1,15 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/deviceId
+```
+
+
+
+| 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") |
+
+## deviceId Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-dsn.md b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-dsn.md
new file mode 100644
index 0000000..52cf564
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-dsn.md
@@ -0,0 +1,15 @@
+# Untitled number in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/dsn
+```
+
+
+
+| 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") |
+
+## dsn Type
+
+`number`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-signature.md b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-signature.md
new file mode 100644
index 0000000..7668e27
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-signature.md
@@ -0,0 +1,15 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/signature
+```
+
+
+
+| 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") |
+
+## signature Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-tempkey.md b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-tempkey.md
new file mode 100644
index 0000000..d512ff1
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-tempkey.md
@@ -0,0 +1,15 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/tempKey
+```
+
+
+
+| 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") |
+
+## tempKey Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-type.md b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-type.md
new file mode 100644
index 0000000..18161b5
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-type.md
@@ -0,0 +1,23 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/type
+```
+
+
+
+| 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") |
+
+## type Type
+
+`string`
+
+## type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :------------------- | :---------- |
+| `"SEND_KEY_REQUEST"` | |
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction.md b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction.md
new file mode 100644
index 0000000..8e9e42f
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedsendkeyrequestaction.md
@@ -0,0 +1,161 @@
+# SerializedSendKeyRequestAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [SerializedAppLogicAction.schema.json\*](SerializedAppLogicAction.schema.json "open original schema") |
+
+## SerializedSendKeyRequestAction Type
+
+`object` ([SerializedSendKeyRequestAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction.md))
+
+# SerializedSendKeyRequestAction Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :------------------------ | :------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/type") |
+| [dsn](#dsn) | `number` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-dsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/dsn") |
+| [deviceId](#deviceid) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-deviceid.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/deviceId") |
+| [categoryId](#categoryid) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-categoryid.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/categoryId") |
+| [dataType](#datatype) | `number` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-datatype.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/dataType") |
+| [tempKey](#tempkey) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-tempkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/tempKey") |
+| [signature](#signature) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-signature.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/signature") |
+
+## type
+
+
+
+`type`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/type")
+
+### type Type
+
+`string`
+
+### type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :------------------- | :---------- |
+| `"SEND_KEY_REQUEST"` | |
+
+## dsn
+
+
+
+`dsn`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-dsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/dsn")
+
+### dsn Type
+
+`number`
+
+## deviceId
+
+
+
+`deviceId`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-deviceid.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/deviceId")
+
+### deviceId Type
+
+`string`
+
+## categoryId
+
+
+
+`categoryId`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-categoryid.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/categoryId")
+
+### categoryId Type
+
+`string`
+
+## dataType
+
+
+
+`dataType`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-datatype.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/dataType")
+
+### dataType Type
+
+`number`
+
+## tempKey
+
+
+
+`tempKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-tempkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/tempKey")
+
+### tempKey Type
+
+`string`
+
+## signature
+
+
+
+`signature`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-signature.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/signature")
+
+### signature Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-b.md b/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-b.md
new file mode 100644
index 0000000..678a444
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-b.md
@@ -0,0 +1,15 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/b
+```
+
+
+
+| 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") |
+
+## b Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-d.md b/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-d.md
new file mode 100644
index 0000000..1c3f537
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-d.md
@@ -0,0 +1,15 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/d
+```
+
+
+
+| 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") |
+
+## d Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-type.md b/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-type.md
new file mode 100644
index 0000000..cb90c75
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-type.md
@@ -0,0 +1,23 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/type
+```
+
+
+
+| 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") |
+
+## type Type
+
+`string`
+
+## type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :------------------------ | :---------- |
+| `"UPDATE_INSTALLED_APPS"` | |
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-w.md b/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-w.md
new file mode 100644
index 0000000..2dd0e64
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-w.md
@@ -0,0 +1,15 @@
+# Untitled boolean in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/w
+```
+
+
+
+| 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") |
+
+## w Type
+
+`boolean`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction.md b/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction.md
new file mode 100644
index 0000000..eedea95
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializedupdateinstalledappsaction.md
@@ -0,0 +1,104 @@
+# SerializedUpdateInstalledAppsAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [SerializedAppLogicAction.schema.json\*](SerializedAppLogicAction.schema.json "open original schema") |
+
+## SerializedUpdateInstalledAppsAction Type
+
+`object` ([SerializedUpdateInstalledAppsAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction.md))
+
+# SerializedUpdateInstalledAppsAction Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :------------ | :-------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/type") |
+| [b](#b) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-b.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/b") |
+| [d](#d) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-d.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/d") |
+| [w](#w) | `boolean` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-w.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/w") |
+
+## type
+
+
+
+`type`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/type")
+
+### type Type
+
+`string`
+
+### type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :------------------------ | :---------- |
+| `"UPDATE_INSTALLED_APPS"` | |
+
+## b
+
+
+
+`b`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-b.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/b")
+
+### b Type
+
+`string`
+
+## d
+
+
+
+`d`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-d.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/d")
+
+### d Type
+
+`string`
+
+## w
+
+
+
+`w`
+
+* is required
+
+* Type: `boolean`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-w.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/w")
+
+### w Type
+
+`boolean`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-key.md b/docs/schema/serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-key.md
new file mode 100644
index 0000000..4249d87
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-key.md
@@ -0,0 +1,15 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction/properties/key
+```
+
+
+
+| 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") |
+
+## key Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-type.md b/docs/schema/serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-type.md
new file mode 100644
index 0000000..9dff83c
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-type.md
@@ -0,0 +1,23 @@
+# Untitled string in SerializedAppLogicAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction/properties/type
+```
+
+
+
+| 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") |
+
+## type Type
+
+`string`
+
+## type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :--------------------------- | :---------- |
+| `"UPLOAD_DEVICE_PUBLIC_KEY"` | |
diff --git a/docs/schema/serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction.md b/docs/schema/serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction.md
new file mode 100644
index 0000000..d88ad89
--- /dev/null
+++ b/docs/schema/serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction.md
@@ -0,0 +1,66 @@
+# SerializedUploadDevicePublicKeyAction Schema
+
+```txt
+https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :---------------------------------------------------------------------------------------------------- |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [SerializedAppLogicAction.schema.json\*](SerializedAppLogicAction.schema.json "open original schema") |
+
+## SerializedUploadDevicePublicKeyAction Type
+
+`object` ([SerializedUploadDevicePublicKeyAction](serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction.md))
+
+# SerializedUploadDevicePublicKeyAction Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :------------ | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction/properties/type") |
+| [key](#key) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-key.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction/properties/key") |
+
+## type
+
+
+
+`type`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction/properties/type")
+
+### type Type
+
+`string`
+
+### type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :--------------------------- | :---------- |
+| `"UPLOAD_DEVICE_PUBLIC_KEY"` | |
+
+## key
+
+
+
+`key`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-key.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction/properties/key")
+
+### key Type
+
+`string`
diff --git a/docs/schema/serializedapplogicaction.md b/docs/schema/serializedapplogicaction.md
index 815aa66..3dd9ff2 100644
--- a/docs/schema/serializedapplogicaction.md
+++ b/docs/schema/serializedapplogicaction.md
@@ -22,12 +22,20 @@ any of
* [SerializedAddUsedTimeActionVersion2](serializedapplogicaction-definitions-serializedaddusedtimeactionversion2.md "check type definition")
+* [SerializedFinishKeyRequestAction](serializedapplogicaction-definitions-serializedfinishkeyrequestaction.md "check type definition")
+
* [SerializedForceSyncAction](serializedapplogicaction-definitions-serializedforcesyncaction.md "check type definition")
+* [SerializedReplyToKeyRequestAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction.md "check type definition")
+
* [SerializedMarkTaskPendingAction](serializedapplogicaction-definitions-serializedmarktaskpendingaction.md "check type definition")
+* [SerializedUpdateInstalledAppsAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction.md "check type definition")
+
* [SerializedRemoveInstalledAppsAction](serializedapplogicaction-definitions-serializedremoveinstalledappsaction.md "check type definition")
+* [SerializedSendKeyRequestAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction.md "check type definition")
+
* [SerializedSignOutAtDeviceAction](serializedapplogicaction-definitions-serializedsignoutatdeviceaction.md "check type definition")
* [SerialiezdTriedDisablingDeviceAdminAction](serializedapplogicaction-definitions-serialiezdtrieddisablingdeviceadminaction.md "check type definition")
@@ -36,6 +44,8 @@ any of
* [SerializedUpdateDeviceStatusAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction.md "check type definition")
+* [SerializedUploadDevicePublicKeyAction](serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction.md "check type definition")
+
# SerializedAppLogicAction Definitions
## Definitions group SerializedAddInstalledAppsAction
@@ -412,6 +422,63 @@ Reference this group by using
`number`
+## Definitions group SerializedFinishKeyRequestAction
+
+Reference this group by using
+
+```json
+{"$ref":"https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction"}
+```
+
+| Property | Type | Required | Nullable | Defined by |
+| :-------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type-3) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction/properties/type") |
+| [dsn](#dsn) | `number` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-dsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction/properties/dsn") |
+
+### type
+
+
+
+`type`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction/properties/type")
+
+#### type Type
+
+`string`
+
+#### type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :--------------------- | :---------- |
+| `"FINISH_KEY_REQUEST"` | |
+
+### dsn
+
+
+
+`dsn`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedfinishkeyrequestaction-properties-dsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedFinishKeyRequestAction/properties/dsn")
+
+#### dsn Type
+
+`number`
+
## Definitions group SerializedForceSyncAction
Reference this group by using
@@ -422,7 +489,7 @@ Reference this group by using
| Property | Type | Required | Nullable | Defined by |
| :-------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [type](#type-3) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedforcesyncaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedForceSyncAction/properties/type") |
+| [type](#type-4) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedforcesyncaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedForceSyncAction/properties/type") |
### type
@@ -450,6 +517,120 @@ Reference this group by using
| :------------- | :---------- |
| `"FORCE_SYNC"` | |
+## Definitions group SerializedReplyToKeyRequestAction
+
+Reference this group by using
+
+```json
+{"$ref":"https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction"}
+```
+
+| Property | Type | Required | Nullable | Defined by |
+| :---------------------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type-5) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/type") |
+| [rsn](#rsn) | `number` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-rsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/rsn") |
+| [tempKey](#tempkey) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-tempkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/tempKey") |
+| [encryptedKey](#encryptedkey) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-encryptedkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/encryptedKey") |
+| [signature](#signature) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-signature.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/signature") |
+
+### type
+
+
+
+`type`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/type")
+
+#### type Type
+
+`string`
+
+#### type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :----------------------- | :---------- |
+| `"REPLY_TO_KEY_REQUEST"` | |
+
+### rsn
+
+
+
+`rsn`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-rsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/rsn")
+
+#### rsn Type
+
+`number`
+
+### tempKey
+
+
+
+`tempKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-tempkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/tempKey")
+
+#### tempKey Type
+
+`string`
+
+### encryptedKey
+
+
+
+`encryptedKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-encryptedkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/encryptedKey")
+
+#### encryptedKey Type
+
+`string`
+
+### signature
+
+
+
+`signature`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedreplytokeyrequestaction-properties-signature.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedReplyToKeyRequestAction/properties/signature")
+
+#### signature Type
+
+`string`
+
## Definitions group SerializedMarkTaskPendingAction
Reference this group by using
@@ -460,7 +641,7 @@ Reference this group by using
| Property | Type | Required | Nullable | Defined by |
| :---------------- | :------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [type](#type-4) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedmarktaskpendingaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedMarkTaskPendingAction/properties/type") |
+| [type](#type-6) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedmarktaskpendingaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedMarkTaskPendingAction/properties/type") |
| [taskId](#taskid) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedmarktaskpendingaction-properties-taskid.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedMarkTaskPendingAction/properties/taskId") |
### type
@@ -507,6 +688,101 @@ Reference this group by using
`string`
+## Definitions group SerializedUpdateInstalledAppsAction
+
+Reference this group by using
+
+```json
+{"$ref":"https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction"}
+```
+
+| Property | Type | Required | Nullable | Defined by |
+| :-------------- | :-------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type-7) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/type") |
+| [b](#b) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-b.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/b") |
+| [d](#d-1) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-d.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/d") |
+| [w](#w) | `boolean` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-w.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/w") |
+
+### type
+
+
+
+`type`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/type")
+
+#### type Type
+
+`string`
+
+#### type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :------------------------ | :---------- |
+| `"UPDATE_INSTALLED_APPS"` | |
+
+### b
+
+
+
+`b`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-b.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/b")
+
+#### b Type
+
+`string`
+
+### d
+
+
+
+`d`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-d.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/d")
+
+#### d Type
+
+`string`
+
+### w
+
+
+
+`w`
+
+* is required
+
+* Type: `boolean`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateinstalledappsaction-properties-w.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateInstalledAppsAction/properties/w")
+
+#### w Type
+
+`boolean`
+
## Definitions group SerializedRemoveInstalledAppsAction
Reference this group by using
@@ -517,7 +793,7 @@ Reference this group by using
| Property | Type | Required | Nullable | Defined by |
| :---------------------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [type](#type-5) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedremoveinstalledappsaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedRemoveInstalledAppsAction/properties/type") |
+| [type](#type-8) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedremoveinstalledappsaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedRemoveInstalledAppsAction/properties/type") |
| [packageNames](#packagenames) | `array` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedremoveinstalledappsaction-properties-packagenames.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedRemoveInstalledAppsAction/properties/packageNames") |
### type
@@ -564,6 +840,158 @@ Reference this group by using
`string[]`
+## Definitions group SerializedSendKeyRequestAction
+
+Reference this group by using
+
+```json
+{"$ref":"https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction"}
+```
+
+| Property | Type | Required | Nullable | Defined by |
+| :-------------------------- | :------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type-9) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/type") |
+| [dsn](#dsn-1) | `number` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-dsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/dsn") |
+| [deviceId](#deviceid) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-deviceid.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/deviceId") |
+| [categoryId](#categoryid-1) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-categoryid.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/categoryId") |
+| [dataType](#datatype) | `number` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-datatype.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/dataType") |
+| [tempKey](#tempkey-1) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-tempkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/tempKey") |
+| [signature](#signature-1) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-signature.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/signature") |
+
+### type
+
+
+
+`type`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/type")
+
+#### type Type
+
+`string`
+
+#### type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :------------------- | :---------- |
+| `"SEND_KEY_REQUEST"` | |
+
+### dsn
+
+
+
+`dsn`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-dsn.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/dsn")
+
+#### dsn Type
+
+`number`
+
+### deviceId
+
+
+
+`deviceId`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-deviceid.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/deviceId")
+
+#### deviceId Type
+
+`string`
+
+### categoryId
+
+
+
+`categoryId`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-categoryid.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/categoryId")
+
+#### categoryId Type
+
+`string`
+
+### dataType
+
+
+
+`dataType`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-datatype.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/dataType")
+
+#### dataType Type
+
+`number`
+
+### tempKey
+
+
+
+`tempKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-tempkey.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/tempKey")
+
+#### tempKey Type
+
+`string`
+
+### signature
+
+
+
+`signature`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsendkeyrequestaction-properties-signature.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSendKeyRequestAction/properties/signature")
+
+#### signature Type
+
+`string`
+
## Definitions group SerializedSignOutAtDeviceAction
Reference this group by using
@@ -572,9 +1000,9 @@ Reference this group by using
{"$ref":"https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSignOutAtDeviceAction"}
```
-| Property | Type | Required | Nullable | Defined by |
-| :-------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [type](#type-6) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsignoutatdeviceaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSignOutAtDeviceAction/properties/type") |
+| Property | Type | Required | Nullable | Defined by |
+| :--------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type-10) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedsignoutatdeviceaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedSignOutAtDeviceAction/properties/type") |
### type
@@ -610,9 +1038,9 @@ Reference this group by using
{"$ref":"https://timelimit.io/SerializedAppLogicAction#/definitions/SerialiezdTriedDisablingDeviceAdminAction"}
```
-| Property | Type | Required | Nullable | Defined by |
-| :-------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [type](#type-7) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serialiezdtrieddisablingdeviceadminaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerialiezdTriedDisablingDeviceAdminAction/properties/type") |
+| Property | Type | Required | Nullable | Defined by |
+| :--------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type-11) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serialiezdtrieddisablingdeviceadminaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerialiezdTriedDisablingDeviceAdminAction/properties/type") |
### type
@@ -650,7 +1078,7 @@ Reference this group by using
| Property | Type | Required | Nullable | Defined by |
| :-------------------------------- | :------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [type](#type-8) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/type") |
+| [type](#type-12) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/type") |
| [removed](#removed) | `array` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-removed.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/removed") |
| [updatedOrAdded](#updatedoradded) | `array` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdateappactivitiesaction-properties-updatedoradded.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateAppActivitiesAction/properties/updatedOrAdded") |
@@ -802,7 +1230,7 @@ Reference this group by using
| Property | Type | Required | Nullable | Defined by |
| :---------------------------------------------------------- | :-------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [type](#type-9) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/type") |
+| [type](#type-13) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/type") |
| [protectionLevel](#protectionlevel) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-protectionlevel.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/protectionLevel") |
| [usageStats](#usagestats) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-usagestats.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/usageStats") |
| [notificationAccess](#notificationaccess) | `string` | Optional | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializedupdatedevicestatusaction-properties-notificationaccess.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUpdateDeviceStatusAction/properties/notificationAccess") |
@@ -1041,3 +1469,60 @@ Reference this group by using
#### addedManipulationFlags Type
`number`
+
+## Definitions group SerializedUploadDevicePublicKeyAction
+
+Reference this group by using
+
+```json
+{"$ref":"https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction"}
+```
+
+| Property | Type | Required | Nullable | Defined by |
+| :--------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [type](#type-14) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction/properties/type") |
+| [key](#key) | `string` | Required | cannot be null | [SerializedAppLogicAction](serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-key.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction/properties/key") |
+
+### type
+
+
+
+`type`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-type.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction/properties/type")
+
+#### type Type
+
+`string`
+
+#### type Constraints
+
+**enum**: the value of this property must be equal to one of the following values:
+
+| Value | Explanation |
+| :--------------------------- | :---------- |
+| `"UPLOAD_DEVICE_PUBLIC_KEY"` | |
+
+### key
+
+
+
+`key`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [SerializedAppLogicAction](serializedapplogicaction-definitions-serializeduploaddevicepublickeyaction-properties-key.md "https://timelimit.io/SerializedAppLogicAction#/definitions/SerializedUploadDevicePublicKeyAction/properties/key")
+
+#### key Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-servercryptcontainer-properties-data.md b/docs/schema/serverdatastatus-definitions-servercryptcontainer-properties-data.md
new file mode 100644
index 0000000..d6da93d
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-servercryptcontainer-properties-data.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer/properties/data
+```
+
+
+
+| 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") |
+
+## data Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-servercryptcontainer-properties-version.md b/docs/schema/serverdatastatus-definitions-servercryptcontainer-properties-version.md
new file mode 100644
index 0000000..cf72277
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-servercryptcontainer-properties-version.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer/properties/version
+```
+
+
+
+| 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") |
+
+## version Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-servercryptcontainer.md b/docs/schema/serverdatastatus-definitions-servercryptcontainer.md
new file mode 100644
index 0000000..7327534
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-servercryptcontainer.md
@@ -0,0 +1,58 @@
+# ServerCryptContainer Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :------------------------------------------------------------------------------------ |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [ServerDataStatus.schema.json\*](ServerDataStatus.schema.json "open original schema") |
+
+## ServerCryptContainer Type
+
+`object` ([ServerCryptContainer](serverdatastatus-definitions-servercryptcontainer.md))
+
+# ServerCryptContainer Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :------------------ | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [version](#version) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer/properties/version") |
+| [data](#data) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer-properties-data.md "https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer/properties/data") |
+
+## version
+
+
+
+`version`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer/properties/version")
+
+### version Type
+
+`string`
+
+## data
+
+
+
+`data`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer-properties-data.md "https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer/properties/data")
+
+### data Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverdevicedata-properties-pk.md b/docs/schema/serverdatastatus-definitions-serverdevicedata-properties-pk.md
new file mode 100644
index 0000000..9251376
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverdevicedata-properties-pk.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pk
+```
+
+
+
+| 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") |
+
+## pk Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverdevicedata.md b/docs/schema/serverdatastatus-definitions-serverdevicedata.md
index 6c31a1f..ca29b31 100644
--- a/docs/schema/serverdatastatus-definitions-serverdevicedata.md
+++ b/docs/schema/serverdatastatus-definitions-serverdevicedata.md
@@ -49,6 +49,7 @@ https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData
| [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") |
+| [pk](#pk) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-pk.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pk") |
## deviceId
@@ -699,3 +700,21 @@ https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData
### mFlags Type
`number`
+
+## pk
+
+
+
+`pk`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-pk.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pk")
+
+### pk Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverextendeddevicedata-properties-deviceid.md b/docs/schema/serverdatastatus-definitions-serverextendeddevicedata-properties-deviceid.md
new file mode 100644
index 0000000..f67c12c
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverextendeddevicedata-properties-deviceid.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/deviceId
+```
+
+
+
+| 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") |
+
+## deviceId Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverextendeddevicedata.md b/docs/schema/serverdatastatus-definitions-serverextendeddevicedata.md
new file mode 100644
index 0000000..3a8b616
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverextendeddevicedata.md
@@ -0,0 +1,77 @@
+# ServerExtendedDeviceData Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :------------------------------------------------------------------------------------ |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [ServerDataStatus.schema.json\*](ServerDataStatus.schema.json "open original schema") |
+
+## ServerExtendedDeviceData Type
+
+`object` ([ServerExtendedDeviceData](serverdatastatus-definitions-serverextendeddevicedata.md))
+
+# ServerExtendedDeviceData Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :-------------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [deviceId](#deviceid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverextendeddevicedata-properties-deviceid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/deviceId") |
+| [appsBase](#appsbase) | `object` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/appsBase") |
+| [appsDiff](#appsdiff) | `object` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/appsDiff") |
+
+## deviceId
+
+
+
+`deviceId`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverextendeddevicedata-properties-deviceid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/deviceId")
+
+### deviceId Type
+
+`string`
+
+## appsBase
+
+
+
+`appsBase`
+
+* is optional
+
+* Type: `object` ([ServerCryptContainer](serverdatastatus-definitions-servercryptcontainer.md))
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/appsBase")
+
+### appsBase Type
+
+`object` ([ServerCryptContainer](serverdatastatus-definitions-servercryptcontainer.md))
+
+## appsDiff
+
+
+
+`appsDiff`
+
+* is optional
+
+* Type: `object` ([ServerCryptContainer](serverdatastatus-definitions-servercryptcontainer.md))
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/appsDiff")
+
+### appsDiff Type
+
+`object` ([ServerCryptContainer](serverdatastatus-definitions-servercryptcontainer.md))
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-categoryid.md b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-categoryid.md
new file mode 100644
index 0000000..72821e1
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-categoryid.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/categoryId
+```
+
+
+
+| 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") |
+
+## categoryId Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-deviceid.md b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-deviceid.md
new file mode 100644
index 0000000..e96e615
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-deviceid.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/deviceId
+```
+
+
+
+| 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") |
+
+## deviceId Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-senid.md b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-senid.md
new file mode 100644
index 0000000..1433f86
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-senid.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/senId
+```
+
+
+
+| 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") |
+
+## senId Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-senseq.md b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-senseq.md
new file mode 100644
index 0000000..7ebccfe
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-senseq.md
@@ -0,0 +1,15 @@
+# Untitled number in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/senSeq
+```
+
+
+
+| 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") |
+
+## senSeq Type
+
+`number`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-signature.md b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-signature.md
new file mode 100644
index 0000000..a5d17a7
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-signature.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/signature
+```
+
+
+
+| 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") |
+
+## signature Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-srvseq.md b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-srvseq.md
new file mode 100644
index 0000000..60b082b
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-srvseq.md
@@ -0,0 +1,15 @@
+# Untitled number in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/srvSeq
+```
+
+
+
+| 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") |
+
+## srvSeq Type
+
+`number`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-tempkey.md b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-tempkey.md
new file mode 100644
index 0000000..dc69348
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-tempkey.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/tempKey
+```
+
+
+
+| 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") |
+
+## tempKey Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-type.md b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-type.md
new file mode 100644
index 0000000..f6f0126
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyrequest-properties-type.md
@@ -0,0 +1,15 @@
+# Untitled number in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/type
+```
+
+
+
+| 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") |
+
+## type Type
+
+`number`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyrequest.md b/docs/schema/serverdatastatus-definitions-serverkeyrequest.md
new file mode 100644
index 0000000..05ef336
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyrequest.md
@@ -0,0 +1,172 @@
+# ServerKeyRequest Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :------------------------------------------------------------------------------------ |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [ServerDataStatus.schema.json\*](ServerDataStatus.schema.json "open original schema") |
+
+## ServerKeyRequest Type
+
+`object` ([ServerKeyRequest](serverdatastatus-definitions-serverkeyrequest.md))
+
+# ServerKeyRequest Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :------------------------ | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [srvSeq](#srvseq) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-srvseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/srvSeq") |
+| [senId](#senid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-senid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/senId") |
+| [senSeq](#senseq) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-senseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/senSeq") |
+| [deviceId](#deviceid) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-deviceid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/deviceId") |
+| [categoryId](#categoryid) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/categoryId") |
+| [type](#type) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-type.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/type") |
+| [tempKey](#tempkey) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-tempkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/tempKey") |
+| [signature](#signature) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-signature.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/signature") |
+
+## srvSeq
+
+
+
+`srvSeq`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-srvseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/srvSeq")
+
+### srvSeq Type
+
+`number`
+
+## senId
+
+
+
+`senId`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-senid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/senId")
+
+### senId Type
+
+`string`
+
+## senSeq
+
+
+
+`senSeq`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-senseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/senSeq")
+
+### senSeq Type
+
+`number`
+
+## deviceId
+
+
+
+`deviceId`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-deviceid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/deviceId")
+
+### deviceId Type
+
+`string`
+
+## categoryId
+
+
+
+`categoryId`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/categoryId")
+
+### categoryId Type
+
+`string`
+
+## type
+
+
+
+`type`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-type.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/type")
+
+### type Type
+
+`number`
+
+## tempKey
+
+
+
+`tempKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-tempkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/tempKey")
+
+### tempKey Type
+
+`string`
+
+## signature
+
+
+
+`signature`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-signature.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/signature")
+
+### signature Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-cryptkey.md b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-cryptkey.md
new file mode 100644
index 0000000..d85a8f2
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-cryptkey.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/cryptKey
+```
+
+
+
+| 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") |
+
+## cryptKey Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-rqseq.md b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-rqseq.md
new file mode 100644
index 0000000..7e2e8d3
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-rqseq.md
@@ -0,0 +1,15 @@
+# Untitled number in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/rqSeq
+```
+
+
+
+| 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") |
+
+## rqSeq Type
+
+`number`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-sender.md b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-sender.md
new file mode 100644
index 0000000..b06b27d
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-sender.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/sender
+```
+
+
+
+| 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") |
+
+## sender Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-signature.md b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-signature.md
new file mode 100644
index 0000000..db892c4
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-signature.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/signature
+```
+
+
+
+| 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") |
+
+## signature Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-srvseq.md b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-srvseq.md
new file mode 100644
index 0000000..86d8f37
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-srvseq.md
@@ -0,0 +1,15 @@
+# Untitled number in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/srvSeq
+```
+
+
+
+| 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") |
+
+## srvSeq Type
+
+`number`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-tempkey.md b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-tempkey.md
new file mode 100644
index 0000000..9cdafc7
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyresponse-properties-tempkey.md
@@ -0,0 +1,15 @@
+# Untitled string in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/tempKey
+```
+
+
+
+| 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") |
+
+## tempKey Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-definitions-serverkeyresponse.md b/docs/schema/serverdatastatus-definitions-serverkeyresponse.md
new file mode 100644
index 0000000..d79360f
--- /dev/null
+++ b/docs/schema/serverdatastatus-definitions-serverkeyresponse.md
@@ -0,0 +1,134 @@
+# ServerKeyResponse Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse
+```
+
+
+
+| Abstract | Extensible | Status | Identifiable | Custom Properties | Additional Properties | Access Restrictions | Defined In |
+| :------------------ | :--------- | :------------- | :----------- | :---------------- | :-------------------- | :------------------ | :------------------------------------------------------------------------------------ |
+| Can be instantiated | No | Unknown status | No | Forbidden | Forbidden | none | [ServerDataStatus.schema.json\*](ServerDataStatus.schema.json "open original schema") |
+
+## ServerKeyResponse Type
+
+`object` ([ServerKeyResponse](serverdatastatus-definitions-serverkeyresponse.md))
+
+# ServerKeyResponse Properties
+
+| Property | Type | Required | Nullable | Defined by |
+| :---------------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [srvSeq](#srvseq) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-srvseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/srvSeq") |
+| [sender](#sender) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-sender.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/sender") |
+| [rqSeq](#rqseq) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-rqseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/rqSeq") |
+| [tempKey](#tempkey) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-tempkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/tempKey") |
+| [cryptKey](#cryptkey) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-cryptkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/cryptKey") |
+| [signature](#signature) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-signature.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/signature") |
+
+## srvSeq
+
+
+
+`srvSeq`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-srvseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/srvSeq")
+
+### srvSeq Type
+
+`number`
+
+## sender
+
+
+
+`sender`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-sender.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/sender")
+
+### sender Type
+
+`string`
+
+## rqSeq
+
+
+
+`rqSeq`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-rqseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/rqSeq")
+
+### rqSeq Type
+
+`number`
+
+## tempKey
+
+
+
+`tempKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-tempkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/tempKey")
+
+### tempKey Type
+
+`string`
+
+## cryptKey
+
+
+
+`cryptKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-cryptkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/cryptKey")
+
+### cryptKey Type
+
+`string`
+
+## signature
+
+
+
+`signature`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-signature.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/signature")
+
+### signature Type
+
+`string`
diff --git a/docs/schema/serverdatastatus-properties-devices2.md b/docs/schema/serverdatastatus-properties-devices2.md
new file mode 100644
index 0000000..875c8d5
--- /dev/null
+++ b/docs/schema/serverdatastatus-properties-devices2.md
@@ -0,0 +1,15 @@
+# Untitled array in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/properties/devices2
+```
+
+
+
+| 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") |
+
+## devices2 Type
+
+`object[]` ([ServerExtendedDeviceData](serverdatastatus-definitions-serverextendeddevicedata.md))
diff --git a/docs/schema/serverdatastatus-properties-kr.md b/docs/schema/serverdatastatus-properties-kr.md
new file mode 100644
index 0000000..71d5ed8
--- /dev/null
+++ b/docs/schema/serverdatastatus-properties-kr.md
@@ -0,0 +1,15 @@
+# Untitled array in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/properties/kr
+```
+
+
+
+| 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") |
+
+## kr Type
+
+`object[]` ([ServerKeyResponse](serverdatastatus-definitions-serverkeyresponse.md))
diff --git a/docs/schema/serverdatastatus-properties-krq.md b/docs/schema/serverdatastatus-properties-krq.md
new file mode 100644
index 0000000..da54815
--- /dev/null
+++ b/docs/schema/serverdatastatus-properties-krq.md
@@ -0,0 +1,15 @@
+# Untitled array in ServerDataStatus Schema
+
+```txt
+https://timelimit.io/ServerDataStatus#/properties/krq
+```
+
+
+
+| 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") |
+
+## krq Type
+
+`object[]` ([ServerKeyRequest](serverdatastatus-definitions-serverkeyrequest.md))
diff --git a/docs/schema/serverdatastatus.md b/docs/schema/serverdatastatus.md
index 9392111..3b2ede4 100644
--- a/docs/schema/serverdatastatus.md
+++ b/docs/schema/serverdatastatus.md
@@ -19,6 +19,7 @@ https://timelimit.io/ServerDataStatus
| Property | Type | Required | Nullable | Defined by |
| :---------------------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------- |
| [devices](#devices) | `object` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicelist.md "https://timelimit.io/ServerDataStatus#/properties/devices") |
+| [devices2](#devices2) | `array` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-properties-devices2.md "https://timelimit.io/ServerDataStatus#/properties/devices2") |
| [apps](#apps) | `array` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-properties-apps.md "https://timelimit.io/ServerDataStatus#/properties/apps") |
| [rmCategories](#rmcategories) | `array` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-properties-rmcategories.md "https://timelimit.io/ServerDataStatus#/properties/rmCategories") |
| [categoryBase](#categorybase) | `array` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-properties-categorybase.md "https://timelimit.io/ServerDataStatus#/properties/categoryBase") |
@@ -27,6 +28,8 @@ https://timelimit.io/ServerDataStatus
| [rules](#rules) | `array` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-properties-rules.md "https://timelimit.io/ServerDataStatus#/properties/rules") |
| [tasks](#tasks) | `array` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-properties-tasks.md "https://timelimit.io/ServerDataStatus#/properties/tasks") |
| [users](#users) | `object` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serveruserlist.md "https://timelimit.io/ServerDataStatus#/properties/users") |
+| [krq](#krq) | `array` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-properties-krq.md "https://timelimit.io/ServerDataStatus#/properties/krq") |
+| [kr](#kr) | `array` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-properties-kr.md "https://timelimit.io/ServerDataStatus#/properties/kr") |
| [fullVersion](#fullversion) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-properties-fullversion.md "https://timelimit.io/ServerDataStatus#/properties/fullVersion") |
| [message](#message) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-properties-message.md "https://timelimit.io/ServerDataStatus#/properties/message") |
| [apiLevel](#apilevel) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-properties-apilevel.md "https://timelimit.io/ServerDataStatus#/properties/apiLevel") |
@@ -49,6 +52,24 @@ https://timelimit.io/ServerDataStatus
`object` ([ServerDeviceList](serverdatastatus-definitions-serverdevicelist.md))
+## devices2
+
+
+
+`devices2`
+
+* is optional
+
+* Type: `object[]` ([ServerExtendedDeviceData](serverdatastatus-definitions-serverextendeddevicedata.md))
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-properties-devices2.md "https://timelimit.io/ServerDataStatus#/properties/devices2")
+
+### devices2 Type
+
+`object[]` ([ServerExtendedDeviceData](serverdatastatus-definitions-serverextendeddevicedata.md))
+
## apps
@@ -193,6 +214,42 @@ https://timelimit.io/ServerDataStatus
`object` ([ServerUserList](serverdatastatus-definitions-serveruserlist.md))
+## krq
+
+
+
+`krq`
+
+* is optional
+
+* Type: `object[]` ([ServerKeyRequest](serverdatastatus-definitions-serverkeyrequest.md))
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-properties-krq.md "https://timelimit.io/ServerDataStatus#/properties/krq")
+
+### krq Type
+
+`object[]` ([ServerKeyRequest](serverdatastatus-definitions-serverkeyrequest.md))
+
+## kr
+
+
+
+`kr`
+
+* is optional
+
+* Type: `object[]` ([ServerKeyResponse](serverdatastatus-definitions-serverkeyresponse.md))
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-properties-kr.md "https://timelimit.io/ServerDataStatus#/properties/kr")
+
+### kr Type
+
+`object[]` ([ServerKeyResponse](serverdatastatus-definitions-serverkeyresponse.md))
+
## fullVersion
@@ -339,6 +396,7 @@ Reference this group by using
| [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") |
+| [pk](#pk) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-pk.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pk") |
### deviceId
@@ -990,6 +1048,24 @@ Reference this group by using
`number`
+### pk
+
+
+
+`pk`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverdevicedata-properties-pk.md "https://timelimit.io/ServerDataStatus#/definitions/ServerDeviceData/properties/pk")
+
+#### pk Type
+
+`string`
+
## Definitions group ProtectionLevel
Reference this group by using
@@ -1023,6 +1099,123 @@ Reference this group by using
| Property | Type | Required | Nullable | Defined by |
| :------- | :--- | :------- | :------- | :--------- |
+## Definitions group ServerExtendedDeviceData
+
+Reference this group by using
+
+```json
+{"$ref":"https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData"}
+```
+
+| Property | Type | Required | Nullable | Defined by |
+| :---------------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [deviceId](#deviceid-1) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverextendeddevicedata-properties-deviceid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/deviceId") |
+| [appsBase](#appsbase) | `object` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/appsBase") |
+| [appsDiff](#appsdiff) | `object` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/appsDiff") |
+
+### deviceId
+
+
+
+`deviceId`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverextendeddevicedata-properties-deviceid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/deviceId")
+
+#### deviceId Type
+
+`string`
+
+### appsBase
+
+
+
+`appsBase`
+
+* is optional
+
+* Type: `object` ([ServerCryptContainer](serverdatastatus-definitions-servercryptcontainer.md))
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/appsBase")
+
+#### appsBase Type
+
+`object` ([ServerCryptContainer](serverdatastatus-definitions-servercryptcontainer.md))
+
+### appsDiff
+
+
+
+`appsDiff`
+
+* is optional
+
+* Type: `object` ([ServerCryptContainer](serverdatastatus-definitions-servercryptcontainer.md))
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer.md "https://timelimit.io/ServerDataStatus#/definitions/ServerExtendedDeviceData/properties/appsDiff")
+
+#### appsDiff Type
+
+`object` ([ServerCryptContainer](serverdatastatus-definitions-servercryptcontainer.md))
+
+## Definitions group ServerCryptContainer
+
+Reference this group by using
+
+```json
+{"$ref":"https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer"}
+```
+
+| Property | Type | Required | Nullable | Defined by |
+| :-------------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [version](#version-1) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer/properties/version") |
+| [data](#data-1) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer-properties-data.md "https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer/properties/data") |
+
+### version
+
+
+
+`version`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer/properties/version")
+
+#### version Type
+
+`string`
+
+### data
+
+
+
+`data`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-servercryptcontainer-properties-data.md "https://timelimit.io/ServerDataStatus#/definitions/ServerCryptContainer/properties/data")
+
+#### data Type
+
+`string`
+
## Definitions group ServerInstalledAppsData
Reference this group by using
@@ -1033,8 +1226,8 @@ Reference this group by using
| Property | Type | Required | Nullable | Defined by |
| :------------------------ | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [deviceId](#deviceid-1) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverinstalledappsdata-properties-deviceid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/deviceId") |
-| [version](#version-1) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverinstalledappsdata-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/version") |
+| [deviceId](#deviceid-2) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverinstalledappsdata-properties-deviceid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/deviceId") |
+| [version](#version-2) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverinstalledappsdata-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/version") |
| [apps](#apps-1) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverinstalledappsdata-properties-apps.md "https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/apps") |
| [activities](#activities) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverinstalledappsdata-properties-activities.md "https://timelimit.io/ServerDataStatus#/definitions/ServerInstalledAppsData/properties/activities") |
@@ -1304,7 +1497,7 @@ Reference this group by using
| [extraTimeDay](#extratimeday) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-extratimeday.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/extraTimeDay") |
| [tempBlocked](#tempblocked) | `boolean` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-tempblocked.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/tempBlocked") |
| [tempBlockTime](#tempblocktime) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-tempblocktime.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/tempBlockTime") |
-| [version](#version-2) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/version") |
+| [version](#version-3) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/version") |
| [parentCategoryId](#parentcategoryid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-parentcategoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/parentCategoryId") |
| [blockAllNotifications](#blockallnotifications) | `boolean` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-blockallnotifications.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/blockAllNotifications") |
| [timeWarnings](#timewarnings) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorybasedata-properties-timewarnings.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryBaseData/properties/timeWarnings") |
@@ -1738,7 +1931,7 @@ Reference this group by using
| :-------------------------- | :------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [categoryId](#categoryid-1) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategoryassignedapps-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryAssignedApps/properties/categoryId") |
| [apps](#apps-2) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategoryassignedapps-properties-apps.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryAssignedApps/properties/apps") |
-| [version](#version-3) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategoryassignedapps-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryAssignedApps/properties/version") |
+| [version](#version-4) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategoryassignedapps-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryAssignedApps/properties/version") |
### categoryId
@@ -1807,7 +2000,7 @@ Reference this group by using
| [categoryId](#categoryid-2) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategoryusedtimes-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes/properties/categoryId") |
| [times](#times) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategoryusedtimes-properties-times.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes/properties/times") |
| [sessionDurations](#sessiondurations) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategoryusedtimes-properties-sessiondurations.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes/properties/sessionDurations") |
-| [version](#version-4) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategoryusedtimes-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes/properties/version") |
+| [version](#version-5) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategoryusedtimes-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryUsedTimes/properties/version") |
### categoryId
@@ -2106,7 +2299,7 @@ Reference this group by using
| Property | Type | Required | Nullable | Defined by |
| :-------------------------- | :------- | :------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [categoryId](#categoryid-3) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedtimelimitrules-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedTimeLimitRules/properties/categoryId") |
-| [version](#version-5) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedtimelimitrules-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedTimeLimitRules/properties/version") |
+| [version](#version-6) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedtimelimitrules-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedTimeLimitRules/properties/version") |
| [rules](#rules-1) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedtimelimitrules-properties-rules.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedTimeLimitRules/properties/rules") |
### categoryId
@@ -2356,7 +2549,7 @@ Reference this group by using
| Property | Type | Required | Nullable | Defined by |
| :-------------------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [categoryId](#categoryid-4) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorytasks-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTasks/properties/categoryId") |
-| [version](#version-6) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorytasks-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTasks/properties/version") |
+| [version](#version-7) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorytasks-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTasks/properties/version") |
| [tasks](#tasks-1) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverupdatedcategorytasks-properties-tasks.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUpdatedCategoryTasks/properties/tasks") |
### categoryId
@@ -2529,8 +2722,8 @@ Reference this group by using
| Property | Type | Required | Nullable | Defined by |
| :-------------------- | :------- | :------- | :------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| [version](#version-7) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serveruserlist-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUserList/properties/version") |
-| [data](#data-1) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serveruserlist-properties-data.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUserList/properties/data") |
+| [version](#version-8) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serveruserlist-properties-version.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUserList/properties/version") |
+| [data](#data-2) | `array` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serveruserlist-properties-data.md "https://timelimit.io/ServerDataStatus#/definitions/ServerUserList/properties/data") |
### version
@@ -2891,3 +3084,291 @@ Reference this group by using
#### pbd Type
`number`
+
+## Definitions group ServerKeyRequest
+
+Reference this group by using
+
+```json
+{"$ref":"https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest"}
+```
+
+| Property | Type | Required | Nullable | Defined by |
+| :-------------------------- | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [srvSeq](#srvseq) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-srvseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/srvSeq") |
+| [senId](#senid) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-senid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/senId") |
+| [senSeq](#senseq) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-senseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/senSeq") |
+| [deviceId](#deviceid-3) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-deviceid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/deviceId") |
+| [categoryId](#categoryid-5) | `string` | Optional | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/categoryId") |
+| [type](#type-1) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-type.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/type") |
+| [tempKey](#tempkey) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-tempkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/tempKey") |
+| [signature](#signature) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-signature.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/signature") |
+
+### srvSeq
+
+
+
+`srvSeq`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-srvseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/srvSeq")
+
+#### srvSeq Type
+
+`number`
+
+### senId
+
+
+
+`senId`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-senid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/senId")
+
+#### senId Type
+
+`string`
+
+### senSeq
+
+
+
+`senSeq`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-senseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/senSeq")
+
+#### senSeq Type
+
+`number`
+
+### deviceId
+
+
+
+`deviceId`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-deviceid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/deviceId")
+
+#### deviceId Type
+
+`string`
+
+### categoryId
+
+
+
+`categoryId`
+
+* is optional
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-categoryid.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/categoryId")
+
+#### categoryId Type
+
+`string`
+
+### type
+
+
+
+`type`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-type.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/type")
+
+#### type Type
+
+`number`
+
+### tempKey
+
+
+
+`tempKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-tempkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/tempKey")
+
+#### tempKey Type
+
+`string`
+
+### signature
+
+
+
+`signature`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyrequest-properties-signature.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyRequest/properties/signature")
+
+#### signature Type
+
+`string`
+
+## Definitions group ServerKeyResponse
+
+Reference this group by using
+
+```json
+{"$ref":"https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse"}
+```
+
+| Property | Type | Required | Nullable | Defined by |
+| :------------------------ | :------- | :------- | :------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| [srvSeq](#srvseq-1) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-srvseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/srvSeq") |
+| [sender](#sender) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-sender.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/sender") |
+| [rqSeq](#rqseq) | `number` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-rqseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/rqSeq") |
+| [tempKey](#tempkey-1) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-tempkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/tempKey") |
+| [cryptKey](#cryptkey) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-cryptkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/cryptKey") |
+| [signature](#signature-1) | `string` | Required | cannot be null | [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-signature.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/signature") |
+
+### srvSeq
+
+
+
+`srvSeq`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-srvseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/srvSeq")
+
+#### srvSeq Type
+
+`number`
+
+### sender
+
+
+
+`sender`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-sender.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/sender")
+
+#### sender Type
+
+`string`
+
+### rqSeq
+
+
+
+`rqSeq`
+
+* is required
+
+* Type: `number`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-rqseq.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/rqSeq")
+
+#### rqSeq Type
+
+`number`
+
+### tempKey
+
+
+
+`tempKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-tempkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/tempKey")
+
+#### tempKey Type
+
+`string`
+
+### cryptKey
+
+
+
+`cryptKey`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-cryptkey.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/cryptKey")
+
+#### cryptKey Type
+
+`string`
+
+### signature
+
+
+
+`signature`
+
+* is required
+
+* Type: `string`
+
+* cannot be null
+
+* defined in: [ServerDataStatus](serverdatastatus-definitions-serverkeyresponse-properties-signature.md "https://timelimit.io/ServerDataStatus#/definitions/ServerKeyResponse/properties/signature")
+
+#### signature Type
+
+`string`
diff --git a/src/action/finishkeyrequest.ts b/src/action/finishkeyrequest.ts
new file mode 100644
index 0000000..2558eaa
--- /dev/null
+++ b/src/action/finishkeyrequest.ts
@@ -0,0 +1,44 @@
+/*
+ * 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 { AppLogicAction } from './basetypes'
+import { assertSafeInteger } from './meta/util'
+
+const actionType = 'FinishKeyRequestAction'
+
+export class FinishKeyRequestAction extends AppLogicAction {
+ readonly deviceSequenceNumber: number
+
+ constructor ({ deviceSequenceNumber }: { deviceSequenceNumber: number }) {
+ super()
+
+ assertSafeInteger({ value: deviceSequenceNumber, field: 'deviceSequenceNumber', actionType })
+
+ this.deviceSequenceNumber = deviceSequenceNumber
+ }
+
+ static parse = ({ dsn }: SerializedFinishKeyRequestAction) => (
+ new FinishKeyRequestAction({
+ deviceSequenceNumber: dsn,
+ })
+ )
+}
+
+export interface SerializedFinishKeyRequestAction {
+ type: 'FINISH_KEY_REQUEST'
+ dsn: number
+}
diff --git a/src/action/index.ts b/src/action/index.ts
index 49663ca..d4fcb51 100644
--- a/src/action/index.ts
+++ b/src/action/index.ts
@@ -1,6 +1,6 @@
/*
* server component for the TimeLimit App
- * Copyright (C) 2019 - 2021 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
@@ -30,6 +30,7 @@ export { CreateCategoryAction } from './createcategory'
export { CreateTimeLimitRuleAction } from './createtimelimitrule'
export { DeleteCategoryAction } from './deletecategory'
export { DeleteTimeLimitRuleAction } from './deletetimelimitrule'
+export { FinishKeyRequestAction } from './finishkeyrequest'
export { ForceSyncAction } from './forcesync'
export { IgnoreManipulationAction } from './ignoremanipulation'
export { IncrementCategoryExtraTimeAction } from './incrementcategoryextratime'
@@ -38,6 +39,7 @@ export { RemoveInstalledAppsAction } from './removeinstalledapps'
export { RemoveUserAction } from './removeuser'
export { ResetCategoryNetworkIdsAction } from './resetcategorynetworkids'
export { RenameChildAction } from './renamechild'
+export { ReplyToKeyRequestAction } from './replytokeyrequest'
export { SetCategoryExtraTimeAction } from './setcategoryextratime'
export { SetCategoryForUnassignedAppsAction } from './setcategoryforunassignedapps'
export { SetChildPasswordAction } from './setchildpassword'
@@ -66,6 +68,7 @@ export { UpdateCategoryTitleAction } from './updatecategorytitle'
export { UpdateDeviceNameAction } from './updatedevicename'
export { UpdateDeviceStatusAction } from './updatedevicestatus'
export { UpdateEnableActivityLevelBlockingAction } from './updateenableactivitylevelblocking'
+export { UpdateInstalledAppsAction } from './updateinstalledapps'
export { UpdateNetworkTimeVerificationAction } from './updatenetworktimeverification'
export { UpdateParentNotificationFlagsAction } from './updateparentnotificationflags'
export { UpdateTimelimitRuleAction } from './updatetimelimitrule'
@@ -76,3 +79,5 @@ export { DeleteChildTaskAction } from './deletechildtaskaction'
export { UpdateChildTaskAction } from './updatechildtaskaction'
export { ReviewChildTaskAction } from './reviewchildtaskaction'
export { UpdateUserLimitLoginPreBlockDuration } from './updateuserlimitloginpreblockduration'
+export { UploadDevicePublicKeyAction } from './uploaddevicepublickey'
+export { SendKeyRequestAction } from './sendkeyrequest'
diff --git a/src/action/replytokeyrequest.ts b/src/action/replytokeyrequest.ts
new file mode 100644
index 0000000..74cdd4d
--- /dev/null
+++ b/src/action/replytokeyrequest.ts
@@ -0,0 +1,74 @@
+/*
+ * 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 { AppLogicAction } from './basetypes'
+import { InvalidActionParameterException } from './meta/exception'
+import { assertSafeInteger } from './meta/util'
+
+const actionType = 'ReplyToKeyRequestAction'
+
+export class ReplyToKeyRequestAction extends AppLogicAction {
+ readonly requestServerSequenceNumber: number
+ readonly tempKey: Buffer
+ readonly encryptedKey: Buffer
+ readonly signature: Buffer
+
+ constructor ({
+ requestServerSequenceNumber,
+ tempKey,
+ encryptedKey,
+ signature
+ }: {
+ requestServerSequenceNumber: number
+ tempKey: Buffer
+ encryptedKey: Buffer
+ signature: Buffer
+ }) {
+ super()
+
+ assertSafeInteger({ value: requestServerSequenceNumber, field: 'requestServerSequenceNumber', actionType })
+
+ if (tempKey.length !== 32 || encryptedKey.length !== 16 || signature.length !== 64) {
+ throw new InvalidActionParameterException({
+ actionType,
+ staticMessage: 'key/signature has wrong length'
+ })
+ }
+
+ this.requestServerSequenceNumber = requestServerSequenceNumber
+ this.tempKey = tempKey
+ this.encryptedKey = encryptedKey
+ this.signature = signature
+ }
+
+ static parse = ({ rsn, tempKey, encryptedKey, signature }: SerializedReplyToKeyRequestAction) => (
+ new ReplyToKeyRequestAction({
+ requestServerSequenceNumber: rsn,
+ tempKey: Buffer.from(tempKey, 'base64'),
+ encryptedKey: Buffer.from(encryptedKey, 'base64'),
+ signature: Buffer.from(signature, 'base64')
+ })
+ )
+}
+
+export interface SerializedReplyToKeyRequestAction {
+ type: 'REPLY_TO_KEY_REQUEST'
+ rsn: number
+ tempKey: string
+ encryptedKey: string
+ signature: string
+}
diff --git a/src/action/sendkeyrequest.ts b/src/action/sendkeyrequest.ts
new file mode 100644
index 0000000..a4bbbec
--- /dev/null
+++ b/src/action/sendkeyrequest.ts
@@ -0,0 +1,110 @@
+/*
+ * 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 { AppLogicAction } from './basetypes'
+import { InvalidActionParameterException } from './meta/exception'
+import { assertIdWithinFamily, assertSafeInteger } from './meta/util'
+import { types } from '../database/keyrequest'
+
+const actionType = 'SendKeyRequestAction'
+
+export class SendKeyRequestAction extends AppLogicAction {
+ readonly deviceSequenceNumber: number
+ readonly deviceId?: string
+ readonly categoryId?: string
+ readonly type: number
+ readonly tempKey: Buffer
+ readonly signature: Buffer
+
+ constructor ({
+ deviceSequenceNumber,
+ deviceId,
+ categoryId,
+ type,
+ tempKey,
+ signature
+ }: {
+ deviceSequenceNumber: number
+ deviceId?: string
+ categoryId?: string
+ type: number
+ tempKey: Buffer
+ signature: Buffer
+ }) {
+ super()
+
+ assertSafeInteger({ value: deviceSequenceNumber, field: 'deviceSequenceNumber', actionType })
+ assertSafeInteger({ value: type, field: 'deviceSequenceNumber', actionType })
+
+ if (tempKey.length != 32 || signature.length != 64) {
+ throw new InvalidActionParameterException({
+ actionType,
+ staticMessage: 'key/signature has wrong length'
+ })
+ }
+
+ if (deviceId !== undefined) {
+ assertIdWithinFamily({ value: deviceId, actionType, field: 'deviceId' })
+ }
+
+ if (categoryId !== undefined) {
+ assertIdWithinFamily({ value: categoryId, actionType, field: 'categoryId' })
+ }
+
+ if (deviceId !== undefined && categoryId !== undefined) {
+ throw new InvalidActionParameterException({
+ actionType,
+ staticMessage: 'can not specify device and category at the same time'
+ })
+ }
+
+ if (types.all.indexOf(type) === -1) {
+ throw new InvalidActionParameterException({
+ actionType,
+ staticMessage: 'invalid type'
+ })
+ }
+
+ this.deviceSequenceNumber = deviceSequenceNumber
+ this.deviceId = deviceId
+ this.categoryId = categoryId
+ this.type = type
+ this.tempKey = tempKey
+ this.signature = signature
+ }
+
+ static parse = ({ dsn, deviceId, categoryId, dataType, tempKey, signature }: SerializedSendKeyRequestAction) => (
+ new SendKeyRequestAction({
+ deviceSequenceNumber: dsn,
+ deviceId,
+ categoryId,
+ type: dataType,
+ tempKey: Buffer.from(tempKey, 'base64'),
+ signature: Buffer.from(signature, 'base64')
+ })
+ )
+}
+
+export interface SerializedSendKeyRequestAction {
+ type: 'SEND_KEY_REQUEST'
+ dsn: number
+ deviceId?: string
+ categoryId?: string
+ dataType: number
+ tempKey: string
+ signature: string
+}
diff --git a/src/action/serialization/applogicaction.ts b/src/action/serialization/applogicaction.ts
index ab84d16..2aabcef 100644
--- a/src/action/serialization/applogicaction.ts
+++ b/src/action/serialization/applogicaction.ts
@@ -19,26 +19,36 @@ import { AddInstalledAppsAction, SerializedAddInstalledAppsAction } from '../add
import { AddUsedTimeAction, SerializedAddUsedTimeAction } from '../addusedtime'
import { AddUsedTimeActionVersion2, SerializedAddUsedTimeActionVersion2 } from '../addusedtime2'
import { AppLogicAction } from '../basetypes'
+import { FinishKeyRequestAction, SerializedFinishKeyRequestAction } from '../finishkeyrequest'
import { ForceSyncAction, SerializedForceSyncAction } from '../forcesync'
+import { ReplyToKeyRequestAction, SerializedReplyToKeyRequestAction } from '../replytokeyrequest'
import { MarkTaskPendingAction, SerializedMarkTaskPendingAction } from '../marktaskpendingaction'
import { UnknownActionTypeException } from '../meta/exception'
+import { UpdateInstalledAppsAction, SerializedUpdateInstalledAppsAction } from '../updateinstalledapps'
import { RemoveInstalledAppsAction, SerializedRemoveInstalledAppsAction } from '../removeinstalledapps'
+import { SendKeyRequestAction, SerializedSendKeyRequestAction } from '../sendkeyrequest'
import { SerializedSignOutAtDeviceAction, SignOutAtDeviceAction } from '../signoutatdevice'
import { SerialiezdTriedDisablingDeviceAdminAction, TriedDisablingDeviceAdminAction } from '../trieddisablingdeviceadmin'
import { SerializedUpdateAppActivitiesAction, UpdateAppActivitiesAction } from '../updateappactivities'
import { SerializedUpdateDeviceStatusAction, UpdateDeviceStatusAction } from '../updatedevicestatus'
+import { SerializedUploadDevicePublicKeyAction, UploadDevicePublicKeyAction } from '../uploaddevicepublickey'
export type SerializedAppLogicAction =
SerializedAddInstalledAppsAction |
SerializedAddUsedTimeAction |
SerializedAddUsedTimeActionVersion2 |
+ SerializedFinishKeyRequestAction |
SerializedForceSyncAction |
+ SerializedReplyToKeyRequestAction |
SerializedMarkTaskPendingAction |
+ SerializedUpdateInstalledAppsAction |
SerializedRemoveInstalledAppsAction |
+ SerializedSendKeyRequestAction |
SerializedSignOutAtDeviceAction |
SerialiezdTriedDisablingDeviceAdminAction |
SerializedUpdateAppActivitiesAction |
- SerializedUpdateDeviceStatusAction
+ SerializedUpdateDeviceStatusAction |
+ SerializedUploadDevicePublicKeyAction
export const parseAppLogicAction = (serialized: SerializedAppLogicAction): AppLogicAction => {
if (serialized.type === 'ADD_USED_TIME') {
@@ -47,12 +57,20 @@ export const parseAppLogicAction = (serialized: SerializedAppLogicAction): AppLo
return AddUsedTimeActionVersion2.parse(serialized)
} else if (serialized.type === 'ADD_INSTALLED_APPS') {
return AddInstalledAppsAction.parse(serialized)
+ } else if (serialized.type === 'FINISH_KEY_REQUEST') {
+ return FinishKeyRequestAction.parse(serialized)
} else if (serialized.type === 'FORCE_SYNC') {
return ForceSyncAction.instance
+ } else if (serialized.type === 'REPLY_TO_KEY_REQUEST') {
+ return ReplyToKeyRequestAction.parse(serialized)
} else if (serialized.type === 'MARK_TASK_PENDING') {
return MarkTaskPendingAction.parse(serialized)
+ } else if (serialized.type === 'UPDATE_INSTALLED_APPS') {
+ return UpdateInstalledAppsAction.parse(serialized)
} else if (serialized.type === 'REMOVE_INSTALLED_APPS') {
return RemoveInstalledAppsAction.parse(serialized)
+ } else if (serialized.type === 'SEND_KEY_REQUEST') {
+ return SendKeyRequestAction.parse(serialized)
} else if (serialized.type === 'SIGN_OUT_AT_DEVICE') {
return SignOutAtDeviceAction.instance
} else if (serialized.type === 'TRIED_DISABLING_DEVICE_ADMIN') {
@@ -61,6 +79,8 @@ export const parseAppLogicAction = (serialized: SerializedAppLogicAction): AppLo
return UpdateAppActivitiesAction.parse(serialized)
} else if (serialized.type === 'UPDATE_DEVICE_STATUS') {
return UpdateDeviceStatusAction.parse(serialized)
+ } else if (serialized.type === 'UPLOAD_DEVICE_PUBLIC_KEY') {
+ return UploadDevicePublicKeyAction.parse(serialized)
} else {
throw new UnknownActionTypeException({ group: 'app logic' })
}
diff --git a/src/action/updateinstalledapps.ts b/src/action/updateinstalledapps.ts
new file mode 100644
index 0000000..31fa979
--- /dev/null
+++ b/src/action/updateinstalledapps.ts
@@ -0,0 +1,69 @@
+/*
+ * 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 { AppLogicAction } from './basetypes'
+import { InvalidActionParameterException } from './meta/exception'
+
+const actionType = 'UpdateInstalledAppsAction'
+const SIZE_LIMIT = 1024 * 256
+
+export class UpdateInstalledAppsAction extends AppLogicAction {
+ readonly base?: Buffer
+ readonly diff?: Buffer
+ readonly wipe: boolean
+
+ constructor ({ base, diff, wipe }: {
+ base?: Buffer,
+ diff?: Buffer,
+ wipe: boolean
+ }) {
+ super()
+
+ if (base && base.length > SIZE_LIMIT) {
+ throw new InvalidActionParameterException({
+ actionType,
+ staticMessage: 'base data too big'
+ })
+ }
+
+ if (diff && diff.length > SIZE_LIMIT) {
+ throw new InvalidActionParameterException({
+ actionType,
+ staticMessage: 'diff data too big'
+ })
+ }
+
+ this.base = base
+ this.diff = diff
+ this.wipe = wipe
+ }
+
+ static parse = ({ b, d, w }: SerializedUpdateInstalledAppsAction) => (
+ new UpdateInstalledAppsAction({
+ base: b !== undefined ? Buffer.from(b, 'base64') : undefined,
+ diff: d !== undefined ? Buffer.from(d, 'base64') : undefined,
+ wipe: w
+ })
+ )
+}
+
+export interface SerializedUpdateInstalledAppsAction {
+ type: 'UPDATE_INSTALLED_APPS'
+ b?: string
+ d?: string
+ w: boolean
+}
diff --git a/src/action/uploaddevicepublickey.ts b/src/action/uploaddevicepublickey.ts
new file mode 100644
index 0000000..a136f6e
--- /dev/null
+++ b/src/action/uploaddevicepublickey.ts
@@ -0,0 +1,49 @@
+/*
+ * 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 { AppLogicAction } from './basetypes'
+import { InvalidActionParameterException } from './meta/exception'
+
+const actionType = 'UploadDevicePublicKeyAction'
+
+export class UploadDevicePublicKeyAction extends AppLogicAction {
+ readonly key: Buffer
+
+ constructor ({ key }: { key: Buffer }) {
+ super()
+
+ if (key.length !== 32) {
+ throw new InvalidActionParameterException({
+ actionType,
+ staticMessage: 'key has wrong length'
+ })
+ }
+
+ this.key = key
+ }
+
+ static parse = ({ key }: SerializedUploadDevicePublicKeyAction) => (
+ new UploadDevicePublicKeyAction({
+ key: Buffer.from(key, 'base64')
+ })
+ )
+}
+
+export interface SerializedUploadDevicePublicKeyAction {
+ type: 'UPLOAD_DEVICE_PUBLIC_KEY'
+ key: string
+}
diff --git a/src/api/sync.ts b/src/api/sync.ts
index 88c8755..224d892 100644
--- a/src/api/sync.ts
+++ b/src/api/sync.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
@@ -90,7 +90,7 @@ export const createSyncRouter = ({ database, websocket, connectedDevicesManager,
where: {
deviceAuthToken: body.deviceAuthToken
},
- attributes: ['familyId', 'lastConnectivity'],
+ attributes: ['familyId', 'deviceId', 'lastConnectivity'],
transaction
})
@@ -98,7 +98,7 @@ export const createSyncRouter = ({ database, websocket, connectedDevicesManager,
throw new Unauthorized()
}
- const { familyId, lastConnectivity } = deviceEntryUnsafe
+ const { familyId, deviceId, lastConnectivity } = deviceEntryUnsafe
const now = getRoundedTimestampForLastConnectivity()
if (parseInt(lastConnectivity, 10) !== now) {
@@ -115,6 +115,7 @@ export const createSyncRouter = ({ database, websocket, connectedDevicesManager,
return generateServerDataStatus({
database,
familyId,
+ deviceId,
clientStatus: body.status,
transaction
})
diff --git a/src/api/validator.ts b/src/api/validator.ts
index b59c7df..da15c92 100644
--- a/src/api/validator.ts
+++ b/src/api/validator.ts
@@ -60,6 +60,18 @@ const definitions = {
},
"clientLevel": {
"type": "number"
+ },
+ "devicesDetail": {
+ "type": "object",
+ "additionalProperties": {
+ "$ref": "#/definitions/DeviceDataStatus"
+ }
+ },
+ "kri": {
+ "type": "number"
+ },
+ "kr": {
+ "type": "number"
}
},
"additionalProperties": false,
@@ -97,6 +109,18 @@ const definitions = {
"usedTime"
]
},
+ "DeviceDataStatus": {
+ "type": "object",
+ "properties": {
+ "appsB": {
+ "type": "string"
+ },
+ "appsD": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
"ParentPassword": {
"type": "object",
"properties": {
@@ -1555,6 +1579,25 @@ const definitions = {
"type"
]
},
+ "SerializedFinishKeyRequestAction": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "FINISH_KEY_REQUEST"
+ ]
+ },
+ "dsn": {
+ "type": "number"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "dsn",
+ "type"
+ ]
+ },
"SerializedForceSyncAction": {
"type": "object",
"properties": {
@@ -1570,6 +1613,37 @@ const definitions = {
"type"
]
},
+ "SerializedReplyToKeyRequestAction": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "REPLY_TO_KEY_REQUEST"
+ ]
+ },
+ "rsn": {
+ "type": "number"
+ },
+ "tempKey": {
+ "type": "string"
+ },
+ "encryptedKey": {
+ "type": "string"
+ },
+ "signature": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "encryptedKey",
+ "rsn",
+ "signature",
+ "tempKey",
+ "type"
+ ]
+ },
"SerializedMarkTaskPendingAction": {
"type": "object",
"properties": {
@@ -1589,6 +1663,31 @@ const definitions = {
"type"
]
},
+ "SerializedUpdateInstalledAppsAction": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "UPDATE_INSTALLED_APPS"
+ ]
+ },
+ "b": {
+ "type": "string"
+ },
+ "d": {
+ "type": "string"
+ },
+ "w": {
+ "type": "boolean"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "type",
+ "w"
+ ]
+ },
"SerializedRemoveInstalledAppsAction": {
"type": "object",
"properties": {
@@ -1611,6 +1710,43 @@ const definitions = {
"type"
]
},
+ "SerializedSendKeyRequestAction": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "SEND_KEY_REQUEST"
+ ]
+ },
+ "dsn": {
+ "type": "number"
+ },
+ "deviceId": {
+ "type": "string"
+ },
+ "categoryId": {
+ "type": "string"
+ },
+ "dataType": {
+ "type": "number"
+ },
+ "tempKey": {
+ "type": "string"
+ },
+ "signature": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "dataType",
+ "dsn",
+ "signature",
+ "tempKey",
+ "type"
+ ]
+ },
"SerializedSignOutAtDeviceAction": {
"type": "object",
"properties": {
@@ -1763,6 +1899,25 @@ const definitions = {
"type"
]
},
+ "SerializedUploadDevicePublicKeyAction": {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string",
+ "enum": [
+ "UPLOAD_DEVICE_PUBLIC_KEY"
+ ]
+ },
+ "key": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "key",
+ "type"
+ ]
+ },
"SerializedChildChangePasswordAction": {
"type": "object",
"properties": {
@@ -1916,6 +2071,9 @@ const definitions = {
},
"mFlags": {
"type": "number"
+ },
+ "pk": {
+ "type": "string"
}
},
"additionalProperties": false,
@@ -1978,6 +2136,40 @@ const definitions = {
],
"type": "string"
},
+ "ServerExtendedDeviceData": {
+ "type": "object",
+ "properties": {
+ "deviceId": {
+ "type": "string"
+ },
+ "appsBase": {
+ "$ref": "#/definitions/ServerCryptContainer"
+ },
+ "appsDiff": {
+ "$ref": "#/definitions/ServerCryptContainer"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "deviceId"
+ ]
+ },
+ "ServerCryptContainer": {
+ "type": "object",
+ "properties": {
+ "version": {
+ "type": "string"
+ },
+ "data": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "data",
+ "version"
+ ]
+ },
"ServerInstalledAppsData": {
"type": "object",
"properties": {
@@ -2443,6 +2635,76 @@ const definitions = {
"timeZone",
"type"
]
+ },
+ "ServerKeyRequest": {
+ "type": "object",
+ "properties": {
+ "srvSeq": {
+ "type": "number"
+ },
+ "senId": {
+ "type": "string"
+ },
+ "senSeq": {
+ "type": "number"
+ },
+ "deviceId": {
+ "type": "string"
+ },
+ "categoryId": {
+ "type": "string"
+ },
+ "type": {
+ "type": "number"
+ },
+ "tempKey": {
+ "type": "string"
+ },
+ "signature": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "senId",
+ "senSeq",
+ "signature",
+ "srvSeq",
+ "tempKey",
+ "type"
+ ]
+ },
+ "ServerKeyResponse": {
+ "type": "object",
+ "properties": {
+ "srvSeq": {
+ "type": "number"
+ },
+ "sender": {
+ "type": "string"
+ },
+ "rqSeq": {
+ "type": "number"
+ },
+ "tempKey": {
+ "type": "string"
+ },
+ "cryptKey": {
+ "type": "string"
+ },
+ "signature": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false,
+ "required": [
+ "cryptKey",
+ "rqSeq",
+ "sender",
+ "signature",
+ "srvSeq",
+ "tempKey"
+ ]
}
}
@@ -2753,15 +3015,27 @@ export const isSerializedAppLogicAction: (value: unknown) => value is Serialized
{
"$ref": "#/definitions/SerializedAddUsedTimeActionVersion2"
},
+ {
+ "$ref": "#/definitions/SerializedFinishKeyRequestAction"
+ },
{
"$ref": "#/definitions/SerializedForceSyncAction"
},
+ {
+ "$ref": "#/definitions/SerializedReplyToKeyRequestAction"
+ },
{
"$ref": "#/definitions/SerializedMarkTaskPendingAction"
},
+ {
+ "$ref": "#/definitions/SerializedUpdateInstalledAppsAction"
+ },
{
"$ref": "#/definitions/SerializedRemoveInstalledAppsAction"
},
+ {
+ "$ref": "#/definitions/SerializedSendKeyRequestAction"
+ },
{
"$ref": "#/definitions/SerializedSignOutAtDeviceAction"
},
@@ -2773,6 +3047,9 @@ export const isSerializedAppLogicAction: (value: unknown) => value is Serialized
},
{
"$ref": "#/definitions/SerializedUpdateDeviceStatusAction"
+ },
+ {
+ "$ref": "#/definitions/SerializedUploadDevicePublicKeyAction"
}
],
"definitions": definitions,
diff --git a/src/database/device.ts b/src/database/device.ts
index d74f551..9b9413c 100644
--- a/src/database/device.ts
+++ b/src/database/device.ts
@@ -111,11 +111,19 @@ export interface DeviceAttributesVersion12 {
manipulationFlags: number
}
+export interface DeviceAttributesVersion13 {
+ publicKey: Buffer | null
+}
+
+export interface DeviceAttributesVersion14 {
+ nextKeyReplySequenceNumber: string
+}
+
export type DeviceAttributes = DeviceAttributesVersion1 & DeviceAttributesVersion2 &
DeviceAttributesVersion3 & DeviceAttributesVersion4 & DeviceAttributesVersion5 &
DeviceAttributesVersion6 & DeviceAttributesVersion7 & DeviceAttributesVersion8 &
DeviceAttributesVersion9 & DeviceAttributesVersion10 & DeviceAttributesVersion11 &
- DeviceAttributesVersion12
+ DeviceAttributesVersion12 & DeviceAttributesVersion13 & DeviceAttributesVersion14
export type DeviceModel = Sequelize.Model & DeviceAttributes
export type DeviceModelStatic = typeof Sequelize.Model & {
@@ -281,6 +289,22 @@ export const attributesVersion12: SequelizeAttributes
}
}
+export const attributesVersion13: SequelizeAttributes = {
+ publicKey: {
+ type: Sequelize.BLOB,
+ allowNull: true,
+ defaultValue: null
+ }
+}
+
+export const attributesVersion14: SequelizeAttributes = {
+ nextKeyReplySequenceNumber: {
+ type: Sequelize.BIGINT,
+ allowNull: false,
+ defaultValue: 1
+ }
+}
+
export const attributes: SequelizeAttributes = {
...attributesVersion1,
...attributesVersion2,
@@ -293,7 +317,9 @@ export const attributes: SequelizeAttributes = {
...attributesVersion9,
...attributesVersion10,
...attributesVersion11,
- ...attributesVersion12
+ ...attributesVersion12,
+ ...attributesVersion13,
+ ...attributesVersion14
}
export const createDeviceModel = (sequelize: Sequelize.Sequelize): DeviceModelStatic => sequelize.define('Device', attributes) as DeviceModelStatic
diff --git a/src/database/encryptedapplist.ts b/src/database/encryptedapplist.ts
new file mode 100644
index 0000000..cd3f88c
--- /dev/null
+++ b/src/database/encryptedapplist.ts
@@ -0,0 +1,66 @@
+/*
+ * 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 * as Sequelize from 'sequelize'
+import { familyIdColumn, idWithinFamilyColumn, versionColumn } from './columns'
+import { SequelizeAttributes } from './types'
+
+export interface EncryptedAppListAttributes {
+ familyId: string
+ deviceId: string
+ type: number
+ version: string
+ data: Buffer
+}
+
+export const types = {
+ base: 1,
+ diff: 2
+}
+
+export type EncryptedAppListModel = Sequelize.Model & EncryptedAppListAttributes
+export type EncryptedAppListModelStatic = typeof Sequelize.Model & {
+ new (values?: object, options?: Sequelize.BuildOptions): EncryptedAppListModel;
+}
+
+export const attributes: SequelizeAttributes = {
+ familyId: {
+ ...familyIdColumn,
+ primaryKey: true
+ },
+ deviceId: {
+ ...idWithinFamilyColumn,
+ primaryKey: true
+ },
+ type: {
+ type: Sequelize.INTEGER,
+ primaryKey: true,
+ validate: {
+ min: 1,
+ max: 2
+ }
+ },
+ version: {
+ ...versionColumn
+ },
+ data: {
+ type: Sequelize.BLOB,
+ allowNull: false
+ }
+}
+
+export const createEncryptedAppListModel = (sequelize: Sequelize.Sequelize): EncryptedAppListModelStatic => sequelize.define('EncryptedAppList', attributes) as EncryptedAppListModelStatic
diff --git a/src/database/family.ts b/src/database/family.ts
index 00d3364..565c221 100644
--- a/src/database/family.ts
+++ b/src/database/family.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
@@ -19,7 +19,7 @@ import * as Sequelize from 'sequelize'
import { booleanColumn, familyIdColumn, optionalLabelColumn, timestampColumn, versionColumn } from './columns'
import { SequelizeAttributes } from './types'
-export interface FamilyAttributes {
+export interface FamilyAttributesVersion1 {
familyId: string
name: string
createdAt: string
@@ -29,12 +29,18 @@ export interface FamilyAttributes {
hasFullVersion: boolean
}
+export interface FamilyAttributesVersion2 {
+ nextServerKeyRequestSeq: string
+}
+
+export type FamilyAttributes = FamilyAttributesVersion1 & FamilyAttributesVersion2
+
export type FamilyModel = Sequelize.Model & FamilyAttributes
export type FamilyModelStatic = typeof Sequelize.Model & {
new (values?: object, options?: Sequelize.BuildOptions): FamilyModel;
}
-export const attributes: SequelizeAttributes = {
+export const attributesVersion1: SequelizeAttributes = {
familyId: {
...familyIdColumn,
primaryKey: true
@@ -47,4 +53,20 @@ export const attributes: SequelizeAttributes = {
hasFullVersion: { ...booleanColumn }
}
+export const attributesVersion2: SequelizeAttributes = {
+ nextServerKeyRequestSeq: {
+ type: Sequelize.BIGINT,
+ allowNull: false,
+ defaultValue: 1,
+ validate: {
+ min: 1
+ }
+ }
+}
+
+export const attributes: SequelizeAttributes = {
+ ...attributesVersion1,
+ ...attributesVersion2
+}
+
export const createFamilyModel = (sequelize: Sequelize.Sequelize): FamilyModelStatic => sequelize.define('Family', attributes) as FamilyModelStatic
diff --git a/src/database/keyrequest.ts b/src/database/keyrequest.ts
new file mode 100644
index 0000000..70a068a
--- /dev/null
+++ b/src/database/keyrequest.ts
@@ -0,0 +1,87 @@
+/*
+ * 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 * as Sequelize from 'sequelize'
+import { familyIdColumn, idWithinFamilyColumn } from './columns'
+import { SequelizeAttributes } from './types'
+
+export interface KeyRequestAttributes {
+ familyId: string
+ serverSequenceNumber: string
+ senderDeviceId: string
+ senderSequenceNumber: string
+ deviceId: string | null
+ categoryId: string | null
+ type: number
+ tempKey: Buffer
+ signature: Buffer
+}
+
+export const types = {
+ appListBase: 1,
+ appListDiff: 2,
+ all: [1, 2]
+}
+
+export type KeyRequestModel = Sequelize.Model & KeyRequestAttributes
+export type KeyRequestModelStatic = typeof Sequelize.Model & {
+ new (values?: object, options?: Sequelize.BuildOptions): KeyRequestModel;
+}
+
+export const attributes: SequelizeAttributes = {
+ familyId: {
+ ...familyIdColumn,
+ primaryKey: true
+ },
+ serverSequenceNumber: {
+ type: Sequelize.BIGINT,
+ primaryKey: true,
+ allowNull: false
+ },
+ senderDeviceId: {
+ ...idWithinFamilyColumn
+ },
+ senderSequenceNumber: {
+ type: Sequelize.BIGINT,
+ allowNull: false
+ },
+ deviceId: {
+ ...idWithinFamilyColumn,
+ allowNull: true
+ },
+ categoryId: {
+ ...idWithinFamilyColumn,
+ allowNull: true
+ },
+ type: {
+ type: Sequelize.INTEGER,
+ allowNull: false,
+ validate: {
+ isIn: [types.all]
+ }
+ },
+ tempKey: {
+ type: Sequelize.BLOB,
+ allowNull: false
+ },
+ signature: {
+ type: Sequelize.BLOB,
+ allowNull: false
+ }
+}
+
+export const createKeyRequestModel = (sequelize: Sequelize.Sequelize): KeyRequestModelStatic => sequelize.define('KeyRequest', attributes) as KeyRequestModelStatic
diff --git a/src/database/keyresponse.ts b/src/database/keyresponse.ts
new file mode 100644
index 0000000..01edaed
--- /dev/null
+++ b/src/database/keyresponse.ts
@@ -0,0 +1,77 @@
+/*
+ * 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 * as Sequelize from 'sequelize'
+import { familyIdColumn, idWithinFamilyColumn } from './columns'
+import { SequelizeAttributes } from './types'
+
+export interface KeyResponseAttributes {
+ familyId: string
+ receiverDeviceId: string
+ requestServerSequenceNumber: string // fk to request table with familyId
+ senderDeviceId: string // pk up to this
+ replyServerSequenceNumber: string // unique with familyId, receiverDeviceId
+ requestClientSequenceNumber: string
+ tempKey: Buffer
+ encryptedKey: Buffer
+ signature: Buffer
+}
+
+export type KeyResponseModel = Sequelize.Model & KeyResponseAttributes
+export type KeyResponseModelStatic = typeof Sequelize.Model & {
+ new (values?: object, options?: Sequelize.BuildOptions): KeyResponseModel;
+}
+
+export const attributes: SequelizeAttributes = {
+ familyId: {
+ ...familyIdColumn,
+ primaryKey: true
+ },
+ receiverDeviceId: {
+ ...idWithinFamilyColumn
+ },
+ requestServerSequenceNumber: {
+ type: Sequelize.BIGINT,
+ primaryKey: true,
+ allowNull: false
+ },
+ senderDeviceId: {
+ ...idWithinFamilyColumn
+ },
+ replyServerSequenceNumber: {
+ type: Sequelize.BIGINT,
+ allowNull: false
+ },
+ requestClientSequenceNumber: {
+ type: Sequelize.BIGINT,
+ allowNull: false
+ },
+ tempKey: {
+ type: Sequelize.BLOB,
+ allowNull: false
+ },
+ encryptedKey: {
+ type: Sequelize.BLOB,
+ allowNull: false
+ },
+ signature: {
+ type: Sequelize.BLOB,
+ allowNull: false
+ }
+}
+
+export const createKeyResponseModel = (sequelize: Sequelize.Sequelize): KeyResponseModelStatic => sequelize.define('KeyResponse', attributes) as KeyResponseModelStatic
diff --git a/src/database/main.ts b/src/database/main.ts
index ed96c8a..95ed3b8 100644
--- a/src/database/main.ts
+++ b/src/database/main.ts
@@ -27,7 +27,10 @@ import { CategoryTimeWarningModelStatic, createCategoryTimeWarningModel } from '
import { ChildTaskModelStatic, createChildTaskModel } from './childtask'
import { ConfigModelStatic, createConfigModel } from './config'
import { createDeviceModel, DeviceModelStatic } from './device'
+import { createEncryptedAppListModel, EncryptedAppListModelStatic } from './encryptedapplist'
import { createFamilyModel, FamilyModelStatic } from './family'
+import { createKeyRequestModel, KeyRequestModelStatic } from './keyrequest'
+import { createKeyResponseModel, KeyResponseModelStatic } from './keyresponse'
import { createMailLoginTokenModel, MailLoginTokenModelStatic } from './maillogintoken'
import { createUmzug } from './migration/umzug'
import { createOldDeviceModel, OldDeviceModelStatic } from './olddevice'
@@ -52,7 +55,10 @@ export interface Database {
childTask: ChildTaskModelStatic
config: ConfigModelStatic
device: DeviceModelStatic
+ encryptedAppList: EncryptedAppListModelStatic
family: FamilyModelStatic
+ keyRequest: KeyRequestModelStatic
+ keyResponse: KeyResponseModelStatic
mailLoginToken: MailLoginTokenModelStatic
oldDevice: OldDeviceModelStatic
purchase: PurchaseModelStatic
@@ -77,7 +83,10 @@ const createDatabase = (sequelize: Sequelize.Sequelize): Database => ({
categoryTimeWarning: createCategoryTimeWarningModel(sequelize),
config: createConfigModel(sequelize),
device: createDeviceModel(sequelize),
+ encryptedAppList: createEncryptedAppListModel(sequelize),
family: createFamilyModel(sequelize),
+ keyRequest: createKeyRequestModel(sequelize),
+ keyResponse: createKeyResponseModel(sequelize),
mailLoginToken: createMailLoginTokenModel(sequelize),
oldDevice: createOldDeviceModel(sequelize),
purchase: createPurchaseModel(sequelize),
diff --git a/src/database/migration/migrations/20181014-setup-tables.ts b/src/database/migration/migrations/20181014-setup-tables.ts
index 7f9f63c..d3a1d37 100644
--- a/src/database/migration/migrations/20181014-setup-tables.ts
+++ b/src/database/migration/migrations/20181014-setup-tables.ts
@@ -1,6 +1,6 @@
/*
* server component for the TimeLimit App
- * Copyright (C) 2019 - 2021 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
@@ -22,7 +22,7 @@ import { attributesVersion1 as authTokenAttributes } from '../../authtoken'
import { attributesVersion1 as categoryAttributes } from '../../category'
import { attributes as categoryAppAttributes } from '../../categoryapp'
import { attributesVersion1 as deviceAttributes } from '../../device'
-import { attributes as familyAttributes } from '../../family'
+import { attributesVersion1 as familyAttributes } from '../../family'
import { attributes as purchaseAttributes } from '../../purchase'
import { attributesVersion1 as timelimitruleAttributes } from '../../timelimitrule'
import { attributesVersion1 as usedTimeAttribute } from '../../usedtime'
diff --git a/src/database/migration/migrations/20220725-create-encrypted-app-lists.ts b/src/database/migration/migrations/20220725-create-encrypted-app-lists.ts
new file mode 100644
index 0000000..273a028
--- /dev/null
+++ b/src/database/migration/migrations/20220725-create-encrypted-app-lists.ts
@@ -0,0 +1,62 @@
+/*
+ * 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'
+
+export async function up (queryInterface: QueryInterface, sequelize: Sequelize) {
+ await sequelize.transaction({
+ type: Transaction.TYPES.EXCLUSIVE
+ }, async (transaction) => {
+ const dialect = sequelize.getDialect()
+ const isMysql = dialect === 'mysql' || dialect === 'mariadb'
+ const isPosgresql = dialect === 'postgres'
+
+ if (isMysql) {
+ await sequelize.query(
+ 'CREATE TABLE `EncryptedAppLists` ' +
+ '(`familyId` VARCHAR(10) NOT NULL, `deviceId` VARCHAR(6) NOT NULL,' +
+ '`type` INTEGER NOT NULL, `version` VARCHAR(4) NOT NULL,' +
+ '`data` BLOB NOT NULL, ' +
+ 'PRIMARY KEY (`familyId`, `deviceId`, `type`),' +
+ 'FOREIGN KEY (`familyId`, `deviceId`) REFERENCES `Devices` (`familyId`, `deviceId`) ON UPDATE CASCADE ON DELETE CASCADE' +
+ ')',
+ { transaction }
+ )
+ } else {
+ await sequelize.query(
+ 'CREATE TABLE "EncryptedAppLists" ' +
+ '("familyId" VARCHAR(10) NOT NULL, "deviceId" VARCHAR(6) NOT NULL,' +
+ '"type" INTEGER NOT NULL, "version" VARCHAR(4) NOT NULL,' +
+ '"data" ' + (isPosgresql ? 'BYTEA' : 'BLOB') + ' NOT NULL, ' +
+ 'PRIMARY KEY ("familyId", "deviceId", "type"),' +
+ 'FOREIGN KEY ("familyId", "deviceId") REFERENCES "Devices" ("familyId", "deviceId") ON UPDATE CASCADE ON DELETE CASCADE' +
+ ')',
+ { transaction }
+ )
+ }
+
+ await queryInterface.addIndex('EncryptedAppLists', ['familyId', 'deviceId', 'type', 'version'], { transaction })
+ })
+}
+
+export async function down (queryInterface: QueryInterface, sequelize: Sequelize) {
+ await sequelize.transaction({
+ type: Transaction.TYPES.EXCLUSIVE
+ }, async (transaction) => {
+ await queryInterface.dropTable('EncryptedAppLists', { transaction })
+ })
+}
diff --git a/src/database/migration/migrations/20220726-add-device-publickey.ts b/src/database/migration/migrations/20220726-add-device-publickey.ts
new file mode 100644
index 0000000..f7d9c96
--- /dev/null
+++ b/src/database/migration/migrations/20220726-add-device-publickey.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 { attributesVersion13 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', 'publicKey', {
+ ...deviceAttributes.publicKey
+ }, {
+ transaction
+ })
+ })
+}
+
+export async function down (queryInterface: QueryInterface, sequelize: Sequelize) {
+ await sequelize.transaction({
+ type: Transaction.TYPES.EXCLUSIVE
+ }, async (transaction) => {
+ await queryInterface.removeColumn('Devices', 'publicKey', { transaction })
+ })
+}
diff --git a/src/database/migration/migrations/20220727-add-family-requestseq.ts b/src/database/migration/migrations/20220727-add-family-requestseq.ts
new file mode 100644
index 0000000..cd3f809
--- /dev/null
+++ b/src/database/migration/migrations/20220727-add-family-requestseq.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 { attributesVersion2 as familyAttributes } from '../../family'
+
+export async function up (queryInterface: QueryInterface, sequelize: Sequelize) {
+ await sequelize.transaction({
+ type: Transaction.TYPES.EXCLUSIVE
+ }, async (transaction) => {
+ await queryInterface.addColumn('Families', 'nextServerKeyRequestSeq', {
+ ...familyAttributes.nextServerKeyRequestSeq
+ }, {
+ transaction
+ })
+ })
+}
+
+export async function down (queryInterface: QueryInterface, sequelize: Sequelize) {
+ await sequelize.transaction({
+ type: Transaction.TYPES.EXCLUSIVE
+ }, async (transaction) => {
+ await queryInterface.removeColumn('Families', 'nextServerKeyRequestSeq', { transaction })
+ })
+}
diff --git a/src/database/migration/migrations/20220728-create-key-requests.ts b/src/database/migration/migrations/20220728-create-key-requests.ts
new file mode 100644
index 0000000..4fc4585
--- /dev/null
+++ b/src/database/migration/migrations/20220728-create-key-requests.ts
@@ -0,0 +1,81 @@
+/*
+ * 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'
+
+export async function up (queryInterface: QueryInterface, sequelize: Sequelize) {
+ await sequelize.transaction({
+ type: Transaction.TYPES.EXCLUSIVE
+ }, async (transaction) => {
+ const dialect = sequelize.getDialect()
+ const isMysql = dialect === 'mysql' || dialect === 'mariadb'
+ const isPosgresql = dialect === 'postgres'
+
+ if (isMysql) {
+ await sequelize.query(
+ 'CREATE TABLE `KeyRequests` (' +
+ '`familyId` VARCHAR(10) NOT NULL, ' +
+ '`serverSequenceNumber` BIGINT NOT NULL, ' +
+ '`senderDeviceId` VARCHAR(6) NOT NULL, ' +
+ '`senderSequenceNumber` BIGINT NOT NULL, ' +
+ '`deviceId` VARCHAR(6) NULL, ' +
+ '`categoryId` VARCHAR(6) NULL, ' +
+ '`type` INTEGER NOT NULL, ' +
+ '`tempKey` BLOB NOT NULL, ' +
+ '`signature` BLOB NOT NULL, ' +
+ 'PRIMARY KEY (`familyId`, `serverSequenceNumber`), ' +
+ 'FOREIGN KEY (`familyId`, `senderDeviceId`) REFERENCES `Devices` (`familyId`, `deviceId`) ON UPDATE CASCADE ON DELETE CASCADE, ' +
+ 'FOREIGN KEY (`familyId`, `deviceId`) REFERENCES `Devices` (`familyId`, `deviceId`) ON UPDATE CASCADE ON DELETE CASCADE, ' +
+ 'FOREIGN KEY (`familyId`, `categoryId`) REFERENCES `Categories` (`familyId`, `categoryId`) ON UPDATE CASCADE ON DELETE CASCADE' +
+ ')',
+ { transaction }
+ )
+ } else {
+ await sequelize.query(
+ 'CREATE TABLE "KeyRequests" (' +
+ '"familyId" VARCHAR(10) NOT NULL, ' +
+ '"serverSequenceNumber" ' + (isPosgresql ? 'BIGINT' : 'LONG') + ' NOT NULL, ' +
+ '"senderDeviceId" VARCHAR(6) NOT NULL, ' +
+ '"senderSequenceNumber" ' + (isPosgresql ? 'BIGINT' : 'LONG') + ' NOT NULL, ' +
+ '"deviceId" VARCHAR(6) NULL, ' +
+ '"categoryId" VARCHAR(6) NULL, ' +
+ '"type" INTEGER NOT NULL, ' +
+ '"tempKey" ' + (isPosgresql ? 'BYTEA' : 'BLOB') + ' NOT NULL, ' +
+ '"signature" ' + (isPosgresql ? 'BYTEA' : 'BLOB') + ' NOT NULL, ' +
+ 'PRIMARY KEY ("familyId", "serverSequenceNumber"), ' +
+ 'FOREIGN KEY ("familyId", "senderDeviceId") REFERENCES "Devices" ("familyId", "deviceId") ON UPDATE CASCADE ON DELETE CASCADE, ' +
+ 'FOREIGN KEY ("familyId", "deviceId") REFERENCES "Devices" ("familyId", "deviceId") ON UPDATE CASCADE ON DELETE CASCADE, ' +
+ 'FOREIGN KEY ("familyId", "categoryId") REFERENCES "Categories" ("familyId", "categoryId") ON UPDATE CASCADE ON DELETE CASCADE' +
+ ')',
+ { transaction }
+ )
+ }
+
+ await queryInterface.addIndex('KeyRequests', ['familyId', 'senderDeviceId', 'senderSequenceNumber'], { transaction })
+ await queryInterface.addIndex('KeyRequests', ['familyId', 'deviceId'], { transaction })
+ await queryInterface.addIndex('KeyRequests', ['familyId', 'categoryId'], { transaction })
+ await queryInterface.addIndex('KeyRequests', ['familyId', 'senderDeviceId', 'deviceId', 'categoryId'], { transaction, unique: true })
+ })
+}
+
+export async function down (queryInterface: QueryInterface, sequelize: Sequelize) {
+ await sequelize.transaction({
+ type: Transaction.TYPES.EXCLUSIVE
+ }, async (transaction) => {
+ await queryInterface.dropTable('KeyRequests', { transaction })
+ })
+}
diff --git a/src/database/migration/migrations/20220729-create-key-responses.ts b/src/database/migration/migrations/20220729-create-key-responses.ts
new file mode 100644
index 0000000..29becd1
--- /dev/null
+++ b/src/database/migration/migrations/20220729-create-key-responses.ts
@@ -0,0 +1,83 @@
+/*
+ * 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'
+
+export async function up (queryInterface: QueryInterface, sequelize: Sequelize) {
+ await sequelize.transaction({
+ type: Transaction.TYPES.EXCLUSIVE
+ }, async (transaction) => {
+ const dialect = sequelize.getDialect()
+ const isMysql = dialect === 'mysql' || dialect === 'mariadb'
+ const isPosgresql = dialect === 'postgres'
+
+ if (isMysql) {
+ await sequelize.query(
+ 'CREATE TABLE `KeyResponses` (' +
+ '`familyId` VARCHAR(10) NOT NULL, ' +
+ '`receiverDeviceId` VARCHAR(6) NOT NULL, ' +
+ '`requestServerSequenceNumber` BIGINT NOT NULL, ' +
+ '`senderDeviceId` VARCHAR(6) NOT NULL, ' +
+ '`replyServerSequenceNumber` BIGINT NOT NULL, ' +
+ '`requestClientSequenceNumber` BIGINT NOT NULL, ' +
+ '`tempKey` BLOB NOT NULL, ' +
+ '`encryptedKey` BLOB NOT NULL, ' +
+ '`signature` BLOB NOT NULL, ' +
+ 'PRIMARY KEY (`familyId`, `receiverDeviceId`, `requestServerSequenceNumber`, `senderDeviceId`), ' +
+ 'FOREIGN KEY (`familyId`, `requestServerSequenceNumber`) REFERENCES `KeyRequests` (`familyId`, `serverSequenceNumber`) ON UPDATE CASCADE ON DELETE CASCADE ' +
+ ')',
+ { transaction }
+ )
+ } else {
+ await sequelize.query(
+ 'CREATE TABLE "KeyResponses" (' +
+ '"familyId" VARCHAR(10) NOT NULL, ' +
+ '"receiverDeviceId" VARCHAR(6) NOT NULL, ' +
+ '"requestServerSequenceNumber" ' + (isPosgresql ? 'BIGINT' : 'LONG') + ' NOT NULL, ' +
+ '"senderDeviceId" VARCHAR(6) NOT NULL, ' +
+ '"replyServerSequenceNumber" ' + (isPosgresql ? 'BIGINT' : 'LONG') + ' NOT NULL, ' +
+ '"requestClientSequenceNumber" ' + (isPosgresql ? 'BIGINT' : 'LONG') + ' NOT NULL, ' +
+ '"tempKey" ' + (isPosgresql ? 'BYTEA' : 'BLOB') + ' NOT NULL, ' +
+ '"encryptedKey" ' + (isPosgresql ? 'BYTEA' : 'BLOB') + ' NOT NULL, ' +
+ '"signature" ' + (isPosgresql ? 'BYTEA' : 'BLOB') + ' NOT NULL, ' +
+ 'PRIMARY KEY ("familyId", "receiverDeviceId", "requestServerSequenceNumber", "senderDeviceId"), ' +
+ 'FOREIGN KEY ("familyId", "requestServerSequenceNumber") REFERENCES "KeyRequests" ("familyId", "serverSequenceNumber") ON UPDATE CASCADE ON DELETE CASCADE ' +
+ ')',
+ { transaction }
+ )
+ }
+
+ await queryInterface.addIndex('KeyResponses', ['familyId', 'requestServerSequenceNumber'], { transaction })
+ await queryInterface.addIndex(
+ 'KeyResponses',
+ ['familyId', 'receiverDeviceId', 'replyServerSequenceNumber'],
+ {
+ transaction,
+ unique: true,
+ name: 'key_response_index_fid_rdid_rssn'
+ }
+ )
+ })
+}
+
+export async function down (queryInterface: QueryInterface, sequelize: Sequelize) {
+ await sequelize.transaction({
+ type: Transaction.TYPES.EXCLUSIVE
+ }, async (transaction) => {
+ await queryInterface.dropTable('KeyResponses', { transaction })
+ })
+}
diff --git a/src/database/migration/migrations/20220730-add-device-key-response-counter.ts b/src/database/migration/migrations/20220730-add-device-key-response-counter.ts
new file mode 100644
index 0000000..2849d4f
--- /dev/null
+++ b/src/database/migration/migrations/20220730-add-device-key-response-counter.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 { attributesVersion14 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', 'nextKeyReplySequenceNumber', {
+ ...deviceAttributes.nextKeyReplySequenceNumber
+ }, {
+ transaction
+ })
+ })
+}
+
+export async function down (queryInterface: QueryInterface, sequelize: Sequelize) {
+ await sequelize.transaction({
+ type: Transaction.TYPES.EXCLUSIVE
+ }, async (transaction) => {
+ await queryInterface.removeColumn('Devices', 'nextKeyReplySequenceNumber', { transaction })
+ })
+}
diff --git a/src/function/device/prepare-device-entry.ts b/src/function/device/prepare-device-entry.ts
index fb1dad1..32d2a7b 100644
--- a/src/function/device/prepare-device-entry.ts
+++ b/src/function/device/prepare-device-entry.ts
@@ -64,5 +64,7 @@ export const prepareDeviceEntry = ({ familyId, userId, deviceAuthToken, deviceId
wasAsEnabled: false,
activityLevelBlocking: false,
isQorLater: false,
- manipulationFlags: 0
+ manipulationFlags: 0,
+ publicKey: null,
+ nextKeyReplySequenceNumber: '1'
})
diff --git a/src/function/parent/create-family.ts b/src/function/parent/create-family.ts
index efdb800..9bf20f4 100644
--- a/src/function/parent/create-family.ts
+++ b/src/function/parent/create-family.ts
@@ -1,6 +1,6 @@
/*
* server component for the TimeLimit App
- * Copyright (C) 2019 - 2021 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
@@ -65,7 +65,8 @@ export const createFamily = async ({ database, mailAuthToken, firstParentDevice,
deviceListVersion: generateVersionId(),
// 14 days demo version
fullVersionUntil: (Date.now() + 1000 * 60 * 60 * 24 * 14).toString(10),
- hasFullVersion: true
+ hasFullVersion: true,
+ nextServerKeyRequestSeq: '1'
}, { transaction })
// create parent user
diff --git a/src/function/sync/apply-actions/dispatch-app-logic-action/finishkeyrequest.ts b/src/function/sync/apply-actions/dispatch-app-logic-action/finishkeyrequest.ts
new file mode 100644
index 0000000..1bad5c4
--- /dev/null
+++ b/src/function/sync/apply-actions/dispatch-app-logic-action/finishkeyrequest.ts
@@ -0,0 +1,34 @@
+/*
+ * 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 { FinishKeyRequestAction } from '../../../../action'
+import { Cache } from '../cache'
+
+export async function dispatchFinishKeyRequestAction ({ action, cache, deviceId }: {
+ deviceId: string
+ action: FinishKeyRequestAction
+ cache: Cache
+}) {
+ await cache.database.keyRequest.destroy({
+ where: {
+ familyId: cache.familyId,
+ senderDeviceId: deviceId,
+ senderSequenceNumber: action.deviceSequenceNumber.toString(10)
+ },
+ transaction: cache.transaction
+ })
+}
diff --git a/src/function/sync/apply-actions/dispatch-app-logic-action/index.ts b/src/function/sync/apply-actions/dispatch-app-logic-action/index.ts
index ebef50c..f914bcf 100644
--- a/src/function/sync/apply-actions/dispatch-app-logic-action/index.ts
+++ b/src/function/sync/apply-actions/dispatch-app-logic-action/index.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
@@ -20,13 +20,18 @@ import {
AddUsedTimeAction,
AddUsedTimeActionVersion2,
AppLogicAction,
+ FinishKeyRequestAction,
ForceSyncAction,
MarkTaskPendingAction,
+ ReplyToKeyRequestAction,
RemoveInstalledAppsAction,
+ SendKeyRequestAction,
SignOutAtDeviceAction,
TriedDisablingDeviceAdminAction,
UpdateAppActivitiesAction,
- UpdateDeviceStatusAction
+ UpdateDeviceStatusAction,
+ UpdateInstalledAppsAction,
+ UploadDevicePublicKeyAction
} from '../../../../action'
import { EventHandler } from '../../../../monitoring/eventhandler'
import { Cache } from '../cache'
@@ -34,13 +39,18 @@ import { ActionObjectTypeNotHandledException } from '../exception/illegal-state'
import { dispatchAddInstalledApps } from './addinstalledapps'
import { dispatchAddUsedTime } from './addusedtime'
import { dispatchAddUsedTimeVersion2 } from './addusedtime2'
+import { dispatchFinishKeyRequestAction } from './finishkeyrequest'
import { dispatchForceSyncAction } from './forcesync'
import { dispatchMarkTaskPendingAction } from './marktaskpendingaction'
+import { dispatchReplyToKeyRequestAction } from './replytokeyrequest'
import { dispatchRemoveInstalledApps } from './removeinstalledapps'
+import { dispatchSendKeyRequestAction } from './sendkeyrequest'
import { dispatchSignOutAtDevice } from './signoutatdevice'
import { dispatchTriedDisablingDeviceAdmin } from './trieddisablingdeviceadmin'
import { dispatchUpdateAppActivities } from './updateappactivities'
import { dispatchUpdateDeviceStatus } from './updatedevicestatus'
+import { dispatchUpdateInstalledApps } from './updateinstalledapps'
+import { dispatchUploadDevicePublicKeyAction } from './uploaddevicepublickey'
export const dispatchAppLogicAction = async ({ action, deviceId, cache, eventHandler }: {
action: AppLogicAction
@@ -54,12 +64,18 @@ export const dispatchAppLogicAction = async ({ action, deviceId, cache, eventHan
await dispatchAddUsedTime({ deviceId, action, cache })
} else if (action instanceof AddUsedTimeActionVersion2) {
await dispatchAddUsedTimeVersion2({ deviceId, action, cache, eventHandler })
+ } else if (action instanceof FinishKeyRequestAction) {
+ await dispatchFinishKeyRequestAction({ deviceId, action, cache })
} else if (action instanceof ForceSyncAction) {
await dispatchForceSyncAction({ deviceId, action, cache })
} else if (action instanceof MarkTaskPendingAction) {
await dispatchMarkTaskPendingAction({ deviceId, action, cache })
+ } else if (action instanceof ReplyToKeyRequestAction) {
+ await dispatchReplyToKeyRequestAction({ deviceId, action, cache, eventHandler })
} else if (action instanceof RemoveInstalledAppsAction) {
await dispatchRemoveInstalledApps({ deviceId, action, cache })
+ } else if (action instanceof SendKeyRequestAction) {
+ await dispatchSendKeyRequestAction({ deviceId, action, cache })
} else if (action instanceof SignOutAtDeviceAction) {
await dispatchSignOutAtDevice({ deviceId, action, cache })
} else if (action instanceof UpdateDeviceStatusAction) {
@@ -68,6 +84,10 @@ export const dispatchAppLogicAction = async ({ action, deviceId, cache, eventHan
await dispatchUpdateAppActivities({ deviceId, action, cache })
} else if (action instanceof TriedDisablingDeviceAdminAction) {
await dispatchTriedDisablingDeviceAdmin({ deviceId, action, cache })
+ } else if (action instanceof UpdateInstalledAppsAction) {
+ await dispatchUpdateInstalledApps({ deviceId, action, cache })
+ } else if (action instanceof UploadDevicePublicKeyAction) {
+ await dispatchUploadDevicePublicKeyAction({ deviceId, action, cache, eventHandler })
} else {
throw new ActionObjectTypeNotHandledException()
}
diff --git a/src/function/sync/apply-actions/dispatch-app-logic-action/replytokeyrequest.ts b/src/function/sync/apply-actions/dispatch-app-logic-action/replytokeyrequest.ts
new file mode 100644
index 0000000..f6c6ad5
--- /dev/null
+++ b/src/function/sync/apply-actions/dispatch-app-logic-action/replytokeyrequest.ts
@@ -0,0 +1,108 @@
+/*
+ * 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 { ReplyToKeyRequestAction } from '../../../../action'
+import { Cache } from '../cache'
+import { EventHandler } from '../../../../monitoring/eventhandler'
+import { SourceDeviceNotFoundException } from '../exception/illegal-state'
+
+export async function dispatchReplyToKeyRequestAction ({ deviceId, action, cache, eventHandler }: {
+ deviceId: string
+ action: ReplyToKeyRequestAction
+ cache: Cache
+ eventHandler: EventHandler
+}) {
+ const requestUnsafe = await cache.database.keyRequest.findOne({
+ where: {
+ familyId: cache.familyId,
+ serverSequenceNumber: action.requestServerSequenceNumber.toString(10)
+ },
+ attributes: ['senderDeviceId', 'senderSequenceNumber'],
+ transaction: cache.transaction
+ })
+
+ if (!requestUnsafe) {
+ eventHandler.countEvent('dispatchReplyToKeyRequestAction:request does not exists (anymore)')
+
+ return
+ }
+
+ const request = {
+ senderDeviceId: requestUnsafe.senderDeviceId,
+ senderSequenceNumber: requestUnsafe.senderSequenceNumber
+ }
+
+ const oldReplyCounter = await cache.database.keyResponse.count({
+ where: {
+ familyId: cache.familyId,
+ receiverDeviceId: request.senderDeviceId,
+ requestServerSequenceNumber: action.requestServerSequenceNumber.toString(10),
+ senderDeviceId: deviceId
+ },
+ transaction: cache.transaction
+ })
+
+ if (oldReplyCounter !== 0) {
+ eventHandler.countEvent('dispatchReplyToKeyRequestAction:got duplicate reply which was ignored')
+
+ return
+ }
+
+ const deviceEntryUnsafe = await cache.database.device.findOne({
+ where: {
+ familyId: cache.familyId,
+ deviceId
+ },
+ transaction: cache.transaction,
+ attributes: ['nextKeyReplySequenceNumber']
+ })
+
+ if (!deviceEntryUnsafe) {
+ throw new SourceDeviceNotFoundException()
+ }
+
+ const deviceEntry = {
+ nextKeyReplySequenceNumber: deviceEntryUnsafe.nextKeyReplySequenceNumber
+ }
+
+ await cache.database.device.update({
+ nextKeyReplySequenceNumber: (parseInt(deviceEntry.nextKeyReplySequenceNumber) + 1).toString(10)
+ }, {
+ where: {
+ familyId: cache.familyId,
+ deviceId
+ },
+ transaction: cache.transaction
+ })
+
+ await cache.database.keyResponse.create({
+ familyId: cache.familyId,
+ receiverDeviceId: request.senderDeviceId,
+ requestServerSequenceNumber: action.requestServerSequenceNumber.toString(10),
+ senderDeviceId: deviceId,
+ replyServerSequenceNumber: deviceEntry.nextKeyReplySequenceNumber,
+ requestClientSequenceNumber: requestUnsafe.senderSequenceNumber,
+ tempKey: action.tempKey,
+ encryptedKey: action.encryptedKey,
+ signature: action.signature
+ }, {
+ transaction: cache.transaction
+ })
+
+ // there is no way (yet) to inform the specific device only
+ cache.areChangesImportant = true
+}
diff --git a/src/function/sync/apply-actions/dispatch-app-logic-action/sendkeyrequest.ts b/src/function/sync/apply-actions/dispatch-app-logic-action/sendkeyrequest.ts
new file mode 100644
index 0000000..2907ab5
--- /dev/null
+++ b/src/function/sync/apply-actions/dispatch-app-logic-action/sendkeyrequest.ts
@@ -0,0 +1,76 @@
+/*
+ * 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 { SendKeyRequestAction } from '../../../../action'
+import { Cache } from '../cache'
+import { SourceFamilyNotFoundException } from '../exception/illegal-state'
+
+export async function dispatchSendKeyRequestAction ({ action, cache, deviceId }: {
+ deviceId: string
+ action: SendKeyRequestAction
+ cache: Cache
+}) {
+ const familyEntryUnsafe = await cache.database.family.findOne({
+ where: {
+ familyId: cache.familyId
+ },
+ transaction: cache.transaction,
+ attributes: ['nextServerKeyRequestSeq']
+ })
+
+ if (!familyEntryUnsafe) {
+ throw new SourceFamilyNotFoundException()
+ }
+
+ const serverSequenceNumber = familyEntryUnsafe.nextServerKeyRequestSeq
+
+ await cache.database.family.update({
+ nextServerKeyRequestSeq: (parseInt(serverSequenceNumber, 10) + 1).toString(10)
+ }, {
+ where: {
+ familyId: cache.familyId
+ },
+ transaction: cache.transaction
+ })
+
+ await cache.database.keyRequest.destroy({
+ where: {
+ familyId: cache.familyId,
+ senderDeviceId: deviceId,
+ type: action.type,
+ deviceId: action.deviceId || null,
+ categoryId: action.categoryId || null
+ },
+ transaction: cache.transaction
+ })
+
+ await cache.database.keyRequest.create({
+ familyId: cache.familyId,
+ serverSequenceNumber: serverSequenceNumber,
+ senderDeviceId: deviceId,
+ senderSequenceNumber: action.deviceSequenceNumber.toString(10),
+ deviceId: action.deviceId || null,
+ categoryId: action.categoryId || null,
+ type: action.type,
+ tempKey: action.tempKey,
+ signature: action.signature
+ }, {
+ transaction: cache.transaction
+ })
+
+ cache.areChangesImportant = true
+}
diff --git a/src/function/sync/apply-actions/dispatch-app-logic-action/updateinstalledapps.ts b/src/function/sync/apply-actions/dispatch-app-logic-action/updateinstalledapps.ts
new file mode 100644
index 0000000..27085b4
--- /dev/null
+++ b/src/function/sync/apply-actions/dispatch-app-logic-action/updateinstalledapps.ts
@@ -0,0 +1,59 @@
+/*
+ * 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 { UpdateInstalledAppsAction } from '../../../../action'
+import { types } from '../../../../database/encryptedapplist'
+import { generateVersionId } from '../../../../util/token'
+import { Cache } from '../cache'
+
+export async function dispatchUpdateInstalledApps ({ deviceId, action, cache }: {
+ deviceId: string
+ action: UpdateInstalledAppsAction
+ cache: Cache
+}) {
+ if (action.base) {
+ await cache.database.encryptedAppList.upsert({
+ familyId: cache.familyId,
+ deviceId,
+ type: types.base,
+ version: generateVersionId(),
+ data: action.base
+ }, { transaction: cache.transaction })
+ }
+
+ if (action.diff) {
+ await cache.database.encryptedAppList.upsert({
+ familyId: cache.familyId,
+ deviceId,
+ type: types.diff,
+ version: generateVersionId(),
+ data: action.diff
+ }, { transaction: cache.transaction })
+ }
+
+ if (action.wipe) {
+ await cache.database.app.destroy({
+ where: {
+ familyId: cache.familyId,
+ deviceId
+ },
+ transaction: cache.transaction
+ })
+
+ cache.devicesWithModifiedInstalledApps.add(deviceId)
+ }
+}
diff --git a/src/function/sync/apply-actions/dispatch-app-logic-action/uploaddevicepublickey.ts b/src/function/sync/apply-actions/dispatch-app-logic-action/uploaddevicepublickey.ts
new file mode 100644
index 0000000..0650328
--- /dev/null
+++ b/src/function/sync/apply-actions/dispatch-app-logic-action/uploaddevicepublickey.ts
@@ -0,0 +1,50 @@
+/*
+ * 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 { UploadDevicePublicKeyAction } from '../../../../action'
+import { Cache } from '../cache'
+import { EventHandler } from '../../../../monitoring/eventhandler'
+import { SourceDeviceNotFoundException } from '../exception/illegal-state'
+
+export async function dispatchUploadDevicePublicKeyAction ({ deviceId, action, cache, eventHandler }: {
+ deviceId: string
+ action: UploadDevicePublicKeyAction
+ cache: Cache
+ eventHandler: EventHandler
+}) {
+ const deviceEntry = await cache.database.device.findOne({
+ where: {
+ familyId: cache.familyId,
+ deviceId
+ },
+ transaction: cache.transaction
+ })
+
+ if (deviceEntry === null) {
+ throw new SourceDeviceNotFoundException()
+ } else if (deviceEntry.publicKey === null) {
+ deviceEntry.publicKey = action.key
+
+ await deviceEntry.save({ transaction: cache.transaction })
+
+ cache.invalidiateDeviceList = true
+ } else if (deviceEntry.publicKey.equals(action.key)) {
+ eventHandler.countEvent('dispatchUploadDevicePublicKeyAction:duplicate action')
+ } else {
+ eventHandler.countEvent('dispatchUploadDevicePublicKeyAction:got new public key for existing device')
+ }
+}
diff --git a/src/function/sync/get-server-data-status/device-detail.ts b/src/function/sync/get-server-data-status/device-detail.ts
new file mode 100644
index 0000000..8e9211d
--- /dev/null
+++ b/src/function/sync/get-server-data-status/device-detail.ts
@@ -0,0 +1,119 @@
+/*
+ * 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 * as Sequelize from 'sequelize'
+import { Database } from '../../../database'
+import { ClientDataStatusDevicesExtended } from '../../../object/clientdatastatus'
+import { ServerExtendedDeviceData, ServerCryptContainer } from '../../../object/serverdatastatus'
+import { FamilyEntry } from './family-entry'
+import { types } from '../../../database/encryptedapplist'
+
+export async function getDeviceDetailList ({ database, transaction, familyEntry, devicesDetail }: {
+ database: Database
+ transaction: Sequelize.Transaction
+ familyEntry: FamilyEntry
+ devicesDetail: ClientDataStatusDevicesExtended
+}): Promise | null> {
+ const serverEncryptedAppsVersions = (await database.encryptedAppList.findAll({
+ where: {
+ familyId: familyEntry.familyId,
+ },
+ attributes: ['deviceId', 'type', 'version'],
+ transaction
+ })).map((item) => ({
+ deviceId: item.deviceId,
+ type: item.type,
+ version: item.version
+ }))
+
+ const devicesWithChangedBaseApps: Array = []
+ const devicesWithChangedDiffApps: Array = []
+
+ serverEncryptedAppsVersions.forEach((item) => {
+ if (item.type === types.base) {
+ if (!devicesDetail[item.deviceId] || devicesDetail[item.deviceId].appsB !== item.version) {
+ devicesWithChangedBaseApps.push(item.deviceId)
+ }
+ } else if (item.type === types.diff) {
+ if (!devicesDetail[item.deviceId] || devicesDetail[item.deviceId].appsD !== item.version) {
+ devicesWithChangedDiffApps.push(item.deviceId)
+ }
+ }
+ })
+
+ const updatedDeviceIds = Array.from(new Set([...devicesWithChangedBaseApps, ...devicesWithChangedDiffApps]))
+
+ if (updatedDeviceIds.length === 0) return null
+
+ const updatedBaseApps = devicesWithChangedBaseApps.length === 0 ? [] : (await database.encryptedAppList.findAll({
+ where: {
+ familyId: familyEntry.familyId,
+ deviceId: {
+ [Sequelize.Op.in]: devicesWithChangedBaseApps
+ },
+ type: types.base
+ },
+ attributes: [
+ 'deviceId',
+ 'version',
+ 'data'
+ ],
+ transaction
+ })).map((item) => ({
+ deviceId: item.deviceId,
+ version: item.version,
+ data: item.data
+ }))
+
+ const updatedDiffApps = devicesWithChangedDiffApps.length === 0 ? [] : (await database.encryptedAppList.findAll({
+ where: {
+ familyId: familyEntry.familyId,
+ deviceId: {
+ [Sequelize.Op.in]: devicesWithChangedDiffApps
+ },
+ type: types.diff
+ },
+ attributes: [
+ 'deviceId',
+ 'version',
+ 'data'
+ ],
+ transaction
+ })).map((item) => ({
+ deviceId: item.deviceId,
+ version: item.version,
+ data: item.data
+ }))
+
+ return updatedDeviceIds.map((deviceId) => {
+ const appsBase = updatedBaseApps.find((item) => item.deviceId === deviceId)
+ const appsDiff = updatedDiffApps.find((item) => item.deviceId === deviceId)
+
+ return {
+ deviceId,
+ appsBase: appsBase ? wrapServerCryptContainer(appsBase) : undefined,
+ appsDiff: appsDiff ? wrapServerCryptContainer(appsDiff) : undefined
+ }
+ })
+}
+
+function wrapServerCryptContainer({ version, data }: { version: string, data: Buffer }): ServerCryptContainer {
+ return {
+ version,
+ data: data.toString('base64')
+ }
+}
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 2caf511..0d56181 100644
--- a/src/function/sync/get-server-data-status/device-list.ts
+++ b/src/function/sync/get-server-data-status/device-list.ts
@@ -65,7 +65,8 @@ export async function getDeviceList ({ database, transaction, familyEntry }: {
wasAsEnabled: item.wasAsEnabled,
activityLevelBlocking: item.activityLevelBlocking,
qOrLater: item.isQorLater,
- mFlags: item.manipulationFlags
+ mFlags: item.manipulationFlags,
+ pk: item.publicKey ? item.publicKey.toString('base64') : undefined
}))
}
}
diff --git a/src/function/sync/get-server-data-status/index.ts b/src/function/sync/get-server-data-status/index.ts
index 5b03fb6..104eecf 100644
--- a/src/function/sync/get-server-data-status/index.ts
+++ b/src/function/sync/get-server-data-status/index.ts
@@ -26,25 +26,32 @@ import {
getCategoryAssignedApps, getCategoryBaseDatas, getCategoryDataToSync,
getRules, getTasks, getUsedTimes
} from './category'
+import { getDeviceDetailList } from './device-detail'
import { getDeviceList } from './device-list'
import { getFamilyEntry } from './family-entry'
import { getUserList } from './user-list'
+import { getKeyRequests } from './key-requests'
+import { getKeyResponses } from './key-responses'
-export const generateServerDataStatus = async ({ database, clientStatus, familyId, transaction }: {
+export const generateServerDataStatus = async ({
+ database, clientStatus, familyId, deviceId, transaction
+}: {
database: Database
clientStatus: ClientDataStatus
familyId: string
+ deviceId: string
transaction: Sequelize.Transaction
}): Promise => {
const familyEntry = await getFamilyEntry({ database, familyId, transaction })
const doesClientSupportTasks = clientStatus.clientLevel !== undefined && clientStatus.clientLevel >= 3
+ const doesClientSupportCryptoApps = clientStatus.clientLevel !== undefined && clientStatus.clientLevel >= 4
const result: ServerDataStatus = {
fullVersion: config.alwaysPro ? 1 : (
familyEntry.hasFullVersion ? parseInt(familyEntry.fullVersionUntil, 10) : 0
),
message: await getStatusMessage({ database, transaction }) || undefined,
- apiLevel: 3
+ apiLevel: 4
}
if (familyEntry.deviceListVersion !== clientStatus.devices) {
@@ -103,5 +110,30 @@ export const generateServerDataStatus = async ({ database, clientStatus, familyI
})
}
+ if (doesClientSupportCryptoApps) {
+ result.devices2 = await getDeviceDetailList({
+ database,
+ transaction,
+ familyEntry,
+ devicesDetail: clientStatus.devicesDetail || {}
+ }) || undefined
+
+ result.krq = await getKeyRequests({
+ database,
+ transaction,
+ familyEntry,
+ deviceId,
+ lastSeenRequestIndex: clientStatus.kri || null
+ }) || undefined
+
+ result.kr = await getKeyResponses({
+ database,
+ transaction,
+ familyEntry,
+ deviceId,
+ lastSeenRequestIndex: clientStatus.kr || null
+ }) || undefined
+ }
+
return result
}
diff --git a/src/function/sync/get-server-data-status/key-requests.ts b/src/function/sync/get-server-data-status/key-requests.ts
new file mode 100644
index 0000000..a7184d3
--- /dev/null
+++ b/src/function/sync/get-server-data-status/key-requests.ts
@@ -0,0 +1,58 @@
+/*
+ * 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 * as Sequelize from 'sequelize'
+import { Database } from '../../../database'
+import { ServerKeyRequest } from '../../../object/serverdatastatus'
+import { FamilyEntry } from './family-entry'
+
+export async function getKeyRequests ({ database, transaction, familyEntry, lastSeenRequestIndex, deviceId }: {
+ database: Database
+ transaction: Sequelize.Transaction
+ familyEntry: FamilyEntry
+ lastSeenRequestIndex: number | null
+ deviceId: string
+}): Promise | null> {
+ const data = await database.keyRequest.findAll({
+ where: {
+ familyId: familyEntry.familyId,
+ senderDeviceId: {
+ [Sequelize.Op.ne]: deviceId
+ },
+ ...(lastSeenRequestIndex === null ? {} : {
+ serverSequenceNumber: {
+ [Sequelize.Op.gt]: lastSeenRequestIndex
+ }
+ })
+ },
+ transaction,
+ limit: 32
+ })
+
+ if (data.length === 0) return null
+
+ return data.map((item) => ({
+ srvSeq: parseInt(item.serverSequenceNumber),
+ senId: item.senderDeviceId,
+ senSeq: parseInt(item.senderSequenceNumber),
+ deviceId: item.deviceId || undefined,
+ categoryId: item.categoryId || undefined,
+ type: item.type,
+ tempKey: item.tempKey.toString('base64'),
+ signature: item.signature.toString('base64')
+ }))
+}
diff --git a/src/function/sync/get-server-data-status/key-responses.ts b/src/function/sync/get-server-data-status/key-responses.ts
new file mode 100644
index 0000000..b029454
--- /dev/null
+++ b/src/function/sync/get-server-data-status/key-responses.ts
@@ -0,0 +1,63 @@
+/*
+ * 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 * as Sequelize from 'sequelize'
+import { Database } from '../../../database'
+import { ServerKeyResponse } from '../../../object/serverdatastatus'
+import { FamilyEntry } from './family-entry'
+
+export async function getKeyResponses ({ database, transaction, familyEntry, lastSeenRequestIndex, deviceId }: {
+ database: Database
+ transaction: Sequelize.Transaction
+ familyEntry: FamilyEntry
+ lastSeenRequestIndex: number | null
+ deviceId: string
+}): Promise | null> {
+ if (lastSeenRequestIndex !== null) {
+ await database.keyResponse.destroy({
+ where: {
+ familyId: familyEntry.familyId,
+ receiverDeviceId: deviceId,
+ replyServerSequenceNumber: {
+ [Sequelize.Op.lte]: lastSeenRequestIndex.toString(10)
+ }
+ },
+ transaction
+ })
+ }
+
+ const data = await database.keyResponse.findAll({
+ where: {
+ familyId: familyEntry.familyId,
+ receiverDeviceId: deviceId,
+ },
+ order: [['replyServerSequenceNumber', 'ASC']],
+ transaction,
+ limit: 32
+ })
+
+ if (data.length === 0) return null
+
+ return data.map((item) => ({
+ srvSeq: parseInt(item.replyServerSequenceNumber),
+ sender: item.senderDeviceId,
+ rqSeq: parseInt(item.requestClientSequenceNumber),
+ tempKey: item.tempKey.toString('base64'),
+ cryptKey: item.encryptedKey.toString('base64'),
+ signature: item.signature.toString('base64')
+ }))
+}
diff --git a/src/object/clientdatastatus.ts b/src/object/clientdatastatus.ts
index 437db70..531f17e 100644
--- a/src/object/clientdatastatus.ts
+++ b/src/object/clientdatastatus.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
@@ -21,10 +21,14 @@ export interface ClientDataStatus {
categories: ClientDataStatusCategories
users: string // userListVersion
clientLevel?: number
+ devicesDetail?: ClientDataStatusDevicesExtended
+ kri?: number // last key request index
+ kr?: number // last key response index
}
export type ClientDataStatusApps = {[key: string]: string} // installedAppsVersionsByDeviceId
export type ClientDataStatusCategories = {[key: string]: CategoryDataStatus}
+export type ClientDataStatusDevicesExtended = {[key: string]: DeviceDataStatus}
export interface CategoryDataStatus {
base: string // baseVersion
@@ -33,3 +37,8 @@ export interface CategoryDataStatus {
usedTime: string // usedTimeItemsVersion
tasks?: string // taskListVersion
}
+
+export interface DeviceDataStatus {
+ appsB?: string // encrypted app list base version
+ appsD?: string // encrypted app list diff version
+}
diff --git a/src/object/serverdatastatus.ts b/src/object/serverdatastatus.ts
index a65dc22..78a1437 100644
--- a/src/object/serverdatastatus.ts
+++ b/src/object/serverdatastatus.ts
@@ -23,6 +23,7 @@ import { RuntimePermissionStatus } from '../model/runtimepermissionstatus'
export interface ServerDataStatus {
devices?: ServerDeviceList // newDeviceList
+ devices2?: Array // updatedExtendedDeviceData
apps?: Array // newInstalledApps
rmCategories?: Array // removedCategories
categoryBase?: Array // newCategoryBaseData
@@ -31,6 +32,8 @@ export interface ServerDataStatus {
rules?: Array // newOrUpdatedTimeLimitRules
tasks?: Array // newOrUpdatedTasks
users?: ServerUserList // newUserList
+ krq?: Array // pendingKeyRequests
+ kr?: Array // keyResponses
fullVersion: number // fullVersionUntil
message?: string
apiLevel: number
@@ -97,6 +100,7 @@ export interface ServerDeviceData {
activityLevelBlocking: boolean
qOrLater: boolean
mFlags: number // manipulation flags
+ pk?: string // public key
}
export interface ServerUpdatedCategoryBaseData {
@@ -217,3 +221,34 @@ export interface ServerInstalledAppsData {
apps: Array
activities: Array
}
+
+export interface ServerExtendedDeviceData {
+ deviceId: string
+ appsBase?: ServerCryptContainer
+ appsDiff?: ServerCryptContainer
+}
+
+export interface ServerCryptContainer {
+ version: string
+ data: string
+}
+
+export interface ServerKeyRequest {
+ srvSeq: number
+ senId: string
+ senSeq: number
+ deviceId?: string
+ categoryId?: string
+ type: number
+ tempKey: string
+ signature: string
+}
+
+export interface ServerKeyResponse {
+ srvSeq: number
+ sender: string
+ rqSeq: number
+ tempKey: string,
+ cryptKey: string,
+ signature: string
+}